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 2018/10/03 19:00:04 UTC

[airavata-django-portal] 01/02: AIRAVATA-2865 UI for setting default cred store token of GroupResourceProfile

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

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

commit 861527d07596a087173d81b6e00fe6459ebf27e1
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Mon Oct 1 17:37:56 2018 -0400

    AIRAVATA-2865 UI for setting default cred store token of GroupResourceProfile
---
 .../ComputePreference.vue                          |  16 +-
 .../GroupComputeResourcePreference.vue             |  18 +-
 .../credentials/SSHCredentialSelector.vue          |  10 +-
 .../js/models/GroupResourceProfile.js              | 263 ++++++++++++---------
 4 files changed, 188 insertions(+), 119 deletions(-)

diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputePreference.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputePreference.vue
index cd05dfa..49fb726 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputePreference.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputePreference.vue
@@ -18,7 +18,12 @@
               </b-form-input>
             </b-form-group>
             <b-form-group label="SSH Credential" label-for="credential-store-token">
-              <ssh-credential-selector v-model="data.resourceSpecificCredentialStoreToken" />
+              <ssh-credential-selector v-model="data.resourceSpecificCredentialStoreToken">
+                <option v-if="localGroupResourceProfile && localGroupResourceProfile.defaultCredentialStoreToken"
+                  :value="null" slot="first">
+                  --- Use the default SSH credential for {{ localGroupResourceProfile.groupResourceProfileName }}
+                </option>
+              </ssh-credential-selector>
             </b-form-group>
             <b-form-group label="Allocation Project Number" label-for="allocation-number">
               <b-form-input id="allocation-number" type="text" v-model="data.allocationProjectNumber">
@@ -39,12 +44,13 @@
             <h5 class="card-title">Policy</h5>
             <b-form-group label="Allowed Queues">
               <div v-for="batchQueue in computeResource.batchQueues" :key="batchQueue.queueName" v-if="localComputeResourcePolicy">
-                <b-form-checkbox :checked="localComputeResourcePolicy.allowedBatchQueues.includes(batchQueue.queueName)" @input="batchQueueChecked(batchQueue, $event)">
+                <b-form-checkbox :checked="localComputeResourcePolicy.allowedBatchQueues.includes(batchQueue.queueName)"
+                  @input="batchQueueChecked(batchQueue, $event)">
                   {{ batchQueue.queueName }}
                 </b-form-checkbox>
-                <batch-queue-resource-policy v-if="localComputeResourcePolicy.allowedBatchQueues.includes(batchQueue.queueName)" :batch-queue="batchQueue"
-                  :value="localBatchQueueResourcePolicies.find(pol => pol.queuename === batchQueue.queueName)" @input="updatedBatchQueueResourcePolicy(batchQueue, $event)"
-                />
+                <batch-queue-resource-policy v-if="localComputeResourcePolicy.allowedBatchQueues.includes(batchQueue.queueName)"
+                  :batch-queue="batchQueue" :value="localBatchQueueResourcePolicies.find(pol => pol.queuename === batchQueue.queueName)"
+                  @input="updatedBatchQueueResourcePolicy(batchQueue, $event)" />
               </div>
             </b-form-group>
           </div>
diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/GroupComputeResourcePreference.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/GroupComputeResourcePreference.vue
index 419dd2f..206ca98 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/GroupComputeResourcePreference.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/GroupComputeResourcePreference.vue
@@ -13,12 +13,20 @@
               <b-form-input id="profile-name" type="text" v-model="data.groupResourceProfileName" required placeholder="Name of this Group Resource Profile">
               </b-form-input>
             </b-form-group>
+            <b-form-group label="Default SSH Credential" label-for="default-credential-store-token">
+              <ssh-credential-selector id="default-credential-store-token" v-model="data.defaultCredentialStoreToken">
+                <option :value="null" slot="first">
+                  --- Unset the default SSH credential for this profile
+                </option>
+              </ssh-credential-selector>
+            </b-form-group>
             <share-button ref="shareButton" :entity-id="id" />
           </div>
         </div>
       </div>
     </div>
-    <list-layout :items="data.computePreferences" title="Compute Preferences" new-item-button-text="New Compute Preference" @add-new-item="createComputePreference">
+    <list-layout :items="data.computePreferences" title="Compute Preferences" new-item-button-text="New Compute Preference"
+      @add-new-item="createComputePreference">
       <template slot="item-list" slot-scope="slotProps">
 
         <b-table hover :fields="computePreferencesFields" :items="slotProps.items" sort-by="computeResourceId">
@@ -55,8 +63,8 @@
         <b-button class="ml-2" variant="secondary" @click="cancel">Cancel</b-button>
       </div>
     </div>
