Skip to content
Snippets Groups Projects
Commit 7df1dd1b authored by Mattia Mancini's avatar Mattia Mancini
Browse files

OSB-44: implementing referee suggestions

parent ab1656f1
No related branches found
No related tags found
2 merge requests!89Monitoring maintenance Epic branch merge,!1Resolve OSB-13 "Monitoringmaintenance "
...@@ -7,8 +7,9 @@ COVERAGE_EXCLUDE_LINES="[report]\nexclude_lines = \n if __name__ == .__main__.\ ...@@ -7,8 +7,9 @@ COVERAGE_EXCLUDE_LINES="[report]\nexclude_lines = \n if __name__ == .__main__.\
if type "coverage@PYTHON_VERSION@" >& /dev/null; then if type "coverage@PYTHON_VERSION@" >& /dev/null; then
COVERAGE=coverage@PYTHON_VERSION@ COVERAGE=coverage@PYTHON_VERSION@
>&1 echo "Using ${COVERAGE}" >&1 echo "Using ${COVERAGE}"
elif type "python-coverage" >& /dev/null; then elif type "python@PYTHON_VERSION@-coverage" >& /dev/null; then
COVERAGE=python-coverage COVERAGE=python@PYTHON_VERSION@-coverage
>&1 echo "Using ${COVERAGE}"
else else
COVERAGE="" COVERAGE=""
>&1 echo "Cannot find coverage@PYTHON_VERSION@/python-coverage... Continuing without it" >&1 echo "Cannot find coverage@PYTHON_VERSION@/python-coverage... Continuing without it"
......
...@@ -21,88 +21,132 @@ def to_status(status_code): ...@@ -21,88 +21,132 @@ def to_status(status_code):
return STATUS_CODE_TO_STATUS.get(status_code, 'UNKNOWN') return STATUS_CODE_TO_STATUS.get(status_code, 'UNKNOWN')
class WinCCAntennaStatusManager(models.Manager): def _format_result(raw_query_result, antenna_type):
def latest_status_per_station_and_component_type(self, station, results = OrderedDict()
component_type, for row in raw_query_result:
to_date): status_description = OrderedDict()
antenna_type = to_antenna_type(component_type) results[str(row.antenna_id)] = status_description
if antenna_type: status_description['inserted_at'] = row.last_entry_timestamp
return self.latest_status_per_station_and_antenna_type(station, antenna_type, status_description['status'] = to_status(row.status_code)
to_date) status_description['status_code'] = row.status_code
else: status_description['reason'] = row.status_code_reason
return OrderedDict() status_description['last_modified'] = row.status_code_modified_at
@staticmethod if antenna_type is 'HBA':
def format_result(raw_query_result, antenna_type): elements = OrderedDict()
results = OrderedDict() status_description['elements'] = elements
for row in raw_query_result:
status_description = OrderedDict() for i in range(16):
results[str(row.antenna_id)] = status_description element_status = OrderedDict()
status_description['inserted_at'] = row.last_entry_timestamp elements[str(i)] = element_status
status_description['status'] = to_status(row.status_code)
status_description['status_code'] = row.status_code element_status['status_code'] = getattr(row, "element_%.02d" % i, )
status_description['reason'] = row.status_code_reason element_status['status'] = to_status(element_status['status_code'])
status_description['last_modified'] = row.status_code_modified_at
element_status['reason'] = getattr(row, "element_%.02d_reason" % i, )
if antenna_type is 'HBA': element_status['last_modified'] = getattr(row,
elements = OrderedDict() "element_%.02d_modified_at" % i, )
status_description['elements'] = elements return results
for i in range(16):
element_status = OrderedDict() def latest_status_per_station_and_antenna_type(queryset, station, antenna_type, to_date):
elements[str(i)] = element_status """
Retrieve the latest antenna statuses for a given station and antenna type
element_status['status_code'] = getattr(row, "element_%.02d" % i, ) :param queryset: source queryset
element_status['status'] = to_status(element_status['status_code']) :param station: station name
:type station: str
element_status['reason'] = getattr(row, "element_%.02d_reason" % i, ) :param component_type: component type name
element_status['last_modified'] = getattr(row, :type component_type: str
"element_%.02d_modified_at" % i, ) :param to_date: select the latest test before the to date
return results :type to_date: datetime.datetime
:return: the status of an antenna per antenna id
def latest_status_per_station_and_antenna_type(self, station, antenna_type, to_date): """
raw_results = super().raw(''' raw_results = queryset.raw('''
SELECT * SELECT *
FROM antenna_statuses master FROM antenna_statuses master
INNER JOIN ( INNER JOIN (
SELECT station, antenna_type, antenna_id, MAX("timestamp") last_entry_timestamp SELECT station, antenna_type, antenna_id, MAX("timestamp") last_entry_timestamp
FROM antenna_statuses FROM antenna_statuses
WHERE timestamp <= %s WHERE timestamp <= %s
GROUP BY station, antenna_type, antenna_id GROUP BY station, antenna_type, antenna_id
) slave ON master.station=slave.station AND master.antenna_type=slave.antenna_type AND master.antenna_id = slave.antenna_id AND last_entry_timestamp=master.timestamp ) slave ON master.station=slave.station AND master.antenna_type=slave.antenna_type AND master.antenna_id = slave.antenna_id AND last_entry_timestamp=master.timestamp
WHERE master.station=%s AND master.antenna_type=%s WHERE master.station=%s AND master.antenna_type=%s
''', [to_date, station.rstrip('C'), antenna_type]) ''', [to_date, station.rstrip('C'), antenna_type])
return WinCCAntennaStatusManager.format_result(raw_results, antenna_type) return _format_result(raw_results, antenna_type)
def latest_status_per_station_and_component_type_antenna_id(self, station,
component_type, def latest_status_per_station_and_component_type(queryset, station, component_type, to_date):
component_id, """
to_date): Retrieve the latest antenna statuses for a given station and component type
antenna_type = to_antenna_type(component_type) :param queryset: source queryset
if antenna_type: :param station: station name
return self.latest_status_per_station_and_antenna_type_antenna_id(station, antenna_type, :type station: str
component_id, :param component_type: component type name
to_date) :type component_type: str
else: :param to_date: select the latest test before the to date
return OrderedDict() :type to_date: datetime.datetime
:return: the status of an antenna per antenna id
def latest_status_per_station_and_antenna_type_antenna_id(self, station, """
antenna_type, antenna_type = to_antenna_type(component_type)
antenna_id, if antenna_type:
to_date): return latest_status_per_station_and_antenna_type(queryset, station, antenna_type,
raw_results = super().raw(''' to_date)
SELECT * else:
FROM antenna_statuses master return OrderedDict()
INNER JOIN (
SELECT station, antenna_type, antenna_id, MAX("timestamp") last_entry_timestamp
FROM antenna_statuses def latest_status_per_station_and_component_type_antenna_id(queryset, station,
WHERE timestamp <= %s component_type,
GROUP BY station, antenna_type, antenna_id component_id,
) slave ON master.station=slave.station AND master.antenna_type=slave.antenna_type AND master.antenna_id = slave.antenna_id AND last_entry_timestamp=master.timestamp to_date):
WHERE master.station=%s AND master.antenna_type=%s AND master.antenna_id=%s """
''', [to_date, station.rstrip('C'), antenna_type, antenna_id]) Retrieve the latest antenna statuses for a given station and component type and id
return WinCCAntennaStatusManager.format_result(raw_results, antenna_type) :param queryset: source queryset
:param station: station name
:type station: str
:param component_type: component type name
:type component_type: str
:param to_date: select the latest test before the to date
:type to_date: datetime.datetime
:return: the status of an antenna per antenna id
"""
antenna_type = to_antenna_type(component_type)
if antenna_type:
return latest_status_per_station_and_antenna_type_antenna_id(queryset, station, antenna_type,
component_id,
to_date)
else:
return OrderedDict()
def latest_status_per_station_and_antenna_type_antenna_id(queryset, station,
antenna_type,
antenna_id,
to_date):
"""
Retrieve the latest antenna statuses for a given station and antenna type and id
:param queryset: source queryset
:param station: station name
:type station: str
:param component_type: component type name
:type component_type: str
:param to_date: select the latest test before the to date
:type to_date: datetime.datetime
:return: the status of an antenna per antenna id
"""
raw_results = queryset.raw('''
SELECT *
FROM antenna_statuses master
INNER JOIN (
SELECT station, antenna_type, antenna_id, MAX("timestamp") last_entry_timestamp
FROM antenna_statuses
WHERE timestamp <= %s
GROUP BY station, antenna_type, antenna_id
) slave ON master.station=slave.station AND master.antenna_type=slave.antenna_type AND master.antenna_id = slave.antenna_id AND last_entry_timestamp=master.timestamp
WHERE master.station=%s AND master.antenna_type=%s AND master.antenna_id=%s
''', [to_date, station.rstrip('C'), antenna_type, antenna_id])
return _format_result(raw_results, antenna_type)
class WinCCAntennaStatus(models.Model): class WinCCAntennaStatus(models.Model):
...@@ -112,7 +156,6 @@ class WinCCAntennaStatus(models.Model): ...@@ -112,7 +156,6 @@ class WinCCAntennaStatus(models.Model):
indexes = [ indexes = [
models.Index(fields=['station', 'antenna_type', 'antenna_id', 'timestamp']) models.Index(fields=['station', 'antenna_type', 'antenna_id', 'timestamp'])
] ]
objects = WinCCAntennaStatusManager()
timestamp = models.DateTimeField(auto_now_add=True) timestamp = models.DateTimeField(auto_now_add=True)
station = models.CharField(max_length=10, default=None) station = models.CharField(max_length=10, default=None)
......
...@@ -13,7 +13,9 @@ from lofar.maintenance.monitoringdb.models.rtsm import RTSMErrorSummary, MODE_TO ...@@ -13,7 +13,9 @@ from lofar.maintenance.monitoringdb.models.rtsm import RTSMErrorSummary, MODE_TO
from lofar.maintenance.monitoringdb.models.rtsm import RTSMObservation from lofar.maintenance.monitoringdb.models.rtsm import RTSMObservation
from lofar.maintenance.monitoringdb.models.station import Station from lofar.maintenance.monitoringdb.models.station import Station
from lofar.maintenance.monitoringdb.models.station_test import StationTest from lofar.maintenance.monitoringdb.models.station_test import StationTest
from lofar.maintenance.monitoringdb.models.wincc import WinCCAntennaStatus from lofar.maintenance.monitoringdb.models.wincc import WinCCAntennaStatus,\
latest_status_per_station_and_component_type,\
latest_status_per_station_and_component_type_antenna_id
from rest_framework import status from rest_framework import status
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.reverse import reverse from rest_framework.reverse import reverse
...@@ -814,11 +816,12 @@ class ControllerStationComponentErrors(ValidableReadOnlyView): ...@@ -814,11 +816,12 @@ class ControllerStationComponentErrors(ValidableReadOnlyView):
test_summary['start_date'] = station_test.start_datetime test_summary['start_date'] = station_test.start_datetime
test_summary['end_date'] = station_test.end_datetime test_summary['end_date'] = station_test.end_datetime
component_errors_dict = OrderedDict() component_errors_dict = OrderedDict()
antenna_statuses = \ antenna_statuses = latest_status_per_station_and_component_type(
WinCCAntennaStatus.objects. \ WinCCAntennaStatus.objects,
latest_status_per_station_and_component_type(self.station_name, self.station_name,
failing_component_type, failing_component_type,
to_date=station_test.end_datetime) to_date=station_test.end_datetime)
test_summary['status'] = antenna_statuses test_summary['status'] = antenna_statuses
test_summary['component_errors'] = component_errors_dict test_summary['component_errors'] = component_errors_dict
component_errors = station_test.component_errors \ component_errors = station_test.component_errors \
...@@ -862,11 +865,11 @@ class ControllerStationComponentErrors(ValidableReadOnlyView): ...@@ -862,11 +865,11 @@ class ControllerStationComponentErrors(ValidableReadOnlyView):
rtsm_summary['start_date'] = rtsm_observation.start_datetime rtsm_summary['start_date'] = rtsm_observation.start_datetime
rtsm_summary['end_date'] = rtsm_observation.end_datetime rtsm_summary['end_date'] = rtsm_observation.end_datetime
rtsm_summary['observation_id'] = rtsm_observation.observation_id rtsm_summary['observation_id'] = rtsm_observation.observation_id
antenna_statuses = \ antenna_statuses = latest_status_per_station_and_component_type(
WinCCAntennaStatus.objects. \ WinCCAntennaStatus.objects,
latest_status_per_station_and_component_type(self.station_name, self.station_name,
component_name, component_name,
to_date=rtsm_observation.end_datetime) to_date=rtsm_observation.end_datetime)
rtsm_summary['status'] = antenna_statuses rtsm_summary['status'] = antenna_statuses
component_errors_dict = OrderedDict() component_errors_dict = OrderedDict()
rtsm_summary['component_errors'] = component_errors_dict rtsm_summary['component_errors'] = component_errors_dict
...@@ -943,8 +946,9 @@ class ControllerStationComponentErrors(ValidableReadOnlyView): ...@@ -943,8 +946,9 @@ class ControllerStationComponentErrors(ValidableReadOnlyView):
payload[component_type]['errors'] = sorted(station_test_errors_per_type + rtsm_errors_per_type, payload[component_type]['errors'] = sorted(station_test_errors_per_type + rtsm_errors_per_type,
key=lambda item: item['start_date'], reverse=True) key=lambda item: item['start_date'], reverse=True)
payload[component_type]['current_status'] = WinCCAntennaStatus.objects. \ payload[component_type]['current_status'] =\
latest_status_per_station_and_component_type(self.station_name, latest_status_per_station_and_component_type(WinCCAntennaStatus.objects,
self.station_name,
component_type, component_type,
to_date=datetime.datetime.now()) to_date=datetime.datetime.now())
return Response(status=status.HTTP_200_OK, data=payload) return Response(status=status.HTTP_200_OK, data=payload)
...@@ -1028,13 +1032,13 @@ class ControllerStationComponentElementErrors(ValidableReadOnlyView): ...@@ -1028,13 +1032,13 @@ class ControllerStationComponentElementErrors(ValidableReadOnlyView):
end_date=observation['end_datetime'], end_date=observation['end_datetime'],
test_type='R', test_type='R',
component_errors=dict()) component_errors=dict())
antenna_statuses = \ antenna_statuses = latest_status_per_station_and_component_type_antenna_id(
WinCCAntennaStatus.objects. \ WinCCAntennaStatus.objects,
latest_status_per_station_and_component_type_antenna_id(self.station_name, self.station_name,
self.component_type, self.component_type,
self.antenna_id, self.antenna_id,
to_date=observation[ to_date=observation[
'end_datetime']) 'end_datetime'])
entry['status'] = antenna_statuses entry['status'] = antenna_statuses
...@@ -1055,11 +1059,12 @@ class ControllerStationComponentElementErrors(ValidableReadOnlyView): ...@@ -1055,11 +1059,12 @@ class ControllerStationComponentElementErrors(ValidableReadOnlyView):
end_date=station_test['end_datetime'], end_date=station_test['end_datetime'],
test_type='S', test_type='S',
component_errors=dict()) component_errors=dict())
antenna_statuses = WinCCAntennaStatus.objects. \ antenna_statuses = latest_status_per_station_and_component_type_antenna_id(
latest_status_per_station_and_component_type_antenna_id(self.station_name, WinCCAntennaStatus.objects,
self.component_type, self.station_name,
self.antenna_id, self.component_type,
to_date=station_test['end_datetime']) self.antenna_id,
to_date=station_test['end_datetime'])
entry['status'] = antenna_statuses entry['status'] = antenna_statuses
result.append(entry) result.append(entry)
...@@ -1100,13 +1105,13 @@ class ControllerStationComponentElementErrors(ValidableReadOnlyView): ...@@ -1100,13 +1105,13 @@ class ControllerStationComponentElementErrors(ValidableReadOnlyView):
test_type='R', test_type='R',
component_errors=dict()) component_errors=dict())
antenna_statuses = \ antenna_statuses = latest_status_per_station_and_component_type_antenna_id(
WinCCAntennaStatus.objects. \ WinCCAntennaStatus.objects,
latest_status_per_station_and_component_type_antenna_id(self.station_name, self.station_name,
self.component_type, self.component_type,
self.antenna_id, self.antenna_id,
to_date=item[ to_date=item[
'observation__end_datetime']) 'observation__end_datetime'])
errors[observation_pk]['status'] = antenna_statuses errors[observation_pk]['status'] = antenna_statuses
...@@ -1149,11 +1154,12 @@ class ControllerStationComponentElementErrors(ValidableReadOnlyView): ...@@ -1149,11 +1154,12 @@ class ControllerStationComponentElementErrors(ValidableReadOnlyView):
end_date=component_error.station_test.end_datetime, end_date=component_error.station_test.end_datetime,
test_type='S', test_type='S',
component_errors=dict()) component_errors=dict())
antenna_statuses = WinCCAntennaStatus.objects.\ antenna_statuses = latest_status_per_station_and_component_type_antenna_id(
latest_status_per_station_and_component_type_antenna_id(self.station_name, WinCCAntennaStatus.objects,
self.component_type, self.station_name,
self.antenna_id, self.component_type,
to_date=component_error.station_test.end_datetime) self.antenna_id,
to_date=component_error.station_test.end_datetime)
errors[station_test_pk]['status'] = antenna_statuses errors[station_test_pk]['status'] = antenna_statuses
...@@ -1188,10 +1194,11 @@ class ControllerStationComponentElementErrors(ValidableReadOnlyView): ...@@ -1188,10 +1194,11 @@ class ControllerStationComponentElementErrors(ValidableReadOnlyView):
payload = OrderedDict() payload = OrderedDict()
payload['errors'] = combined_and_sorted payload['errors'] = combined_and_sorted
payload['current_status'] = WinCCAntennaStatus.objects.\ payload['current_status'] = latest_status_per_station_and_component_type_antenna_id(
latest_status_per_station_and_component_type_antenna_id(self.station_name, WinCCAntennaStatus.objects,
self.component_type, self.station_name,
self.antenna_id, self.component_type,
to_date=datetime.datetime.now()) self.antenna_id,
to_date=datetime.datetime.now())
return Response(status=status.HTTP_200_OK, data=payload) return Response(status=status.HTTP_200_OK, data=payload)
from django.test import TestCase from django.test import TestCase
from lofar.maintenance.monitoringdb.models.wincc import WinCCAntennaStatus from lofar.maintenance.monitoringdb.models.wincc import WinCCAntennaStatus,\
latest_status_per_station_and_component_type_antenna_id,\
latest_status_per_station_and_component_type
from datetime import datetime from datetime import datetime
import django.db.utils as db_utils import django.db.utils as db_utils
...@@ -78,11 +80,20 @@ class WinCCAntennaStatusTest(TestCase): ...@@ -78,11 +80,20 @@ class WinCCAntennaStatusTest(TestCase):
order_by('-timestamp').first() order_by('-timestamp').first()
self.assertGreaterEqual(saved_entity.timestamp, before_last_insertion_timestamp) self.assertGreaterEqual(saved_entity.timestamp, before_last_insertion_timestamp)
result = WinCCAntennaStatus.objects.\ result = latest_status_per_station_and_component_type(WinCCAntennaStatus.objects,
latest_status_per_station_and_component_type('CS001', 'CS001',
'HBA', 'HBA',
datetime.now()) datetime.now())
self.assertIn('1', result) self.assertIn('1', result)
self.assertIn('2', result) self.assertIn('2', result)
self.assertGreaterEqual(result['1']["inserted_at"], before_last_insertion_timestamp) self.assertGreaterEqual(result['1']["inserted_at"], before_last_insertion_timestamp)
result = latest_status_per_station_and_component_type_antenna_id(WinCCAntennaStatus.objects,
'CS001',
'HBA',
1,
datetime.now())
self.assertIn('1', result)
self.assertNotIn('2', result)
self.assertGreaterEqual(result['1']["inserted_at"], before_last_insertion_timestamp)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment