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:03 UTC

[airavata-django-portal] branch master updated (bb16f49 -> cddacba)

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

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


    from bb16f49  Bug fix: experimentOutput may have null 'value'
     new 861527d  AIRAVATA-2865 UI for setting default cred store token of GroupResourceProfile
     new cddacba  Order matters here

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../ComputePreference.vue                          |  16 +-
 .../GroupComputeResourcePreference.vue             |  18 +-
 .../credentials/SSHCredentialSelector.vue          |  10 +-
 .../js/models/GroupResourceProfile.js              | 263 ++++++++++++---------
 django_airavata/apps/workspace/signals.py          |  52 ++--
 5 files changed, 214 insertions(+), 145 deletions(-)


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

Posted by ma...@apache.org.
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;
+  }
 }


[airavata-django-portal] 02/02: Order matters here

Posted by ma...@apache.org.
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 cddacba9e9c220a264eb1b8a7774dc7796e1e446
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Wed Oct 3 11:23:13 2018 -0400

    Order matters here
    
    But really we shouldn't create the default project until user replication finishes
---
 django_airavata/apps/workspace/signals.py | 52 +++++++++++++++----------------
 1 file changed, 26 insertions(+), 26 deletions(-)

diff --git a/django_airavata/apps/workspace/signals.py b/django_airavata/apps/workspace/signals.py
index 664b08f..d0c21cb 100644
--- a/django_airavata/apps/workspace/signals.py
+++ b/django_airavata/apps/workspace/signals.py
@@ -16,30 +16,6 @@ log = logging.getLogger(__name__)
 
 
 @receiver(user_logged_in)
-def create_default_project_if_not_exists(sender, request, user, **kwargs):
-    """Create 'Default Project' for new user."""
-    # auth middleware hasn't run yet so authz_token attribute is not available
-    # on request, so need to create the authz_token manually
-    authz_token = get_authz_token(request)
-    with get_airavata_client() as airavata_client:
-        # Just retrieve the first project
-        projects = airavata_client.getUserProjects(
-            authz_token, settings.GATEWAY_ID, request.user.username, 1, 0)
-        if len(projects) == 0:
-            log.info("Creating default project for user {}".format(
-                user.username))
-            default_project = Project()
-            default_project.owner = request.user.username
-            default_project.name = "Default Project"
-            default_project.gatewayId = settings.GATEWAY_ID
-            default_project.description = ("This is the default project for "
-                                           "user {owner}".format(
-                                               owner=default_project.owner))
-            airavata_client.createProject(authz_token, settings.GATEWAY_ID,
-                                          default_project)
-
-
-@receiver(user_logged_in)
 def create_user_profile_for_new_user(sender, request, user, **kwargs):
     """Create basic User Profile for new user."""
     # auth middleware hasn't run yet so authz_token attribute is not available
@@ -52,8 +28,8 @@ def create_user_profile_for_new_user(sender, request, user, **kwargs):
             log.debug("UserProfile doesn't exist for {username}, "
                       "creating...".format(username=user.username))
             new_user_profile = UserProfile()
-            new_user_profile.airavataInternalUserId = (user.username + "@"
-                                                       + settings.GATEWAY_ID)
+            new_user_profile.airavataInternalUserId = (user.username + "@" +
+                                                       settings.GATEWAY_ID)
             new_user_profile.userId = user.username
             new_user_profile.gatewayId = settings.GATEWAY_ID
             new_user_profile.emails = [user.email]
@@ -67,3 +43,27 @@ def create_user_profile_for_new_user(sender, request, user, **kwargs):
             user_profile_client.addUserProfile(authz_token, new_user_profile)
             log.info("Created a new UserProfile for {username}".format(
                 username=user.username))
+
+
+@receiver(user_logged_in)
+def create_default_project_if_not_exists(sender, request, user, **kwargs):
+    """Create 'Default Project' for new user."""
+    # auth middleware hasn't run yet so authz_token attribute is not available
+    # on request, so need to create the authz_token manually
+    authz_token = get_authz_token(request)
+    with get_airavata_client() as airavata_client:
+        # Just retrieve the first project
+        projects = airavata_client.getUserProjects(
+            authz_token, settings.GATEWAY_ID, request.user.username, 1, 0)
+        if len(projects) == 0:
+            log.info("Creating default project for user {}".format(
+                user.username))
+            default_project = Project()
+            default_project.owner = request.user.username
+            default_project.name = "Default Project"
+            default_project.gatewayId = settings.GATEWAY_ID
+            default_project.description = ("This is the default project for "
+                                           "user {owner}".format(
+                                               owner=default_project.owner))
+            airavata_client.createProject(authz_token, settings.GATEWAY_ID,
+                                          default_project)