You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ma...@apache.org on 2022/08/29 18:51:14 UTC

[airavata-django-portal] 02/11: AIRAVATA-3649 DB field and Admin UI for queueSettingsCalculatorId

This is an automated email from the ASF dual-hosted git repository.

machristie pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git

commit 2319627de69a66eaf0f1543e256c155f1336df60
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Thu Aug 25 11:10:56 2022 -0400

    AIRAVATA-3649 DB field and Admin UI for queueSettingsCalculatorId
---
 .../applications/ApplicationInterfaceEditor.vue    | 51 +++++++++++++++++++---
 ...icationsettings_queue_settings_calculator_id.py | 18 ++++++++
 django_airavata/apps/api/models.py                 |  1 +
 django_airavata/apps/api/serializers.py            | 29 +++++++-----
 .../api/static/django_airavata_api/js/index.js     |  3 ++
 .../js/models/ApplicationInterfaceDefinition.js    |  5 +++
 .../js/models/QueueSettingsCalculator.js           |  9 ++++
 .../django_airavata_api/js/service_config.js       | 13 ++++++
 8 files changed, 111 insertions(+), 18 deletions(-)

diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/ApplicationInterfaceEditor.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/ApplicationInterfaceEditor.vue
index c33c8c46..3114370f 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/ApplicationInterfaceEditor.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/ApplicationInterfaceEditor.vue
@@ -37,6 +37,22 @@
             cores, walltime limit).
           </div>
         </b-form-group>
+        <b-form-group
+          label="Queue Settings Calculator"
+          description="Select function to automatically compute queue settings."
+        >
+          <b-form-select
+            v-model="data.queueSettingsCalculatorId"
+            :options="queueSettingsCalculatorOptions"
+            :disabled="queueSettingsCalculatorOptions.length === 0"
+          >
+            <template slot="first">
+              <option :value="null">
+                If applicable, select a queue settings calculator
+              </option>
+            </template>
+          </b-form-select>
+        </b-form-group>
       </div>
     </div>
     <div class="w-100">
@@ -45,9 +61,13 @@
         label-for="application-description"
       >
         <b-form-textarea
-          id="application-description" :rows="5"
+          id="application-description"
+          :rows="5"
           v-model="data.applicationDescription"
-          :state="!data.applicationDescription || data.applicationDescription.length < 500"
+          :state="
+            !data.applicationDescription ||
+            data.applicationDescription.length < 500
+          "
         >
         </b-form-textarea>
         <b-form-valid-feedback v-if="!!data.applicationDescription">
@@ -120,8 +140,8 @@
 </template>
 
 <script>
-import {models} from "django-airavata-api";
-import {mixins} from "django-airavata-common-ui";
+import { models, services } from "django-airavata-api";
+import { mixins } from "django-airavata-common-ui";
 import ApplicationInputFieldEditor from "./ApplicationInputFieldEditor.vue";
 import ApplicationOutputFieldEditor from "./ApplicationOutputFieldEditor.vue";
 
@@ -144,13 +164,28 @@ export default {
     ApplicationOutputFieldEditor,
     draggable,
   },
+  created() {
+    this.loadQueueSettingsCalculators();
+  },
   computed: {
     trueFalseOptions() {
       return [
-        {text: "True", value: true},
-        {text: "False", value: false},
+        { text: "True", value: true },
+        { text: "False", value: false },
       ];
     },
+    queueSettingsCalculatorOptions() {
+      if (this.queueSettingsCalculators) {
+        return this.queueSettingsCalculators.map((qsc) => {
+          return {
+            text: qsc.name,
+            value: qsc.id,
+          };
+        });
+      } else {
+        return [];
+      }
+    },
   },
   data() {
     return {
@@ -160,6 +195,7 @@ export default {
         handle: ".drag-handle",
       },
       collapseApplicationInputs: false,
+      queueSettingsCalculators: null,
     };
   },
   methods: {
@@ -209,6 +245,9 @@ export default {
     onDragEnd() {
       this.collapseApplicationInputs = false;
     },
+    async loadQueueSettingsCalculators() {
+      this.queueSettingsCalculators = await services.QueueSettingsCalculatorService.list();
+    },
   },
 };
 </script>
diff --git a/django_airavata/apps/api/migrations/0009_applicationsettings_queue_settings_calculator_id.py b/django_airavata/apps/api/migrations/0009_applicationsettings_queue_settings_calculator_id.py
new file mode 100644
index 00000000..bc7bf8fb
--- /dev/null
+++ b/django_airavata/apps/api/migrations/0009_applicationsettings_queue_settings_calculator_id.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.15 on 2022-08-25 13:34
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('django_airavata_api', '0008_merge_20220601_1951'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='applicationsettings',
+            name='queue_settings_calculator_id',
+            field=models.CharField(max_length=255, null=True),
+        ),
+    ]
diff --git a/django_airavata/apps/api/models.py b/django_airavata/apps/api/models.py
index 829c88fa..45c88164 100644
--- a/django_airavata/apps/api/models.py
+++ b/django_airavata/apps/api/models.py
@@ -72,3 +72,4 @@ class ApplicationTemplateContextProcessor(models.Model):
 class ApplicationSettings(models.Model):
     application_module_id = models.CharField(max_length=255, unique=True)
     show_queue_settings = models.BooleanField(default=True)
