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