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 2017/09/19 19:09:16 UTC

[19/35] airavata git commit: AIRAVATA-2500 Persist SSH account provisioner and config

AIRAVATA-2500 Persist SSH account provisioner and config


Project: http://git-wip-us.apache.org/repos/asf/airavata/repo
Commit: http://git-wip-us.apache.org/repos/asf/airavata/commit/ac2823a6
Tree: http://git-wip-us.apache.org/repos/asf/airavata/tree/ac2823a6
Diff: http://git-wip-us.apache.org/repos/asf/airavata/diff/ac2823a6

Branch: refs/heads/AIRAVATA-2500
Commit: ac2823a604abca6e0db6314dd7658c1325bb94c3
Parents: 722aabd
Author: Marcus Christie <ma...@apache.org>
Authored: Fri Sep 1 12:33:40 2017 -0400
Committer: Marcus Christie <ma...@apache.org>
Committed: Tue Sep 19 15:07:56 2017 -0400

----------------------------------------------------------------------
 .../accountprovisioning/SSHAccountManager.java  |  5 +-
 .../catalog/impl/GwyResourceProfileImpl.java    | 10 ++
 .../model/ComputeResourcePreference.java        | 31 +++++--
 .../SSHAccountProvisionerConfiguration.java     | 98 ++++++++++++++++++++
 .../SSHAccountProvisionerConfigurationPK.java   | 57 ++++++++++++
 .../ComputeHostPreferenceResource.java          | 50 +++++++---
 .../app/catalog/util/AppCatalogJPAUtils.java    |  8 ++
 .../util/AppCatalogThriftConversion.java        |  8 +-
 .../src/main/resources/META-INF/persistence.xml |  1 +
 .../src/main/resources/appcatalog-derby.sql     | 11 +++
 .../src/main/resources/appcatalog-mysql.sql     | 13 ++-
 .../DeltaScripts/appCatalog_schema_delta.sql    | 31 +++++++
 .../gateway_resource_profile_model.thrift       |  2 +-
 13 files changed, 300 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/airavata/blob/ac2823a6/modules/compute-account-provisioning/src/main/java/org/apache/airavata/accountprovisioning/SSHAccountManager.java
----------------------------------------------------------------------
diff --git a/modules/compute-account-provisioning/src/main/java/org/apache/airavata/accountprovisioning/SSHAccountManager.java b/modules/compute-account-provisioning/src/main/java/org/apache/airavata/accountprovisioning/SSHAccountManager.java
index f9ed22a..74c0dd2 100644
--- a/modules/compute-account-provisioning/src/main/java/org/apache/airavata/accountprovisioning/SSHAccountManager.java
+++ b/modules/compute-account-provisioning/src/main/java/org/apache/airavata/accountprovisioning/SSHAccountManager.java
@@ -25,7 +25,6 @@ import org.apache.airavata.common.utils.ServerSettings;
 import org.apache.airavata.credential.store.client.CredentialStoreClientFactory;
 import org.apache.airavata.credential.store.cpi.CredentialStoreService;
 import org.apache.airavata.credential.store.exception.CredentialStoreException;
-import org.apache.airavata.model.appcatalog.accountprovisioning.SSHAccountProvisionerConfigParam;
 import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
 import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionInterface;
 import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionProtocol;
@@ -181,11 +180,11 @@ public class SSHAccountManager {
         }
     }
 
-    private static Map<ConfigParam, String> convertConfigParams(String provisionerName, Map<SSHAccountProvisionerConfigParam, String> thriftConfigParams) {
+    private static Map<ConfigParam, String> convertConfigParams(String provisionerName, Map<String, String> thriftConfigParams) {
         List<ConfigParam> configParams = SSHAccountProvisionerFactory.getSSHAccountProvisionerConfigParams(provisionerName);
         Map<String, ConfigParam> configParamMap = configParams.stream().collect(Collectors.toMap(ConfigParam::getName, Function.identity()));
 
-        return thriftConfigParams.entrySet().stream().collect(Collectors.toMap(entry -> configParamMap.get(entry.getKey().getName()), entry -> entry.getValue()));
+        return thriftConfigParams.entrySet().stream().collect(Collectors.toMap(entry -> configParamMap.get(entry.getKey()), entry -> entry.getValue()));
     }
 
     private static RegistryService.Client getRegistryServiceClient() {

http://git-wip-us.apache.org/repos/asf/airavata/blob/ac2823a6/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/GwyResourceProfileImpl.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/GwyResourceProfileImpl.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/GwyResourceProfileImpl.java
index ccfb08a..78a6f0f 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/GwyResourceProfileImpl.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/GwyResourceProfileImpl.java
@@ -89,6 +89,11 @@ public class GwyResourceProfileImpl implements GwyResourceProfile {
                     if (preference.getReservationEndTime() > 0) {
                         resource.setReservationEndTime(AiravataUtils.getTime(preference.getReservationEndTime()));
                     }
+                    resource.setSshAccountProvisioner(preference.getSshAccountProvisioner());
+                    if (preference.getSshAccountProvisionerConfig() != null && !preference.getSshAccountProvisionerConfig().isEmpty()) {
+                        Map<String,String> sshAccountProvisionerConfigurationsCopy = new HashMap<>(preference.getSshAccountProvisionerConfig());
+                        resource.setSshAccountProvisionerConfigurations(sshAccountProvisionerConfigurationsCopy);
+                    }
                     resource.save();
                 }
             }
@@ -154,6 +159,11 @@ public class GwyResourceProfileImpl implements GwyResourceProfile {
                     if (preference.getReservationEndTime() > 0) {
                         resource.setReservationEndTime(AiravataUtils.getTime(preference.getReservationEndTime()));
                     }
+                    resource.setSshAccountProvisioner(preference.getSshAccountProvisioner());
+                    if (preference.getSshAccountProvisionerConfig() != null && !preference.getSshAccountProvisionerConfig().isEmpty()) {
+                        Map<String,String> sshAccountProvisionerConfigurationsCopy = new HashMap<>(preference.getSshAccountProvisionerConfig());
+                        resource.setSshAccountProvisionerConfigurations(sshAccountProvisionerConfigurationsCopy);
+                    }
                     resource.save();
                 }
             }

http://git-wip-us.apache.org/repos/asf/airavata/blob/ac2823a6/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/ComputeResourcePreference.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/ComputeResourcePreference.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/ComputeResourcePreference.java
index a289526..20f55d4 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/ComputeResourcePreference.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/ComputeResourcePreference.java
@@ -20,15 +20,9 @@
 package org.apache.airavata.registry.core.app.catalog.model;
 
 
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.IdClass;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
+import javax.persistence.*;
 import java.sql.Timestamp;
+import java.util.Collection;
 
 @Entity
 @Table(name = "COMPUTE_RESOURCE_PREFERENCE")
