You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by is...@apache.org on 2013/12/15 08:38:44 UTC

git commit: initial service deployment implementation

Updated Branches:
  refs/heads/master 8d995e243 -> cc4f6946e


initial service deployment implementation


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

Branch: refs/heads/master
Commit: cc4f6946e9dfc4054bd07f8205098281e50634fe
Parents: 8d995e2
Author: Isuru <is...@wso2.com>
Authored: Sun Dec 15 13:07:42 2013 +0530
Committer: Isuru <is...@wso2.com>
Committed: Sun Dec 15 13:07:42 2013 +0530

----------------------------------------------------------------------
 .../stratos/adc/mgt/deploy/service/Service.java | 137 +++++++++++++++++++
 .../service/ServiceDeploymentManager.java       | 107 +++++++++++++++
 .../service/multitenant/MultiTenantService.java |  52 +++++++
 .../manager/CartridgeSubscriptionManager.java   |  15 +-
 .../stratos/adc/mgt/payload/PayloadFactory.java |   7 +-
 .../subscription/DataCartridgeSubscription.java |   2 +-
 .../utils/CartridgeSubscriptionUtils.java       |  31 ++++-
 7 files changed, 336 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/cc4f6946/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/deploy/service/Service.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/deploy/service/Service.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/deploy/service/Service.java
