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__.\
if type "coverage@PYTHON_VERSION@" >& /dev/null; then
COVERAGE=coverage@PYTHON_VERSION@
>&1 echo "Using ${COVERAGE}"
elif type "python-coverage" >& /dev/null; then
COVERAGE=python-coverage
elif type "python@PYTHON_VERSION@-coverage" >& /dev/null; then
COVERAGE=python@PYTHON_VERSION@-coverage
>&1 echo "Using ${COVERAGE}"
else
COVERAGE=""
>&1 echo "Cannot find coverage@PYTHON_VERSION@/python-coverage... Continuing without it"
......
......@@ -21,88 +21,132 @@ def to_status(status_code):
return STATUS_CODE_TO_STATUS.get(status_code, 'UNKNOWN')
class WinCCAntennaStatusManager(models.Manager):
def latest_status_per_station_and_component_type(self, station,
component_type,
to_date):
antenna_type = to_antenna_type(component_type)
if antenna_type:
return self.latest_status_per_station_and_antenna_type(station, antenna_type,
to_date)
else:
return OrderedDict()
@staticmethod
def format_result(raw_query_result, antenna_type):
results = OrderedDict()
for row in raw_query_result:
status_description = OrderedDict()
results[str(row.antenna_id)] = status_description
status_description['inserted_at'] = row.last_entry_timestamp
status_description['status'] = to_status(row.status_code)
status_description['status_code'] = row.status_code
status_description['reason'] = row.status_code_reason
status_description['last_modified'] = row.status_code_modified_at
if antenna_type is 'HBA':
elements = OrderedDict()
status_description['elements'] = elements
for i in range(16):
element_status = OrderedDict()
elements[str(i)] = element_status
element_status['status_code'] = getattr(row, "element_%.02d" % i, )
element_status['status'] = to_status(element_status['status_code'])
element_status['reason'] = getattr(row, "element_%.02d_reason" % i, )
element_status['last_modified'] = getattr(row,
"element_%.02d_modified_at" % i, )
return results
def latest_status_per_station_and_antenna_type(self, station, antenna_type, to_date):
raw_results = super().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
''', [to_date, station.rstrip('C'), antenna_type])
return WinCCAntennaStatusManager.format_result(raw_results, antenna_type)
def latest_status_per_station_and_component_type_antenna_id(self, station,
component_type,
component_id,
to_date):
antenna_type = to_antenna_type(component_type)
if antenna_type:
return self.latest_status_per_station_and_antenna_type_antenna_id(station, antenna_type,
component_id,
to_date)
else:
return OrderedDict()
def latest_status_per_station_and_antenna_type_antenna_id(self, station,
antenna_type,
antenna_id,
to_date):
raw_results = super().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 WinCCAntennaStatusManager.format_result(raw_results, antenna_type)
def _format_result(raw_query_result, antenna_type):
results = OrderedDict()
for row in raw_query_result:
status_description = OrderedDict()
results[str(row.antenna_id)] = status_description
status_description['inserted_at'] = row.last_entry_timestamp
status_description['status'] = to_status(row.status_code)
status_description['status_code'] = row.status_code
status_description['reason'] = row.status_code_reason
status_description['last_modified'] = row.status_code_modified_at
if antenna_type is 'HBA':
elements = OrderedDict()
status_description['elements'] = elements
for i in range(16):
element_status = OrderedDict()
elements[str(i)] = element_status
element_status['status_code'] = getattr(row, "element_%.02d" % i, )
element_status['status'] = to_status(element_status['status_code'])
element_status['reason'] = getattr(row, "element_%.02d_reason" % i, )
element_status['last_modified'] = getattr(row,
"element_%.02d_modified_at" % i, )
return results
def latest_status_per_station_and_antenna_type(queryset, station, antenna_type, to_date):
"""
Retrieve the latest antenna statuses for a given station and 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
"""
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
''', [to_date, station.rstrip('C'), antenna_type])
return _format_result(raw_results, antenna_type)
def latest_status_per_station_and_component_type(queryset, station, component_type, to_date):
"""
Retrieve the latest antenna statuses for a given station and component 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(queryset, station, antenna_type,
to_date)
else:
return OrderedDict()
def latest_status_per_station_and_component_type_antenna_id(queryset, station,
component_type,
component_id,
to_date):
"""
Retrieve the latest antenna statuses for a given station and component 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
"""
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):
......@@ -112,7 +156,6 @@ class WinCCAntennaStatus(models.Model):
indexes = [
models.Index(fields=['station', 'antenna_type', 'antenna_id', 'timestamp'])
]
objects = WinCCAntennaStatusManager()
timestamp = models.DateTimeField(auto_now_add=True)
station = models.CharField(max_length=10, default=None)
......
......@@ -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.station import Station
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.response import Response
from rest_framework.reverse import reverse
......@@ -814,11 +816,12 @@ class ControllerStationComponentErrors(ValidableReadOnlyView):
test_summary['start_date'] = station_test.start_datetime
test_summary['end_date'] = station_test.end_datetime
component_errors_dict = OrderedDict()
antenna_statuses = \
WinCCAntennaStatus.objects. \
latest_status_per_station_and_component_type(self.station_name,
failing_component_type,
to_date=station_test.end_datetime)
antenna_statuses = latest_status_per_station_and_component_type(
WinCCAntennaStatus.objects,
self.station_name,
failing_component_type,
to_date=station_test.end_datetime)
test_summary['status'] = antenna_statuses
test_summary['component_errors'] = component_errors_dict
component_errors = station_test.component_errors \
......@@ -862,11 +865,11 @@ class ControllerStationComponentErrors(ValidableReadOnlyView):
rtsm_summary['start_date'] = rtsm_observation.start_datetime
rtsm_summary['end_date'] = rtsm_observation.end_datetime
rtsm_summary['observation_id'] = rtsm_observation.observation_id
antenna_statuses = \
WinCCAntennaStatus.objects. \
latest_status_per_station_and_component_type(self.station_name,
component_name,
to_date=rtsm_observation.end_datetime)
antenna_statuses = latest_status_per_station_and_component_type(
WinCCAntennaStatus.objects,
self.station_name,
component_name,
to_date=rtsm_observation.end_datetime)
rtsm_summary['status'] = antenna_statuses
component_errors_dict = OrderedDict()
rtsm_summary['component_errors'] = component_errors_dict
......@@ -943,8 +946,9 @@ class ControllerStationComponentErrors(ValidableReadOnlyView):
payload[component_type]['errors'] = sorted(station_test_errors_per_type + rtsm_errors_per_type,
key=lambda item: item['start_date'], reverse=True)
payload[component_type]['current_status'] = WinCCAntennaStatus.objects. \
latest_status_per_station_and_component_type(self.station_name,
payload[component_type]['current_status'] =\
latest_status_per_station_and_component_type(WinCCAntennaStatus.objects,
self.station_name,
component_type,
to_date=datetime.datetime.now())
return Response(status=status.HTTP_200_OK, data=payload)
......@@ -1028,13 +1032,13 @@ class ControllerStationComponentElementErrors(ValidableReadOnlyView):
end_date=observation['end_datetime'],
test_type='R',
component_errors=dict())
antenna_statuses = \
WinCCAntennaStatus.objects. \
latest_status_per_station_and_component_type_antenna_id(self.station_name,
self.component_type,
self.antenna_id,
to_date=observation[
'end_datetime'])
antenna_statuses = latest_status_per_station_and_component_type_antenna_id(
WinCCAntennaStatus.objects,
self.station_name,
self.component_type,
self.antenna_id,
to_date=observation[
'end_datetime'])
entry['status'] = antenna_statuses
......@@ -1055,11 +1059,12 @@ class ControllerStationComponentElementErrors(ValidableReadOnlyView):
end_date=station_test['end_datetime'],
test_type='S',
component_errors=dict())
antenna_statuses = WinCCAntennaStatus.objects. \
latest_status_per_station_and_component_type_antenna_id(self.station_name,
self.component_type,
self.antenna_id,
to_date=station_test['end_datetime'])
antenna_statuses = latest_status_per_station_and_component_type_antenna_id(
WinCCAntennaStatus.objects,
self.station_name,
self.component_type,
self.antenna_id,
to_date=station_test['end_datetime'])
entry['status'] = antenna_statuses
result.append(entry)
......@@ -1100,13 +1105,13 @@ class ControllerStationComponentElementErrors(ValidableReadOnlyView):
test_type='R',
component_errors=dict())
antenna_statuses = \
WinCCAntennaStatus.objects. \
latest_status_per_station_and_component_type_antenna_id(self.station_name,
self.component_type,
self.antenna_id,
to_date=item[
'observation__end_datetime'])
antenna_statuses = latest_status_per_station_and_component_type_antenna_id(
WinCCAntennaStatus.objects,
self.station_name,
self.component_type,
self.antenna_id,
to_date=item[
'observation__end_datetime'])
errors[observation_pk]['status'] = antenna_statuses
......@@ -1149,11 +1154,12 @@ class ControllerStationComponentElementErrors(ValidableReadOnlyView):
end_date=component_error.station_test.end_datetime,
test_type='S',
component_errors=dict())
antenna_statuses = WinCCAntennaStatus.objects.\
latest_status_per_station_and_component_type_antenna_id(self.station_name,
self.component_type,
self.antenna_id,
to_date=component_error.station_test.end_datetime)
antenna_statuses = latest_status_per_station_and_component_type_antenna_id(
WinCCAntennaStatus.objects,
self.station_name,
self.component_type,
self.antenna_id,
to_date=component_error.station_test.end_datetime)
errors[station_test_pk]['status'] = antenna_statuses
......@@ -1188,10 +1194,11 @@ class ControllerStationComponentElementErrors(ValidableReadOnlyView):
payload = OrderedDict()
payload['errors'] = combined_and_sorted
payload['current_status'] = WinCCAntennaStatus.objects.\
latest_status_per_station_and_component_type_antenna_id(self.station_name,
self.component_type,
self.antenna_id,
to_date=datetime.datetime.now())
payload['current_status'] = latest_status_per_station_and_component_type_antenna_id(
WinCCAntennaStatus.objects,
self.station_name,
self.component_type,
self.antenna_id,
to_date=datetime.datetime.now())
return Response(status=status.HTTP_200_OK, data=payload)
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
import django.db.utils as db_utils
......@@ -78,11 +80,20 @@ class WinCCAntennaStatusTest(TestCase):
order_by('-timestamp').first()
self.assertGreaterEqual(saved_entity.timestamp, before_last_insertion_timestamp)
result = WinCCAntennaStatus.objects.\
latest_status_per_station_and_component_type('CS001',
'HBA',
datetime.now())
result = latest_status_per_station_and_component_type(WinCCAntennaStatus.objects,
'CS001',
'HBA',
datetime.now())
self.assertIn('1', result)
self.assertIn('2', result)
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