From ca338ac683a61ab3298bfaf197c1cbea6a9b846f Mon Sep 17 00:00:00 2001
From: Mattia Mancini <mancini@astron.nl>
Date: Wed, 16 May 2018 15:50:12 +0000
Subject: [PATCH] Story SW-300: fixing response on already existing item and
 adding releasing script

---
 .gitattributes                                |  2 +
 .../django_postgresql/requirements.txt        |  3 +-
 .../DBInterface/monitoringdb/exceptions.py    |  8 ++++
 .../monitoringdb/serializers/rtsm.py          | 11 +++---
 .../monitoringdb/serializers/stationtest.py   |  4 +-
 .../DBInterface/monitoringdb/views.py         | 27 +++++++++++--
 LCU/Maintenance/MDB_tools/cli/mdb_loader.py   |  4 +-
 LCU/Maintenance/MDB_tools/cli/release_code.py | 39 +++++++++++++++++++
 8 files changed, 86 insertions(+), 12 deletions(-)
 create mode 100644 LCU/Maintenance/DBInterface/monitoringdb/exceptions.py
 create mode 100644 LCU/Maintenance/MDB_tools/cli/release_code.py

diff --git a/.gitattributes b/.gitattributes
index 826f58aab42..fa50c3b9067 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1783,6 +1783,7 @@ LCU/Maintenance/DBInterface/manage.py -text
 LCU/Maintenance/DBInterface/monitoringdb/__init__.py -text
 LCU/Maintenance/DBInterface/monitoringdb/admin.py -text
 LCU/Maintenance/DBInterface/monitoringdb/apps.py -text
+LCU/Maintenance/DBInterface/monitoringdb/exceptions.py -text
 LCU/Maintenance/DBInterface/monitoringdb/migrations/__init__.py -text
 LCU/Maintenance/DBInterface/monitoringdb/models/__init__.py -text
 LCU/Maintenance/DBInterface/monitoringdb/models/componenterror.py -text
@@ -1822,6 +1823,7 @@ LCU/Maintenance/DBInterface/monitoringdb/views.py -text
 LCU/Maintenance/MDB_tools/CMakeLists.txt -text
 LCU/Maintenance/MDB_tools/cli/mdb_loader.py -text
 LCU/Maintenance/MDB_tools/cli/probe_mdb.py -text
+LCU/Maintenance/MDB_tools/cli/release_code.py -text
 LCU/Maintenance/__init__.py -text
 LCU/PPSTune/CMakeLists.txt -text
 LCU/PPSTune/MANIFEST.in -text
diff --git a/LCU/Maintenance/DBInterface/django_postgresql/requirements.txt b/LCU/Maintenance/DBInterface/django_postgresql/requirements.txt
index d9e9276da69..5d7195d1beb 100644
--- a/LCU/Maintenance/DBInterface/django_postgresql/requirements.txt
+++ b/LCU/Maintenance/DBInterface/django_postgresql/requirements.txt
@@ -4,4 +4,5 @@ djangorestframework
 django-polymorphic
 django-rest-polymorphic
 requests
-pandas
\ No newline at end of file
+pandas
+fabric
\ No newline at end of file
diff --git a/LCU/Maintenance/DBInterface/monitoringdb/exceptions.py b/LCU/Maintenance/DBInterface/monitoringdb/exceptions.py
new file mode 100644
index 00000000000..5faebb92203
--- /dev/null
+++ b/LCU/Maintenance/DBInterface/monitoringdb/exceptions.py
@@ -0,0 +1,8 @@
+
+
+class ItemAlreadyExists(Exception):
+    def __init__(self, instance, message=''):
+        self.instance_id = instance.id
+
+        message = 'Item %d was already present. %s'.format(self.instance_id, message)
+        super(ItemAlreadyExists, self).__init__(message)
\ No newline at end of file
diff --git a/LCU/Maintenance/DBInterface/monitoringdb/serializers/rtsm.py b/LCU/Maintenance/DBInterface/monitoringdb/serializers/rtsm.py
index fa5c14517b6..f3f1bd4938d 100644
--- a/LCU/Maintenance/DBInterface/monitoringdb/serializers/rtsm.py
+++ b/LCU/Maintenance/DBInterface/monitoringdb/serializers/rtsm.py
@@ -2,10 +2,12 @@ from ..models.rtsm import *
 from rest_framework import serializers
 import logging
 from django.db.transaction import atomic
-
+from ..exceptions import ItemAlreadyExists
+from django.db.models import ObjectDoesNotExist
 
 logger = logging.getLogger('serializers')
 
+
 class RTSMErrorSerializer(serializers.ModelSerializer):
     bad_spectrum = serializers.ListField(child=serializers.FloatField())
     average_spectrum = serializers.ListField(child=serializers.FloatField())
@@ -33,10 +35,9 @@ class RTSMObservationSerializer(serializers.ModelSerializer):
                 logger.info('rtsm not found inserting %s', validated_data)
             else:
                 logger.info('RTSM test for station %s started at %s is present already. Skipping insertion',
-                        start_time, station_name)
-
-                return element
-        except Exception as e:
+                            start_time, station_name)
+                raise ItemAlreadyExists(element)
+        except ObjectDoesNotExist as e:
             logger.info('rtsm not found inserting %s', validated_data)
         RTSMObservation_instance = RTSMObservation.objects.create(**validated_data)
         RTSMObservation_instance.save()
diff --git a/LCU/Maintenance/DBInterface/monitoringdb/serializers/stationtest.py b/LCU/Maintenance/DBInterface/monitoringdb/serializers/stationtest.py
index 2526dbaed67..2f7e0077f3a 100644
--- a/LCU/Maintenance/DBInterface/monitoringdb/serializers/stationtest.py
+++ b/LCU/Maintenance/DBInterface/monitoringdb/serializers/stationtest.py
@@ -5,6 +5,8 @@ from django.db.transaction import atomic
 import logging
 from .componenterrors_generic import ComponentErrorPolymorphicSerializer
 
+from ..exceptions import ItemAlreadyExists
+
 logger = logging.getLogger('serializers')
 
 
@@ -46,7 +48,7 @@ class StationTestSerializer(serializers.ModelSerializer):
                         start_time, station_name)
 
                 logger.debug('found item is %s', element)
-                return element
+                raise ItemAlreadyExists(element)
             else:
                 logger.info('station test not found inserting %s', validated_data)
         except ObjectDoesNotExist:
diff --git a/LCU/Maintenance/DBInterface/monitoringdb/views.py b/LCU/Maintenance/DBInterface/monitoringdb/views.py
index f44485734fb..10f3d9da553 100644
--- a/LCU/Maintenance/DBInterface/monitoringdb/views.py
+++ b/LCU/Maintenance/DBInterface/monitoringdb/views.py
@@ -15,6 +15,7 @@ from .serializers.tileerror import TileErrorPolymorphicSerializer
 from .station_test_raw_parser import parse_raw_station_test
 from .rtsm_test_raw_parser import parse_rtsm_test
 import logging
+from .exceptions import ItemAlreadyExists
 
 logger = logging.getLogger('views')
 
@@ -117,8 +118,15 @@ def insert_raw_station_test(request):
                 if parsed_content is None:
                     raise Exception('cannot parse test {}'.format(content))
                 logger.info('data parsed successfully for test')
+                station_test_ids = []
+                station_test_ids_already_present = []
                 for entry in parsed_content:
-                    StationTestSerializer().create(entry)
+                    try:
+                        item = StationTestSerializer().create(entry)
+                        station_test_ids.append(item.id)
+                    except ItemAlreadyExists as e:
+                        station_test_ids_already_present.append(e.instance_id)
+
             except Exception as e:
                 logger.exception("exception occurred while parsing raw station info %s: %s", request.data['content'], e)
                 return Response(exception=True,
@@ -130,7 +138,12 @@ def insert_raw_station_test(request):
                             data="the post message is not correct." +
                             " It has to be of the form \{'content':[RAWSTRING]\}", status=status.HTTP_400_BAD_REQUEST)
 