new file mode 100644
index 0000000..4b1cad3
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/deploy/service/Service.java
@@ -0,0 +1,137 @@
+/*
+ * 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.stratos.adc.mgt.deploy.service;
+
+import org.apache.stratos.adc.mgt.exception.ADCException;
+import org.apache.stratos.adc.mgt.exception.UnregisteredCartridgeException;
+import org.apache.stratos.adc.mgt.payload.PayloadData;
+import org.apache.stratos.adc.mgt.subscription.utils.CartridgeSubscriptionUtils;
+import org.apache.stratos.cloud.controller.pojo.CartridgeInfo;
+
+import java.io.Serializable;
+
+public abstract class Service implements Serializable {
+
+    private String type;
+    private String autoscalingPolicyName;
+    private String deploymentPolicyName;
+    private String tenantRange;
+    private String clusterId;
+    private String hostName;
+    private int tenantId;
+    private String subscriptionKey;
+    private CartridgeInfo cartridgeInfo;
+    private PayloadData payloadData;
+
+    public Service (String type, String autoscalingPolicyName, String deploymentPolicyName, int tenantId, CartridgeInfo cartridgeInfo) {
+
+        this.type = type;
+        this.autoscalingPolicyName = autoscalingPolicyName;
+        this.deploymentPolicyName = deploymentPolicyName;
+        this.tenantId = tenantId;
+        this.cartridgeInfo = cartridgeInfo;
+        this.tenantRange = "*";
+        this.subscriptionKey = CartridgeSubscriptionUtils.generateSubscriptionKey();
+    }
+
+    public abstract void deploy () throws ADCException, UnregisteredCartridgeException;
+
+    public abstract void undeploy (String clusterId) throws ADCException;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getAutoscalingPolicyName() {
+        return autoscalingPolicyName;
+    }
+
+    public void setAutoscalingPolicyName(String autoscalingPolicyName) {
+        this.autoscalingPolicyName = autoscalingPolicyName;
+    }
+
+    public String getDeploymentPolicyName() {
+        return deploymentPolicyName;
+    }
+
+    public void setDeploymentPolicyName(String deploymentPolicyName) {
+        this.deploymentPolicyName = deploymentPolicyName;
+    }
+
+    public String getTenantRange() {
+        return tenantRange;
+    }
+
+    public void setTenantRange(String tenantRange) {
+        this.tenantRange = tenantRange;
+    }
+
+    public String getClusterId() {
+        return clusterId;
+    }
+
+    public void setClusterId(String clusterId) {
+        this.clusterId = clusterId;
+    }
+
+    public String getHostName() {
+        return hostName;
+    }
+
+    public void setHostName(String hostName) {
+        this.hostName = hostName;
+    }
+
+    public int getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(int tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public CartridgeInfo getCartridgeInfo() {
+        return cartridgeInfo;
+    }
+
+    public void setCartridgeInfo(CartridgeInfo cartridgeInfo) {
+        this.cartridgeInfo = cartridgeInfo;
+    }
+
+    public String getSubscriptionKey() {
+        return subscriptionKey;
+    }
+
+    public void setSubscriptionKey(String subscriptionKey) {
+        this.subscriptionKey = subscriptionKey;
+    }
+
+    public PayloadData getPayloadData() {
+        return payloadData;
+    }
+
+    public void setPayloadData(PayloadData payloadData) {
+        this.payloadData = payloadData;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/cc4f6946/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/deploy/service/ServiceDeploymentManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/deploy/service/ServiceDeploymentManager.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/deploy/service/ServiceDeploymentManager.java
new file mode 100644
index 0000000..5a0297f
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/deploy/service/ServiceDeploymentManager.java
@@ -0,0 +1,107 @@
+/*
+ * 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.stratos.adc.mgt.deploy.service;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.adc.mgt.client.CloudControllerServiceClient;
+import org.apache.stratos.adc.mgt.deploy.service.multitenant.MultiTenantService;
+import org.apache.stratos.adc.mgt.exception.ADCException;
+import org.apache.stratos.adc.mgt.exception.UnregisteredCartridgeException;
+import org.apache.stratos.adc.mgt.payload.BasicPayloadData;
+import org.apache.stratos.adc.mgt.payload.PayloadData;
+import org.apache.stratos.adc.mgt.payload.PayloadFactory;
+import org.apache.stratos.adc.mgt.subscription.utils.CartridgeSubscriptionUtils;
+import org.apache.stratos.adc.mgt.utils.CartridgeConstants;
+import org.apache.stratos.cloud.controller.pojo.CartridgeInfo;
+import org.apache.stratos.cloud.controller.pojo.Property;
+
+public class ServiceDeploymentManager {
+
+    private static Log log = LogFactory.getLog(ServiceDeploymentManager.class);
+
+    public Service deployService (String type, String autoscalingPolicyName, String deploymentPolicyName, int tenantId)
+        throws ADCException, UnregisteredCartridgeException {
+
+        //get deployed Cartridge Definition information
+        CartridgeInfo cartridgeInfo;
+        try {
+            cartridgeInfo = CloudControllerServiceClient.getServiceClient().getCartridgeInfo(type);
+
+        } catch (UnregisteredCartridgeException e) {
+            String message = type + " is not a valid cartridgeSubscription type. Please try again with a valid cartridgeSubscription type.";
+            log.error(message);
+            throw e;
+
+        } catch (Exception e) {
+            String message = "Error getting info for " + type;
+            log.error(message, e);
+            throw new ADCException(message, e);
+        }
+
+        if (!cartridgeInfo.getMultiTenant()) {
+            String errorMsg = "Cartridge definition with type " + type + " is not multitenant";
+            log.error(errorMsg);
+            throw new ADCException(errorMsg);
+        }
+
+        Service service = new MultiTenantService(type, autoscalingPolicyName, deploymentPolicyName, tenantId, cartridgeInfo);
+
+        //generate the cluster ID (domain)for the service
+        service.setClusterId(type + "." + cartridgeInfo.getHostName() + ".domain");
+        //host name is the hostname defined in cartridge definition
+        service.setHostName(cartridgeInfo.getHostName());
+
+        //Create payload
+        BasicPayloadData basicPayloadData = CartridgeSubscriptionUtils.createBasicPayload(service);
+        PayloadData payloadData = PayloadFactory.getPayloadDataInstance(cartridgeInfo.getProvider(),
+                cartridgeInfo.getType(), basicPayloadData);
+
+        // get the payload parameters defined in the cartridge definition file for this cartridge type
+        if (cartridgeInfo.getProperties() != null && cartridgeInfo.getProperties().length != 0) {
+
+            for (Property property : cartridgeInfo.getProperties()) {
+                // check if a property is related to the payload. Currently this is done by checking if the
+                // property name starts with 'payload_parameter.' suffix. If so the payload param name will
+                // be taken as the substring from the index of '.' to the end of the property name.
+                if (property.getName()
+                        .startsWith(CartridgeConstants.CUSTOM_PAYLOAD_PARAM_NAME_PREFIX)) {
+                    String payloadParamName = property.getName();
+                    payloadData.add(payloadParamName.substring(payloadParamName.indexOf(".") + 1), property.getValue());
+                }
+            }
+        }
+
+        //set PayloadData instance
+        service.setPayloadData(payloadData);
+
+        //deploy the service
+        service.deploy();
+
+        //TODO: persist Service
+
+        return service;
+    }
+
+    public void undeployService (String clusterId) {
+
+        //TODO:
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/cc4f6946/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/deploy/service/multitenant/MultiTenantService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/deploy/service/multitenant/MultiTenantService.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/deploy/service/multitenant/MultiTenantService.java
new file mode 100644
index 0000000..2a3b07d
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/deploy/service/multitenant/MultiTenantService.java
@@ -0,0 +1,52 @@
+/*
+ * 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.stratos.adc.mgt.deploy.service.multitenant;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.adc.mgt.deploy.service.Service;
+import org.apache.stratos.adc.mgt.exception.ADCException;
+import org.apache.stratos.adc.mgt.exception.UnregisteredCartridgeException;
+import org.apache.stratos.adc.mgt.utils.ApplicationManagementUtil;
+import org.apache.stratos.adc.mgt.utils.CartridgeConstants;
+import org.apache.stratos.cloud.controller.pojo.CartridgeInfo;
+
+public class MultiTenantService extends Service {
+
+    private static Log log = LogFactory.getLog(MultiTenantService.class);
+
+    public MultiTenantService (String type, String autoscalingPolicyName, String deploymentPolicyName, int tenantId, CartridgeInfo cartridgeInfo) {
+        super(type, autoscalingPolicyName, deploymentPolicyName, tenantId, cartridgeInfo);
+    }
+
+    @Override
+    public void deploy() throws ADCException, UnregisteredCartridgeException {
+
+        //register the service
+        ApplicationManagementUtil.registerService(getType(), getClusterId(), CartridgeConstants.DEFAULT_SUBDOMAIN,
+                getPayloadData().getCompletePayloadData(), getTenantRange(), getHostName(), getAutoscalingPolicyName(),
+                getDeploymentPolicyName(), null);
+    }
+
+    @Override
+    public void undeploy(String clusterId) throws ADCException {
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/cc4f6946/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/manager/CartridgeSubscriptionManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/manager/CartridgeSubscriptionManager.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/manager/CartridgeSubscriptionManager.java
index c124af8..8e1d454 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/manager/CartridgeSubscriptionManager.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/manager/CartridgeSubscriptionManager.java
@@ -20,7 +20,6 @@
 package org.apache.stratos.adc.mgt.manager;
 
 import org.apache.axis2.AxisFault;
-import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.adc.mgt.client.CloudControllerServiceClient;
@@ -157,8 +156,7 @@ public class CartridgeSubscriptionManager {
                 getCartridgeSubscriptionInstance(cartridgeInfo, tenancyBehaviour);
 
         //Create repository
-        Repository repository =
-                                cartridgeSubscription.manageRepository(repositoryURL,
+        Repository repository = cartridgeSubscription.manageRepository(repositoryURL,
                                                                        repositoryUsername,
                                                                        repositoryPassword,
                                                                        isPrivateRepository,
@@ -171,7 +169,7 @@ public class CartridgeSubscriptionManager {
         //create subscription
         cartridgeSubscription.createSubscription(subscriber, cartridgeAlias, autoscalingPolicyName,
                                                  deploymentPolicyName, repository);
-        cartridgeSubscription.setSubscriptionKey(generateSubscriptionKey()); // TODO ---- fix
+        cartridgeSubscription.setSubscriptionKey(CartridgeSubscriptionUtils.generateSubscriptionKey()); // TODO ---- fix
                                                                              // properly
 
         log.info("Tenant [" + tenantId + "] with username [" + tenantAdminUsername +
@@ -180,7 +178,7 @@ public class CartridgeSubscriptionManager {
                  autoscalingPolicyName);
 
         //Create the payload
-        BasicPayloadData basicPayloadData = CartridgeSubscriptionUtils.getBasicPayloadData(cartridgeSubscription);
+        BasicPayloadData basicPayloadData = CartridgeSubscriptionUtils.createBasicPayload(cartridgeSubscription);
         PayloadData payloadData = PayloadFactory.getPayloadDataInstance(cartridgeInfo.getProvider(),
                 cartridgeInfo.getType(), basicPayloadData);
 
@@ -535,11 +533,4 @@ public class CartridgeSubscriptionManager {
 
         return cartridgeSubscription;
     }
-    
-
-    private String generateSubscriptionKey() {
-    	String key = RandomStringUtils.randomAlphanumeric(16);
-    	log.info("Generated key  : " + key); // TODO -- remove the log
-		return key;
-	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/cc4f6946/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/PayloadFactory.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/PayloadFactory.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/PayloadFactory.java
index 9370fe8..e15b6bc 100755
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/PayloadFactory.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/PayloadFactory.java
@@ -22,6 +22,7 @@ package org.apache.stratos.adc.mgt.payload;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.adc.mgt.exception.ADCException;
+import org.apache.stratos.adc.mgt.utils.CartridgeConstants;
 
 public class PayloadFactory {
 
@@ -43,7 +44,11 @@ public class PayloadFactory {
         PayloadData payloadData = null;
 
         //TODO: fix after adding the property Category to Cartridge Definition
-        payloadData = new FramewrokCartridgePayloadData(basicPayloadData);
+        if (cartridgeProvider.equals(CartridgeConstants.DATA_CARTRIDGE_PROVIDER)) {
+            payloadData = new DataCartridgePayloadData(basicPayloadData);
+        } else {
+            payloadData = new FramewrokCartridgePayloadData(basicPayloadData);
+        }
 
         if(payloadData == null) {
             throw new ADCException("Unable to find matching payload for cartridge type " + cartridgeType +

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/cc4f6946/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/DataCartridgeSubscription.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/DataCartridgeSubscription.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/DataCartridgeSubscription.java
index 53b7ae6..a38e609 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/DataCartridgeSubscription.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/DataCartridgeSubscription.java
@@ -50,7 +50,7 @@ public class DataCartridgeSubscription extends CartridgeSubscription {
         super(cartridgeInfo, subscriptionTenancyBehaviour);
         setHost("localhost");
         setUsername("root");
-        setPassword("root");
+        setPassword(ApplicationManagementUtil.generatePassword());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/cc4f6946/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/utils/CartridgeSubscriptionUtils.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/utils/CartridgeSubscriptionUtils.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/utils/CartridgeSubscriptionUtils.java
index dbd7b43..5983ece 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/utils/CartridgeSubscriptionUtils.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/utils/CartridgeSubscriptionUtils.java
@@ -19,13 +19,19 @@
 
 package org.apache.stratos.adc.mgt.subscription.utils;
 
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.adc.mgt.deploy.service.Service;
 import org.apache.stratos.adc.mgt.payload.BasicPayloadData;
 import org.apache.stratos.adc.mgt.subscription.CartridgeSubscription;
 import org.apache.stratos.cloud.controller.pojo.CartridgeInfo;
 
 public class CartridgeSubscriptionUtils {
 
-    public static BasicPayloadData getBasicPayloadData (CartridgeSubscription cartridgeSubscription) {
+    private static Log log = LogFactory.getLog(CartridgeSubscriptionUtils.class);
+
+    public static BasicPayloadData createBasicPayload (CartridgeSubscription cartridgeSubscription) {
 
         BasicPayloadData basicPayloadData = new BasicPayloadData();
         basicPayloadData.setApplicationPath(cartridgeSubscription.getCartridgeInfo().getBaseDir());
@@ -51,6 +57,23 @@ public class CartridgeSubscriptionUtils {
         return basicPayloadData;
     }
 
+    public static BasicPayloadData createBasicPayload (Service service) {
+
+        BasicPayloadData basicPayloadData = new BasicPayloadData();
+        basicPayloadData.setApplicationPath(service.getCartridgeInfo().getBaseDir());
+        basicPayloadData.setSubscriptionKey(service.getSubscriptionKey());
+        basicPayloadData.setClusterId(service.getClusterId());
+        basicPayloadData.setDeployment("default");//currently hard coded to default
+        basicPayloadData.setHostName(service.getHostName());
+        basicPayloadData.setMultitenant("true");
+        basicPayloadData.setPortMappings(createPortMappingPayloadString(service.getCartridgeInfo()));
+        basicPayloadData.setServiceName(service.getType());
+        basicPayloadData.setTenantId(service.getTenantId());
+        basicPayloadData.setTenantRange("*");
+
+        return basicPayloadData;
+    }
+
     private static String createPortMappingPayloadString (CartridgeInfo cartridgeInfo) {
 
         // port mappings
@@ -66,4 +89,10 @@ public class CartridgeSubscriptionUtils {
 
         return portMappingString;
     }
+
+    public static String generateSubscriptionKey() {
+        String key = RandomStringUtils.randomAlphanumeric(16);
+        log.info("Generated key  : " + key); // TODO -- remove the log
+        return key;
+    }
 }