From b9e435d8a6b66565f8c0b00f33e6d969a88223a1 Mon Sep 17 00:00:00 2001 From: Nico Vermaas <vermaas@astron.nl> Date: Thu, 27 Jan 2022 15:08:21 +0100 Subject: [PATCH] https://support.astron.nl/jira/browse/SDC-496 monitor endpoint and database change --- .../migrations/0009_auto_20220127_1456.py | 33 +++++++++++++++++++ .../migrations/0010_auto_20220127_1458.py | 23 +++++++++++++ atdb/taskdatabase/models.py | 11 +++++++ atdb/taskdatabase/serializers.py | 9 ++++- .../templates/taskdatabase/index.html | 2 +- atdb/taskdatabase/urls.py | 3 ++ atdb/taskdatabase/views.py | 24 ++++++++++++-- 7 files changed, 101 insertions(+), 4 deletions(-) create mode 100644 atdb/taskdatabase/migrations/0009_auto_20220127_1456.py create mode 100644 atdb/taskdatabase/migrations/0010_auto_20220127_1458.py diff --git a/atdb/taskdatabase/migrations/0009_auto_20220127_1456.py b/atdb/taskdatabase/migrations/0009_auto_20220127_1456.py new file mode 100644 index 00000000..dc95eb73 --- /dev/null +++ b/atdb/taskdatabase/migrations/0009_auto_20220127_1456.py @@ -0,0 +1,33 @@ +# Generated by Django 3.1.4 on 2022-01-27 13:56 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('taskdatabase', '0008_postprocessingrule'), + ] + + operations = [ + migrations.CreateModel( + name='Monitor', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='unknown', max_length=50)), + ('type', models.CharField(blank=True, default='ldv-service', max_length=20, null=True)), + ('timestamp', models.DateTimeField(blank=True, default=datetime.datetime.utcnow)), + ('hostname', models.CharField(default='unknown', max_length=50)), + ('process_id', models.IntegerField(null=True)), + ('description', models.CharField(blank=True, max_length=100, null=True)), + ('new_status', models.CharField(default='defining', max_length=50, null=True)), + ('metadata', models.JSONField(blank=True, null=True)), + ], + ), + migrations.AlterField( + model_name='task', + name='task_type', + field=models.CharField(default='regular', max_length=20), + ), + ] diff --git a/atdb/taskdatabase/migrations/0010_auto_20220127_1458.py b/atdb/taskdatabase/migrations/0010_auto_20220127_1458.py new file mode 100644 index 00000000..1ed95992 --- /dev/null +++ b/atdb/taskdatabase/migrations/0010_auto_20220127_1458.py @@ -0,0 +1,23 @@ +# Generated by Django 3.1.4 on 2022-01-27 13:58 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('taskdatabase', '0009_auto_20220127_1456'), + ] + + operations = [ + migrations.RenameField( + model_name='monitor', + old_name='new_status', + new_name='status', + ), + migrations.AlterField( + model_name='monitor', + name='description', + field=models.CharField(blank=True, max_length=255, null=True), + ), + ] diff --git a/atdb/taskdatabase/models.py b/atdb/taskdatabase/models.py index 72101397..e3262803 100644 --- a/atdb/taskdatabase/models.py +++ b/atdb/taskdatabase/models.py @@ -125,3 +125,14 @@ class PostProcessingRule(models.Model): # relationships workflow_to_process = models.ForeignKey(Workflow, related_name='to_process', on_delete=models.SET_NULL, null=True, blank=True) workflow_to_apply = models.ForeignKey(Workflow, related_name='to_apply',on_delete=models.SET_NULL, null=True, blank=True) + + +class Monitor(models.Model): + name = models.CharField(max_length=50, default="unknown") + type = models.CharField(max_length=20, default="ldv-service", null=True, blank=True) + timestamp = models.DateTimeField(default=datetime.utcnow, blank=True) + hostname = models.CharField(max_length=50, default="unknown") + process_id = models.IntegerField(null=True) + description = models.CharField(max_length=255, blank=True, null=True) + status = models.CharField(max_length=50, default="defining", null=True) + metadata = models.JSONField(null=True, blank=True) \ No newline at end of file diff --git a/atdb/taskdatabase/serializers.py b/atdb/taskdatabase/serializers.py index af0c9704..0fa7016d 100644 --- a/atdb/taskdatabase/serializers.py +++ b/atdb/taskdatabase/serializers.py @@ -1,5 +1,5 @@ from rest_framework import serializers -from .models import Status, Task, Workflow, LogEntry, Configuration, Job, PostProcessingRule +from .models import Status, Task, Workflow, LogEntry, Configuration, Job, PostProcessingRule, Monitor @@ -168,4 +168,11 @@ class PostProcessingRuleSerializer(serializers.ModelSerializer): class Meta: model = PostProcessingRule + fields = "__all__" + + +class MonitorSerializer(serializers.ModelSerializer): + + class Meta: + model = Monitor fields = "__all__" \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/index.html b/atdb/taskdatabase/templates/taskdatabase/index.html index 0def5ef4..dfee958b 100644 --- a/atdb/taskdatabase/templates/taskdatabase/index.html +++ b/atdb/taskdatabase/templates/taskdatabase/index.html @@ -80,7 +80,7 @@ {% include 'taskdatabase/pagination.html' %} </div> </div> - <p class="footer"> Version 1.0.0 (27 jan 2021 - 14:00) + <p class="footer"> Version 1.0.0 (27 jan 2021 - 15:00) </div> diff --git a/atdb/taskdatabase/urls.py b/atdb/taskdatabase/urls.py index 13c728f5..df6c25f0 100644 --- a/atdb/taskdatabase/urls.py +++ b/atdb/taskdatabase/urls.py @@ -53,6 +53,9 @@ urlpatterns = [ path('postprocessing/', views.PostProcessingRuleListViewAPI.as_view()), path('postprocessing/<int:pk>/', views.PostProcessingRuleDetailsViewAPI.as_view(), name='postprocessing-detail-view-api'), + path('monitor/', views.MonitorListViewAPI.as_view()), + path('monitor/<int:pk>/', views.MonitorDetailsViewAPI.as_view(),name='monitor-detail-view-api'), + # --- custom requests --- # /atdb/get_size?status__in=defined,staged path('tasks/get_size/', views.GetSizeView.as_view(), name='get-size-view'), diff --git a/atdb/taskdatabase/views.py b/atdb/taskdatabase/views.py index 08e2b895..a3542fd6 100644 --- a/atdb/taskdatabase/views.py +++ b/atdb/taskdatabase/views.py @@ -22,7 +22,7 @@ from django.shortcuts import render, redirect from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.conf import settings -from .models import Task, Status, Workflow, LogEntry, Configuration, Job, PostProcessingRule +from .models import Task, Status, Workflow, LogEntry, Configuration, Job, PostProcessingRule, Monitor from .tables import TaskTable from django.db.models import Q @@ -33,7 +33,9 @@ from .serializers import \ WorkflowSerializer,\ LogEntrySerializer,\ ConfigurationSerializer,\ - JobSerializer, PostProcessingRuleSerializer + JobSerializer, \ + PostProcessingRuleSerializer, \ + MonitorSerializer from .services import algorithms @@ -537,6 +539,24 @@ class PostProcessingRuleDetailsViewAPI(generics.RetrieveUpdateDestroyAPIView): queryset = PostProcessingRule.objects.all() serializer_class = PostProcessingRuleSerializer + +# example: /atdb/job/ +class MonitorListViewAPI(generics.ListCreateAPIView): + model = Monitor + queryset = Monitor.objects.all() + serializer_class = MonitorSerializer + + filter_backends = (filters.DjangoFilterBackend,) + #filter_class = PostProcessingFilter + + +# example: /atdb/job/5/ +class MonitorDetailsViewAPI(generics.RetrieveUpdateDestroyAPIView): + model = Monitor + queryset = Monitor.objects.all() + serializer_class = MonitorSerializer + + # --- controller resources, triggered by a button in the GUI or directoy with a URL --- # set task status to 'new_status' - called from the GUI -- GitLab