-    <compute-resources-modal ref="modalSelectComputeResource" @selected="onSelectComputeResource" :excluded-resource-ids="excludedComputeResourceIds"
-    />
+    <compute-resources-modal ref="modalSelectComputeResource" @selected="onSelectComputeResource"
+      :excluded-resource-ids="excludedComputeResourceIds" />
   </div>
 </template>
 
@@ -65,6 +73,7 @@ import { components as comps, layouts } from "django-airavata-common-ui";
 import { models, services } from "django-airavata-api";
 import ComputeResourcePolicySummary from "./ComputeResourcePolicySummary.vue";
 import ComputeResourcesModal from "../ComputeResourcesModal.vue";
+import SSHCredentialSelector from "../../credentials/SSHCredentialSelector.vue";
 
 export default {
   name: "group-compute-resource-preference",
@@ -124,7 +133,8 @@ export default {
     "share-button": comps.ShareButton,
     "list-layout": layouts.ListLayout,
     ComputeResourcePolicySummary,
-    ComputeResourcesModal
+    ComputeResourcesModal,
+    "ssh-credential-selector": SSHCredentialSelector
   },
   computed: {
     excludedComputeResourceIds() {
diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/credentials/SSHCredentialSelector.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/credentials/SSHCredentialSelector.vue
index 4c84ed0..fcf115b 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/credentials/SSHCredentialSelector.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/credentials/SSHCredentialSelector.vue
@@ -2,10 +2,12 @@
   <div>
     <b-input-group>
       <b-form-select v-model="data" :options="credentialStoreTokenOptions">
-        <template slot="first">
-          <option :value="null">
-            <em>Use the default SSH credential</em>
-          </option>
+        <template v-if="$slots.first" slot="first">
+          <slot name="first">
+            <option :value="null">
+              Use the default SSH credential
+            </option>
+          </slot>
         </template>
       </b-form-select>
       <b-input-group-append>
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/GroupResourceProfile.js b/django_airavata/apps/api/static/django_airavata_api/js/models/GroupResourceProfile.js
index 59645e3..ff71113 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/GroupResourceProfile.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/GroupResourceProfile.js
@@ -1,121 +1,172 @@
-import BaseModel from './BaseModel'
-import BatchQueueResourcePolicy from './BatchQueueResourcePolicy'
-import ComputeResourcePolicy from './ComputeResourcePolicy'
-import GroupComputeResourcePreference from './GroupComputeResourcePreference'
+import BaseModel from "./BaseModel";
+import BatchQueueResourcePolicy from "./BatchQueueResourcePolicy";
+import ComputeResourcePolicy from "./ComputeResourcePolicy";
+import GroupComputeResourcePreference from "./GroupComputeResourcePreference";
 
 const FIELDS = [
-     'gatewayId',
-     'groupResourceProfileId',
-     'groupResourceProfileName',
-     {
-         name: 'computePreferences',
-         type: GroupComputeResourcePreference,
-         list: true,
-         default: BaseModel.defaultNewInstance(Array),
-     },
-     {
-         name: 'computeResourcePolicies',
-         type: ComputeResourcePolicy,
-         list: true,
-         default: BaseModel.defaultNewInstance(Array),
-     },
-     {
-         name: 'batchQueueResourcePolicies',
-         type: BatchQueueResourcePolicy,
-         list: true,
-         default: BaseModel.defaultNewInstance(Array),
-     },
-     {
-         name: 'creationTime',
-         type: 'date',
-     },
-     {
-         name: 'updatedTime',
-         type: 'date',
-     },
-     'userHasWriteAccess', // true if current user has write access
+  "gatewayId",
+  "groupResourceProfileId",
+  "groupResourceProfileName",
+  {
+    name: "computePreferences",
+    type: GroupComputeResourcePreference,
+    list: true,
+    default: BaseModel.defaultNewInstance(Array)
+  },
+  {
+    name: "computeResourcePolicies",
+    type: ComputeResourcePolicy,
+    list: true,
+    default: BaseModel.defaultNewInstance(Array)
+  },
+  {
+    name: "batchQueueResourcePolicies",
+    type: BatchQueueResourcePolicy,
+    list: true,
+    default: BaseModel.defaultNewInstance(Array)
+  },
+  {
+    name: "creationTime",
+    type: "date"
+  },
+  {
+    name: "updatedTime",
+    type: "date"
+  },
+  "defaultCredentialStoreToken",
+  "userHasWriteAccess" // true if current user has write access
 ];
 
 export default class GroupResourceProfile extends BaseModel {
+  constructor(data = {}) {
+    super(FIELDS, data);
+  }
 
-    constructor(data = {}) {
-        super(FIELDS, data);
-    }
+  getComputePreference(computeResourceId) {
+    return this.computePreferences.find(
+      pref => pref.computeResourceId === computeResourceId
+    );
+  }
 
-    getComputePreference(computeResourceId) {
-        return this.computePreferences.find(pref => pref.computeResourceId === computeResourceId);
-    }
+  getComputeResourcePolicy(computeResourceId) {
+    return this.computeResourcePolicies.find(
+      pol => pol.computeResourceId === computeResourceId
+    );
+  }
 
-    getComputeResourcePolicy(computeResourceId) {
-        return this.computeResourcePolicies.find(pol => pol.computeResourceId === computeResourceId);
-    }
+  getBatchQueueResourcePolicies(computeResourceId) {
+    return this.batchQueueResourcePolicies.filter(
+      pol => pol.computeResourceId === computeResourceId
+    );
+  }
 
-    getBatchQueueResourcePolicies(computeResourceId) {
-        return this.batchQueueResourcePolicies.filter(pol => pol.computeResourceId === computeResourceId);
+  mergeComputeResourcePreference(
+    computeResourcePreference,
+    computeResourcePolicy,
+    batchQueueResourcePolicies
+  ) {
+    // merge/add computeResourcePreference and computeResourcePolicy
+    const existingComputeResourcePreference = this.computePreferences.find(
+      pref =>
+        pref.computeResourceId === computeResourcePreference.computeResourceId
+    );
+    if (existingComputeResourcePreference) {
+      Object.assign(
+        existingComputeResourcePreference,
+        computeResourcePreference
+      );
+    } else {
+      this.computePreferences.push(computeResourcePreference);
     }
-
-    mergeComputeResourcePreference(computeResourcePreference, computeResourcePolicy, batchQueueResourcePolicies) {
-        // merge/add computeResourcePreference and computeResourcePolicy
-        const existingComputeResourcePreference = this.computePreferences.find(pref => pref.computeResourceId === computeResourcePreference.computeResourceId);
-        if (existingComputeResourcePreference) {
-            Object.assign(existingComputeResourcePreference, computeResourcePreference);
-        } else {
-            this.computePreferences.push(computeResourcePreference);
-        }
-        const existingComputeResourcePolicy = this.computeResourcePolicies.find(pol => pol.computeResourceId === computeResourcePolicy.computeResourceId);
-        if (existingComputeResourcePolicy) {
-            Object.assign(existingComputeResourcePolicy, computeResourcePolicy);
-        } else {
-            this.computeResourcePolicies.push(computeResourcePolicy);
-        }
-        // merge/add/remove batchQueueResourcePolicies
-        const existingBatchQueueResourcePolicies = this.batchQueueResourcePolicies.filter(pol => pol.computeResourceId === computeResourcePreference.computeResourceId);
-        for (const batchQueueResourcePolicy of batchQueueResourcePolicies) {
-            const existingBatchQueueResourcePolicy = existingBatchQueueResourcePolicies.find(pol => pol.queuename === batchQueueResourcePolicy.queuename);
-            if (existingBatchQueueResourcePolicy) {
-                Object.assign(existingBatchQueueResourcePolicy, batchQueueResourcePolicy);
-                const existingBatchQueueResourcePolicyIndex = existingBatchQueueResourcePolicies.findIndex(pol => pol.queuename === batchQueueResourcePolicy.queuename);
-                if (existingBatchQueueResourcePolicyIndex >= 0) {
-                    existingBatchQueueResourcePolicies.splice(existingBatchQueueResourcePolicyIndex, 1);
-                }
-            } else {
-                this.batchQueueResourcePolicies.push(batchQueueResourcePolicy);
-            }
-        }
-        for (const existingBatchQueueResourcePolicy of existingBatchQueueResourcePolicies) {
-            const existingBatchQueueResourcePolicyIndex = this.batchQueueResourcePolicies.findIndex(
-                pol => pol.computeResourceId === existingBatchQueueResourcePolicy.computeResourceId && pol.queuename === existingBatchQueueResourcePolicy.queuename);
-            if (existingBatchQueueResourcePolicyIndex >= 0) {
-                this.batchQueueResourcePolicies.splice(existingBatchQueueResourcePolicyIndex, 1);
-            }
-        }
+    const existingComputeResourcePolicy = this.computeResourcePolicies.find(
+      pol => pol.computeResourceId === computeResourcePolicy.computeResourceId
+    );
+    if (existingComputeResourcePolicy) {
+      Object.assign(existingComputeResourcePolicy, computeResourcePolicy);
+    } else {
+      this.computeResourcePolicies.push(computeResourcePolicy);
     }
-
-    /**
-     * Remove compute resource preference, compute resource policy and batch queue policies.
-     * @param {string} computeResourceId 
-     * @returns {boolean} true if this GroupResourceProfile was changed
-     */
-    removeComputeResource(computeResourceId) {
-
-        let removedChildren = false;
-        const existingComputeResourcePreferenceIndex = this.computePreferences.findIndex(pref => pref.computeResourceId === computeResourceId);
-        if (existingComputeResourcePreferenceIndex >= 0) {
-            this.computePreferences.splice(existingComputeResourcePreferenceIndex, 1);
-            removedChildren = true;
-        }
-        const existingComputeResourcePolicyIndex = this.computeResourcePolicies.findIndex(pol => pol.computeResourceId === computeResourceId);
-        if (existingComputeResourcePolicyIndex >= 0) {
-            this.computeResourcePolicies.splice(existingComputeResourcePolicyIndex, 1);
-            removedChildren = true;
-        }
-        const existingBatchQueueResourcePolicies = this.batchQueueResourcePolicies.filter(pol => pol.computeResourceId === computeResourceId);
-        for (const existingBatchQueueResourcePolicy of existingBatchQueueResourcePolicies) {
-            const existingBatchQueueResourcePolicyIndex = this.batchQueueResourcePolicies.indexOf(existingBatchQueueResourcePolicy);
-            this.batchQueueResourcePolicies.splice(existingBatchQueueResourcePolicyIndex, 1);
-            removedChildren = true;
+    // merge/add/remove batchQueueResourcePolicies
+    const existingBatchQueueResourcePolicies = this.batchQueueResourcePolicies.filter(
+      pol =>
+        pol.computeResourceId === computeResourcePreference.computeResourceId
+    );
+    for (const batchQueueResourcePolicy of batchQueueResourcePolicies) {
+      const existingBatchQueueResourcePolicy = existingBatchQueueResourcePolicies.find(
+        pol => pol.queuename === batchQueueResourcePolicy.queuename
+      );
+      if (existingBatchQueueResourcePolicy) {
+        Object.assign(
+          existingBatchQueueResourcePolicy,
+          batchQueueResourcePolicy
+        );
+        const existingBatchQueueResourcePolicyIndex = existingBatchQueueResourcePolicies.findIndex(
+          pol => pol.queuename === batchQueueResourcePolicy.queuename
+        );
+        if (existingBatchQueueResourcePolicyIndex >= 0) {
+          existingBatchQueueResourcePolicies.splice(
+            existingBatchQueueResourcePolicyIndex,
+            1
+          );
         }
+      } else {
+        this.batchQueueResourcePolicies.push(batchQueueResourcePolicy);
+      }
+    }
+    for (const existingBatchQueueResourcePolicy of existingBatchQueueResourcePolicies) {
+      const existingBatchQueueResourcePolicyIndex = this.batchQueueResourcePolicies.findIndex(
+        pol =>
+          pol.computeResourceId ===
+            existingBatchQueueResourcePolicy.computeResourceId &&
+          pol.queuename === existingBatchQueueResourcePolicy.queuename
+      );
+      if (existingBatchQueueResourcePolicyIndex >= 0) {
+        this.batchQueueResourcePolicies.splice(
+          existingBatchQueueResourcePolicyIndex,
+          1
+        );
+      }
+    }
+  }
 
-        return removedChildren;
+  /**
+   * Remove compute resource preference, compute resource policy and batch queue policies.
+   * @param {string} computeResourceId
+   * @returns {boolean} true if this GroupResourceProfile was changed
+   */
+  removeComputeResource(computeResourceId) {
+    let removedChildren = false;
+    const existingComputeResourcePreferenceIndex = this.computePreferences.findIndex(
+      pref => pref.computeResourceId === computeResourceId
+    );
+    if (existingComputeResourcePreferenceIndex >= 0) {
+      this.computePreferences.splice(existingComputeResourcePreferenceIndex, 1);
+      removedChildren = true;
+    }
+    const existingComputeResourcePolicyIndex = this.computeResourcePolicies.findIndex(
+      pol => pol.computeResourceId === computeResourceId
+    );
+    if (existingComputeResourcePolicyIndex >= 0) {
+      this.computeResourcePolicies.splice(
+        existingComputeResourcePolicyIndex,
+        1
+      );
+      removedChildren = true;
     }
+    const existingBatchQueueResourcePolicies = this.batchQueueResourcePolicies.filter(
+      pol => pol.computeResourceId === computeResourceId
+    );
+    for (const existingBatchQueueResourcePolicy of existingBatchQueueResourcePolicies) {
+      const existingBatchQueueResourcePolicyIndex = this.batchQueueResourcePolicies.indexOf(
+        existingBatchQueueResourcePolicy
+      );
+      this.batchQueueResourcePolicies.splice(
+        existingBatchQueueResourcePolicyIndex,
+        1
+      );
+      removedChildren = true;
+    }
+
+    return removedChildren;
+  }
 }