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