@@ -66,6 +60,8 @@ public class ComputeResourcePreference {
     private Timestamp reservationStartTime;
     @Column(name = "RESERVATION_END_TIME")
     private Timestamp reservationEndTime;
+    @Column(name = "SSH_ACCOUNT_PROVISIONER")
+    private String sshAccountProvisioner;
 
 
     @ManyToOne(cascade= CascadeType.MERGE)
@@ -76,6 +72,9 @@ public class ComputeResourcePreference {
     @JoinColumn(name = "GATEWAY_ID")
     private GatewayProfile gatewayProfile;
 
+    @OneToMany(mappedBy = "computeResourcePreference", cascade = CascadeType.ALL, orphanRemoval = true)
+    Collection<SSHAccountProvisionerConfiguration> sshAccountProvisionerConfigurations;
+
 
     public String getGatewayId() {
         return gatewayId;
@@ -212,4 +211,20 @@ public class ComputeResourcePreference {
     public void setReservationEndTime(Timestamp reservationEndTime) {
         this.reservationEndTime = reservationEndTime;
     }
+
+    public String getSshAccountProvisioner() {
+        return sshAccountProvisioner;
+    }
+
+    public void setSshAccountProvisioner(String sshAccountProvisioner) {
+        this.sshAccountProvisioner = sshAccountProvisioner;
+    }
+
+    public Collection<SSHAccountProvisionerConfiguration> getSshAccountProvisionerConfigurations() {
+        return sshAccountProvisionerConfigurations;
+    }
+
+    public void setSshAccountProvisionerConfigurations(Collection<SSHAccountProvisionerConfiguration> sshAccountProvisionerConfigurations) {
+        this.sshAccountProvisionerConfigurations = sshAccountProvisionerConfigurations;
+    }
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/ac2823a6/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/SSHAccountProvisionerConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/SSHAccountProvisionerConfiguration.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/SSHAccountProvisionerConfiguration.java
new file mode 100644
index 0000000..303835b
--- /dev/null
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/SSHAccountProvisionerConfiguration.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.airavata.registry.core.app.catalog.model;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "SSH_ACCOUNT_PROVISIONER_CONFIG")
+@IdClass(SSHAccountProvisionerConfigurationPK.class)
+public class SSHAccountProvisionerConfiguration {
+    @Id
+    @Column(name = "GATEWAY_ID")
+    private String gatewayId;
+    @Id
+    @Column(name = "RESOURCE_ID")
+    private String resourceId;
+    @Id
+    @Column(name = "CONFIG_NAME")
+    private String configName;
+
+    @Column(name = "CONFIG_VALUE")
+    private String configValue;
+
+    @ManyToOne
+    @JoinColumns({
+            @JoinColumn(name = "GATEWAY_ID", referencedColumnName = "GATEWAY_ID", nullable = false),
+            @JoinColumn(name = "RESOURCE_ID", referencedColumnName = "RESOURCE_ID", nullable = false)
+    })
+    private ComputeResourcePreference computeResourcePreference;
+
+    public SSHAccountProvisionerConfiguration() {}
+
+    public SSHAccountProvisionerConfiguration(String configName, String configValue, ComputeResourcePreference computeResourcePreference) {
+        this.gatewayId = computeResourcePreference.getGatewayId();
+        this.resourceId = computeResourcePreference.getResourceId();
+        this.configName = configName;
+        this.configValue = configValue;
+        this.computeResourcePreference = computeResourcePreference;
+    }
+
+    public String getGatewayId() {
+        return gatewayId;
+    }
+
+    public void setGatewayId(String gatewayId) {
+        this.gatewayId = gatewayId;
+    }
+
+    public String getResourceId() {
+        return resourceId;
+    }
+
+    public void setResourceId(String resourceId) {
+        this.resourceId = resourceId;
+    }
+
+    public String getConfigName() {
+        return configName;
+    }
+
+    public void setConfigName(String configName) {
+        this.configName = configName;
+    }
+
+    public String getConfigValue() {
+        return configValue;
+    }
+
+    public void setConfigValue(String configValue) {
+        this.configValue = configValue;
+    }
+
+    public ComputeResourcePreference getComputeResourcePreference() {
+        return computeResourcePreference;
+    }
+
+    public void setComputeResourcePreference(ComputeResourcePreference computeResourcePreference) {
+        this.computeResourcePreference = computeResourcePreference;
+    }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/ac2823a6/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/SSHAccountProvisionerConfigurationPK.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/SSHAccountProvisionerConfigurationPK.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/SSHAccountProvisionerConfigurationPK.java
new file mode 100644
index 0000000..94045b0
--- /dev/null
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/SSHAccountProvisionerConfigurationPK.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.airavata.registry.core.app.catalog.model;
+
+import java.io.Serializable;
+
+public class SSHAccountProvisionerConfigurationPK implements Serializable {
+    private String gatewayId;
+    private String resourceId;
+    private String configName;
+
+    public SSHAccountProvisionerConfigurationPK(String gatewayId, String resourceId, String configName) {
+        this.gatewayId = gatewayId;
+        this.resourceId = resourceId;
+        this.configName = configName;
+    }
+
+    public SSHAccountProvisionerConfigurationPK() {}
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof SSHAccountProvisionerConfigurationPK)) return false;
+
+        SSHAccountProvisionerConfigurationPK that = (SSHAccountProvisionerConfigurationPK) o;
+
+        if (!gatewayId.equals(that.gatewayId)) return false;
+        if (!resourceId.equals(that.resourceId)) return false;
+        return configName.equals(that.configName);
+    }
+
+    @Override
+    public int hashCode() {
+        int result = gatewayId.hashCode();
+        result = 31 * result + resourceId.hashCode();
+        result = 31 * result + configName.hashCode();
+        return result;
+    }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/ac2823a6/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/resources/ComputeHostPreferenceResource.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/resources/ComputeHostPreferenceResource.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/resources/ComputeHostPreferenceResource.java
index 29c2d5a..1320025 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/resources/ComputeHostPreferenceResource.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/resources/ComputeHostPreferenceResource.java
@@ -20,10 +20,7 @@
 package org.apache.airavata.registry.core.app.catalog.resources;
 
 import org.apache.airavata.common.exception.ApplicationSettingsException;
-import org.apache.airavata.registry.core.app.catalog.model.ComputeResource;
-import org.apache.airavata.registry.core.app.catalog.model.ComputeResourcePreference;
-import org.apache.airavata.registry.core.app.catalog.model.ComputeResourcePreferencePK;
-import org.apache.airavata.registry.core.app.catalog.model.GatewayProfile;
+import org.apache.airavata.registry.core.app.catalog.model.*;
 import org.apache.airavata.registry.core.app.catalog.util.AppCatalogJPAUtils;
 import org.apache.airavata.registry.core.app.catalog.util.AppCatalogQueryGenerator;
 import org.apache.airavata.registry.core.app.catalog.util.AppCatalogResourceType;
@@ -56,6 +53,8 @@ public class ComputeHostPreferenceResource extends AppCatAbstractResource {
     private String reservation;
     private Timestamp reservationStartTime;
     private Timestamp reservationEndTime;
+    private String sshAccountProvisioner;
+    private Map<String,String> sshAccountProvisionerConfigurations;
 
     private GatewayProfileResource gatewayProfile;
     private ComputeResourceResource computeHostResource;
@@ -200,6 +199,22 @@ public class ComputeHostPreferenceResource extends AppCatAbstractResource {
         this.reservationEndTime = reservationEndTime;
     }
 
+    public String getSshAccountProvisioner() {
+        return sshAccountProvisioner;
+    }
+
+    public void setSshAccountProvisioner(String sshAccountProvisioner) {
+        this.sshAccountProvisioner = sshAccountProvisioner;
+    }
+
+    public Map<String, String> getSshAccountProvisionerConfigurations() {
+        return sshAccountProvisionerConfigurations;
+    }
+
+    public void setSshAccountProvisionerConfigurations(Map<String, String> sshAccountProvisionerConfigurations) {
+        this.sshAccountProvisionerConfigurations = sshAccountProvisionerConfigurations;
+    }
+
     @Override
     public void remove(Object identifier) throws AppCatalogException {
         HashMap<String, String> ids;
@@ -408,14 +423,7 @@ public class ComputeHostPreferenceResource extends AppCatAbstractResource {
         try {
             em = AppCatalogJPAUtils.getEntityManager();
             ComputeResourcePreference existingPreference = em.find(ComputeResourcePreference.class, new ComputeResourcePreferencePK(gatewayId, resourceId));
-            if (em.isOpen()) {
-                if (em.getTransaction().isActive()){
-                    em.getTransaction().rollback();
-                }
-                em.close();
-            }
 
-            em = AppCatalogJPAUtils.getEntityManager();
             em.getTransaction().begin();
             ComputeResource computeResource = em.find(ComputeResource.class, resourceId);
             GatewayProfile gatewayProf = em.find(GatewayProfile.class, gatewayId);
@@ -437,6 +445,17 @@ public class ComputeHostPreferenceResource extends AppCatAbstractResource {
                 existingPreference.setReservation(reservation);
                 existingPreference.setReservationStartTime(reservationStartTime);
                 existingPreference.setReservationEndTime(reservationEndTime);
+                existingPreference.setSshAccountProvisioner(sshAccountProvisioner);
+                if (sshAccountProvisionerConfigurations != null && !sshAccountProvisionerConfigurations.isEmpty()) {
+                    List<SSHAccountProvisionerConfiguration> configurations = new ArrayList<>();
+                    for (String sshAccountProvisionerConfigName : sshAccountProvisionerConfigurations.keySet()) {
+                        String value = sshAccountProvisionerConfigurations.get(sshAccountProvisionerConfigName);
+                        configurations.add(new SSHAccountProvisionerConfiguration(sshAccountProvisionerConfigName, value, existingPreference));
+                    }
+                    existingPreference.setSshAccountProvisionerConfigurations(configurations);
+                } else {
+                    existingPreference.setSshAccountProvisionerConfigurations(null);
+                }
                 em.merge(existingPreference);
             } else {
                 ComputeResourcePreference resourcePreference = new ComputeResourcePreference();
@@ -457,6 +476,15 @@ public class ComputeHostPreferenceResource extends AppCatAbstractResource {
                 resourcePreference.setReservation(reservation);
                 resourcePreference.setReservationStartTime(reservationStartTime);
                 resourcePreference.setReservationEndTime(reservationEndTime);
+                existingPreference.setSshAccountProvisioner(sshAccountProvisioner);
+                if (sshAccountProvisionerConfigurations != null && !sshAccountProvisionerConfigurations.isEmpty()){
+                    List<SSHAccountProvisionerConfiguration> configurations = new ArrayList<>();
+                    for (String sshAccountProvisionerConfigName : sshAccountProvisionerConfigurations.keySet()) {
+                        String value = sshAccountProvisionerConfigurations.get(sshAccountProvisionerConfigName);
+                        configurations.add(new SSHAccountProvisionerConfiguration(sshAccountProvisionerConfigName, value, existingPreference));
+                    }
+                    existingPreference.setSshAccountProvisionerConfigurations(configurations);
+                }
                 em.persist(resourcePreference);
             }
             em.getTransaction().commit();

http://git-wip-us.apache.org/repos/asf/airavata/blob/ac2823a6/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/util/AppCatalogJPAUtils.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/util/AppCatalogJPAUtils.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/util/AppCatalogJPAUtils.java
index 099c088..f794078 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/util/AppCatalogJPAUtils.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/util/AppCatalogJPAUtils.java
@@ -957,6 +957,14 @@ public class AppCatalogJPAUtils {
             resource.setReservation(o.getReservation());
             resource.setReservationStartTime(o.getReservationStartTime());
             resource.setReservationEndTime(o.getReservationEndTime());
+            resource.setSshAccountProvisioner(o.getSshAccountProvisioner());
+            if (o.getSshAccountProvisionerConfigurations() != null && !o.getSshAccountProvisionerConfigurations().isEmpty()) {
+                Map<String,String> sshAccountProvisionerConfigurations = new HashMap<>();
+                for (SSHAccountProvisionerConfiguration config : o.getSshAccountProvisionerConfigurations()){
+                    sshAccountProvisionerConfigurations.put(config.getConfigName(), config.getConfigValue());
+                }
+                resource.setSshAccountProvisionerConfigurations(sshAccountProvisionerConfigurations);
+            }
         }
         return resource;
     }

http://git-wip-us.apache.org/repos/asf/airavata/blob/ac2823a6/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/util/AppCatalogThriftConversion.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/util/AppCatalogThriftConversion.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/util/AppCatalogThriftConversion.java
index acfc16e..1a85454 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/util/AppCatalogThriftConversion.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/util/AppCatalogThriftConversion.java
@@ -30,8 +30,8 @@ import org.apache.airavata.model.appcatalog.gatewayprofile.GatewayResourceProfil
 import org.apache.airavata.model.appcatalog.gatewayprofile.StoragePreference;
 import org.apache.airavata.model.appcatalog.storageresource.StorageResourceDescription;
 import org.apache.airavata.model.appcatalog.userresourceprofile.UserComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserStoragePreference;
 import org.apache.airavata.model.appcatalog.userresourceprofile.UserResourceProfile;
+import org.apache.airavata.model.appcatalog.userresourceprofile.UserStoragePreference;
 import org.apache.airavata.model.application.io.DataType;
 import org.apache.airavata.model.application.io.InputDataObjectType;
 import org.apache.airavata.model.application.io.OutputDataObjectType;
@@ -43,6 +43,7 @@ import org.apache.airavata.registry.cpi.AppCatalogException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 public class AppCatalogThriftConversion {
     public static ComputeResourceResource getComputeHostResource (ComputeResourceDescription description){
@@ -874,6 +875,11 @@ public class AppCatalogThriftConversion {
         if (resource.getReservationEndTime() != null) {
             preference.setReservationEndTime(resource.getReservationEndTime().getTime());
         }
+        preference.setSshAccountProvisioner(resource.getSshAccountProvisioner());
+        if (resource.getSshAccountProvisionerConfigurations() != null && !resource.getSshAccountProvisionerConfigurations().isEmpty()){
+            Map<String, String> sshAccountProvisionerConfigCopy = new HashMap<>(resource.getSshAccountProvisionerConfigurations());
+            preference.setSshAccountProvisionerConfig(sshAccountProvisionerConfigCopy);
+        }
         return preference;
     }
 

http://git-wip-us.apache.org/repos/asf/airavata/blob/ac2823a6/modules/registry/registry-core/src/main/resources/META-INF/persistence.xml
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/resources/META-INF/persistence.xml b/modules/registry/registry-core/src/main/resources/META-INF/persistence.xml
index c3f1a0f..5ac231f 100644
--- a/modules/registry/registry-core/src/main/resources/META-INF/persistence.xml
+++ b/modules/registry/registry-core/src/main/resources/META-INF/persistence.xml
@@ -51,6 +51,7 @@
         <class>org.apache.airavata.registry.core.app.catalog.model.ApplicationIntOutput</class>
         <class>org.apache.airavata.registry.core.app.catalog.model.GatewayProfile</class>
         <class>org.apache.airavata.registry.core.app.catalog.model.ComputeResourcePreference</class>
+        <class>org.apache.airavata.registry.core.app.catalog.model.SSHAccountProvisionerConfiguration</class>
         <class>org.apache.airavata.registry.core.app.catalog.model.UserResourceProfile</class>
         <class>org.apache.airavata.registry.core.app.catalog.model.UserComputeResourcePreference</class>
         <class>org.apache.airavata.registry.core.app.catalog.model.UserStoragePreference</class>

http://git-wip-us.apache.org/repos/asf/airavata/blob/ac2823a6/modules/registry/registry-core/src/main/resources/appcatalog-derby.sql
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/resources/appcatalog-derby.sql b/modules/registry/registry-core/src/main/resources/appcatalog-derby.sql
index 68fd1ff..df4ebb1 100644
--- a/modules/registry/registry-core/src/main/resources/appcatalog-derby.sql
+++ b/modules/registry/registry-core/src/main/resources/appcatalog-derby.sql
@@ -356,11 +356,22 @@ CREATE TABLE COMPUTE_RESOURCE_PREFERENCE
         RESERVATION VARCHAR (255),
         RESERVATION_START_TIME timestamp,
         RESERVATION_END_TIME timestamp,
+        SSH_ACCOUNT_PROVISIONER VARCHAR(255),
         PRIMARY KEY(GATEWAY_ID,RESOURCE_ID),
         FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE,
         FOREIGN KEY (GATEWAY_ID) REFERENCES GATEWAY_PROFILE(GATEWAY_ID) ON DELETE CASCADE
 );
 
+CREATE TABLE SSH_ACCOUNT_PROVISIONER_CONFIG
+(
+        GATEWAY_ID VARCHAR(255),
+        RESOURCE_ID VARCHAR(255),
+        CONFIG_NAME VARCHAR(255),
+        CONFIG_VALUE VARCHAR(255),
+        PRIMARY KEY (GATEWAY_ID, RESOURCE_ID, CONFIG_NAME),
+        FOREIGN KEY (GATEWAY_ID, RESOURCE_ID) REFERENCES COMPUTE_RESOURCE_PREFERENCE (GATEWAY_ID, RESOURCE_ID) ON DELETE CASCADE
+);
+
 CREATE TABLE BATCH_QUEUE
 (
         COMPUTE_RESOURCE_ID VARCHAR(255) NOT NULL,

http://git-wip-us.apache.org/repos/asf/airavata/blob/ac2823a6/modules/registry/registry-core/src/main/resources/appcatalog-mysql.sql
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/resources/appcatalog-mysql.sql b/modules/registry/registry-core/src/main/resources/appcatalog-mysql.sql
index 997bb2d..54886b1 100644
--- a/modules/registry/registry-core/src/main/resources/appcatalog-mysql.sql
+++ b/modules/registry/registry-core/src/main/resources/appcatalog-mysql.sql
@@ -355,10 +355,21 @@ CREATE TABLE COMPUTE_RESOURCE_PREFERENCE
         RESERVATION VARCHAR (255),
         RESERVATION_START_TIME timestamp,
         RESERVATION_END_TIME timestamp,
+        SSH_ACCOUNT_PROVISIONER VARCHAR(255),
         PRIMARY KEY(GATEWAY_ID,RESOURCE_ID),
         FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE,
         FOREIGN KEY (GATEWAY_ID) REFERENCES GATEWAY_PROFILE(GATEWAY_ID) ON DELETE CASCADE
-);
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+CREATE TABLE SSH_ACCOUNT_PROVISIONER_CONFIG
+(
+        GATEWAY_ID VARCHAR(255),
+        RESOURCE_ID VARCHAR(255),
+        CONFIG_NAME VARCHAR(255),
+        CONFIG_VALUE VARCHAR(255),
+        PRIMARY KEY (GATEWAY_ID, RESOURCE_ID, CONFIG_NAME),
+        FOREIGN KEY (GATEWAY_ID, RESOURCE_ID) REFERENCES COMPUTE_RESOURCE_PREFERENCE (GATEWAY_ID, RESOURCE_ID) ON DELETE CASCADE
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
 
 CREATE TABLE BATCH_QUEUE
 (

http://git-wip-us.apache.org/repos/asf/airavata/blob/ac2823a6/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/appCatalog_schema_delta.sql
----------------------------------------------------------------------
diff --git a/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/appCatalog_schema_delta.sql b/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/appCatalog_schema_delta.sql
new file mode 100644
index 0000000..bf31b6b
--- /dev/null
+++ b/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/appCatalog_schema_delta.sql
@@ -0,0 +1,31 @@
+--
+--
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements.  See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership.  The ASF licenses this file
+-- to you under the Apache License, Version 2.0 (the
+-- "License"); you may not use this file except in compliance
+-- with the License.  You may obtain a copy of the License at
+--
+--   http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing,
+-- software distributed under the License is distributed on an
+-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+-- KIND, either express or implied.  See the License for the
+-- specific language governing permissions and limitations
+-- under the License.
+--
+
+alter table COMPUTE_RESOURCE_PREFERENCE add SSH_ACCOUNT_PROVISIONER VARCHAR(255);
+
+CREATE TABLE SSH_ACCOUNT_PROVISIONER_CONFIG
+(
+        GATEWAY_ID VARCHAR(255),
+        RESOURCE_ID VARCHAR(255),
+        CONFIG_NAME VARCHAR(255),
+        CONFIG_VALUE VARCHAR(255),
+        PRIMARY KEY (GATEWAY_ID, RESOURCE_ID, CONFIG_NAME),
+        FOREIGN KEY (GATEWAY_ID, RESOURCE_ID) REFERENCES COMPUTE_RESOURCE_PREFERENCE (GATEWAY_ID, RESOURCE_ID) ON DELETE CASCADE
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;

http://git-wip-us.apache.org/repos/asf/airavata/blob/ac2823a6/thrift-interface-descriptions/data-models/resource-catalog-models/gateway_resource_profile_model.thrift
----------------------------------------------------------------------
diff --git a/thrift-interface-descriptions/data-models/resource-catalog-models/gateway_resource_profile_model.thrift b/thrift-interface-descriptions/data-models/resource-catalog-models/gateway_resource_profile_model.thrift
index 060442b..87ca433 100644
--- a/thrift-interface-descriptions/data-models/resource-catalog-models/gateway_resource_profile_model.thrift
+++ b/thrift-interface-descriptions/data-models/resource-catalog-models/gateway_resource_profile_model.thrift
@@ -77,7 +77,7 @@ struct ComputeResourcePreference {
     13: optional i64 reservationStartTime,
     14: optional i64 reservationEndTime,
     15: optional string sshAccountProvisioner,
-    16: optional map<account_provisioning_model.SSHAccountProvisionerConfigParam, string> sshAccountProvisionerConfig
+    16: optional map<string, string> sshAccountProvisionerConfig
 }
 
 struct StoragePreference {