+    queue_settings_calculator_id = models.CharField(max_length=255, null=True)
diff --git a/django_airavata/apps/api/serializers.py b/django_airavata/apps/api/serializers.py
index 6780b3c3..5ed02848 100644
--- a/django_airavata/apps/api/serializers.py
+++ b/django_airavata/apps/api/serializers.py
@@ -336,6 +336,7 @@ class ApplicationInterfaceDescriptionSerializer(
     applicationOutputs = OutputDataObjectTypeSerializer(many=True)
     userHasWriteAccess = serializers.SerializerMethodField()
     showQueueSettings = serializers.BooleanField(required=False)
+    queueSettingsCalculatorId = serializers.CharField(allow_null=True, required=False)
 
     def to_representation(self, instance):
         representation = super().to_representation(instance)
@@ -343,28 +344,32 @@ class ApplicationInterfaceDescriptionSerializer(
         application_settings, created = models.ApplicationSettings.objects.get_or_create(
             application_module_id=application_module_id)
         representation["showQueueSettings"] = application_settings.show_queue_settings
+        representation["queueSettingsCalculatorId"] = application_settings.queue_settings_calculator_id
         return representation
 
     def create(self, validated_data):
-        showQueueSettings = validated_data.pop("showQueueSettings", None)
+        showQueueSettings = validated_data.pop("showQueueSettings", True)
+        queueSettingsCalculatorId = validated_data.pop("queueSettingsCalculatorId", None)
         application_interface = super().create(validated_data)
         application_module_id = application_interface.applicationModules[0]
-        if showQueueSettings is not None:
-            models.ApplicationSettings.objects.update_or_create(
-                application_module_id=application_module_id,
-                defaults={"show_queue_settings": showQueueSettings}
-            )
+        models.ApplicationSettings.objects.update_or_create(
+            application_module_id=application_module_id,
+            defaults={"show_queue_settings": showQueueSettings,
+                      "queue_settings_calculator_id": queueSettingsCalculatorId}
+        )
         return application_interface
 
     def update(self, instance, validated_data):
-        showQueueSettings = validated_data.pop("showQueueSettings", None)
+        defaults = {}
+        if "showQueueSettings" in validated_data:
+            defaults["show_queue_settings"] = validated_data.pop("showQueueSettings")
+        if "queueSettingsCalculatorId" in validated_data:
+            defaults["queue_settings_calculator_id"] = validated_data.pop("queueSettingsCalculatorId")
         application_interface = super().update(instance, validated_data)
         application_module_id = application_interface.applicationModules[0]
-        if showQueueSettings is not None:
-            models.ApplicationSettings.objects.update_or_create(
-                application_module_id=application_module_id,
-                defaults={"show_queue_settings": showQueueSettings}
-            )
+        models.ApplicationSettings.objects.update_or_create(
+            application_module_id=application_module_id, defaults=defaults
+        )
         return application_interface
 
     def get_userHasWriteAccess(self, appDeployment):
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/index.js b/django_airavata/apps/api/static/django_airavata_api/js/index.js
index ca08f1d7..d57713d3 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/index.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/index.js
@@ -135,6 +135,9 @@ const services = {
 
   ParserService: ServiceFactory.service("Parsers"),
   ProjectService: ServiceFactory.service("Projects"),
+  QueueSettingsCalculatorService: ServiceFactory.service(
+    "QueueSettingsCalculators"
+  ),
   SCPDataMovementService,
   ServiceFactory,
   SettingsService: ServiceFactory.service("Settings"),
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/ApplicationInterfaceDefinition.js b/django_airavata/apps/api/static/django_airavata_api/js/models/ApplicationInterfaceDefinition.js
index 008f3a0a..d75164cb 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/ApplicationInterfaceDefinition.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/ApplicationInterfaceDefinition.js
@@ -44,6 +44,11 @@ const FIELDS = [
     type: "boolean",
     default: true,
   },
+  {
+    name: "queueSettingsCalculatorId",
+    type: "string",
+    default: null,
+  },
 ];
 
 export default class ApplicationInterfaceDefinition extends BaseModel {
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/QueueSettingsCalculator.js b/django_airavata/apps/api/static/django_airavata_api/js/models/QueueSettingsCalculator.js
new file mode 100644
index 00000000..4396d74f
--- /dev/null
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/QueueSettingsCalculator.js
@@ -0,0 +1,9 @@
+import BaseModel from "./BaseModel";
+
+const FIELDS = ["id", "name"];
+
+export default class QueueSettingsCalculator extends BaseModel {
+  constructor(data = {}) {
+    super(FIELDS, data);
+  }
+}
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/service_config.js b/django_airavata/apps/api/static/django_airavata_api/js/service_config.js
index 95ee7ac8..0eb915c4 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/service_config.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/service_config.js
@@ -19,6 +19,7 @@ import LogRecord from "./models/LogRecord";
 import Notification from "./models/Notification";
 import Parser from "./models/Parser";
 import Project from "./models/Project";
+import QueueSettingsCalculator from "./models/QueueSettingsCalculator";
 import Settings from "./models/Settings";
 import SharedEntity from "./models/SharedEntity";
 import StoragePreference from "./models/StoragePreference";
@@ -341,6 +342,18 @@ export default {
     queryParams: ["limit", "offset"],
     modelClass: Project,
   },
+  QueueSettingsCalculators: {
+    url: "/api/queue-settings-calculators",
+    viewSet: ["retrieve", "list"],
+    methods: {
+      calculate: {
+        url: "/api/queue-settings-calculators/<lookup>/calculate/",
+        requestType: "post",
+        modelClass: QueueSettingsCalculator,
+      },
+    },
+    modelClass: QueueSettingsCalculator,
+  },
   Settings: {
     url: "/api/settings/",
     methods: {