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/10/15 18:13:42 UTC

[2/3] committing cartridge subscription model changes

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/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
new file mode 100644
index 0000000..c890034
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/manager/CartridgeSubscriptionManager.java
@@ -0,0 +1,400 @@
+/*
+ * 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.manager;
+
+import org.apache.axis2.AxisFault;
+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.connector.CartridgeInstanceConnector;
+import org.apache.stratos.adc.mgt.connector.CartridgeInstanceConnectorFactory;
+import org.apache.stratos.adc.mgt.dao.CartridgeSubscription;
+import org.apache.stratos.adc.mgt.dto.Policy;
+import org.apache.stratos.adc.mgt.dto.SubscriptionInfo;
+import org.apache.stratos.adc.mgt.exception.*;
+import org.apache.stratos.adc.mgt.instance.CartridgeInstance;
+import org.apache.stratos.adc.mgt.instance.factory.CartridgeInstanceFactory;
+import org.apache.stratos.adc.mgt.payload.Payload;
+import org.apache.stratos.adc.mgt.payload.PayloadArg;
+import org.apache.stratos.adc.mgt.payload.PayloadFactory;
+import org.apache.stratos.adc.mgt.repository.Repository;
+import org.apache.stratos.adc.mgt.subscriber.Subscriber;
+import org.apache.stratos.adc.mgt.utils.ApplicationManagementUtil;
+import org.apache.stratos.adc.mgt.utils.PersistenceManager;
+import org.apache.stratos.adc.mgt.utils.PolicyHolder;
+import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
+import org.wso2.carbon.context.CarbonContext;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+/**
+ * Manager class for the purpose of managing CartridgeInstance subscriptions, groupings, etc.
+ */
+public class CartridgeSubscriptionManager {
+
+    private static Log log = LogFactory.getLog(CartridgeSubscriptionManager.class);
+
+    /**
+     * Subscribes to a cartridge
+     *
+     * @param cartridgeType Cartridge type
+     * @param cartridgeAlias Cartridge alias
+     * @param autoscalingPolicyName Autoscaling policy name
+     * @param tenantDomain Subscriing tenant's domain
+     * @param tenantId Subscribing tenant's Id
+     * @param tenantAdminUsername Subscribing tenant's admin user name
+     * @param repositoryType Type of repository
+     * @param repositoryURL Repository URL
+     * @param isPrivateRepository If a private or a public repository
+     * @param repositoryUsername Repository username
+     * @param repositoryPassword Repository password
+     *
+     * @return Subscribed CartridgeInstance object
+     * @throws ADCException
+     * @throws InvalidCartridgeAliasException
+     * @throws DuplicateCartridgeAliasException
+     * @throws PolicyException
+     * @throws UnregisteredCartridgeException
+     * @throws RepositoryRequiredException
+     * @throws RepositoryCredentialsRequiredException
+     * @throws RepositoryTransportException
+     * @throws AlreadySubscribedException
+     * @throws InvalidRepositoryException
+     */
+    public CartridgeInstance subscribeToCartridge (String cartridgeType, String cartridgeAlias,
+                                                  String autoscalingPolicyName, String tenantDomain, int tenantId,
+                                                  String tenantAdminUsername, String repositoryType,
+                                                  String repositoryURL, boolean isPrivateRepository,
+                                                  String repositoryUsername, String repositoryPassword)
+
+            throws ADCException, InvalidCartridgeAliasException, DuplicateCartridgeAliasException, PolicyException,
+            UnregisteredCartridgeException, RepositoryRequiredException, RepositoryCredentialsRequiredException,
+            RepositoryTransportException, AlreadySubscribedException, InvalidRepositoryException {
+
+        //validate cartridge alias
+        ApplicationManagementUtil.validateCartridgeAlias(cartridgeAlias, cartridgeType);
+
+        Policy autoScalingPolicy;
+        if(autoscalingPolicyName != null && !autoscalingPolicyName.isEmpty()) {
+            autoScalingPolicy = PolicyHolder.getInstance().getPolicy(autoscalingPolicyName);
+        } else {
+            autoScalingPolicy = PolicyHolder.getInstance().getDefaultPolicy();
+        }
+
+        if(autoScalingPolicy == null) {
+            throw new PolicyException("Could not load the auto scaling policy.");
+        }
+
+        CartridgeInfo cartridgeInfo;
+        try {
+            cartridgeInfo = CloudControllerServiceClient.getServiceClient().getCartridgeInfo(cartridgeType);
+
+        } catch (UnregisteredCartridgeException e) {
+            String message = cartridgeType
+                    + " is not a valid cartridgeInstance type. Please try again with a valid cartridgeInstance type.";
+            log.error(message);
+            throw e;
+
+        } catch (Exception e) {
+            String message = "Error getting info for " + cartridgeType;
+            log.error(message, e);
+            throw new ADCException(message, e);
+        }
+
+        Subscriber subscriber = new Subscriber(tenantAdminUsername, tenantId, tenantDomain);
+
+        CartridgeInstance cartridgeInstance = CartridgeInstanceFactory.getCartridgeInstance(cartridgeInfo);
+        Repository repository = cartridgeInstance.manageRepository(repositoryURL, repositoryUsername,
+                repositoryPassword, isPrivateRepository, cartridgeAlias, cartridgeInfo, tenantDomain);
+
+        cartridgeInstance.subscribe(subscriber, cartridgeAlias, autoScalingPolicy, repository);
+
+        log.info("Tenant [" + tenantId + "] with username [" + tenantAdminUsername +
+                " subscribed to " + "] Cartridge Alias " + cartridgeAlias + ", Cartridge Type: " + cartridgeType +
+                ", Repo URL: " + repositoryURL + ", Policy: " + autoscalingPolicyName);
+
+        PayloadArg payloadArg = cartridgeInstance.createPayloadParameters();
+        Payload payload = PayloadFactory.getPayloadInstance(cartridgeInfo.getProvider(), cartridgeType,
+                "/tmp/" + tenantDomain + "-" + cartridgeAlias + ".zip");
+        payload.populatePayload(payloadArg);
+
+        //set the payload to the cartridge instance
+        cartridgeInstance.setPayload(payload);
+
+        //CartridgeInstanceCache.getCartridgeInstanceCache().
+        //        addCartridgeInstance(new CartridgeInstanceCacheKey(tenantId, cartridgeAlias), cartridgeInstance);
+
+        return cartridgeInstance;
+    }
+
+    /**
+     * Connects / groups cartridges
+     *
+     * @param tenantDomain Tenant's domain
+     * @param cartridgeInstance CartridgeInstance object to which the CartridgeInstance denoted by
+     *                          connectingCartridgeAlias will be connected to
+     * @param connectingCartridgeAlias Alias of the connecting cartridge
+     *
+     * @throws ADCException
+     * @throws NotSubscribedException
+     * @throws AxisFault
+     */
+    public void connectCartridges (String tenantDomain, CartridgeInstance cartridgeInstance,
+                                   String connectingCartridgeAlias)
+            throws ADCException, NotSubscribedException, AxisFault {
+
+        //TODO: retrieve from the cache and connect. For now, new objects are created
+
+        CartridgeInstance connectingCartridgeInstance = getCartridgeInstance(tenantDomain, connectingCartridgeAlias);
+
+        if(cartridgeInstance == null) {
+            String errorMsg = "No cartridge instance found in cache for tenant " + tenantDomain + ", alias " +
+                    cartridgeInstance.getAlias() + ",  connecting aborted";
+            log.error(errorMsg);
+            return;
+        }
+
+        if(connectingCartridgeInstance == null) {
+            String errorMsg = "No cartridge instance found in cache for tenant " + tenantDomain + ", alias " +
+                    connectingCartridgeAlias + ",  connecting aborted";
+            log.error(errorMsg);
+            return;
+        }
+
+        CartridgeInstanceConnector cartridgeInstanceConnector = CartridgeInstanceConnectorFactory.
+                getCartridgeInstanceConnector(connectingCartridgeInstance.getType());
+
+        cartridgeInstance.connect(connectingCartridgeAlias);
+
+        //PayloadArg payloadArg = cartridgeInstance.createPayloadParameters();
+
+        //get additional payload params for connecting cartridges
+        Properties payloadProperties = cartridgeInstanceConnector.createConnection(cartridgeInstance,
+                connectingCartridgeInstance);
+        StringBuilder connectionParamsBuilder = new StringBuilder();
+        Set<Map.Entry<Object,Object>> payloadParamEntries = payloadProperties.entrySet();
+
+        for (Map.Entry<Object, Object> payloadParamEntry : payloadParamEntries) {
+            connectionParamsBuilder.append(",");
+            connectionParamsBuilder.append(payloadParamEntry.getKey().toString());
+            connectionParamsBuilder.append("=");
+            connectionParamsBuilder.append(payloadParamEntry.getValue().toString());
+        }
+
+        //add additional connection relates parameters to the payload
+        cartridgeInstance.getPayload().populatePayload(connectionParamsBuilder.toString());
+
+        /*
+        payloadArg.setUserDefinedPayload(connectionParamsBuilder.toString());
+        Payload payload = PayloadFactory.getPayloadInstance(cartridgeInstance.getCartridgeInfo().getProvider(),
+                cartridgeInstance.getType(),
+                "/tmp/" + tenantDomain + "-" + cartridgeInstance.getAlias() + ".zip");
+        payload.populatePayload(payloadArg);
+        payload.createPayload();
+        */
+    }
+
+    /**
+     * Registers the cartridge subscription for the given CartridgeInstance object
+     *
+     * @param cartridgeInstance CartridgeInstance instance
+     *
+     * @return SubscriptionInfo object populated with relevant information
+     * @throws ADCException
+     * @throws UnregisteredCartridgeException
+     */
+    public SubscriptionInfo registerCartridgeSubscription(CartridgeInstance cartridgeInstance)
+            throws ADCException, UnregisteredCartridgeException {
+
+        /*CartridgeInstance cartridgeInstance = CartridgeInstanceCache.getCartridgeInstanceCache().
+                getCartridgeInstance(new CartridgeInstanceCacheKey(tenantId, alias));
+
+        if(cartridgeInstance == null) {
+            throw new ADCException("Unable to find cartridge with alias " + alias + ", for tenant Id " + tenantId +
+                    " in cache");
+        }*/
+
+        CartridgeSubscription cartridgeSubscription = cartridgeInstance.registerSubscription(null);
+
+        int subscriptionId;
+        try {
+            subscriptionId = PersistenceManager.persistSubscription(cartridgeSubscription);
+
+        } catch (Exception e) {
+            String errorMsg = "Error saving subscription for tenant " +
+                    cartridgeInstance.getSubscriber().getTenantDomain() + ", alias " + cartridgeInstance.getType();
+            log.error(errorMsg);
+            throw new ADCException(errorMsg, e);
+        }
+
+        cartridgeInstance.setSubscriptionId(subscriptionId);
+        ApplicationManagementUtil.addDNSEntry(cartridgeSubscription.getAlias(), cartridgeInstance.getType());
+
+        return ApplicationManagementUtil.
+                createSubscriptionResponse(cartridgeSubscription, cartridgeInstance.getRepository());
+    }
+
+    /**
+     * Unsubscribe from a CartridgeInstance
+     *
+     * @param tenantDomain Tenant's domain
+     * @param alias Alias of the CartridgeInstance to unsubscribe from
+     * @throws ADCException
+     * @throws NotSubscribedException
+     */
+    public void unsubscribeFromCartridge (String tenantDomain, String alias)
+            throws ADCException, NotSubscribedException {
+
+        //TODO: retrieve from the cache and connect. For now, new objects are created
+
+        CartridgeInstance cartridgeInstance = getCartridgeInstance(tenantDomain, alias);
+
+        if(cartridgeInstance != null) {
+            cartridgeInstance.unsubscribe();
+            //CartridgeInstanceCache.getCartridgeInstanceCache().removeCartridgeInstance(cartridgeInstanceCacheKey);
+        }
+        else {
+            if(log.isDebugEnabled()) {
+                log.debug("No cartridge instance found with alias " + alias + " for tenant " + tenantDomain);
+            }
+        }
+    }
+
+    /*public List<CartridgeInstance> getCartridgeInstances (int tenantId) throws ADCException, NotSubscribedException {
+
+        List<CartridgeSubscription> cartridgeSubscriptions = getCartridgeSubscriptions(tenantId);
+        List<CartridgeInstance> cartridgeInstances = new ArrayList<CartridgeInstance>();
+        CartridgeInfo cartridgeInfo;
+
+        for(CartridgeSubscription cartridgeSubscription : cartridgeSubscriptions) {
+            try {
+                cartridgeInfo = CloudControllerServiceClient.getServiceClient().
+                        getCartridgeInfo(cartridgeSubscription.getCartridge());
+                cartridgeInstances.add(populateCartridgeInstanceInformation(cartridgeInfo, cartridgeSubscription));
+
+            } catch (Exception e) {
+                throw new ADCException(e.getMessage(), e);
+            }
+        }
+
+        return cartridgeInstances;
+    }*/
+
+    /**
+     * Creates and returns a CartridgeInstance object
+     *
+     * @param tenantDomain Tenant's domain
+     * @param alias Alias of the CartridgeInstance
+     *
+     * @return CartridgeInstance object populated with relevant information
+     * @throws ADCException
+     * @throws NotSubscribedException
+     */
+    public CartridgeInstance getCartridgeInstance (String tenantDomain, String alias)
+            throws ADCException, NotSubscribedException {
+
+        CartridgeSubscription cartridgeSubscription = getCartridgeSubscription(tenantDomain, alias);
+
+        CartridgeInfo cartridgeInfo;
+        try {
+            cartridgeInfo = CloudControllerServiceClient.getServiceClient().
+                    getCartridgeInfo(cartridgeSubscription.getCartridge());
+        } catch (Exception e) {
+            throw new ADCException(e.getMessage(), e);
+        }
+
+        return populateCartridgeInstanceInformation(cartridgeInfo, cartridgeSubscription);
+    }
+
+    private CartridgeSubscription getCartridgeSubscription (String tenantDomain, String alias)
+            throws ADCException, NotSubscribedException {
+
+        CartridgeSubscription subscription;
+        try {
+            subscription = PersistenceManager.getSubscription(tenantDomain, alias);
+
+        } catch (Exception e) {
+            String msg = "Failed to get subscriptions for " + tenantDomain;
+            log.error(msg, e);
+            throw new ADCException(msg, e);
+        }
+
+        if (subscription == null) {
+            String msg = "Tenant " + tenantDomain + " has not subscribed for cartridges";
+            log.error(msg);
+            throw new NotSubscribedException(msg, msg);
+        }
+
+        return subscription;
+
+    }
+
+    private List<CartridgeSubscription> getCartridgeSubscriptions (int tenantId) throws ADCException, NotSubscribedException {
+
+        List<CartridgeSubscription> subscriptions;
+        try {
+            subscriptions = PersistenceManager.getSubscriptionsForTenant(tenantId);
+
+        } catch (Exception e) {
+            String msg = "Failed to get subscriptions for " + tenantId;
+            log.error(msg, e);
+            throw new ADCException(msg, e);
+        }
+
+        if (subscriptions == null) {
+            String msg = "Tenant " + tenantId + " has not subscribed for cartridges";
+            log.error(msg);
+            throw new NotSubscribedException(msg, msg);
+        }
+
+        return subscriptions;
+    }
+
+    private CartridgeInstance populateCartridgeInstanceInformation (CartridgeInfo cartridgeInfo,
+                                                                    CartridgeSubscription cartridgeSubscription)
+            throws ADCException {
+
+        CartridgeInstance cartridgeInstance = CartridgeInstanceFactory.getCartridgeInstance(cartridgeInfo);
+
+        cartridgeInstance.setSubscriptionId(cartridgeSubscription.getSubscriptionId());
+        cartridgeInstance.setAlias(cartridgeSubscription.getAlias());
+        cartridgeInstance.setHostName(cartridgeSubscription.getHostName());
+        cartridgeInstance.setClusterDomain(cartridgeSubscription.getClusterDomain());
+        cartridgeInstance.setClusterSubDomain(cartridgeSubscription.getClusterSubdomain());
+        cartridgeInstance.setMgtClusterDomain(cartridgeSubscription.getMgtClusterDomain());
+        cartridgeInstance.setMgtClusterSubDomain(cartridgeSubscription.getMgtClusterSubDomain());
+        Policy autoScalingPolicy;
+        if(cartridgeSubscription.getPolicy() != null && !cartridgeSubscription.getPolicy().isEmpty()) {
+            autoScalingPolicy = PolicyHolder.getInstance().getPolicy(cartridgeSubscription.getPolicy());
+        } else {
+            autoScalingPolicy = PolicyHolder.getInstance().getDefaultPolicy();
+        }
+        cartridgeInstance.setAutoscalingPolicy(autoScalingPolicy);
+        Subscriber subscriber = new Subscriber(CarbonContext.getThreadLocalCarbonContext().getUsername(),
+                cartridgeSubscription.getTenantId(), cartridgeSubscription.getTenantDomain());
+        cartridgeInstance.setSubscriber(subscriber);
+        cartridgeInstance.setRepository(cartridgeSubscription.getRepository());
+
+        return cartridgeInstance;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/CarbonPayload.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/CarbonPayload.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/CarbonPayload.java
new file mode 100644
index 0000000..7581138
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/CarbonPayload.java
@@ -0,0 +1,44 @@
+/*
+ * 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.payload;
+
+import org.apache.stratos.adc.mgt.utils.CartridgeConstants;
+
+public class CarbonPayload extends Payload {
+
+    public CarbonPayload(String payloadFilePath) {
+        super(payloadFilePath);
+    }
+
+    public void populatePayload(PayloadArg payloadArg) {
+
+        super.populatePayload(payloadArg);
+        payloadBuilder.append(",");
+
+        //carbon specific
+        payloadBuilder.append("DEPLOYMENT=" + payloadArg.getDeployment());
+        payloadBuilder.append(",");
+        payloadBuilder.append("SC_IP=" + System.getProperty(CartridgeConstants.SC_IP));
+        payloadBuilder.append(",");
+        payloadBuilder.append("MULTITENANT=" + payloadArg.getCartridgeInfo().getMultiTenant());
+        payloadBuilder.append(",");
+        payloadBuilder.append("DOMAIN=" + payloadArg.getServiceDomain());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/DataPayload.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/DataPayload.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/DataPayload.java
new file mode 100644
index 0000000..f4c8701
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/DataPayload.java
@@ -0,0 +1,40 @@
+/*
+ * 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.payload;
+
+public class DataPayload extends NonCarbonPayload {
+
+    public DataPayload(String payloadFilePath) {
+        super(payloadFilePath);
+    }
+
+    public void populatePayload(PayloadArg payloadArg) {
+
+        super.populatePayload(payloadArg);
+        payloadBuilder.append(",");
+
+        //data specific
+        payloadBuilder.append("MYSQL_USER=" + payloadArg.getDataCartridgeAdminUser());
+        payloadBuilder.append(",");
+        payloadBuilder.append("MYSQL_HOST=" + payloadArg.getDataCartridgeHost());
+        payloadBuilder.append(",");
+        payloadBuilder.append("MYSQL_PASSWORD=" + payloadArg.getDataCartridgeAdminPassword());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/NonCarbonPayload.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/NonCarbonPayload.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/NonCarbonPayload.java
new file mode 100644
index 0000000..8a528d2
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/NonCarbonPayload.java
@@ -0,0 +1,121 @@
+/*
+ * 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.payload;
+
+import org.apache.stratos.adc.mgt.utils.CartridgeConstants;
+import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
+
+import java.text.DecimalFormat;
+
+public class NonCarbonPayload extends Payload {
+
+    public NonCarbonPayload(String payloadFilePath) {
+        super(payloadFilePath);
+    }
+
+    public void populatePayload(PayloadArg payloadArg) {
+
+        super.populatePayload(payloadArg);
+        payloadBuilder.append(",");
+
+        //general
+        payloadBuilder.append("REPO_INFO_EPR=" + System.getProperty(CartridgeConstants.REPO_INFO_EPR));
+        payloadBuilder.append(",");
+        payloadBuilder.append("CARTRIDGE_AGENT_EPR=" + System.getProperty(CartridgeConstants.CARTRIDGE_AGENT_EPR));
+        payloadBuilder.append(",");
+        payloadBuilder.append("APP_PATH=" + payloadArg.getCartridgeInfo().getBaseDir());
+        payloadBuilder.append(",");
+
+        //port mapping specific
+        payloadBuilder.append(createPortMappingPayloadString(payloadArg.getCartridgeInfo()));
+        payloadBuilder.append(",");
+
+        //git repository specific
+        payloadBuilder.append("GIT_REPO=" + getRepositoryUrlParam(payloadArg));
+        payloadBuilder.append(",");
+
+        //BAM specific
+        payloadBuilder.append("BAM_IP=" + System.getProperty(CartridgeConstants.BAM_IP));
+        payloadBuilder.append(",");
+        payloadBuilder.append("BAM_PORT=" + System.getProperty(CartridgeConstants.BAM_PORT));
+
+        //Autoscale policy specific
+        payloadBuilder.append(getAutoscalingParams(payloadArg));
+    }
+
+    private String createPortMappingPayloadString(CartridgeInfo cartridgeInfo) {
+        // port mappings
+        StringBuilder portMapBuilder = new StringBuilder();
+        org.apache.stratos.cloud.controller.util.xsd.PortMapping[] portMappings = cartridgeInfo.getPortMappings();
+        for (org.apache.stratos.cloud.controller.util.xsd.PortMapping portMapping : portMappings) {
+            String port = portMapping.getPort();
+            String protocol = portMapping.getProtocol();
+            String proxyPort = portMapping.getProxyPort();
+            portMapBuilder.append(protocol).append(":").append(port).append(":").append(proxyPort).append("|");
+        }
+
+        // remove last "|" character
+        String portMappingString = portMapBuilder.toString().replaceAll("\\|$", "");
+	        /*String portMappingPayloadString = null;
+	        if (portMappingString.charAt(portMappingString.length() - 1) == '|') {
+	            portMappingPayloadString = portMappingString.substring(0, portMappingString.length() - 1);
+	        } else {
+	            portMappingPayloadString = portMappingString;
+	        }*/
+
+        return "PORTS=" + portMappingString;
+    }
+
+    private String getRepositoryUrlParam (PayloadArg arg) {
+
+        String gitRepoURL = null;
+        if (arg.getRepoURL() != null) {
+            gitRepoURL = arg.getRepoURL();
+        } else {
+            gitRepoURL = "git@" + System.getProperty(CartridgeConstants.GIT_HOST_IP) + ":" + arg.getTenantDomain()
+                    + System.getProperty("file.separator") + arg.getCartridgeAlias() + ".git";
+        }
+        return gitRepoURL;
+    }
+
+    private String getAutoscalingParams (PayloadArg arg) {
+
+        DecimalFormat df = new DecimalFormat("##.##");
+        df.setParseBigDecimal(true);
+
+        StringBuilder autoscalingPayloadBuilder = new StringBuilder();
+        autoscalingPayloadBuilder.append(",");
+        autoscalingPayloadBuilder.append("MIN=" + arg.getPolicy().getMinAppInstances());
+        autoscalingPayloadBuilder.append(",");
+        autoscalingPayloadBuilder.append("MAX=" + arg.getPolicy().getMaxAppInstances());
+        autoscalingPayloadBuilder.append(",");
+        autoscalingPayloadBuilder.append("ALARMING_LOWER_RATE=" + arg.getPolicy().getAlarmingLowerRate());
+        autoscalingPayloadBuilder.append(",");
+        autoscalingPayloadBuilder.append("ALARMING_UPPER_RATE=" + arg.getPolicy().getAlarmingUpperRate());
+        autoscalingPayloadBuilder.append(",");
+        autoscalingPayloadBuilder.append("MAX_REQUESTS_PER_SEC=" + arg.getPolicy().getMaxRequestsPerSecond());
+        autoscalingPayloadBuilder.append(",");
+        autoscalingPayloadBuilder.append("ROUNDS_TO_AVERAGE=" + arg.getPolicy().getRoundsToAverage());
+        autoscalingPayloadBuilder.append(",");
+        autoscalingPayloadBuilder.append("SCALE_DOWN_FACTOR=" + arg.getPolicy().getScaleDownFactor());
+
+        return autoscalingPayloadBuilder.toString();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/Payload.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/Payload.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/Payload.java
new file mode 100644
index 0000000..5b236f2
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/Payload.java
@@ -0,0 +1,257 @@
+/*
+ * 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.payload;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.adc.mgt.exception.ADCException;
+import org.wso2.carbon.utils.CarbonUtils;
+
+import javax.activation.DataHandler;
+import javax.activation.FileDataSource;
+import java.io.*;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+public abstract class Payload {
+
+    private static Log log = LogFactory.getLog(Payload.class);
+
+    protected StringBuilder payloadBuilder;
+    protected String payloadFilePath;
+    protected PayloadArg payloadArg;
+
+    /**
+     * Constructor
+     *
+     * @param payloadFilePath Full path at which the payload file is created
+     */
+    public Payload(String payloadFilePath) {
+        this.payloadFilePath = payloadFilePath;
+        payloadBuilder = new StringBuilder();
+    }
+
+    /**
+     * Pupulates the Payload instance with relevant parameters and values given in PayloadArg instance
+     *
+     * @param payloadArg PayloadArg instance with relevant values
+     */
+    public void populatePayload(PayloadArg payloadArg) {
+
+        this.payloadArg = payloadArg;
+        payloadBuilder.append("HOST_NAME=" + payloadArg.getHostName());
+        payloadBuilder.append(",");
+        payloadBuilder.append("TENANT_ID=" + payloadArg.getTenantId());
+        payloadBuilder.append(",");
+        payloadBuilder.append("TENANT_RANGE=" + payloadArg.getTenantRange());
+        payloadBuilder.append(",");
+        payloadBuilder.append("TENANT_CONTEXT=" + payloadArg.getTenantDomain());
+        payloadBuilder.append(",");
+        payloadBuilder.append("CARTRIDGE_ALIAS=" + payloadArg.getCartridgeAlias());
+        payloadBuilder.append(",");
+        payloadBuilder.append("SERVICE=" + payloadArg.getCartridgeInfo().getType());
+
+        //add the user defined payload String (if any)
+        //this should be of the format <key_1>=<value_1>,<key_2>=<value_2>,....<key_n>=<value_n>
+        if (payloadArg.getUserDefinedPayload() != null && !payloadArg.getUserDefinedPayload().trim().isEmpty()) {
+
+            if(!payloadBuilder.toString().endsWith(",")) {
+                payloadBuilder.append(",");
+            }
+            payloadBuilder.append(payloadArg.getUserDefinedPayload());
+        }
+    }
+
+    //
+    //
+
+    /**
+     * Add the user defined payload String (if any). This should be of the format
+     * <key_1>=<value_1>,<key_2>=<value_2>,....<key_n>=<value_n>
+     *
+     * @param payloadString String object with payload information
+     */
+    public void populatePayload (String payloadString) {
+
+        if(!payloadBuilder.toString().endsWith(",")) {
+            payloadBuilder.append(",");
+        }
+        payloadBuilder.append(payloadString);
+    }
+
+    /**
+     * Create the actual payload in the file system
+     *
+     * @return DataHandler instance with payload
+     * @throws ADCException in case of an error
+     */
+    public DataHandler createPayload () throws ADCException {
+
+        if(payloadBuilder.length() == 0) {
+            log.warn("Payload string length is zero. Create payload failed");
+            return null;
+        }
+
+        File payloadFile = new File(getPayloadFilePath());
+        if(payloadFile.exists()) {
+            payloadFile.delete();
+        }
+
+        log.info("** Payload ** " + payloadBuilder.toString());
+
+        String payloadStringTempFile = "launch-params";
+
+        FileWriter fstream = null;
+        try {
+            fstream = new FileWriter(payloadStringTempFile);
+
+        } catch (IOException e) {
+            log.error(e.getMessage());
+            throw new ADCException(e.getMessage(), e);
+        }
+        BufferedWriter out = new BufferedWriter(fstream);
+        try {
+            out.write(payloadBuilder.toString());
+            out.close();
+
+        } catch (IOException e) {
+            log.error(e.getMessage());
+            throw new ADCException(e.getMessage(), e);
+        }
+
+        FileOutputStream fos = null;
+        try {
+            fos = new FileOutputStream(getPayloadFilePath());
+
+        } catch (FileNotFoundException e) {
+            log.error(e.getMessage());
+            throw new ADCException(e.getMessage(), e);
+        }
+
+        ZipOutputStream zos = new ZipOutputStream(fos);
+        addToZipFile(System.getProperty("user.dir"), payloadStringTempFile, zos);
+
+        File folder = new File(CarbonUtils.getCarbonHome() + File.separator
+                + "repository" + File.separator + "resources" + File.separator
+                + "user-data");
+
+        if(folder != null && folder.exists()) {
+            for (File fileEntry : folder.listFiles()) {
+                if (fileEntry != null && !fileEntry.isDirectory()) {
+                    addToZipFile(folder.getPath(), fileEntry.getName(), zos);
+                }
+            }
+        }
+
+        try {
+            zos.close();
+            fos.close();
+
+        } catch (IOException e) {
+            log.error(e.getMessage());
+            throw new ADCException(e.getMessage(), e);
+        }
+
+        FileDataSource payloadDataSource;
+        try {
+            payloadDataSource = new FileDataSource(new File(payloadFilePath));
+
+        } catch (Exception e) {
+            log.error(e.getMessage());
+            throw new ADCException(e.getMessage(), e);
+        }
+
+        DataHandler payloadDataHandler = new DataHandler(payloadDataSource);
+        return payloadDataHandler;
+    }
+
+    /**
+     * Adds content to a zip file
+     *
+     * @param dir Name of directory
+     * @param fileName Name of file to add
+     * @param zos ZipOutputStream instance to write
+     * @throws ADCException in an error
+     */
+    private void addToZipFile(String dir, String fileName, ZipOutputStream zos) throws ADCException {
+
+        log.info("Writing '" + fileName + "' to zip file");
+
+        File file = new File(dir + File.separator + fileName);
+        FileInputStream fis;
+        try {
+            fis = new FileInputStream(file);
+
+        } catch (FileNotFoundException e) {
+            log.error(e.getMessage());
+            throw new ADCException(e.getMessage(), e);
+        }
+
+        ZipEntry zipEntry = new ZipEntry(fileName);
+        try {
+            zos.putNextEntry(zipEntry);
+
+        } catch (IOException e) {
+            log.error(e.getMessage());
+            throw new ADCException(e.getMessage(), e);
+        }
+
+        byte[] bytes = new byte[1024];
+        int length;
+
+            try {
+                while ((length = fis.read(bytes)) >= 0) {
+                    zos.write(bytes, 0, length);
+                }
+            } catch (IOException e) {
+                log.error(e.getMessage());
+                throw new ADCException(e.getMessage(), e);
+            }
+
+        try {
+            zos.closeEntry();
+            fis.close();
+
+        } catch (IOException e) {
+            log.error(e.getMessage());
+            throw new ADCException(e.getMessage(), e);
+        }
+    }
+
+    public String getPayloadFilePath() {
+        return payloadFilePath;
+    }
+
+    public void setPayloadFilePath(String payloadFilePath) {
+        this.payloadFilePath = payloadFilePath;
+    }
+
+    public boolean delete () {
+        return new File(payloadFilePath).delete();
+    }
+
+    public PayloadArg getPayloadArg() {
+        return payloadArg;
+    }
+
+    public void setPayloadArg(PayloadArg payloadArg) {
+        this.payloadArg = payloadArg;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/PayloadArg.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/PayloadArg.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/PayloadArg.java
new file mode 100755
index 0000000..98986f7
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/PayloadArg.java
@@ -0,0 +1,185 @@
+/**
+ *  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.payload;
+
+import org.apache.stratos.adc.mgt.dto.Policy;
+import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
+
+public class PayloadArg {
+
+    //basic
+    private String hostName;
+    private String tenantRange;
+    private int tenantId;
+    private String serviceName;
+    private String cartridgeAlias;
+    private String tenantDomain;
+    private CartridgeInfo cartridgeInfo;
+    private Policy policy;
+    private String repoURL;
+    private boolean multitenant;
+
+    //other
+	private String userDefinedPayload;
+    private String serviceDomain;
+    private String serviceSubDomain;
+    private String mgtServiceDomain;
+    private String mgtServiceSubDomain;
+    private String deployment;
+
+    //data cartridge specific
+    private String dataCartridgeHost;
+    private String dataCartridgeAdminUser;
+    private String dataCartridgeAdminPassword;
+
+
+	public CartridgeInfo getCartridgeInfo() {
+		return cartridgeInfo;
+	}
+	public void setCartridgeInfo(CartridgeInfo cartridgeInfo) {
+		this.cartridgeInfo = cartridgeInfo;
+	}
+	public Policy getPolicy() {
+		return policy;
+	}
+	public void setPolicy(Policy policy) {
+		this.policy = policy;
+	}
+	public String getRepoURL() {
+		return repoURL;
+	}
+	public void setRepoURL(String repoURL) {
+		this.repoURL = repoURL;
+	}
+	public String getDataCartridgeAdminPassword() {
+		return dataCartridgeAdminPassword;
+	}
+	public void setDataCartridgeAdminPassword(String dataCartridgeAdminPassword) {
+		this.dataCartridgeAdminPassword = dataCartridgeAdminPassword;
+	}
+	public String getDataCartridgeHost() {
+		return dataCartridgeHost;
+	}
+	public void setDataCartridgeHost(String dataCartridgeHost) {
+		this.dataCartridgeHost = dataCartridgeHost;
+	}
+	public int getTenantId() {
+		return tenantId;
+	}
+	public void setTenantId(int tenantId) {
+		this.tenantId = tenantId;
+	}
+	public String getTenantDomain() {
+		return tenantDomain;
+	}
+	public void setTenantDomain(String tenantDomain) {
+		this.tenantDomain = tenantDomain;
+	}
+	public String getUserDefinedPayload() {
+		return userDefinedPayload;
+	}
+	public void setUserDefinedPayload(String userDefinedPayload) {
+		this.userDefinedPayload = userDefinedPayload;
+	}
+	public boolean isMultitenant() {
+		return multitenant;
+	}
+	public void setMultitenant(boolean multitenant) {
+		this.multitenant = multitenant;
+	}
+	public String getCartridgeAlias() {
+		return cartridgeAlias;
+	}
+	public void setCartridgeAlias(String cartridgeAlias) {
+		this.cartridgeAlias = cartridgeAlias;
+	}
+
+    public String getTenantRange() {
+        return tenantRange;
+    }
+
+    public void setTenantRange(String tenantRange) {
+        this.tenantRange = tenantRange;
+    }
+
+    public String getHostName() {
+        return hostName;
+    }
+
+    public void setHostName(String hostName) {
+        this.hostName = hostName;
+    }
+
+    public String getServiceDomain() {
+        return serviceDomain;
+    }
+
+    public void setServiceDomain(String serviceDomain) {
+        this.serviceDomain = serviceDomain;
+    }
+
+    public String getServiceSubDomain() {
+        return serviceSubDomain;
+    }
+
+    public void setServiceSubDomain(String serviceSubDomain) {
+        this.serviceSubDomain = serviceSubDomain;
+    }
+
+    public String getMgtServiceDomain() {
+        return mgtServiceDomain;
+    }
+
+    public void setMgtServiceDomain(String mgtServiceDomain) {
+        this.mgtServiceDomain = mgtServiceDomain;
+    }
+
+    public String getMgtServiceSubDomain() {
+        return mgtServiceSubDomain;
+    }
+
+    public void setMgtServiceSubDomain(String mgtServiceSubDomain) {
+        this.mgtServiceSubDomain = mgtServiceSubDomain;
+    }
+
+    public String getDataCartridgeAdminUser() {
+        return dataCartridgeAdminUser;
+    }
+
+    public void setDataCartridgeAdminUser(String dataCartridgeAdminUser) {
+        this.dataCartridgeAdminUser = dataCartridgeAdminUser;
+    }
+
+    public String getDeployment() {
+        return deployment;
+    }
+
+    public void setDeployment(String deployment) {
+        this.deployment = deployment;
+    }
+
+    public String getServiceName() {
+        return serviceName;
+    }
+
+    public void setServiceName(String serviceName) {
+        this.serviceName = serviceName;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/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
new file mode 100755
index 0000000..f89f2b1
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/payload/PayloadFactory.java
@@ -0,0 +1,64 @@
+/**
+ *  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.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 {
+
+	private static Log log = LogFactory.getLog(PayloadFactory.class);
+
+    /**
+     * Creates and returns a Payload instance
+     *
+     * @param cartridgeProvider Cartridge provider
+     * @param cartridgeType Cartridge type
+     * @param payloadFilePath Location to create the payload
+     * @return Payload instance
+     * @throws ADCException if no matching criteria is found to create a payload
+     */
+	public static Payload getPayloadInstance (String cartridgeProvider, String cartridgeType, String payloadFilePath)
+            throws ADCException {
+
+        Payload payload = null;
+
+        if(cartridgeProvider.equals(CartridgeConstants.PROVIDER_NAME_WSO2)) {
+            payload = new CarbonPayload(payloadFilePath);
+
+        } else {
+            if(cartridgeType.equals(CartridgeConstants.MYSQL_CARTRIDGE_NAME)) {
+                payload = new DataPayload(payloadFilePath);
+            }
+            else {
+                payload = new NonCarbonPayload(payloadFilePath);
+            }
+        }
+
+        if(payload == null) {
+            throw new ADCException("Unable to find matching payload for cartridge type " + cartridgeType +
+                    ", provider " + cartridgeProvider);
+        }
+
+        return payload;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/repository/Repository.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/repository/Repository.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/repository/Repository.java
new file mode 100644
index 0000000..43b6bb5
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/repository/Repository.java
@@ -0,0 +1,60 @@
+/*
+ * 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.repository;
+
+public class Repository {
+
+    private String url;
+    private String userName;
+    private String password;
+    private boolean isPrivateRepository;
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public boolean isPrivateRepository() {
+        return isPrivateRepository;
+    }
+
+    public void setPrivateRepository(boolean privateRepository) {
+        isPrivateRepository = privateRepository;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/ApplicationManagementService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/ApplicationManagementService.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/ApplicationManagementService.java
index 00244e1..7a67eba 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/ApplicationManagementService.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/ApplicationManagementService.java
@@ -22,22 +22,23 @@ package org.apache.stratos.adc.mgt.service;
 import org.apache.axis2.AxisFault;
 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.custom.domain.RegistryManager;
 import org.apache.stratos.adc.mgt.dao.CartridgeSubscription;
-import org.apache.stratos.adc.mgt.dns.DNSManager;
-import org.apache.stratos.adc.mgt.dto.Cartridge;
-import org.apache.stratos.adc.mgt.dto.CartridgeWrapper;
-import org.apache.stratos.adc.mgt.dto.PolicyDefinition;
-import org.apache.stratos.adc.mgt.dto.RepositoryInformation;
-import org.apache.stratos.adc.mgt.dto.SubscriptionInfo;
+import org.apache.stratos.adc.mgt.dto.*;
 import org.apache.stratos.adc.mgt.exception.*;
+import org.apache.stratos.adc.mgt.instance.CartridgeInstance;
 import org.apache.stratos.adc.mgt.internal.DataHolder;
-import org.apache.stratos.adc.mgt.utils.*;
+import org.apache.stratos.adc.mgt.manager.CartridgeSubscriptionManager;
+import org.apache.stratos.adc.mgt.utils.ApplicationManagementUtil;
+import org.apache.stratos.adc.mgt.utils.CartridgeConstants;
+import org.apache.stratos.adc.mgt.utils.PersistenceManager;
+import org.apache.stratos.adc.mgt.utils.PolicyHolder;
 import org.apache.stratos.adc.topology.mgt.service.TopologyManagementService;
+import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
 import org.wso2.carbon.context.PrivilegedCarbonContext;
 import org.wso2.carbon.core.AbstractAdmin;
 import org.wso2.carbon.registry.core.exceptions.RegistryException;
-import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
 import org.wso2.carbon.utils.DataPaginator;
 import org.wso2.carbon.utils.multitenancy.MultitenantConstants;
 
@@ -56,6 +57,7 @@ public class ApplicationManagementService extends AbstractAdmin {
 
     private static final Log log = LogFactory.getLog(ApplicationManagementService.class);
     RegistryManager registryManager = new RegistryManager();
+    private CartridgeSubscriptionManager cartridgeSubsciptionManager = new CartridgeSubscriptionManager();
 
     PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext();
     String tenantDomain = carbonContext.getTenantDomain();
@@ -124,13 +126,13 @@ public class ApplicationManagementService extends AbstractAdmin {
 		try {
 			Pattern searchPattern = getSearchStringPattern(cartridgeSearchString);
 
-			String[] availableCartridges = ApplicationManagementUtil.getServiceClient().getRegisteredCartridges();
+			String[] availableCartridges = CloudControllerServiceClient.getServiceClient().getRegisteredCartridges();
 
 			if (availableCartridges != null) {
 				for (String cartridgeType : availableCartridges) {
 					CartridgeInfo cartridgeInfo = null;
 					try {
-						cartridgeInfo = ApplicationManagementUtil.getServiceClient().getCartridgeInfo(cartridgeType);
+						cartridgeInfo = CloudControllerServiceClient.getServiceClient().getCartridgeInfo(cartridgeType);
 					} catch (Exception e) {
 						if (log.isWarnEnabled()) {
 							log.warn("Error when calling getCartridgeInfo for " + cartridgeType + ", Error: "
@@ -238,7 +240,7 @@ public class ApplicationManagementService extends AbstractAdmin {
 				for (CartridgeSubscription subscription : subscriptionList) {
 					CartridgeInfo cartridgeInfo = null;
 					try {
-						cartridgeInfo = ApplicationManagementUtil.getServiceClient().getCartridgeInfo(
+						cartridgeInfo = CloudControllerServiceClient.getServiceClient().getCartridgeInfo(
 								subscription.getCartridge());
 					} catch (Exception e) {
 						if (log.isWarnEnabled()) {
@@ -386,9 +388,44 @@ public class ApplicationManagementService extends AbstractAdmin {
 
 		checkSuperTenant();
 
-		return ApplicationManagementUtil.doSubscribe(cartridgeType, alias, policy, repoURL, privateRepo, repoUsername,
-				repoPassword, dataCartridgeType, dataCartridgeAlias, getUsername(),
-				ApplicationManagementUtil.getTenantId(getConfigContext()), getTenantDomain());
+		//return ApplicationManagementUtil.doSubscribe(cartridgeType, alias, policy, repoURL, privateRepo, repoUsername,
+		//		repoPassword, dataCartridgeType, dataCartridgeAlias, getUsername(),
+		//		ApplicationManagementUtil.getTenantId(getConfigContext()), getTenantDomain());
+
+        CartridgeInstance cartridgeInstance = cartridgeSubsciptionManager.subscribeToCartridge(cartridgeType,
+                alias.trim(), policy, getTenantDomain(), ApplicationManagementUtil.getTenantId(configurationContext),
+                getUsername(), "git", repoURL, privateRepo, repoUsername, repoPassword);
+
+        if(dataCartridgeAlias != null && !dataCartridgeAlias.trim().isEmpty()) {
+
+            dataCartridgeAlias = dataCartridgeAlias.trim();
+
+            CartridgeInstance connectingCartridgeInstance = null;
+            try {
+                connectingCartridgeInstance = cartridgeSubsciptionManager.getCartridgeInstance(getTenantDomain(),
+                        dataCartridgeAlias);
+
+            } catch (NotSubscribedException e) {
+                log.error(e.getMessage(), e);
+            }
+            if (connectingCartridgeInstance != null) {
+                try {
+                    cartridgeSubsciptionManager.connectCartridges(tenantDomain, cartridgeInstance,
+                            connectingCartridgeInstance.getAlias());
+
+                } catch (NotSubscribedException e) {
+                    log.error(e.getMessage(), e);
+
+                } catch (AxisFault axisFault) {
+                    log.error(axisFault.getMessage(), axisFault);
+                }
+            } else {
+                log.error("Failed to connect. No cartridge instance found for tenant " +
+                        ApplicationManagementUtil.getTenantId(configurationContext) + " with alias " + alias);
+            }
+        }
+
+        return cartridgeSubsciptionManager.registerCartridgeSubscription(cartridgeInstance);
 
 	}
 
@@ -399,8 +436,11 @@ public class ApplicationManagementService extends AbstractAdmin {
      * @param alias name of the cartridge to be unsubscribed
      */
     public void unsubscribe(String alias) throws ADCException, NotSubscribedException {
-    	checkSuperTenant();
-        CartridgeSubscription subscription = null;
+
+        checkSuperTenant();
+
+        cartridgeSubsciptionManager.unsubscribeFromCartridge(getTenantDomain(), alias);
+        /*CartridgeSubscription subscription = null;
         
         try {
 			subscription = PersistenceManager.getSubscription(tenantDomain, alias);
@@ -423,16 +463,16 @@ public class ApplicationManagementService extends AbstractAdmin {
             if (log.isDebugEnabled()) {
                 log.debug("Finding cartridge information for " + subscription.getCartridge());
             }
-            CartridgeInfo cartridgeInfo = ApplicationManagementUtil.getServiceClient().getCartridgeInfo(subscription.getCartridge());
+            CartridgeInfo cartridgeInfo = CloudControllerServiceClient.getServiceClient().getCartridgeInfo(subscription.getCartridge());
             if (log.isDebugEnabled()) {
                 log.debug("Found " + cartridgeInfo.getDisplayName() + " for " + subscription.getCartridge());
             }
             if (!cartridgeInfo.getMultiTenant()) {
                 log.info("Terminating all instances of " + clusterDomain + " " + clusterSubDomain);
-                ApplicationManagementUtil.getServiceClient().terminateAllInstances(clusterDomain, clusterSubDomain);
+                CloudControllerServiceClient.getServiceClient().terminateAllInstances(clusterDomain, clusterSubDomain);
                 log.info("All instances terminated.");
                 log.info("Unregistering services...");
-                ApplicationManagementUtil.getServiceClient().unregisterService(clusterDomain, clusterSubDomain);
+                CloudControllerServiceClient.getServiceClient().unregisterService(clusterDomain, clusterSubDomain);
                 log.info("Successfully terminated instances ..");
             } else {
                 if (log.isInfoEnabled()) {
@@ -461,7 +501,7 @@ public class ApplicationManagementService extends AbstractAdmin {
             String msg1 = "Exception occurred :" + e1.getMessage();
             log.error(msg1);
             throw new ADCException("Unsubscribe failed for cartridge " + alias, e1);
-        }
+        }*/
     }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscriber/Subscriber.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscriber/Subscriber.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscriber/Subscriber.java
new file mode 100644
index 0000000..54a636b
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscriber/Subscriber.java
@@ -0,0 +1,64 @@
+/*
+ * 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.subscriber;
+
+public class Subscriber {
+
+    private String adminUserName;
+    private int tenantId;
+    private String tenantDomain;
+
+    public Subscriber (String adminUserName, int tenantId, String tenantDomain) {
+
+        this.adminUserName = adminUserName;
+        this.tenantId = tenantId;
+        this.tenantDomain = tenantDomain;
+    }
+
+    public String getAdminUserName() {
+        return adminUserName;
+    }
+
+    public void setAdminUserName(String adminUserName) {
+        this.adminUserName = adminUserName;
+    }
+
+    public int getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(int tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getTenantDomain() {
+        return tenantDomain;
+    }
+
+    public void setTenantDomain(String tenantDomain) {
+        this.tenantDomain = tenantDomain;
+    }
+
+    public String toString () {
+        return "[Admin username: " + adminUserName +
+                " -- tenant Id: " + tenantId +
+                " -- tenant domain: " + tenantDomain + "] ";
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/ApplicationManagementUtil.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/ApplicationManagementUtil.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/ApplicationManagementUtil.java
index 932a061..4bbc569 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/ApplicationManagementUtil.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/ApplicationManagementUtil.java
@@ -21,32 +21,7 @@ package org.apache.stratos.adc.mgt.utils;
 */
 
 
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.rmi.RemoteException;
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.regex.Pattern;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-
-import javax.activation.DataHandler;
-import javax.activation.FileDataSource;
-
-import org.apache.axis2.AxisFault;
+import com.google.gson.Gson;
 import org.apache.axis2.clustering.ClusteringAgent;
 import org.apache.axis2.clustering.Member;
 import org.apache.axis2.clustering.management.GroupManagementAgent;
@@ -58,25 +33,21 @@ import org.apache.stratos.adc.mgt.client.CloudControllerServiceClient;
 import org.apache.stratos.adc.mgt.dao.CartridgeSubscription;
 import org.apache.stratos.adc.mgt.dao.DataCartridge;
 import org.apache.stratos.adc.mgt.dao.PortMapping;
-import org.apache.stratos.adc.mgt.dao.Repository;
 import org.apache.stratos.adc.mgt.dns.DNSManager;
 import org.apache.stratos.adc.mgt.dto.Cartridge;
 import org.apache.stratos.adc.mgt.dto.Policy;
 import org.apache.stratos.adc.mgt.dto.RepositoryInformation;
 import org.apache.stratos.adc.mgt.dto.SubscriptionInfo;
-import org.apache.stratos.adc.mgt.exception.ADCException;
-import org.apache.stratos.adc.mgt.exception.AlreadySubscribedException;
-import org.apache.stratos.adc.mgt.exception.DuplicateCartridgeAliasException;
-import org.apache.stratos.adc.mgt.exception.InvalidCartridgeAliasException;
-import org.apache.stratos.adc.mgt.exception.InvalidRepositoryException;
-import org.apache.stratos.adc.mgt.exception.NotSubscribedException;
-import org.apache.stratos.adc.mgt.exception.PolicyException;
-import org.apache.stratos.adc.mgt.exception.RepositoryCredentialsRequiredException;
-import org.apache.stratos.adc.mgt.exception.RepositoryRequiredException;
-import org.apache.stratos.adc.mgt.exception.RepositoryTransportException;
-import org.apache.stratos.adc.mgt.exception.UnregisteredCartridgeException;
+import org.apache.stratos.adc.mgt.exception.*;
 import org.apache.stratos.adc.mgt.internal.DataHolder;
+import org.apache.stratos.adc.mgt.repository.Repository;
 import org.apache.stratos.adc.mgt.service.RepositoryInfoBean;
+import org.apache.stratos.adc.topology.mgt.service.TopologyManagementService;
+import org.apache.stratos.adc.topology.mgt.serviceobjects.DomainContext;
+import org.apache.stratos.cloud.controller.stub.CloudControllerServiceUnregisteredCartridgeExceptionException;
+import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
+import org.apache.stratos.cloud.controller.util.xsd.Properties;
+import org.apache.stratos.cloud.controller.util.xsd.Property;
 import org.eclipse.jgit.api.Git;
 import org.eclipse.jgit.api.LsRemoteCommand;
 import org.eclipse.jgit.api.errors.GitAPIException;
@@ -86,16 +57,20 @@ import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.storage.file.FileRepository;
 import org.eclipse.jgit.transport.CredentialsProvider;
 import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
-import org.apache.stratos.adc.topology.mgt.service.TopologyManagementService;
-import org.apache.stratos.adc.topology.mgt.serviceobjects.DomainContext;
-import org.apache.stratos.cloud.controller.stub.CloudControllerServiceUnregisteredCartridgeExceptionException;
-import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
-import org.apache.stratos.cloud.controller.util.xsd.Properties;
-import org.apache.stratos.cloud.controller.util.xsd.Property;
 import org.wso2.carbon.utils.CarbonUtils;
 import org.wso2.carbon.utils.multitenancy.MultitenantUtils;
 
-import com.google.gson.Gson;
+import javax.activation.DataHandler;
+import javax.activation.FileDataSource;
+import java.io.*;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.rmi.RemoteException;
+import java.text.DecimalFormat;
+import java.util.*;
+import java.util.regex.Pattern;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
 
 /**
  * This class contains utility methods used by ApplicationManagementService.
@@ -103,7 +78,7 @@ import com.google.gson.Gson;
 public class ApplicationManagementUtil {
 
     private static Log log = LogFactory.getLog(ApplicationManagementUtil.class);
-    private static volatile CloudControllerServiceClient serviceClient;
+    //private static volatile CloudControllerServiceClient serviceClient;
 
     /**
      * Method used to subscribe to cartridges.
@@ -135,7 +110,7 @@ public class ApplicationManagementUtil {
 		
 		CartridgeInfo cartridgeInfo;
 		try {
-			cartridgeInfo = getServiceClient().getCartridgeInfo(cartridgeType);
+			cartridgeInfo = CloudControllerServiceClient.getServiceClient().getCartridgeInfo(cartridgeType);
 		} catch (UnregisteredCartridgeException e) {
 			String message = cartridgeType
 					+ " is not a valid cartridge type. Please try again with a valid cartridge type.";
@@ -340,11 +315,12 @@ public class ApplicationManagementUtil {
             }
         }
 
-        subscription =
+        /*subscription =
                 createCartridgeSubscription(cartridgeInfo, autoScalingPolicy,
                         cartridgeType, cartName, tenantId, tenantDomain,
                         repository, clusterDomain, clusterSubDomain,
                         mgtClusterDomain, mgtClusterSubDomain, dataCartridge);
+        */
 
         try {
 			PersistenceManager.persistSubscription(subscription);
@@ -561,37 +537,30 @@ public class ApplicationManagementUtil {
         return axisConfig.getRepository().getPath() + File.separator + cartridge;
     }
 
-    private static CartridgeSubscription createCartridgeSubscription(CartridgeInfo cartridgeInfo,
-                                                                     Policy policy,
-                                                                     String cartridgeType,
-                                                                     String cartridgeName,
-                                                                     int tenantId,
-                                                                     String tenantDomain,
-                                                                     Repository repository,
-                                                                     String clusterDomain,
-                                                                     String clusterSubDomain,
-                                                                     String mgtClusterDomain,
-                                                                     String mgtClusterSubDomain,
-                                                                     DataCartridge dataCartridge) {
+    public static CartridgeSubscription createCartridgeSubscription(CartridgeInfo cartridgeInfo,
+                                                                    Policy policy,
+                                                                    String cartridgeType,
+                                                                    String cartridgeName,
+                                                                    int tenantId,
+                                                                    String tenantDomain,
+                                                                    Repository repository,
+                                                                    String hostName,
+                                                                    String clusterDomain,
+                                                                    String clusterSubDomain,
+                                                                    String mgtClusterDomain,
+                                                                    String mgtClusterSubDomain,
+                                                                    DataCartridge dataCartridge,
+                                                                    String state) {
 
         CartridgeSubscription cartridgeSubscription = new CartridgeSubscription();
         cartridgeSubscription.setCartridge(cartridgeType);
         cartridgeSubscription.setAlias(cartridgeName);
         cartridgeSubscription.setClusterDomain(clusterDomain);
         cartridgeSubscription.setClusterSubdomain(clusterSubDomain);
-               cartridgeSubscription.setMgtClusterDomain(mgtClusterDomain);
-                cartridgeSubscription.setMgtClusterSubDomain(mgtClusterSubDomain);
-        String hostName = null;
-        if (cartridgeInfo.getMultiTenant()) {
-            hostName = cartridgeInfo.getHostName();
-        } else {
-            hostName = cartridgeName + "." + cartridgeInfo.getHostName();
-        }
+        cartridgeSubscription.setMgtClusterDomain(mgtClusterDomain);
+        cartridgeSubscription.setMgtClusterSubDomain(mgtClusterSubDomain);
         cartridgeSubscription.setHostName(hostName);
-        if (policy != null) {
-        	// Policy can be null for multi-tenant cartridge
-        	cartridgeSubscription.setPolicy(policy.getName());
-        }
+        cartridgeSubscription.setPolicy(policy.getName());
         cartridgeSubscription.setRepository(repository);
         cartridgeSubscription.setPortMappings(createPortMappings(cartridgeInfo));
         cartridgeSubscription.setProvider(cartridgeInfo.getProvider());
@@ -599,7 +568,8 @@ public class ApplicationManagementUtil {
         cartridgeSubscription.setTenantId(tenantId);
         cartridgeSubscription.setTenantDomain(tenantDomain);
         cartridgeSubscription.setBaseDirectory(cartridgeInfo.getBaseDir());
-        cartridgeSubscription.setState("PENDING");
+        //cartridgeSubscription.setState("PENDING");
+        cartridgeSubscription.setState(state);
         return cartridgeSubscription;
     }
 
@@ -619,7 +589,7 @@ public class ApplicationManagementUtil {
         return portMappings;
     }
 
-    public static CloudControllerServiceClient getServiceClient() throws AxisFault {
+    /*public static CloudControllerServiceClient getServiceClient() throws AxisFault {
         if (serviceClient == null) {
             synchronized (CloudControllerServiceClient.class) {
                 if (serviceClient == null) {
@@ -629,7 +599,7 @@ public class ApplicationManagementUtil {
             }
         }
         return serviceClient;
-    }
+    }*/
 
     public static int getTenantId(ConfigurationContext configurationContext) {
         int tenantId = MultitenantUtils.getTenantId(configurationContext);
@@ -639,7 +609,7 @@ public class ApplicationManagementUtil {
         return tenantId;
     }
 
-	private static void validateCartridgeAlias(String alias, String cartridgeType) throws InvalidCartridgeAliasException, DuplicateCartridgeAliasException, ADCException {
+	public static void validateCartridgeAlias(String alias, String cartridgeType) throws InvalidCartridgeAliasException, DuplicateCartridgeAliasException, ADCException {
 		// Do not use quotes in messages, current UI JavaScript does not work if there are quotes
 		// TODO: Fix message display in UI
 		String patternString = "([a-z0-9]+([-][a-z0-9])*)+";
@@ -753,7 +723,7 @@ public class ApplicationManagementUtil {
 		return repositoryInformation;
 	}
 
-    private static String generatePassword() {
+    public static String generatePassword() {
 
         final int PASSWORD_LENGTH = 8;
         StringBuffer sb = new StringBuffer();
@@ -770,7 +740,7 @@ public class ApplicationManagementUtil {
         log.info(" Payload file is deleted. ");
     }
 
-    private static Properties setRegisterServiceProperties(Policy policy, int tenantId, String alias) {
+    public static Properties setRegisterServiceProperties(Policy policy, int tenantId, String alias) {
     	
     	DecimalFormat df = new DecimalFormat("##.##");
         df.setParseBigDecimal(true);
@@ -852,15 +822,15 @@ public class ApplicationManagementUtil {
         return convertedHttpURL;
     }
 
-    private static void addDNSEntry(String alias, String cartridgeType) {
+    public static void addDNSEntry(String alias, String cartridgeType) {
         new DNSManager().addNewSubDomain(alias + "." + cartridgeType, System.getProperty(CartridgeConstants.ELB_IP));
     }
 
-    private static SubscriptionInfo createSubscriptionResponse(CartridgeSubscription cartridgeSubscription, Repository repository) {
+    public static SubscriptionInfo createSubscriptionResponse(CartridgeSubscription cartridgeSubscription, Repository repository) {
     	SubscriptionInfo subscriptionInfo = new SubscriptionInfo();
     	
-        if (repository != null && repository.getRepoName() != null) {
-        	subscriptionInfo.setRepositoryURL(convertRepoURL(repository.getRepoName()));
+        if (repository != null && repository.getUrl() != null) {
+        	subscriptionInfo.setRepositoryURL(convertRepoURL(repository.getUrl()));
         }
         
         subscriptionInfo.setHostname(cartridgeSubscription.getHostName());
@@ -884,9 +854,9 @@ public class ApplicationManagementUtil {
             log.info("External REPO URL is provided as [" + repoURL +
                     "]. Therefore not creating a new repo.");
             //repository.setRepoName(repoURL.substring(0, repoURL.length()-4)); // remove .git part
-            repository.setRepoName(repoURL);
-            repository.setRepoUserName(repoUserName);
-            repository.setRepoUserPassword(repoUserPassword);
+            repository.setUrl(repoURL);
+            repository.setUserName(repoUserName);
+            repository.setPassword(repoUserPassword);
         } else {
 
             //log.info("External REPO URL is not provided. Therefore creating a new repo. Adding to Executor");
@@ -894,8 +864,8 @@ public class ApplicationManagementUtil {
                     + tenantDomain + ", creating an git internal repository");
 
             // for internal repos  internal git server username and password is used.
-            repository.setRepoUserName(System.getProperty(CartridgeConstants.INTERNAL_GIT_USERNAME));
-            repository.setRepoUserPassword(System.getProperty(CartridgeConstants.INTERNAL_GIT_PASSWORD));
+            repository.setUserName(System.getProperty(CartridgeConstants.INTERNAL_GIT_USERNAME));
+            repository.setPassword(System.getProperty(CartridgeConstants.INTERNAL_GIT_PASSWORD));
             /*repoCreationExecutor.execute(new RepositoryCreator(new RepositoryInfoBean(repoURL,
                     cartName,
                     tenantDomain,
@@ -906,12 +876,12 @@ public class ApplicationManagementUtil {
             new RepositoryCreator(new RepositoryInfoBean(repoURL,
                     cartName,
                     tenantDomain,
-                    repository.getRepoUserName(),
-                    repository.getRepoUserPassword(),
+                    repository.getUserName(),
+                    repository.getPassword(),
                     cartridgeInfo.getDeploymentDirs(),
                     cartridgeInfo)).createInternalRepository();
             String repoName = tenantDomain + "/" + cartName;
-            repository.setRepoName("https://" + System.getProperty(CartridgeConstants.GIT_HOST_NAME) + ":8443/git/" + repoName);
+            repository.setUrl("https://" + System.getProperty(CartridgeConstants.GIT_HOST_NAME) + ":8443/git/" + repoName);
 
         }
         return repository;
@@ -943,7 +913,7 @@ public class ApplicationManagementUtil {
         
         CartridgeInfo cartridgeInfo = null;
         try {
-            cartridgeInfo = getServiceClient().getCartridgeInfo(sub.getCartridge());
+            cartridgeInfo = CloudControllerServiceClient.getServiceClient().getCartridgeInfo(sub.getCartridge());
         } catch (Exception e) {
             throw new ADCException("Cannot get cartridge info: " + sub.getCartridge(), e);
         }
@@ -957,12 +927,12 @@ public class ApplicationManagementUtil {
         return populateCartridgeInfo(cartridgeInfo, sub, ips, tenantDomain);
     }
 
-    private static void registerService(String cartridgeType, String domain, String subDomain,
+    public static void registerService(String cartridgeType, String domain, String subDomain,
                                         DataHandler payload, String tenantRange, String hostName, Properties properties)
             throws ADCException, UnregisteredCartridgeException {
         log.info("Register service..");
         try {
-            getServiceClient().register(domain, subDomain, cartridgeType, payload, tenantRange,
+            CloudControllerServiceClient.getServiceClient().register(domain, subDomain, cartridgeType, payload, tenantRange,
                     hostName, properties);
         } catch (CloudControllerServiceUnregisteredCartridgeExceptionException e) {
             String msg = "Exception is occurred in register service operation. Reason :" + e.getMessage();
@@ -1082,7 +1052,7 @@ public class ApplicationManagementUtil {
         cartridge.setMappedDomain(sub.getMappedDomain());
 
         if (sub.getRepository() != null) {
-            cartridge.setRepoURL(convertRepoURL(sub.getRepository().getRepoName()));
+            cartridge.setRepoURL(convertRepoURL(sub.getRepository().getUrl()));
         }
         return cartridge;
     }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/CartridgeConstants.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/CartridgeConstants.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/CartridgeConstants.java
index 4e3184d..ae873d8 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/CartridgeConstants.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/CartridgeConstants.java
@@ -57,6 +57,9 @@ public class CartridgeConstants {
 	public static final String FEATURE_MULTI_TENANT_MULTIPLE_SUBSCRIPTION_ENABLED = "feature.multitenant.multiplesubscription.enabled";
 	
 	public static final String MYSQL_CARTRIDGE_NAME = "mysql";
+    public static final String PHP_CARTRIDGE_NAME = "php";
+    public static final String TOMCAT_CARTRIDGE_NAME = "tomcat";
+
 	public static final String DEFAULT_SUBDOMAIN = "__$default";
 	public static final String DEFAULT_MGT_SUBDOMAIN = "mgt";
 	public static final String MYSQL_DEFAULT_USER = "root";

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/PersistenceManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/PersistenceManager.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/PersistenceManager.java
index cda711c..3820ff5 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/PersistenceManager.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/PersistenceManager.java
@@ -18,23 +18,6 @@
  */
 package org.apache.stratos.adc.mgt.utils;
 
-import java.io.File;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import javax.crypto.Cipher;
-import javax.crypto.SecretKey;
-import javax.crypto.spec.SecretKeySpec;
-import javax.xml.namespace.QName;
-
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.impl.builder.StAXOMBuilder;
 import org.apache.commons.codec.binary.Base64;
@@ -43,12 +26,20 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.adc.mgt.dao.CartridgeSubscription;
 import org.apache.stratos.adc.mgt.dao.DataCartridge;
 import org.apache.stratos.adc.mgt.dao.PortMapping;
-import org.apache.stratos.adc.mgt.dao.Repository;
 import org.apache.stratos.adc.mgt.dao.RepositoryCredentials;
+import org.apache.stratos.adc.mgt.repository.Repository;
 import org.wso2.carbon.utils.CarbonUtils;
 import org.wso2.securevault.SecretResolver;
 import org.wso2.securevault.SecretResolverFactory;
 
+import javax.crypto.Cipher;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+import javax.xml.namespace.QName;
+import java.io.File;
+import java.sql.*;
+import java.util.*;
+
 /**
  * This class is responsible for handling persistence
  * 
@@ -191,7 +182,7 @@ public class PersistenceManager {
 				cartridge.setPolicy(resultSet.getString("POLICY"));
 				cartridge.setMappedDomain(resultSet.getString("MAPPED_DOMAIN"));
 				Repository repo = new Repository();
-				repo.setRepoName(resultSet.getString("REPO_NAME"));
+				repo.setUrl(resultSet.getString("REPO_NAME"));
 				cartridge.setRepository(repo);
 				cartridge.setHostName(resultSet.getString("HOSTNAME"));
 				int dataCartridgeId = resultSet.getInt("DATA_CARTRIDGE_ID");
@@ -336,14 +327,14 @@ public class PersistenceManager {
 			// persist repo
 			if (cartridgeSubscription.getRepository() != null) {
 				String encryptedRepoUserPassword = encryptPassword(cartridgeSubscription.getRepository()
-						.getRepoUserPassword());
+						.getPassword());
 				String insertRepo = "INSERT INTO REPOSITORY (REPO_NAME,STATE,REPO_USER_NAME,REPO_USER_PASSWORD)"
 						+ " VALUES (?,?,?,?)";
 
 				insertRepoStmt = con.prepareStatement(insertRepo, Statement.RETURN_GENERATED_KEYS);
-				insertRepoStmt.setString(1, cartridgeSubscription.getRepository().getRepoName());
+				insertRepoStmt.setString(1, cartridgeSubscription.getRepository().getUrl());
 				insertRepoStmt.setString(2, "ACTIVE");
-				insertRepoStmt.setString(3, cartridgeSubscription.getRepository().getRepoUserName());
+				insertRepoStmt.setString(3, cartridgeSubscription.getRepository().getUserName());
 				insertRepoStmt.setString(4, encryptedRepoUserPassword);
 				if (log.isDebugEnabled()) {
 					log.debug("Executing insert: " + insertRepo);
@@ -517,7 +508,7 @@ public class PersistenceManager {
 		String repoName = resultSet.getString("REPO_NAME");
 		if (repoName != null) {
 			Repository repo = new Repository();
-			repo.setRepoName(repoName);
+			repo.setUrl(repoName);
 			cartridgeSubscription.setRepository(repo);
 		}
 
@@ -645,7 +636,45 @@ public class PersistenceManager {
 		return subscriptionList;
 	}
 
-	public static void updateSubscriptionState(int subscriptionId, String state) throws Exception {
+    public static List<CartridgeSubscription> getSubscriptionsForTenant (int tenantId) throws Exception {
+
+        List<CartridgeSubscription> cartridgeSubscriptions = null;
+        Connection con = null;
+        PreparedStatement statement = null;
+        ResultSet resultSet = null;
+
+        try {
+            con = StratosDBUtils.getConnection();
+            String sql = "SELECT * FROM CARTRIDGE_SUBSCRIPTION C left join REPOSITORY R on "
+                    + "C.REPO_ID=R.REPO_ID left join DATA_CARTRIDGE D on "
+                    + "D.DATA_CART_ID=C.DATA_CARTRIDGE_ID WHERE TENANT_ID=? AND C.STATE != 'UNSUBSCRIBED'";
+            statement = con.prepareStatement(sql);
+            statement.setInt(1, tenantId);
+            if (log.isDebugEnabled()) {
+                log.debug("Executing query: " + sql);
+            }
+
+            resultSet = statement.executeQuery();
+            cartridgeSubscriptions = new ArrayList<CartridgeSubscription>();
+            if (resultSet.next()) {
+                CartridgeSubscription cartridgeSubscription = new CartridgeSubscription();
+                populateSubscription(cartridgeSubscription, resultSet);
+                cartridgeSubscriptions.add(cartridgeSubscription);
+            }
+        } catch (Exception s) {
+            String msg = "Error while sql connection :" + s.getMessage();
+            log.error(msg, s);
+            throw s;
+
+        } finally {
+            StratosDBUtils.closeAllConnections(con, statement, resultSet);
+        }
+
+        return cartridgeSubscriptions;
+    }
+
+
+    public static void updateSubscriptionState(int subscriptionId, String state) throws Exception {
 
 		Connection con = null;
 		PreparedStatement statement = null;

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/RepositoryCreator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/RepositoryCreator.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/RepositoryCreator.java
index d9a0568..28885f9 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/RepositoryCreator.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/RepositoryCreator.java
@@ -26,8 +26,7 @@ import com.gitblit.models.RepositoryModel;
 import com.gitblit.utils.RpcUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.adc.mgt.dao.Repository;
-import org.apache.stratos.adc.mgt.exception.ADCException;
+import org.apache.stratos.adc.mgt.repository.Repository;
 import org.apache.stratos.adc.mgt.service.RepositoryInfoBean;
 import org.eclipse.jgit.api.*;
 import org.eclipse.jgit.storage.file.FileRepository;