AIRAVATA-3649 DB field and Admin UI for queueSettingsCalculatorId
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 c33c8c4..3114370 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 @@
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 @@
handle: ".drag-handle",
},
collapseApplicationInputs: false,
+ queueSettingsCalculators: null,
};
},
methods: {
@@ -209,6 +245,9 @@
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 0000000..bc7bf8f
--- /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 829c88f..45c8816 100644
--- a/django_airavata/apps/api/models.py
+++ b/django_airavata/apps/api/models.py
@@ -72,3 +72,4 @@
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 6780b3c..5ed0284 100644
--- a/django_airavata/apps/api/serializers.py
+++ b/django_airavata/apps/api/serializers.py
@@ -336,6 +336,7 @@
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 @@
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 ca08f1d..d57713d 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 @@
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 008f3a0..d75164c 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 @@
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 0000000..4396d74
--- /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 95ee7ac..0eb915c 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 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 @@
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: {