-        return Response(status=status.HTTP_200_OK)
+        return Response(status=status.HTTP_200_OK,
+                        data='Station tests inserted with ids {} \n'.format(station_test_ids) +
+                             'Station tests already present with ids {}'.format(
+                                station_test_ids_already_present
+                             )
+                        )
 
 @api_view(['POST'])
 def insert_raw_rtsm_test(request):
@@ -158,7 +171,12 @@ def insert_raw_rtsm_test(request):
                             entry['observation_id'],
                             entry['station_name'])
 
-                RTSMObservationSerializer().create(entry)
+                try:
+                    rtsm_item = RTSMObservationSerializer().create(entry)
+                    rtsm_id = rtsm_item.id
+                except ItemAlreadyExists as e:
+                    return Response(status=status.HTTP_200_OK,
+                                    data='RTSM test was already inserted with id {}\n'.format(e.instance_id))
                 logger.info('RTSM inserted successfully for obsid %d and station %s',
                             entry['observation_id'],
                             entry['station_name'])
@@ -176,4 +194,5 @@ def insert_raw_rtsm_test(request):
                                  " It has to be of the form \{'content':[RAWSTRING]\}",
                             status=status.HTTP_400_BAD_REQUEST)
 
-        return Response(status=status.HTTP_200_OK)
\ No newline at end of file
+        return Response(status=status.HTTP_200_OK,
+                        data='RTSM test has been inserted with id {}\n'.format(rtsm_id))
diff --git a/LCU/Maintenance/MDB_tools/cli/mdb_loader.py b/LCU/Maintenance/MDB_tools/cli/mdb_loader.py
index 2652c94e2e7..305bb215d94 100644
--- a/LCU/Maintenance/MDB_tools/cli/mdb_loader.py
+++ b/LCU/Maintenance/MDB_tools/cli/mdb_loader.py
@@ -62,7 +62,9 @@ def perform_request(args, content):
     json_content = json.dumps(content)
     logging.debug('request content %s', json_content)
     response = requests.post(full_address, data=content)
-    logging.info('response acknowledged: status code is %s', response.status_code)
+    logging.info('response acknowledged: status code is %s, reason %s, content %s', response.status_code,
+                                                                                    response.reason,
+                                                                                    response.content)
     if response.status_code == 200:
         return True
     else:
diff --git a/LCU/Maintenance/MDB_tools/cli/release_code.py b/LCU/Maintenance/MDB_tools/cli/release_code.py
new file mode 100644
index 00000000000..63dde612053
--- /dev/null
+++ b/LCU/Maintenance/MDB_tools/cli/release_code.py
@@ -0,0 +1,39 @@
+import logging
+import argparse
+import fabric
+import requests
+import sys
+import json
+from glob import glob
+import os
+import re
+
+from datetime import datetime
+
+logger = logging.getLogger('release_code')
+
+"""
+This program is meant to realise the code in the testing/production environment
+"""
+
+def setup_argument_parser():
+    parser = argparse.ArgumentParser(prog='probe_mdb')
+    parser.add_argument('path', help='format and path format of the installed code. es. /where/is/stored/*.dat')
+    parser.add_argument('-u', '--user', help='username', default=False)
+    parser.add_argument('--address', help='address of the server. default [localhost]:8000',
+                        default='lofarmonitortest.control.lofar')
+    parser.add_argument('--address', help='address of the server. default [localhost]:8000',
+                        default='lofarmonitortest.control.lofar')
+
+    parser.add_argument('remote_install_path', help='remote path where to install the code')
+    return parser
+
+
+def parse_arguments(parser):
+    return parser.parse_args()
+
+if __name__=='__main__':
+    logging.basicConfig(format="%(asctime)s %(levelname)s: %(message)s",level=logging.DEBUG)
+    parser = setup_argument_parser()
+    args = parse_arguments(parser)
+
-- 
GitLab