diff --git a/.gitattributes b/.gitattributes index ea2f19e498d22b1498d79537649c9e59698f6430..2a5198245f4fe7be1b0b23f7acc6c822018cd011 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1795,6 +1795,7 @@ LCU/Maintenance/DBInterface/django_postgresql/wsgi.py -text LCU/Maintenance/DBInterface/manage.py -text LCU/Maintenance/DBInterface/monitoringdb/__init__.py -text LCU/Maintenance/DBInterface/monitoringdb/admin.py -text +LCU/Maintenance/DBInterface/monitoringdb/api_swagger_description/swagger_api_version_0.1.yaml -text LCU/Maintenance/DBInterface/monitoringdb/apps.py -text LCU/Maintenance/DBInterface/monitoringdb/exceptions.py -text LCU/Maintenance/DBInterface/monitoringdb/migrations/__init__.py -text diff --git a/LCU/Maintenance/DBInterface/monitoringdb/api_swagger_description/swagger_api_version_0.1.yaml b/LCU/Maintenance/DBInterface/monitoringdb/api_swagger_description/swagger_api_version_0.1.yaml new file mode 100644 index 0000000000000000000000000000000000000000..fb6e9649c330f7644fd59c7786de62cbce23ff8a --- /dev/null +++ b/LCU/Maintenance/DBInterface/monitoringdb/api_swagger_description/swagger_api_version_0.1.yaml @@ -0,0 +1,1185 @@ +swagger: '2.0' +info: + title: Maintenance API + description: '' + version: '' +host: '127.0.0.1:8000' +schemes: + - http +paths: + /rtsm/: + get: + operationId: rtsm_list + description: list latest RTSM tests output + summary: list latest RTSM tests results + responses: + '200': + description: '' + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + type: integer + - name: page_size + required: false + in: query + description: Number of results to return per page. + type: integer + tags: + - rtsm + /rtsm/errors/: + get: + operationId: rtsm_errors_list + description: list latest RTSM errors + summary: list latest RTSM errors + responses: + '200': + description: '' + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + type: integer + - name: page_size + required: false + in: query + description: Number of results to return per page. + type: integer + tags: + - rtsm + '/rtsm/errors/{id}/': + get: + operationId: rtsm_errors_read + responses: + '200': + description: '' + parameters: + - name: id + required: true + in: path + description: A unique integer value identifying this rtsm error. + type: integer + tags: + - rtsm + /rtsm/errors_detailed/: + get: + operationId: rtsm_errors_detailed_list + responses: + '200': + description: '' + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + type: integer + - name: page_size + required: false + in: query + description: Number of results to return per page. + type: integer + tags: + - rtsm + '/rtsm/errors_detailed/{id}/': + get: + operationId: rtsm_errors_detailed_read + responses: + '200': + description: '' + parameters: + - name: id + required: true + in: path + description: A unique integer value identifying this rtsm error. + type: integer + tags: + - rtsm + /rtsm/insert_raw: + post: + operationId: rtsm_insert_raw_create + responses: + '201': + description: '' + parameters: [] + description: >- + This function is meant to parse a request of the form + + { + + "content": "[RTSM TEST RAW TEXT]" station_name: "station_name" + + } + + parse the content field and create all the rtsm_test entity related into + the database + + :param request: HTTP request + + :return: + summary: This function is meant to parse a request of the form + tags: + - rtsm + /rtsm/summary/: + get: + operationId: rtsm_summary_list + responses: + '200': + description: '' + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + type: integer + - name: page_size + required: false + in: query + description: Number of results to return per page. + type: integer + tags: + - rtsm + '/rtsm/summary/{id}/': + get: + operationId: rtsm_summary_read + responses: + '200': + description: '' + parameters: + - name: id + required: true + in: path + description: A unique integer value identifying this rtsm observation. + type: integer + tags: + - rtsm + '/rtsm/{id}/': + get: + operationId: rtsm_read + responses: + '200': + description: '' + parameters: + - name: id + required: true + in: path + description: A unique integer value identifying this rtsm observation. + type: integer + tags: + - rtsm + /stationtests/component/: + get: + operationId: stationtests_component_list + description: list of component that experienced a negative station test + summary: list of component that experienced a negative station test + responses: + '200': + description: '' + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + type: integer + - name: page_size + required: false + in: query + description: Number of results to return per page. + type: integer + - name: type + required: false + in: query + description: Type of error + type: string + - name: component_id + required: false + in: query + description: Id of the component + type: number + - name: station + required: false + in: query + description: station name of the component + type: string + tags: + - stationtests + '/stationtests/component/{id}/': + get: + operationId: stationtests_component_read + description: select a specific component with a given database id + summary: select a specific component with a given database id + responses: + '200': + description: '' + parameters: + - name: id + required: true + in: path + description: A unique integer value identifying this component. + type: integer + - name: type + required: false + in: query + description: Type of error + type: string + - name: component_id + required: false + in: query + description: id of the component + type: number + - name: station + required: false + in: query + description: station name of the component + type: string + tags: + - stationtests + /stationtests/component_error/: + get: + operationId: stationtests_component_error_list + summary: list the latest component error + responses: + '200': + description: '' + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + type: integer + - name: page_size + required: false + in: query + description: Number of results to return per page. + type: integer + - name: component_id + required: false + in: query + description: id of the component + type: number + - name: component_type + required: false + in: query + description: type of the component + type: string + - name: station_name + required: false + in: query + description: name of the station + type: string + - name: station_type + required: false + in: query + description: type of the station + type: string + - name: from_date + required: false + in: query + description: select errors from date + type: string + - name: to_date + required: false + in: query + description: select errors to date + type: string + - name: type + required: false + in: query + description: select error type + type: string + tags: + - stationtests + '/stationtests/component_error/{id}/': + get: + operationId: stationtests_component_error_read + summary: select a specific component error id + description: select a specific component error id + responses: + '200': + description: '' + parameters: + - name: id + required: true + in: path + description: A unique integer value identifying this component error. + type: integer + - name: page + required: false + in: query + description: A page number within the paginated result set. + type: integer + - name: page_size + required: false + in: query + description: Number of results to return per page. + type: integer + - name: component_id + required: false + in: query + description: id of the component + type: number + - name: component_type + required: false + in: query + description: type of the component + type: string + - name: station_name + required: false + in: query + description: name of the station + type: string + - name: station_type + required: false + in: query + description: type of the station + type: string + - name: from_date + required: false + in: query + description: select errors from date + type: string + - name: to_date + required: false + in: query + description: select errors to date + type: string + - name: type + required: false + in: query + description: select error type + type: string + tags: + - stationtests + /stationtests/element/: + get: + operationId: stationtests_element_list + summary: list of the element which have experienced an error + responses: + '200': + description: '' + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + type: integer + - name: page_size + required: false + in: query + description: Number of results to return per page. + type: integer + - name: component + required: false + in: query + description: id of the component + type: string + - name: element_id + required: false + in: query + description: id of the element + type: number + tags: + - stationtests + '/stationtests/element/{id}/': + get: + operationId: stationtests_element_read + summary: returns a specific element with the given id + responses: + '200': + description: '' + parameters: + - name: id + required: true + in: path + description: A unique integer value identifying this element. + type: integer + - name: component + required: false + in: query + description: '' + type: string + - name: element_id + required: false + in: query + description: '' + type: number + tags: + - stationtests + /stationtests/element_error/: + get: + operationId: stationtests_element_error_list + summary: list of the element which have experienced an error + responses: + '200': + description: '' + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + type: integer + - name: page_size + required: false + in: query + description: Number of results to return per page. + type: integer + - name: element + required: false + in: query + description: '' + type: string + - name: component_error + required: false + in: query + description: '' + type: string + - name: station_test + required: false + in: query + description: '' + type: string + - name: type + required: false + in: query + description: '' + type: string + - name: details + required: false + in: query + description: '' + type: string + tags: + - stationtests + '/stationtests/element_error/{id}/': + get: + operationId: stationtests_element_error_read + summary: returns a specific element with the given id + responses: + '200': + description: '' + parameters: + - name: id + required: true + in: path + description: A unique integer value identifying this element error. + type: integer + - name: element + required: false + in: query + description: '' + type: string + - name: component_error + required: false + in: query + description: '' + type: string + - name: station_test + required: false + in: query + description: '' + type: string + - name: type + required: false + in: query + description: '' + type: string + - name: details + required: false + in: query + description: '' + type: string + tags: + - stationtests + /stationtests/error_details/: + get: + operationId: stationtests_error_details_list + summary: list all the error details + description: list all the error details for either a component or an element error + + responses: + '200': + description: '' + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + type: integer + - name: page_size + required: false + in: query + description: Number of results to return per page. + type: integer + - name: x + required: false + in: query + description: '' + type: string + - name: 'y' + required: false + in: query + description: '' + type: string + - name: xval + required: false + in: query + description: '' + type: number + - name: yval + required: false + in: query + description: '' + type: number + - name: xoff + required: false + in: query + description: '' + type: number + - name: yoff + required: false + in: query + description: '' + type: number + - name: xval_no_delay + required: false + in: query + description: '' + type: number + - name: yval_no_delay + required: false + in: query + description: '' + type: number + - name: xsb_no_delay + required: false + in: query + description: '' + type: number + - name: ysb_no_delay + required: false + in: query + description: '' + type: number + - name: xref_no_delay + required: false + in: query + description: '' + type: number + - name: yref_no_delay + required: false + in: query + description: '' + type: number + - name: xref + required: false + in: query + description: '' + type: number + - name: yref + required: false + in: query + description: '' + type: number + - name: xsb_full_delay + required: false + in: query + description: '' + type: number + - name: ysb_full_delay + required: false + in: query + description: '' + type: number + - name: xref_full_delay + required: false + in: query + description: '' + type: number + - name: yref_full_delay + required: false + in: query + description: '' + type: number + - name: xval_full_delay + required: false + in: query + description: '' + type: number + - name: yval_full_delay + required: false + in: query + description: '' + type: number + - name: xlimit + required: false + in: query + description: '' + type: number + - name: ylimit + required: false + in: query + description: '' + type: number + - name: xproc + required: false + in: query + description: '' + type: number + - name: yproc + required: false + in: query + description: '' + type: number + - name: xdiff + required: false + in: query + description: '' + type: number + - name: ydiff + required: false + in: query + description: '' + type: number + - name: xmean + required: false + in: query + description: '' + type: number + - name: ymean + required: false + in: query + description: '' + type: number + - name: tp + required: false + in: query + description: '' + type: string + - name: mp + required: false + in: query + description: '' + type: string + - name: ap + required: false + in: query + description: '' + type: string + - name: bp + required: false + in: query + description: '' + type: string + - name: mp0 + required: false + in: query + description: '' + type: string + - name: mp1 + required: false + in: query + description: '' + type: string + - name: mp2 + required: false + in: query + description: '' + type: string + - name: mp3 + required: false + in: query + description: '' + type: string + - name: ap0 + required: false + in: query + description: '' + type: string + - name: ap1 + required: false + in: query + description: '' + type: string + - name: ap2 + required: false + in: query + description: '' + type: string + - name: ap3 + required: false + in: query + description: '' + type: string + - name: pcb + required: false + in: query + description: '' + type: string + - name: rcu_5_0v + required: false + in: query + description: '' + type: number + - name: lba_8_0v + required: false + in: query + description: '' + type: number + - name: hba_48v + required: false + in: query + description: '' + type: number + - name: spu_3_3v + required: false + in: query + description: '' + type: number + - name: v1_2 + required: false + in: query + description: '' + type: number + - name: v2_5 + required: false + in: query + description: '' + type: number + - name: v3_3 + required: false + in: query + description: '' + type: number + - name: error_code + required: false + in: query + description: '' + type: string + tags: + - stationtests + '/stationtests/error_details/{id}/': + get: + operationId: stationtests_error_details_read + summary: select an error details object with a specific id + description: select an error details object with a specific id + responses: + '200': + description: '' + + parameters: + - name: id + required: true + in: path + description: A unique integer value identifying this error details. + type: integer + - name: x + required: false + in: query + description: '' + type: string + - name: 'y' + required: false + in: query + description: '' + type: string + - name: xval + required: false + in: query + description: '' + type: number + - name: yval + required: false + in: query + description: '' + type: number + - name: xoff + required: false + in: query + description: '' + type: number + - name: yoff + required: false + in: query + description: '' + type: number + - name: xval_no_delay + required: false + in: query + description: '' + type: number + - name: yval_no_delay + required: false + in: query + description: '' + type: number + - name: xsb_no_delay + required: false + in: query + description: '' + type: number + - name: ysb_no_delay + required: false + in: query + description: '' + type: number + - name: xref_no_delay + required: false + in: query + description: '' + type: number + - name: yref_no_delay + required: false + in: query + description: '' + type: number + - name: xref + required: false + in: query + description: '' + type: number + - name: yref + required: false + in: query + description: '' + type: number + - name: xsb_full_delay + required: false + in: query + description: '' + type: number + - name: ysb_full_delay + required: false + in: query + description: '' + type: number + - name: xref_full_delay + required: false + in: query + description: '' + type: number + - name: yref_full_delay + required: false + in: query + description: '' + type: number + - name: xval_full_delay + required: false + in: query + description: '' + type: number + - name: yval_full_delay + required: false + in: query + description: '' + type: number + - name: xlimit + required: false + in: query + description: '' + type: number + - name: ylimit + required: false + in: query + description: '' + type: number + - name: xproc + required: false + in: query + description: '' + type: number + - name: yproc + required: false + in: query + description: '' + type: number + - name: xdiff + required: false + in: query + description: '' + type: number + - name: ydiff + required: false + in: query + description: '' + type: number + - name: xmean + required: false + in: query + description: '' + type: number + - name: ymean + required: false + in: query + description: '' + type: number + - name: tp + required: false + in: query + description: '' + type: string + - name: mp + required: false + in: query + description: '' + type: string + - name: ap + required: false + in: query + description: '' + type: string + - name: bp + required: false + in: query + description: '' + type: string + - name: mp0 + required: false + in: query + description: '' + type: string + - name: mp1 + required: false + in: query + description: '' + type: string + - name: mp2 + required: false + in: query + description: '' + type: string + - name: mp3 + required: false + in: query + description: '' + type: string + - name: ap0 + required: false + in: query + description: '' + type: string + - name: ap1 + required: false + in: query + description: '' + type: string + - name: ap2 + required: false + in: query + description: '' + type: string + - name: ap3 + required: false + in: query + description: '' + type: string + - name: pcb + required: false + in: query + description: '' + type: string + - name: rcu_5_0v + required: false + in: query + description: '' + type: number + - name: lba_8_0v + required: false + in: query + description: '' + type: number + - name: hba_48v + required: false + in: query + description: '' + type: number + - name: spu_3_3v + required: false + in: query + description: '' + type: number + - name: v1_2 + required: false + in: query + description: '' + type: number + - name: v2_5 + required: false + in: query + description: '' + type: number + - name: v3_3 + required: false + in: query + description: '' + type: number + - name: error_code + required: false + in: query + description: '' + type: string + tags: + - stationtests + /stationtests/insert_raw: + post: + operationId: stationtests_insert_raw_create + responses: + '200': + description: insert successfully/test already present + '400': + description: an error occurred while parsing + parameters: [] + description: >- + This function is meant to parse a request of the form + + { + + "content": "[STATION TEST RAW TEXT]" + + } + + summary: Insert raw station test output + tags: + - stationtests + /stationtests/station/: + get: + operationId: stationtests_station_list + description: list the stations that have been tested by the stationtests + summary: List all the stations that have been tested by the stationtests + responses: + '200': + description: '' + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + type: integer + - name: page_size + required: false + in: query + description: Number of results to return per page. + type: integer + - name: location + required: false + in: query + description: '' + type: string + - name: name + required: false + in: query + description: '' + type: string + - name: type + required: false + in: query + description: '' + type: string + tags: + - stationtests + '/stationtests/station/{id}/': + get: + operationId: stationtests_station_read + summary: select a specific station + description: returns the summary of a specific station + responses: + '200': + description: '' + parameters: + - name: id + required: true + in: path + description: A unique integer value identifying this station. + type: integer + - name: location + required: false + in: query + description: '' + type: string + - name: name + required: false + in: query + description: '' + type: string + - name: type + required: false + in: query + description: '' + type: string + tags: + - stationtests + /stationtests/station_test/: + get: + operationId: stationtests_station_test_list + summary: list the latest station tests + responses: + '200': + description: '' + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + type: integer + - name: page_size + required: false + in: query + description: Number of results to return per page. + type: integer + - name: start_datetime + required: false + in: query + description: '' + type: string + - name: end_datetime + required: false + in: query + description: '' + type: string + - name: checks + required: false + in: query + description: '' + type: string + - name: station + required: false + in: query + description: '' + type: string + tags: + - stationtests + '/stationtests/station_test/{id}/': + get: + operationId: stationtests_station_test_read + summary: select a specific station test with the given id + responses: + '200': + description: '' + parameters: + - name: id + required: true + in: path + description: A unique integer value identifying this station test. + type: integer + - name: start_datetime + required: false + in: query + description: '' + type: string + - name: end_datetime + required: false + in: query + description: '' + type: string + - name: checks + required: false + in: query + description: '' + type: string + - name: station + required: false + in: query + description: '' + type: string + tags: + - stationtests diff --git a/LCU/Maintenance/DBInterface/monitoringdb/urls.py b/LCU/Maintenance/DBInterface/monitoringdb/urls.py index a736192c12439045ac0c22fb3cd0220005d63c60..a043e42f81f9fb2b5583550f6c5e4267e21400bb 100644 --- a/LCU/Maintenance/DBInterface/monitoringdb/urls.py +++ b/LCU/Maintenance/DBInterface/monitoringdb/urls.py @@ -2,6 +2,22 @@ from django.conf.urls import url, include from rest_framework import routers from .views.station_test_views import * from .views.rtsm_views import * +from rest_framework.schemas import get_schema_view +from rest_framework.renderers import CoreJSONRenderer +from rest_framework import renderers +from openapi_codec import OpenAPICodec + + +class SwaggerRenderer(renderers.BaseRenderer): + media_type = 'application/openapi+json' + format = 'swagger' + + def render(self, data, media_type=None, renderer_context=None): + codec = OpenAPICodec() + return codec.dump(data) + + +schema_view = get_schema_view(title="Maintenance API", renderer_classes=[SwaggerRenderer, CoreJSONRenderer]) station_test_router = routers.DefaultRouter() @@ -31,6 +47,6 @@ urlpatterns = [ url(r'^api-auth', include('rest_framework.urls', namespace='rest_framework')), url(r'^stationtests/insert_raw', insert_raw_station_test), - url(r'^rtsm/insert_raw', insert_raw_rtsm_test) - + url(r'^rtsm/insert_raw', insert_raw_rtsm_test), + url(r'^schema', schema_view) ] diff --git a/LCU/Maintenance/DBInterface/monitoringdb/views/rtsm_views.py b/LCU/Maintenance/DBInterface/monitoringdb/views/rtsm_views.py index 007fd24bd739cc2fac94a8d8af8190283073a634..bc84d8c4efcf005a6894a43247449dad0c829f60 100644 --- a/LCU/Maintenance/DBInterface/monitoringdb/views/rtsm_views.py +++ b/LCU/Maintenance/DBInterface/monitoringdb/views/rtsm_views.py @@ -7,7 +7,7 @@ from rest_framework.serializers import Serializer logger = logging.getLogger('views') -class RTSMErrorsDetailedViewSet(viewsets.ModelViewSet): +class RTSMErrorsDetailedViewSet(viewsets.ReadOnlyModelViewSet): queryset = RTSMError.objects.all() serializer_class = RTSMErrorSerializer @@ -20,7 +20,7 @@ class RTSMErrorsDetailedViewSet(viewsets.ModelViewSet): return queryset -class RTSMErrorsViewSet(viewsets.ModelViewSet): +class RTSMErrorsViewSet(viewsets.ReadOnlyModelViewSet): queryset = RTSMError.objects.all() serializer_class = RTSMErrorSummarySerializer @@ -33,7 +33,7 @@ class RTSMErrorsViewSet(viewsets.ModelViewSet): return queryset -class RTSMObservationViewSet(viewsets.ModelViewSet): +class RTSMObservationViewSet(viewsets.ReadOnlyModelViewSet): queryset = RTSMObservation.objects.all() serializer_class = RTSMObservationSerializer diff --git a/LCU/Maintenance/DBInterface/monitoringdb/views/station_test_views.py b/LCU/Maintenance/DBInterface/monitoringdb/views/station_test_views.py index 13b73513b3b180fe8bf21edd48e832ba27de9612..334a450d52be114b079d2453aaf81c60eeca798c 100644 --- a/LCU/Maintenance/DBInterface/monitoringdb/views/station_test_views.py +++ b/LCU/Maintenance/DBInterface/monitoringdb/views/station_test_views.py @@ -1,5 +1,5 @@ from django_filters import rest_framework as filters -from rest_framework.viewsets import ModelViewSet +from rest_framework.viewsets import ReadOnlyModelViewSet from .common import * from ..models.component import Component @@ -21,7 +21,7 @@ from ..station_test_raw_parser import parse_raw_station_test logger = logging.getLogger('views') -class ComponentViewSet(ModelViewSet): +class ComponentViewSet(ReadOnlyModelViewSet): serializer_class = ComponentSerializer queryset = Component.objects.all() filter_fields = '__all__' @@ -42,38 +42,38 @@ class ComponentErrorFilterSet(filters.FilterSet): lookup_expr='contains') -class ComponentErrorViewSet(ModelViewSet): +class ComponentErrorViewSet(ReadOnlyModelViewSet): serializer_class = ComponentErrorSerializer - queryset = ComponentError.objects.all() + queryset = ComponentError.objects.all().order_by('-station_test__start_datetime') filter_fields = '__all__' filterset_class = ComponentErrorFilterSet -class StationViewSet(ModelViewSet): +class StationViewSet(ReadOnlyModelViewSet): serializer_class = StationSerializer queryset = Station.objects.all() filter_fields = '__all__' -class StationTestViewSet(ModelViewSet): +class StationTestViewSet(ReadOnlyModelViewSet): serializer_class = StationTestSerializer queryset = StationTest.objects.all() filter_fields = '__all__' -class ErrorDetailsViewSet(ModelViewSet): +class ErrorDetailsViewSet(ReadOnlyModelViewSet): serializer_class = ErrorDetailsSerializer queryset = ErrorDetails.objects.all() filter_fields = '__all__' -class ElementErrorViewSet(ModelViewSet): +class ElementErrorViewSet(ReadOnlyModelViewSet): serializer_class = ElementErrorSerializer queryset = ElementError.objects.all() filter_fields = '__all__' -class ElementViewSet(ModelViewSet): +class ElementViewSet(ReadOnlyModelViewSet): serializer_class = ElementSerializer queryset = Element.objects.all() filter_fields = '__all__'