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/19 21:58:50 UTC

[2/4] refactoring and changing CartridgeInstance to CartridgeSubscription

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/7db31d5d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/utils/CartridgeInstanceUtils.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/utils/CartridgeInstanceUtils.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/utils/CartridgeInstanceUtils.java
deleted file mode 100644
index 40f151f..0000000
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/utils/CartridgeInstanceUtils.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * 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.instance.utils;
-
-public class CartridgeInstanceUtils {
-    /*
-    private static Log log = LogFactory.getLog(CartridgeInstanceUtils.class);
-
-    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])*)+";
-        Pattern pattern = Pattern.compile(patternString);
-
-        if (!pattern.matcher(alias).matches()) {
-            String msg = "The alias " + alias + " can contain only alpha-numeric lowercase characters. Please enter a valid alias.";
-            log.error(msg);
-            throw new InvalidCartridgeAliasException(msg, cartridgeType, alias);
-        }
-
-        boolean isAliasTaken = false;
-        try {
-            isAliasTaken = PersistenceManager.isAliasAlreadyTaken(alias, cartridgeType);
-        } catch (Exception e) {
-            String msg = "Exception : " + e.getMessage();
-            log.error(msg, e);
-            throw new ADCException("Error when checking alias is already taken", e);
-        }
-
-        if (isAliasTaken) {
-            String msg = "The alias " + alias + " is already taken. Please try again with a different alias.";
-            log.error(msg);
-            throw new DuplicateCartridgeAliasException(msg, cartridgeType, alias);
-        }
-    }
-
-    public static String generatePassword() {
-
-        final int PASSWORD_LENGTH = 8;
-        StringBuffer sb = new StringBuffer();
-        for (int x = 0; x < PASSWORD_LENGTH; x++) {
-            sb.append((char) ((int) (Math.random() * 26) + 97));
-        }
-        return sb.toString();
-
-    }
-
-    public static CartridgeSubscription createCartridgeSubscription(CartridgeInfo cartridgeInfo,
-                                                                     Policy policy,
-                                                                     String cartridgeType,
-                                                                     String cartridgeAlias,
-                                                                     int tenantId,
-                                                                     String tenantDomain,
-                                                                     Repository repository,
-                                                                     String clusterDomain,
-                                                                     String clusterSubDomain,
-                                                                     String hostName,
-                                                                     String mgtClusterDomain,
-                                                                     String mgtClusterSubDomain,
-                                                                     DataCartridge dataCartridge) {
-
-        CartridgeSubscription cartridgeSubscription = new CartridgeSubscription();
-        cartridgeSubscription.setCartridge(cartridgeType);
-        cartridgeSubscription.setAlias(cartridgeAlias);
-        cartridgeSubscription.setClusterDomain(clusterDomain);
-        cartridgeSubscription.setClusterSubdomain(clusterSubDomain);
-        cartridgeSubscription.setMgtClusterDomain(mgtClusterDomain);
-        cartridgeSubscription.setMgtClusterSubDomain(mgtClusterSubDomain);
-        cartridgeSubscription.setHostName(hostName);
-        cartridgeSubscription.setPolicy(policy.getName());
-        cartridgeSubscription.setRepository(repository);
-        cartridgeSubscription.setPortMappings(createPortMappings(cartridgeInfo));
-        cartridgeSubscription.setProvider(cartridgeInfo.getProvider());
-        cartridgeSubscription.setDataCartridge(dataCartridge);
-        cartridgeSubscription.setTenantId(tenantId);
-        cartridgeSubscription.setTenantDomain(tenantDomain);
-        cartridgeSubscription.setBaseDirectory(cartridgeInfo.getBaseDir());
-        cartridgeSubscription.setState("PENDING");
-
-        return cartridgeSubscription;
-    }
-
-    private static List<PortMapping> createPortMappings(CartridgeInfo cartridgeInfo) {
-        List<PortMapping> portMappings = new ArrayList<PortMapping>();
-
-        if (cartridgeInfo.getPortMappings() != null) {
-            for (org.apache.stratos.cloud.controller.util.xsd.PortMapping portMapping : cartridgeInfo.getPortMappings()) {
-                PortMapping portMap = new PortMapping();
-                portMap.setPrimaryPort(portMapping.getPort());
-                portMap.setProxyPort(portMapping.getProxyPort());
-                portMap.setType(portMapping.getProtocol());
-                portMappings.add(portMap);
-            }
-        }
-        return portMappings;
-    }
-
-    public static void addDNSEntry(String alias, String cartridgeType) {
-        new DNSManager().addNewSubDomain(alias + "." + cartridgeType, System.getProperty(CartridgeConstants.ELB_IP));
-    }
-
-    public static SubscriptionInfo createSubscriptionResponse(CartridgeSubscription cartridgeSubscription, Repository repository) {
-        SubscriptionInfo subscriptionInfo = new SubscriptionInfo();
-
-        if (repository != null && repository.getUrl() != null) {
-            subscriptionInfo.setRepositoryURL(convertRepoURL(repository.getUrl()));
-        }
-        subscriptionInfo.setHostname(cartridgeSubscription.getHostName());
-
-        return subscriptionInfo;
-    }
-
-    private static String convertRepoURL(String gitURL) {
-        String convertedHttpURL = null;
-        if (gitURL != null && gitURL.startsWith("git@")) {
-            StringBuilder httpRepoUrl = new StringBuilder();
-            httpRepoUrl.append("http://");
-            String[] urls = gitURL.split(":");
-            String[] hostNameArray = urls[0].split("@");
-            String hostName = hostNameArray[1];
-            httpRepoUrl.append(hostName).append("/").append(urls[1]);
-            convertedHttpURL = httpRepoUrl.toString();
-        } else if (gitURL != null && gitURL.startsWith("http")) {
-            convertedHttpURL = gitURL;
-        }
-        return convertedHttpURL;
-    }
-
-    public static RepositoryInformation validateRepository(String repoURL, String repoUsername, String repoPassword,
-                                                           boolean privateRepo, boolean testConnection)
-
-            throws RepositoryRequiredException, ADCException,
-            RepositoryCredentialsRequiredException, InvalidRepositoryException, RepositoryTransportException {
-
-        RepositoryInformation repositoryInformation = new RepositoryInformation();
-        repositoryInformation.setRepoURL(repoURL);
-        if (log.isDebugEnabled()) {
-            log.debug("Validating Git Repository");
-        }
-
-        if (repoURL == null || repoURL.trim().length() == 0) {
-            throw new RepositoryRequiredException("External repository required for subscription");
-        }
-
-        if (repoURL != null && repoURL.trim().length() > 0 && privateRepo) {
-            if (log.isDebugEnabled()) {
-                log.debug("External repo validation is a private repo: " + repoURL);
-            }
-            if (repoUsername == null || repoUsername.trim().length() == 0 || repoPassword == null
-                    || repoPassword.trim().length() == 0) {
-                throw new RepositoryCredentialsRequiredException(
-                        "Username and Password are required for private repository");
-            }
-        }
-
-        if (!testConnection) {
-            if (log.isDebugEnabled()) {
-                log.debug("External repo validation is not enabled");
-            }
-            return repositoryInformation;
-        }
-
-        if (repoURL == null || repoURL.trim().length() == 0) {
-            // This means, no repo to validate.
-            return repositoryInformation;
-        }
-
-        if (log.isDebugEnabled()) {
-            log.debug("External repo validation enabled");
-        }
-
-        // This assumes running on Linux.
-        String parentDirName = "/tmp/" + UUID.randomUUID().toString();
-        CredentialsProvider credentialsProvider = null;
-        if (repoUsername != null && repoUsername.trim().length() > 0 && repoPassword != null
-                && repoPassword.trim().length() > 0) {
-            if (log.isDebugEnabled()) {
-                log.debug("External repo credentails are passed: " + repoUsername);
-            }
-            credentialsProvider = new UsernamePasswordCredentialsProvider(repoUsername, repoPassword.toCharArray());
-        }
-
-        // Initialize temp local file repo
-        FileRepository localRepo = null;
-        try {
-            File f = new File(parentDirName + "/.git");
-            localRepo = new FileRepository(f);
-            if (log.isDebugEnabled()) {
-                log.debug("Local File Repo: " + f.getAbsoluteFile());
-            }
-        } catch (IOException e) {
-            throw new ADCException("Error creating local file repo", e);
-        }
-
-        Git git = new Git(localRepo);
-        LsRemoteCommand cmd = git.lsRemote().setRemote(repoURL);
-        if (credentialsProvider != null) {
-            cmd.setCredentialsProvider(credentialsProvider);
-        }
-        try {
-            Collection<Ref> collection = cmd.call();
-            List<String> refNames = new ArrayList<String>();
-            if (collection != null) {
-                for (Ref ref : collection) {
-                    if (log.isDebugEnabled()) {
-                        log.debug(repoURL + ": " + ref.getName());
-                    }
-                    refNames.add(ref.getName());
-                }
-            }
-            repositoryInformation.setRefName(refNames.toArray(new String[refNames.size()]));
-        } catch (InvalidRemoteException e) {
-            throw new InvalidRepositoryException("Provided repository url is not valid", e);
-        } catch (TransportException e) {
-            throw new RepositoryTransportException("Transport error when checking remote repository", e);
-        } catch (GitAPIException e) {
-            throw new ADCException("Git API error when checking remote repository", e);
-        }
-        return repositoryInformation;
-    }*/
-}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/7db31d5d/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 c890034..ec35a33 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
@@ -23,19 +23,19 @@ 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.connector.CartridgeSubscriptionConnector;
+import org.apache.stratos.adc.mgt.connector.CartridgeSubscriptionConnectorFactory;
+import org.apache.stratos.adc.mgt.dao.CartridgeSubscriptionInfo;
 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.subscription.CartridgeSubscription;
+import org.apache.stratos.adc.mgt.subscription.factory.CartridgeSubscriptionFactory;
 import org.apache.stratos.adc.mgt.utils.ApplicationManagementUtil;
 import org.apache.stratos.adc.mgt.utils.PersistenceManager;
 import org.apache.stratos.adc.mgt.utils.PolicyHolder;
@@ -48,7 +48,7 @@ import java.util.Properties;
 import java.util.Set;
 
 /**
- * Manager class for the purpose of managing CartridgeInstance subscriptions, groupings, etc.
+ * Manager class for the purpose of managing CartridgeSubscriptionInfo subscriptions, groupings, etc.
  */
 public class CartridgeSubscriptionManager {
 
@@ -69,7 +69,7 @@ public class CartridgeSubscriptionManager {
      * @param repositoryUsername Repository username
      * @param repositoryPassword Repository password
      *
-     * @return Subscribed CartridgeInstance object
+     * @return Subscribed CartridgeSubscriptionInfo object
      * @throws ADCException
      * @throws InvalidCartridgeAliasException
      * @throws DuplicateCartridgeAliasException
@@ -81,7 +81,7 @@ public class CartridgeSubscriptionManager {
      * @throws AlreadySubscribedException
      * @throws InvalidRepositoryException
      */
-    public CartridgeInstance subscribeToCartridge (String cartridgeType, String cartridgeAlias,
+    public CartridgeSubscription subscribeToCartridge (String cartridgeType, String cartridgeAlias,
                                                   String autoscalingPolicyName, String tenantDomain, int tenantId,
                                                   String tenantAdminUsername, String repositoryType,
                                                   String repositoryURL, boolean isPrivateRepository,
@@ -111,7 +111,7 @@ public class CartridgeSubscriptionManager {
 
         } catch (UnregisteredCartridgeException e) {
             String message = cartridgeType
-                    + " is not a valid cartridgeInstance type. Please try again with a valid cartridgeInstance type.";
+                    + " is not a valid cartridgeSubscription type. Please try again with a valid cartridgeSubscription type.";
             log.error(message);
             throw e;
 
@@ -123,35 +123,38 @@ public class CartridgeSubscriptionManager {
 
         Subscriber subscriber = new Subscriber(tenantAdminUsername, tenantId, tenantDomain);
 
-        CartridgeInstance cartridgeInstance = CartridgeInstanceFactory.getCartridgeInstance(cartridgeInfo);
-        Repository repository = cartridgeInstance.manageRepository(repositoryURL, repositoryUsername,
+        CartridgeSubscription cartridgeSubscription = CartridgeSubscriptionFactory.getCartridgeSubscriptionInstance(cartridgeInfo);
+        Repository repository = cartridgeSubscription.manageRepository(repositoryURL, repositoryUsername,
                 repositoryPassword, isPrivateRepository, cartridgeAlias, cartridgeInfo, tenantDomain);
 
-        cartridgeInstance.subscribe(subscriber, cartridgeAlias, autoScalingPolicy, repository);
+        cartridgeSubscription.createSubscription(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);
+        PayloadArg payloadArg = cartridgeSubscription.createPayloadParameters();
+        if (payloadArg != null) {
+
+            Payload payload = PayloadFactory.getPayloadInstance(cartridgeInfo.getProvider(), cartridgeType,
+                    "/tmp/" + tenantDomain + "-" + cartridgeAlias + ".zip");
+            payload.populatePayload(payloadArg);
 
-        //set the payload to the cartridge instance
-        cartridgeInstance.setPayload(payload);
+            //set the payload to the cartridge subscription
+            cartridgeSubscription.setPayload(payload);
+        }
 
         //CartridgeInstanceCache.getCartridgeInstanceCache().
-        //        addCartridgeInstance(new CartridgeInstanceCacheKey(tenantId, cartridgeAlias), cartridgeInstance);
+        //        addCartridgeInstance(new CartridgeInstanceCacheKey(tenantId, cartridgeAlias), cartridgeSubscription);
 
-        return cartridgeInstance;
+        return cartridgeSubscription;
     }
 
     /**
      * Connects / groups cartridges
      *
      * @param tenantDomain Tenant's domain
-     * @param cartridgeInstance CartridgeInstance object to which the CartridgeInstance denoted by
+     * @param cartridgeSubscription CartridgeSubscriptionInfo object to which the CartridgeSubscriptionInfo denoted by
      *                          connectingCartridgeAlias will be connected to
      * @param connectingCartridgeAlias Alias of the connecting cartridge
      *
@@ -159,38 +162,38 @@ public class CartridgeSubscriptionManager {
      * @throws NotSubscribedException
      * @throws AxisFault
      */
-    public void connectCartridges (String tenantDomain, CartridgeInstance cartridgeInstance,
+    public void connectCartridges (String tenantDomain, CartridgeSubscription cartridgeSubscription,
                                    String connectingCartridgeAlias)
             throws ADCException, NotSubscribedException, AxisFault {
 
         //TODO: retrieve from the cache and connect. For now, new objects are created
 
-        CartridgeInstance connectingCartridgeInstance = getCartridgeInstance(tenantDomain, connectingCartridgeAlias);
+        CartridgeSubscription connectingCartridgeSubscription = getCartridgeSubscription(tenantDomain, connectingCartridgeAlias);
 
-        if(cartridgeInstance == null) {
-            String errorMsg = "No cartridge instance found in cache for tenant " + tenantDomain + ", alias " +
-                    cartridgeInstance.getAlias() + ",  connecting aborted";
+        if(cartridgeSubscription == null) {
+            String errorMsg = "No cartridge subscription found in cache for tenant " + tenantDomain + ", alias " +
+                    cartridgeSubscription.getAlias() + ",  connecting aborted";
             log.error(errorMsg);
             return;
         }
 
-        if(connectingCartridgeInstance == null) {
-            String errorMsg = "No cartridge instance found in cache for tenant " + tenantDomain + ", alias " +
+        if(connectingCartridgeSubscription == null) {
+            String errorMsg = "No cartridge subscription found in cache for tenant " + tenantDomain + ", alias " +
                     connectingCartridgeAlias + ",  connecting aborted";
             log.error(errorMsg);
             return;
         }
 
-        CartridgeInstanceConnector cartridgeInstanceConnector = CartridgeInstanceConnectorFactory.
-                getCartridgeInstanceConnector(connectingCartridgeInstance.getType());
+        CartridgeSubscriptionConnector cartridgeSubscriptionConnector = CartridgeSubscriptionConnectorFactory.
+                getCartridgeInstanceConnector(connectingCartridgeSubscription.getType());
 
-        cartridgeInstance.connect(connectingCartridgeAlias);
+        cartridgeSubscription.connect(connectingCartridgeAlias);
 
-        //PayloadArg payloadArg = cartridgeInstance.createPayloadParameters();
+        //PayloadArg payloadArg = cartridgeSubscription.createPayloadParameters();
 
         //get additional payload params for connecting cartridges
-        Properties payloadProperties = cartridgeInstanceConnector.createConnection(cartridgeInstance,
-                connectingCartridgeInstance);
+        Properties payloadProperties = cartridgeSubscriptionConnector.createConnection(cartridgeSubscription,
+                connectingCartridgeSubscription);
         StringBuilder connectionParamsBuilder = new StringBuilder();
         Set<Map.Entry<Object,Object>> payloadParamEntries = payloadProperties.entrySet();
 
@@ -202,63 +205,63 @@ public class CartridgeSubscriptionManager {
         }
 
         //add additional connection relates parameters to the payload
-        cartridgeInstance.getPayload().populatePayload(connectionParamsBuilder.toString());
+        cartridgeSubscription.getPayload().populatePayload(connectionParamsBuilder.toString());
 
         /*
         payloadArg.setUserDefinedPayload(connectionParamsBuilder.toString());
-        Payload payload = PayloadFactory.getPayloadInstance(cartridgeInstance.getCartridgeInfo().getProvider(),
-                cartridgeInstance.getType(),
-                "/tmp/" + tenantDomain + "-" + cartridgeInstance.getAlias() + ".zip");
+        Payload payload = PayloadFactory.getPayloadInstance(cartridgeSubscription.getCartridgeInfo().getProvider(),
+                cartridgeSubscription.getType(),
+                "/tmp/" + tenantDomain + "-" + cartridgeSubscription.getAlias() + ".zip");
         payload.populatePayload(payloadArg);
         payload.createPayload();
         */
     }
 
     /**
-     * Registers the cartridge subscription for the given CartridgeInstance object
+     * Registers the cartridge subscription for the given CartridgeSubscriptionInfo object
      *
-     * @param cartridgeInstance CartridgeInstance instance
+     * @param cartridgeSubscription CartridgeSubscription subscription
      *
      * @return SubscriptionInfo object populated with relevant information
      * @throws ADCException
      * @throws UnregisteredCartridgeException
      */
-    public SubscriptionInfo registerCartridgeSubscription(CartridgeInstance cartridgeInstance)
+    public SubscriptionInfo registerCartridgeSubscription(CartridgeSubscription cartridgeSubscription)
             throws ADCException, UnregisteredCartridgeException {
 
-        /*CartridgeInstance cartridgeInstance = CartridgeInstanceCache.getCartridgeInstanceCache().
-                getCartridgeInstance(new CartridgeInstanceCacheKey(tenantId, alias));
+        /*CartridgeSubscriptionInfo cartridgeSubscription = CartridgeInstanceCache.getCartridgeInstanceCache().
+                getCartridgeSubscription(new CartridgeInstanceCacheKey(tenantId, alias));
 
-        if(cartridgeInstance == null) {
+        if(cartridgeSubscription == null) {
             throw new ADCException("Unable to find cartridge with alias " + alias + ", for tenant Id " + tenantId +
                     " in cache");
         }*/
 
-        CartridgeSubscription cartridgeSubscription = cartridgeInstance.registerSubscription(null);
+        CartridgeSubscriptionInfo cartridgeSubscriptionInfo = cartridgeSubscription.registerSubscription(null);
 
         int subscriptionId;
         try {
-            subscriptionId = PersistenceManager.persistSubscription(cartridgeSubscription);
+            subscriptionId = PersistenceManager.persistSubscription(cartridgeSubscriptionInfo);
 
         } catch (Exception e) {
             String errorMsg = "Error saving subscription for tenant " +
-                    cartridgeInstance.getSubscriber().getTenantDomain() + ", alias " + cartridgeInstance.getType();
+                    cartridgeSubscription.getSubscriber().getTenantDomain() + ", alias " + cartridgeSubscription.getType();
             log.error(errorMsg);
             throw new ADCException(errorMsg, e);
         }
 
-        cartridgeInstance.setSubscriptionId(subscriptionId);
-        ApplicationManagementUtil.addDNSEntry(cartridgeSubscription.getAlias(), cartridgeInstance.getType());
+        cartridgeSubscription.setSubscriptionId(subscriptionId);
+        ApplicationManagementUtil.addDNSEntry(cartridgeSubscriptionInfo.getAlias(), cartridgeSubscription.getType());
 
         return ApplicationManagementUtil.
-                createSubscriptionResponse(cartridgeSubscription, cartridgeInstance.getRepository());
+                createSubscriptionResponse(cartridgeSubscriptionInfo, cartridgeSubscription.getRepository());
     }
 
     /**
-     * Unsubscribe from a CartridgeInstance
+     * Unsubscribe from a Cartridge
      *
      * @param tenantDomain Tenant's domain
-     * @param alias Alias of the CartridgeInstance to unsubscribe from
+     * @param alias Alias given at subscription time
      * @throws ADCException
      * @throws NotSubscribedException
      */
@@ -267,30 +270,30 @@ public class CartridgeSubscriptionManager {
 
         //TODO: retrieve from the cache and connect. For now, new objects are created
 
-        CartridgeInstance cartridgeInstance = getCartridgeInstance(tenantDomain, alias);
+        CartridgeSubscription cartridgeSubscription = getCartridgeSubscription(tenantDomain, alias);
 
-        if(cartridgeInstance != null) {
-            cartridgeInstance.unsubscribe();
+        if(cartridgeSubscription != null) {
+            cartridgeSubscription.removeSubscription();
             //CartridgeInstanceCache.getCartridgeInstanceCache().removeCartridgeInstance(cartridgeInstanceCacheKey);
         }
         else {
             if(log.isDebugEnabled()) {
-                log.debug("No cartridge instance found with alias " + alias + " for tenant " + tenantDomain);
+                log.debug("No cartridge subscription found with alias " + alias + " for tenant " + tenantDomain);
             }
         }
     }
 
-    /*public List<CartridgeInstance> getCartridgeInstances (int tenantId) throws ADCException, NotSubscribedException {
+    /*public List<CartridgeSubscriptionInfo> getCartridgeInstances (int tenantId) throws ADCException, NotSubscribedException {
 
-        List<CartridgeSubscription> cartridgeSubscriptions = getCartridgeSubscriptions(tenantId);
-        List<CartridgeInstance> cartridgeInstances = new ArrayList<CartridgeInstance>();
+        List<CartridgeSubscriptionInfo> cartridgeSubscriptions = getCartridgeSubscriptions(tenantId);
+        List<CartridgeSubscriptionInfo> cartridgeInstances = new ArrayList<CartridgeSubscriptionInfo>();
         CartridgeInfo cartridgeInfo;
 
-        for(CartridgeSubscription cartridgeSubscription : cartridgeSubscriptions) {
+        for(CartridgeSubscriptionInfo cartridgeSubscription : cartridgeSubscriptions) {
             try {
                 cartridgeInfo = CloudControllerServiceClient.getServiceClient().
                         getCartridgeInfo(cartridgeSubscription.getCartridge());
-                cartridgeInstances.add(populateCartridgeInstanceInformation(cartridgeInfo, cartridgeSubscription));
+                cartridgeInstances.add(populateCartridgeSubscriptionInformation(cartridgeInfo, cartridgeSubscription));
 
             } catch (Exception e) {
                 throw new ADCException(e.getMessage(), e);
@@ -301,35 +304,35 @@ public class CartridgeSubscriptionManager {
     }*/
 
     /**
-     * Creates and returns a CartridgeInstance object
+     * Creates and returns a CartridgeSubscription object
      *
      * @param tenantDomain Tenant's domain
-     * @param alias Alias of the CartridgeInstance
+     * @param alias alias given at subscription
      *
-     * @return CartridgeInstance object populated with relevant information
+     * @return CartridgeSubscription object populated with relevant information
      * @throws ADCException
      * @throws NotSubscribedException
      */
-    public CartridgeInstance getCartridgeInstance (String tenantDomain, String alias)
+    public CartridgeSubscription getCartridgeSubscription(String tenantDomain, String alias)
             throws ADCException, NotSubscribedException {
 
-        CartridgeSubscription cartridgeSubscription = getCartridgeSubscription(tenantDomain, alias);
+        CartridgeSubscriptionInfo cartridgeSubscriptionInfo = getCartridgeSubscriptionInfo(tenantDomain, alias);
 
         CartridgeInfo cartridgeInfo;
         try {
             cartridgeInfo = CloudControllerServiceClient.getServiceClient().
-                    getCartridgeInfo(cartridgeSubscription.getCartridge());
+                    getCartridgeInfo(cartridgeSubscriptionInfo.getCartridge());
         } catch (Exception e) {
             throw new ADCException(e.getMessage(), e);
         }
 
-        return populateCartridgeInstanceInformation(cartridgeInfo, cartridgeSubscription);
+        return populateCartridgeSubscriptionInformation(cartridgeInfo, cartridgeSubscriptionInfo);
     }
 
-    private CartridgeSubscription getCartridgeSubscription (String tenantDomain, String alias)
+    private CartridgeSubscriptionInfo getCartridgeSubscriptionInfo(String tenantDomain, String alias)
             throws ADCException, NotSubscribedException {
 
-        CartridgeSubscription subscription;
+        CartridgeSubscriptionInfo subscription;
         try {
             subscription = PersistenceManager.getSubscription(tenantDomain, alias);
 
@@ -349,9 +352,9 @@ public class CartridgeSubscriptionManager {
 
     }
 
-    private List<CartridgeSubscription> getCartridgeSubscriptions (int tenantId) throws ADCException, NotSubscribedException {
+    private List<CartridgeSubscriptionInfo> getCartridgeSubscriptions (int tenantId) throws ADCException, NotSubscribedException {
 
-        List<CartridgeSubscription> subscriptions;
+        List<CartridgeSubscriptionInfo> subscriptions;
         try {
             subscriptions = PersistenceManager.getSubscriptionsForTenant(tenantId);
 
@@ -370,31 +373,31 @@ public class CartridgeSubscriptionManager {
         return subscriptions;
     }
 
-    private CartridgeInstance populateCartridgeInstanceInformation (CartridgeInfo cartridgeInfo,
-                                                                    CartridgeSubscription cartridgeSubscription)
+    private CartridgeSubscription populateCartridgeSubscriptionInformation(CartridgeInfo cartridgeInfo,
+                                                                           CartridgeSubscriptionInfo cartridgeSubscriptionInfo)
             throws ADCException {
 
-        CartridgeInstance cartridgeInstance = CartridgeInstanceFactory.getCartridgeInstance(cartridgeInfo);
+        CartridgeSubscription cartridgeSubscription = CartridgeSubscriptionFactory.getCartridgeSubscriptionInstance(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());
+        cartridgeSubscription.setSubscriptionId(cartridgeSubscriptionInfo.getSubscriptionId());
+        cartridgeSubscription.setAlias(cartridgeSubscriptionInfo.getAlias());
+        cartridgeSubscription.setHostName(cartridgeSubscriptionInfo.getHostName());
+        cartridgeSubscription.setClusterDomain(cartridgeSubscriptionInfo.getClusterDomain());
+        cartridgeSubscription.setClusterSubDomain(cartridgeSubscriptionInfo.getClusterSubdomain());
+        cartridgeSubscription.setMgtClusterDomain(cartridgeSubscriptionInfo.getMgtClusterDomain());
+        cartridgeSubscription.setMgtClusterSubDomain(cartridgeSubscriptionInfo.getMgtClusterSubDomain());
         Policy autoScalingPolicy;
-        if(cartridgeSubscription.getPolicy() != null && !cartridgeSubscription.getPolicy().isEmpty()) {
-            autoScalingPolicy = PolicyHolder.getInstance().getPolicy(cartridgeSubscription.getPolicy());
+        if(cartridgeSubscriptionInfo.getPolicy() != null && !cartridgeSubscriptionInfo.getPolicy().isEmpty()) {
+            autoScalingPolicy = PolicyHolder.getInstance().getPolicy(cartridgeSubscriptionInfo.getPolicy());
         } else {
             autoScalingPolicy = PolicyHolder.getInstance().getDefaultPolicy();
         }
-        cartridgeInstance.setAutoscalingPolicy(autoScalingPolicy);
+        cartridgeSubscription.setAutoscalingPolicy(autoScalingPolicy);
         Subscriber subscriber = new Subscriber(CarbonContext.getThreadLocalCarbonContext().getUsername(),
-                cartridgeSubscription.getTenantId(), cartridgeSubscription.getTenantDomain());
-        cartridgeInstance.setSubscriber(subscriber);
-        cartridgeInstance.setRepository(cartridgeSubscription.getRepository());
+                cartridgeSubscriptionInfo.getTenantId(), cartridgeSubscriptionInfo.getTenantDomain());
+        cartridgeSubscription.setSubscriber(subscriber);
+        cartridgeSubscription.setRepository(cartridgeSubscriptionInfo.getRepository());
 
-        return cartridgeInstance;
+        return cartridgeSubscription;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/7db31d5d/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
index 8a528d2..86c365b 100644
--- 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
@@ -19,6 +19,7 @@
 
 package org.apache.stratos.adc.mgt.payload;
 
+import org.apache.stratos.adc.mgt.dto.Policy;
 import org.apache.stratos.adc.mgt.utils.CartridgeConstants;
 import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
 
@@ -41,23 +42,27 @@ public class NonCarbonPayload extends Payload {
         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(",");
+        if(payloadArg.getCartridgeInfo() != null) {
+            payloadBuilder.append(",");
+            payloadBuilder.append(createPortMappingPayloadString(payloadArg.getCartridgeInfo()));
+        }
 
         //git repository specific
-        payloadBuilder.append("GIT_REPO=" + getRepositoryUrlParam(payloadArg));
         payloadBuilder.append(",");
+        payloadBuilder.append("GIT_REPO=" + getRepositoryUrlParam(payloadArg));
 
         //BAM specific
+        payloadBuilder.append(",");
         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));
+        if(payloadArg.getPolicy() != null) {
+            payloadBuilder.append(getAutoscalingParams(payloadArg.getPolicy()));
+        }
     }
 
     private String createPortMappingPayloadString(CartridgeInfo cartridgeInfo) {
@@ -95,26 +100,27 @@ public class NonCarbonPayload extends Payload {
         return gitRepoURL;
     }
 
-    private String getAutoscalingParams (PayloadArg arg) {
+    private String getAutoscalingParams (Policy policy) {
 
         DecimalFormat df = new DecimalFormat("##.##");
         df.setParseBigDecimal(true);
 
         StringBuilder autoscalingPayloadBuilder = new StringBuilder();
+
         autoscalingPayloadBuilder.append(",");
-        autoscalingPayloadBuilder.append("MIN=" + arg.getPolicy().getMinAppInstances());
+        autoscalingPayloadBuilder.append("MIN=" + policy.getMinAppInstances());
         autoscalingPayloadBuilder.append(",");
-        autoscalingPayloadBuilder.append("MAX=" + arg.getPolicy().getMaxAppInstances());
+        autoscalingPayloadBuilder.append("MAX=" + policy.getMaxAppInstances());
         autoscalingPayloadBuilder.append(",");
-        autoscalingPayloadBuilder.append("ALARMING_LOWER_RATE=" + arg.getPolicy().getAlarmingLowerRate());
+        autoscalingPayloadBuilder.append("ALARMING_LOWER_RATE=" + policy.getAlarmingLowerRate());
         autoscalingPayloadBuilder.append(",");
-        autoscalingPayloadBuilder.append("ALARMING_UPPER_RATE=" + arg.getPolicy().getAlarmingUpperRate());
+        autoscalingPayloadBuilder.append("ALARMING_UPPER_RATE=" + policy.getAlarmingUpperRate());
         autoscalingPayloadBuilder.append(",");
-        autoscalingPayloadBuilder.append("MAX_REQUESTS_PER_SEC=" + arg.getPolicy().getMaxRequestsPerSecond());
+        autoscalingPayloadBuilder.append("MAX_REQUESTS_PER_SEC=" + policy.getMaxRequestsPerSecond());
         autoscalingPayloadBuilder.append(",");
-        autoscalingPayloadBuilder.append("ROUNDS_TO_AVERAGE=" + arg.getPolicy().getRoundsToAverage());
+        autoscalingPayloadBuilder.append("ROUNDS_TO_AVERAGE=" + policy.getRoundsToAverage());
         autoscalingPayloadBuilder.append(",");
-        autoscalingPayloadBuilder.append("SCALE_DOWN_FACTOR=" + arg.getPolicy().getScaleDownFactor());
+        autoscalingPayloadBuilder.append("SCALE_DOWN_FACTOR=" + policy.getScaleDownFactor());
 
         return autoscalingPayloadBuilder.toString();
     }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/7db31d5d/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
index 5b236f2..1e17c2d 100644
--- 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
@@ -49,9 +49,9 @@ public abstract class Payload {
     }
 
     /**
-     * Pupulates the Payload instance with relevant parameters and values given in PayloadArg instance
+     * Pupulates the Payload subscription with relevant parameters and values given in PayloadArg subscription
      *
-     * @param payloadArg PayloadArg instance with relevant values
+     * @param payloadArg PayloadArg subscription with relevant values
      */
     public void populatePayload(PayloadArg payloadArg) {
 
@@ -65,8 +65,10 @@ public abstract class Payload {
         payloadBuilder.append("TENANT_CONTEXT=" + payloadArg.getTenantDomain());
         payloadBuilder.append(",");
         payloadBuilder.append("CARTRIDGE_ALIAS=" + payloadArg.getCartridgeAlias());
-        payloadBuilder.append(",");
-        payloadBuilder.append("SERVICE=" + payloadArg.getCartridgeInfo().getType());
+        if(payloadArg.getCartridgeInfo() != null) {
+            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>
@@ -99,7 +101,7 @@ public abstract class Payload {
     /**
      * Create the actual payload in the file system
      *
-     * @return DataHandler instance with payload
+     * @return DataHandler subscription with payload
      * @throws ADCException in case of an error
      */
     public DataHandler createPayload () throws ADCException {
@@ -187,7 +189,7 @@ public abstract class Payload {
      *
      * @param dir Name of directory
      * @param fileName Name of file to add
-     * @param zos ZipOutputStream instance to write
+     * @param zos ZipOutputStream subscription to write
      * @throws ADCException in an error
      */
     private void addToZipFile(String dir, String fileName, ZipOutputStream zos) throws ADCException {

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/7db31d5d/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 f89f2b1..fd5d6ce 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
@@ -29,12 +29,12 @@ public class PayloadFactory {
 	private static Log log = LogFactory.getLog(PayloadFactory.class);
 
     /**
-     * Creates and returns a Payload instance
+     * Creates and returns a Payload subscription
      *
      * @param cartridgeProvider Cartridge provider
      * @param cartridgeType Cartridge type
      * @param payloadFilePath Location to create the payload
-     * @return Payload instance
+     * @return Payload subscription
      * @throws ADCException if no matching criteria is found to create a payload
      */
 	public static Payload getPayloadInstance (String cartridgeProvider, String cartridgeType, String payloadFilePath)

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/7db31d5d/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 7a67eba..771ed4b 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
@@ -24,10 +24,10 @@ 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.dao.CartridgeSubscriptionInfo;
 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.subscription.CartridgeSubscription;
 import org.apache.stratos.adc.mgt.internal.DataHolder;
 import org.apache.stratos.adc.mgt.manager.CartridgeSubscriptionManager;
 import org.apache.stratos.adc.mgt.utils.ApplicationManagementUtil;
@@ -173,12 +173,12 @@ public class ApplicationManagementService extends AbstractAdmin {
 					
 					if (cartridgeInfo.getMultiTenant() && !allowMultipleSubscription) {
 						// If the cartridge is multi-tenant. We should not let users
-						// subscribe twice.
+						// createSubscription twice.
 						if (PersistenceManager.isAlreadySubscribed(cartridgeType,
 								ApplicationManagementUtil.getTenantId(getConfigContext()))) {
 							if (log.isDebugEnabled()) {
 								log.debug("Already subscribed to " + cartridgeType
-										+ ". This multi-tenant cartridge will not be available to subscribe");
+										+ ". This multi-tenant cartridge will not be available to createSubscription");
 							}
 							cartridge.setStatus(CartridgeConstants.SUBSCRIBED);
 						}
@@ -233,11 +233,11 @@ public class ApplicationManagementService extends AbstractAdmin {
 		try {
 			Pattern searchPattern = getSearchStringPattern(cartridgeSearchString);
 
-			List<CartridgeSubscription> subscriptionList = PersistenceManager
+			List<CartridgeSubscriptionInfo> subscriptionList = PersistenceManager
 					.retrieveSubscribedCartridges(ApplicationManagementUtil.getTenantId(getConfigContext()));
 
 			if (subscriptionList != null && !subscriptionList.isEmpty()) {
-				for (CartridgeSubscription subscription : subscriptionList) {
+				for (CartridgeSubscriptionInfo subscription : subscriptionList) {
 					CartridgeInfo cartridgeInfo = null;
 					try {
 						cartridgeInfo = CloudControllerServiceClient.getServiceClient().getCartridgeInfo(
@@ -317,7 +317,7 @@ public class ApplicationManagementService extends AbstractAdmin {
         return true;
     }
 
-    private boolean cartridgeMatches(CartridgeInfo cartridgeInfo, CartridgeSubscription cartridgeSubscription, Pattern pattern) {
+    private boolean cartridgeMatches(CartridgeInfo cartridgeInfo, CartridgeSubscriptionInfo cartridgeSubscriptionInfo, Pattern pattern) {
         if (pattern != null) {
             boolean matches = false;
             if (cartridgeInfo.getDisplayName() != null) {
@@ -326,11 +326,11 @@ public class ApplicationManagementService extends AbstractAdmin {
             if (!matches && cartridgeInfo.getDescription() != null) {
                 matches = pattern.matcher(cartridgeInfo.getDescription().toLowerCase()).find();
             }
-            if (!matches && cartridgeSubscription.getCartridge() != null) {
-                matches = pattern.matcher(cartridgeSubscription.getCartridge().toLowerCase()).find();
+            if (!matches && cartridgeSubscriptionInfo.getCartridge() != null) {
+                matches = pattern.matcher(cartridgeSubscriptionInfo.getCartridge().toLowerCase()).find();
             }
-            if (!matches && cartridgeSubscription.getAlias() != null) {
-                matches = pattern.matcher(cartridgeSubscription.getAlias().toLowerCase()).find();
+            if (!matches && cartridgeSubscriptionInfo.getAlias() != null) {
+                matches = pattern.matcher(cartridgeSubscriptionInfo.getAlias().toLowerCase()).find();
             }
             return matches;
         }
@@ -344,17 +344,17 @@ public class ApplicationManagementService extends AbstractAdmin {
 
     public String[] getSubscribedCartridgeAliases() throws AxisFault {
         try {
-            List<CartridgeSubscription> subscriptionList = PersistenceManager
+            List<CartridgeSubscriptionInfo> subscriptionList = PersistenceManager
                     .retrieveSubscribedCartridges(ApplicationManagementUtil.getTenantId(getConfigContext()));
             List<String> subscribedAliases = new ArrayList<String>();
-            for (CartridgeSubscription cartridgeSubscription : subscriptionList) {
+            for (CartridgeSubscriptionInfo cartridgeSubscriptionInfo : subscriptionList) {
 
-                if(cartridgeSubscription.getProvider().equalsIgnoreCase(CartridgeConstants.PROVIDER_NAME_WSO2) &&
-                        getCartridgeInfo(cartridgeSubscription.getAlias()).isMultiTenant()) {
+                if(cartridgeSubscriptionInfo.getProvider().equalsIgnoreCase(CartridgeConstants.PROVIDER_NAME_WSO2) &&
+                        getCartridgeInfo(cartridgeSubscriptionInfo.getAlias()).isMultiTenant()) {
 
-                    subscribedAliases.add(cartridgeSubscription.getCartridge());
+                    subscribedAliases.add(cartridgeSubscriptionInfo.getCartridge());
                 } else {
-                    subscribedAliases.add(cartridgeSubscription.getAlias());
+                    subscribedAliases.add(cartridgeSubscriptionInfo.getAlias());
                 }
             }
             if(subscribedAliases.size() == 0) {
@@ -392,7 +392,7 @@ public class ApplicationManagementService extends AbstractAdmin {
 		//		repoPassword, dataCartridgeType, dataCartridgeAlias, getUsername(),
 		//		ApplicationManagementUtil.getTenantId(getConfigContext()), getTenantDomain());
 
-        CartridgeInstance cartridgeInstance = cartridgeSubsciptionManager.subscribeToCartridge(cartridgeType,
+        CartridgeSubscription cartridgeSubscription = cartridgeSubsciptionManager.subscribeToCartridge(cartridgeType,
                 alias.trim(), policy, getTenantDomain(), ApplicationManagementUtil.getTenantId(configurationContext),
                 getUsername(), "git", repoURL, privateRepo, repoUsername, repoPassword);
 
@@ -400,18 +400,18 @@ public class ApplicationManagementService extends AbstractAdmin {
 
             dataCartridgeAlias = dataCartridgeAlias.trim();
 
-            CartridgeInstance connectingCartridgeInstance = null;
+            CartridgeSubscription connectingCartridgeSubscription = null;
             try {
-                connectingCartridgeInstance = cartridgeSubsciptionManager.getCartridgeInstance(getTenantDomain(),
+                connectingCartridgeSubscription = cartridgeSubsciptionManager.getCartridgeSubscription(getTenantDomain(),
                         dataCartridgeAlias);
 
             } catch (NotSubscribedException e) {
                 log.error(e.getMessage(), e);
             }
-            if (connectingCartridgeInstance != null) {
+            if (connectingCartridgeSubscription != null) {
                 try {
-                    cartridgeSubsciptionManager.connectCartridges(tenantDomain, cartridgeInstance,
-                            connectingCartridgeInstance.getAlias());
+                    cartridgeSubsciptionManager.connectCartridges(tenantDomain, cartridgeSubscription,
+                            connectingCartridgeSubscription.getAlias());
 
                 } catch (NotSubscribedException e) {
                     log.error(e.getMessage(), e);
@@ -420,12 +420,12 @@ public class ApplicationManagementService extends AbstractAdmin {
                     log.error(axisFault.getMessage(), axisFault);
                 }
             } else {
-                log.error("Failed to connect. No cartridge instance found for tenant " +
+                log.error("Failed to connect. No cartridge subscription found for tenant " +
                         ApplicationManagementUtil.getTenantId(configurationContext) + " with alias " + alias);
             }
         }
 
-        return cartridgeSubsciptionManager.registerCartridgeSubscription(cartridgeInstance);
+        return cartridgeSubsciptionManager.registerCartridgeSubscription(cartridgeSubscription);
 
 	}
 
@@ -440,7 +440,7 @@ public class ApplicationManagementService extends AbstractAdmin {
         checkSuperTenant();
 
         cartridgeSubsciptionManager.unsubscribeFromCartridge(getTenantDomain(), alias);
-        /*CartridgeSubscription subscription = null;
+        /*CartridgeSubscriptionInfo subscription = null;
         
         try {
 			subscription = PersistenceManager.getSubscription(tenantDomain, alias);
@@ -512,7 +512,7 @@ public class ApplicationManagementService extends AbstractAdmin {
 		//			System.out.println("\nOwn domain should include a '.' ");
 		//		}
 
-        CartridgeSubscription subscription = null;
+        CartridgeSubscriptionInfo subscription = null;
         String actualHost = null;
         
         try {
@@ -557,7 +557,7 @@ public class ApplicationManagementService extends AbstractAdmin {
 
     public void removeDomainMapping(String cartridgeAlias) throws ADCException, NotSubscribedException {
     	checkSuperTenant();
-        CartridgeSubscription subscription = null;
+        CartridgeSubscriptionInfo subscription = null;
         String actualHost = null;
         
         try {
@@ -592,7 +592,7 @@ public class ApplicationManagementService extends AbstractAdmin {
 
 	public void synchronizeRepository(String cartridgeAlias) throws ADCException, NotSubscribedException {
 		checkSuperTenant();
-        CartridgeSubscription subscription = null;
+        CartridgeSubscriptionInfo subscription = null;
         
         // Validating subscription
         try {

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/7db31d5d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/InstanceInformationManagementService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/InstanceInformationManagementService.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/InstanceInformationManagementService.java
index a0cd8df..3425c42 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/InstanceInformationManagementService.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/InstanceInformationManagementService.java
@@ -29,7 +29,7 @@ public class InstanceInformationManagementService {
     private static final Log log = LogFactory.getLog(InstanceInformationManagementService.class);
 
     /**
-    * Everytime an instance is started up, this operation is invoked
+    * Everytime an subscription is started up, this operation is invoked
     *            (by the AgentService)
     * @param instanceIp
     * @param tenantId
@@ -52,7 +52,7 @@ public class InstanceInformationManagementService {
       try {
         PersistenceManager.persistCartridgeInstanceInfo(instanceIp, clusterDomain, clusterSubDomain, cartridge, state);
     } catch (Exception e) {
-       log.error("Exception is occurred in updating instance state. Reason, " + e.getMessage());
+       log.error("Exception is occurred in updating subscription state. Reason, " + e.getMessage());
     }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/7db31d5d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepoNotificationService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepoNotificationService.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepoNotificationService.java
index 90dc403..28542b2 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepoNotificationService.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepoNotificationService.java
@@ -28,7 +28,7 @@ import org.apache.axis2.clustering.ClusteringFault;
 import org.apache.axis2.clustering.management.GroupManagementAgent;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.adc.mgt.dao.CartridgeSubscription;
+import org.apache.stratos.adc.mgt.dao.CartridgeSubscriptionInfo;
 import org.apache.stratos.adc.mgt.internal.DataHolder;
 import org.apache.stratos.adc.mgt.utils.CartridgeConstants;
 import org.apache.stratos.adc.mgt.utils.PersistenceManager;
@@ -47,7 +47,7 @@ public class RepoNotificationService {
 		log.info("Updating repository of tenant : " + tenantDomain + " , cartridge: " +
 				cartridgeAlias);
 
-		CartridgeSubscription subscription = null;
+		CartridgeSubscriptionInfo subscription = null;
 		try {
 			subscription = PersistenceManager.getSubscription(tenantDomain, cartridgeAlias);
 		} catch (Exception e) {
@@ -77,13 +77,13 @@ public class RepoNotificationService {
 	public void synchronize(String repositoryURL) throws Exception {
 
 		log.info(" repository URL received : " + repositoryURL);
-		List<CartridgeSubscription> subscription = PersistenceManager.getSubscription(repositoryURL);
-		for (CartridgeSubscription cartridgeSubscription : subscription) {			
-			handleRepoSynch(cartridgeSubscription);   
+		List<CartridgeSubscriptionInfo> subscription = PersistenceManager.getSubscription(repositoryURL);
+		for (CartridgeSubscriptionInfo cartridgeSubscriptionInfo : subscription) {
+			handleRepoSynch(cartridgeSubscriptionInfo);
         }
 	}
 
-	private void handleRepoSynch(CartridgeSubscription subscription) throws Exception {
+	private void handleRepoSynch(CartridgeSubscriptionInfo subscription) throws Exception {
 		if (subscription == null) {
 			throw new Exception("Cannot synchronize repository. subscription is null");
 		}
@@ -107,7 +107,7 @@ public class RepoNotificationService {
 		} else {
 
 			// Query DB and get all the IP s for this tenant 
-			// Invoke update-instance script
+			// Invoke update-subscription script
 			
 			String appPath = subscription.getBaseDirectory();
 			String cartridgePrivateKey = System.getProperty(CartridgeConstants.CARTRIDGE_KEY);
@@ -136,10 +136,10 @@ public class RepoNotificationService {
 					for (String instanceIp : activeIpArray) {
 						String command =
 						                 CarbonUtils.getCarbonHome() + File.separator + "bin" +
-						                         File.separator + "update-instance.sh " +
+						                         File.separator + "update-subscription.sh " +
 						                         instanceIp + " " + appPath + " " +
 						                         cartridgePrivateKey + " /";
-						log.info("Update instance command.... " + command);
+						log.info("Update subscription command.... " + command);
 						Process proc = Runtime.getRuntime().exec(command);
 						proc.waitFor();
 					}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/7db31d5d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/CartridgeSubscription.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/CartridgeSubscription.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/CartridgeSubscription.java
new file mode 100644
index 0000000..afd3791
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/CartridgeSubscription.java
@@ -0,0 +1,416 @@
+/*
+ * 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.subscription;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.adc.mgt.custom.domain.RegistryManager;
+import org.apache.stratos.adc.mgt.dao.CartridgeSubscriptionInfo;
+import org.apache.stratos.adc.mgt.dns.DNSManager;
+import org.apache.stratos.adc.mgt.dto.Policy;
+import org.apache.stratos.adc.mgt.exception.*;
+import org.apache.stratos.adc.mgt.internal.DataHolder;
+import org.apache.stratos.adc.mgt.payload.Payload;
+import org.apache.stratos.adc.mgt.payload.PayloadArg;
+import org.apache.stratos.adc.mgt.repository.Repository;
+import org.apache.stratos.adc.mgt.service.RepositoryInfoBean;
+import org.apache.stratos.adc.mgt.subscriber.Subscriber;
+import org.apache.stratos.adc.mgt.utils.*;
+import org.apache.stratos.adc.topology.mgt.service.TopologyManagementService;
+import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+public abstract class CartridgeSubscription {
+
+    private static Log log = LogFactory.getLog(CartridgeSubscription.class);
+
+    private int subscriptionId;
+    private String type;
+    private String alias;
+    private String clusterDomain;
+    private String clusterSubDomain;
+    private String mgtClusterDomain;
+    private String mgtClusterSubDomain;
+    private String hostName;
+    private Policy autoscalingPolicy;
+    private Subscriber subscriber;
+    private Repository repository;
+    private CartridgeInfo cartridgeInfo;
+    private Payload payload;
+    private String subscriptionStatus;
+    private String mappedDomain;
+    private List<String> connectedSubscriptionAliases;
+
+    /**
+     * Constructor
+     *
+     * @param cartridgeInfo CartridgeInfo subscription
+     */
+    public CartridgeSubscription(CartridgeInfo cartridgeInfo) {
+
+        this.setCartridgeInfo(cartridgeInfo);
+        this.setType(cartridgeInfo.getType());
+        this.setClusterDomain("");
+        this.setClusterSubDomain(CartridgeConstants.DEFAULT_SUBDOMAIN);
+        this.setMgtClusterDomain("");
+        this.setMgtClusterSubDomain(CartridgeConstants.DEFAULT_MGT_SUBDOMAIN);
+        this.setHostName(cartridgeInfo.getHostName());
+        this.setSubscriptionStatus(CartridgeConstants.SUBSCRIBED);
+        this.connectedSubscriptionAliases = new ArrayList<String>();
+    }
+
+    /**
+     * Subscribes to this cartridge subscription
+     *
+     * @param subscriber Subscriber subscription
+     * @param alias Alias of the cartridge subscription
+     * @param autoscalingPolicy Auto scaling policy
+     * @param repository Relevenat Repository subscription
+     *
+     * @throws ADCException
+     * @throws PolicyException
+     * @throws UnregisteredCartridgeException
+     * @throws InvalidCartridgeAliasException
+     * @throws DuplicateCartridgeAliasException
+     * @throws RepositoryRequiredException
+     * @throws AlreadySubscribedException
+     * @throws RepositoryCredentialsRequiredException
+     * @throws InvalidRepositoryException
+     * @throws RepositoryTransportException
+     */
+    public void createSubscription (Subscriber subscriber, String alias, Policy autoscalingPolicy,
+                                   Repository repository)
+            throws ADCException, PolicyException, UnregisteredCartridgeException, InvalidCartridgeAliasException,
+            DuplicateCartridgeAliasException, RepositoryRequiredException, AlreadySubscribedException,
+            RepositoryCredentialsRequiredException, InvalidRepositoryException, RepositoryTransportException {
+
+        setSubscriber(subscriber);
+        setAlias(alias);
+        setAutoscalingPolicy(autoscalingPolicy);
+        setRepository(repository);
+    }
+
+    /**
+     * Unsubscribe from this cartridge subscription
+     *
+     * @throws ADCException
+     * @throws NotSubscribedException
+     */
+    public abstract void removeSubscription() throws ADCException, NotSubscribedException;
+
+    /**
+     * Registers the subscription
+     *
+     * @param properties Any additional properties needed
+     *
+     * @return CartridgeSubscriptionInfo subscription populated with relevant data
+     * @throws ADCException
+     * @throws UnregisteredCartridgeException
+     */
+    public abstract CartridgeSubscriptionInfo registerSubscription(Properties properties)
+            throws ADCException, UnregisteredCartridgeException;
+
+    /**
+     * Connect cartridges
+     *
+     * @param connectingCartridgeAlias Alias of connecting cartridge
+     */
+    public void connect (String connectingCartridgeAlias) {
+        connectedSubscriptionAliases.add(connectingCartridgeAlias);
+    }
+
+    /**
+     * Disconnect from the cartridge subscription given by disconnectingCartridgeAlias
+     *
+     * @param disconnectingCartridgeAlias Alias of the cartridge subscription to disconnect
+     */
+    public void disconnect (String disconnectingCartridgeAlias) {
+        connectedSubscriptionAliases.remove(disconnectingCartridgeAlias);
+    }
+
+    /**
+     * Creates the relevant payload parameters for this cartridge subscription
+     *
+     * @return PayloadArg subscription
+     * @throws ADCException in an errpr
+     */
+    public PayloadArg createPayloadParameters() throws ADCException {
+
+        PayloadArg payloadArg = new PayloadArg();
+        payloadArg.setCartridgeInfo(getCartridgeInfo());
+        payloadArg.setPolicy(getAutoscalingPolicy());
+        payloadArg.setMultitenant(getCartridgeInfo().getMultiTenant());
+        payloadArg.setTenantId(getSubscriber().getTenantId());
+        payloadArg.setTenantDomain(getSubscriber().getTenantDomain());
+        payloadArg.setCartridgeAlias(getAlias());
+        payloadArg.setServiceName(getCartridgeInfo().getType());
+
+        return payloadArg;
+    }
+
+    /**
+     * Manages the repository for the cartridge subscription
+     *
+     * @param repoURL Repository URL
+     * @param repoUserName Repository Username
+     * @param repoUserPassword Repository password
+     * @param privateRepo public/private repository
+     * @param cartridgeAlias Alias of the cartridge subscription
+     * @param cartridgeInfo CartridgeInfo subscription
+     * @param tenantDomain Domain of the tenant
+     *
+     * @return Repository populated with relevant information or null of not repository is relevant to this cartridge
+     * subscription
+     * @throws ADCException
+     * @throws RepositoryRequiredException
+     * @throws RepositoryCredentialsRequiredException
+     * @throws RepositoryTransportException
+     * @throws InvalidRepositoryException
+     */
+    public Repository manageRepository (String repoURL, String repoUserName, String repoUserPassword,
+                                        boolean privateRepo, String cartridgeAlias, CartridgeInfo cartridgeInfo,
+                                        String tenantDomain)
+
+            throws ADCException, RepositoryRequiredException, RepositoryCredentialsRequiredException,
+            RepositoryTransportException, InvalidRepositoryException {
+
+        if (!new Boolean(System.getProperty(CartridgeConstants.FEATURE_INTERNAL_REPO_ENABLED))) {
+            if (log.isDebugEnabled()) {
+                log.debug("Internal repo feature is not enabled.");
+            }
+        }
+
+        Repository repository = new Repository();
+        if (repoURL != null && repoURL.trim().length() > 0) {
+            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.setUrl(repoURL);
+            repository.setUserName(repoUserName);
+            repository.setPassword(repoUserPassword);
+            repository.setPrivateRepository(privateRepo);
+
+        } else {
+
+            log.info("External git repo url not provided for tenant "
+                    + tenantDomain + ", creating an git internal repository");
+
+            // for internal repos  internal git server username and password is used.
+            repository.setUserName(System.getProperty(CartridgeConstants.INTERNAL_GIT_USERNAME));
+            repository.setPassword(System.getProperty(CartridgeConstants.INTERNAL_GIT_PASSWORD));
+            try {
+                new RepositoryCreator(new RepositoryInfoBean(repoURL, cartridgeAlias, tenantDomain,
+                        repository.getUserName(), repository.getPassword(), cartridgeInfo.getDeploymentDirs(),
+                        cartridgeInfo)).createInternalRepository();
+
+            } catch (Exception e) {
+                throw new ADCException(e.getMessage(), e);
+            }
+            String repoName = tenantDomain + "/" + cartridgeAlias;
+            repository.setUrl("https://" + System.getProperty(CartridgeConstants.GIT_HOST_NAME) + ":8443/git/" +
+                    repoName);
+        }
+
+        // Validate Remote Repository.
+        ApplicationManagementUtil.validateRepository(repoURL, repoUserName, repoUserPassword, privateRepo,
+                new Boolean(System.getProperty(CartridgeConstants.FEATURE_EXTERNAL_REPO_VAIDATION_ENABLED)));
+
+        return repository;
+    }
+
+    /**
+     * Cleans up the subscription information after unsubscribing
+     *
+     * @throws ADCException
+     */
+    protected void cleanupSubscription () throws ADCException {
+
+        try {
+            new RepositoryFactory().destroyRepository(alias, subscriber.getTenantDomain(),
+                    subscriber.getAdminUserName());
+            log.info("Repo is destroyed successfully.. ");
+
+        } catch (Exception e) {
+            String errorMsg = "Error in destroying repository for tenant " + subscriber.getTenantDomain() +
+                    "cartridge type " + type;
+            log.error(errorMsg);
+        }
+
+        try {
+            PersistenceManager.updateSubscriptionState(subscriptionId, "UNSUBSCRIBED");
+
+        } catch (Exception e) {
+            String errorMsg = "Error in unscubscribing from cartridge, alias " + alias + ", tenant " +
+                    subscriber.getTenantDomain();
+            throw new ADCException(errorMsg, e);
+        }
+
+        //TODO: FIXME: do we need this?
+        new DNSManager().removeSubDomain(hostName);
+
+        try {
+            new RegistryManager().removeDomainMappingFromRegistry(hostName);
+
+        } catch (Exception e) {
+            String errorMsg = "Error in removing domain mapping, alias " + alias + ", tenant " +
+                    subscriber.getTenantDomain();
+            log.error(errorMsg, e);
+        }
+
+        TopologyManagementService topologyMgtService = DataHolder.getTopologyMgtService();
+        String[] ips = topologyMgtService.getActiveIPs(type, clusterDomain, clusterSubDomain);
+        try {
+            PersistenceManager.updateInstanceState("INACTIVE", ips, clusterDomain, clusterSubDomain, type);
+
+        } catch (Exception e) {
+            String errorMsg = "Error in updating state to INACTIVE";
+            log.error(errorMsg, e);
+        }
+
+        this.setSubscriptionStatus(CartridgeConstants.UNSUBSCRIBED);
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public String getAlias() {
+        return alias;
+    }
+
+    public Subscriber getSubscriber() {
+        return subscriber;
+    }
+
+    public Repository getRepository() {
+        return repository;
+    }
+
+    public List<String> getConnectedSubscriptionAliases() {
+        return connectedSubscriptionAliases;
+    }
+
+    public CartridgeInfo getCartridgeInfo() {
+        return cartridgeInfo;
+    }
+
+    public String getHostName() {
+        return hostName;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public void setAlias(String alias) {
+        this.alias = alias;
+    }
+
+    public String getClusterDomain() {
+        return clusterDomain;
+    }
+
+    public void setClusterDomain(String clusterDomain) {
+        this.clusterDomain = clusterDomain;
+    }
+
+    public String getClusterSubDomain() {
+        return clusterSubDomain;
+    }
+
+    public void setClusterSubDomain(String clusterSubDomain) {
+        this.clusterSubDomain = clusterSubDomain;
+    }
+
+    public String getMgtClusterDomain() {
+        return mgtClusterDomain;
+    }
+
+    public void setMgtClusterDomain(String mgtClusterDomain) {
+        this.mgtClusterDomain = mgtClusterDomain;
+    }
+
+    public String getMgtClusterSubDomain() {
+        return mgtClusterSubDomain;
+    }
+
+    public void setMgtClusterSubDomain(String mgtClusterSubDomain) {
+        this.mgtClusterSubDomain = mgtClusterSubDomain;
+    }
+
+    public void setHostName(String hostName) {
+        this.hostName = hostName;
+    }
+
+    public Policy getAutoscalingPolicy() {
+        return autoscalingPolicy;
+    }
+
+    public void setAutoscalingPolicy(Policy autoscalingPolicy) {
+        this.autoscalingPolicy = autoscalingPolicy;
+    }
+
+    public void setSubscriber(Subscriber subscriber) {
+        this.subscriber = subscriber;
+    }
+
+    public void setRepository(Repository repository) {
+        this.repository = repository;
+    }
+
+    public void setCartridgeInfo(CartridgeInfo cartridgeInfo) {
+        this.cartridgeInfo = cartridgeInfo;
+    }
+
+    public Payload getPayload() {
+        return payload;
+    }
+
+    public void setPayload(Payload payload) {
+        this.payload = payload;
+    }
+
+    public int getSubscriptionId() {
+        return subscriptionId;
+    }
+
+    public void setSubscriptionId(int subscriptionId) {
+        this.subscriptionId = subscriptionId;
+    }
+
+    public String getMappedDomain() {
+        return mappedDomain;
+    }
+
+    public void setMappedDomain(String mappedDomain) {
+        this.mappedDomain = mappedDomain;
+    }
+
+    public String getSubscriptionStatus() {
+        return subscriptionStatus;
+    }
+
+    public void setSubscriptionStatus(String subscriptionStatus) {
+        this.subscriptionStatus = subscriptionStatus;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/7db31d5d/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
new file mode 100644
index 0000000..fcc7700
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/DataCartridgeSubscription.java
@@ -0,0 +1,110 @@
+/*
+ * 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.subscription;
+
+import org.apache.stratos.adc.mgt.dao.CartridgeSubscriptionInfo;
+import org.apache.stratos.adc.mgt.dao.DataCartridge;
+import org.apache.stratos.adc.mgt.dto.Policy;
+import org.apache.stratos.adc.mgt.exception.*;
+import org.apache.stratos.adc.mgt.payload.PayloadArg;
+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.CartridgeConstants;
+import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
+
+import java.util.Properties;
+
+public class DataCartridgeSubscription extends SingleTenantCartridgeSubscription {
+
+    protected String host;
+    protected String username;
+    protected String password;
+
+    public DataCartridgeSubscription(CartridgeInfo cartridgeInfo) {
+
+        super(cartridgeInfo);
+        this.host = "localhost";
+        this.username = CartridgeConstants.MYSQL_DEFAULT_USER;
+        this.password = ApplicationManagementUtil.generatePassword();
+    }
+
+    @Override
+    public void createSubscription(Subscriber subscriber, String alias, Policy autoscalingPolicy, Repository repository)
+
+            throws InvalidCartridgeAliasException,
+            DuplicateCartridgeAliasException, ADCException, RepositoryCredentialsRequiredException,
+            RepositoryTransportException, UnregisteredCartridgeException, AlreadySubscribedException,
+            RepositoryRequiredException, InvalidRepositoryException, PolicyException {
+
+        super.createSubscription(subscriber, alias, autoscalingPolicy, repository);
+    }
+
+    public Repository manageRepository (String repoURL, String repoUserName, String repoUserPassword,
+                                        boolean privateRepo, String cartridgeAlias, CartridgeInfo cartridgeInfo,
+                                        String tenantDomain) {
+
+        //no repository for data cartridge instances
+        return null;
+    }
+
+    public PayloadArg createPayloadParameters() throws ADCException {
+
+        PayloadArg payloadArg = super.createPayloadParameters();
+        payloadArg.setDataCartridgeHost(this.getHost());
+        payloadArg.setDataCartridgeAdminUser(username);
+        payloadArg.setDataCartridgeAdminPassword(password);
+
+        return payloadArg;
+    }
+
+    public CartridgeSubscriptionInfo registerSubscription(Properties payloadProperties)
+            throws ADCException, UnregisteredCartridgeException {
+
+        ApplicationManagementUtil.registerService(getType(),
+                getClusterDomain(),
+                getClusterSubDomain(),
+                getPayload().createPayload(),
+                getPayload().getPayloadArg().getTenantRange(),
+                getHostName(),
+                ApplicationManagementUtil.setRegisterServiceProperties(getAutoscalingPolicy(),
+                        getSubscriber().getTenantId(), getAlias()));
+
+        getPayload().delete();
+
+        DataCartridge dataCartridge = new DataCartridge();
+        dataCartridge.setUserName(username);
+        dataCartridge.setPassword(password);
+        dataCartridge.setDataCartridgeType(getType());
+
+        return ApplicationManagementUtil.createCartridgeSubscription(getCartridgeInfo(), getAutoscalingPolicy(),
+                getType(), getAlias(), getSubscriber().getTenantId(), getSubscriber().getTenantDomain(),
+                getRepository(), getHostName(), getClusterDomain(), getClusterSubDomain(),
+                getMgtClusterDomain(), getMgtClusterSubDomain(), dataCartridge, "PENDING");
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/7db31d5d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/MultiTenantCartridgeSubscription.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/MultiTenantCartridgeSubscription.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/MultiTenantCartridgeSubscription.java
new file mode 100644
index 0000000..4e7796d
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/MultiTenantCartridgeSubscription.java
@@ -0,0 +1,134 @@
+/*
+ * 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.subscription;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.adc.mgt.dao.CartridgeSubscriptionInfo;
+import org.apache.stratos.adc.mgt.dto.Policy;
+import org.apache.stratos.adc.mgt.exception.*;
+import org.apache.stratos.adc.mgt.internal.DataHolder;
+import org.apache.stratos.adc.mgt.payload.PayloadArg;
+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.CartridgeConstants;
+import org.apache.stratos.adc.mgt.utils.PersistenceManager;
+import org.apache.stratos.adc.topology.mgt.service.TopologyManagementService;
+import org.apache.stratos.adc.topology.mgt.serviceobjects.DomainContext;
+import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
+
+import java.util.Properties;
+
+public class MultiTenantCartridgeSubscription extends CartridgeSubscription {
+
+    private static Log log = LogFactory.getLog(MultiTenantCartridgeSubscription.class);
+
+    public MultiTenantCartridgeSubscription(CartridgeInfo cartridgeInfo) {
+        super(cartridgeInfo);
+    }
+
+    @Override
+    public void createSubscription(Subscriber subscriber, String alias, Policy autoscalingPolicy, Repository repository)
+
+            throws InvalidCartridgeAliasException,
+            DuplicateCartridgeAliasException, ADCException, AlreadySubscribedException,
+            RepositoryCredentialsRequiredException, RepositoryTransportException, UnregisteredCartridgeException,
+            InvalidRepositoryException, RepositoryRequiredException, PolicyException {
+
+        super.createSubscription(subscriber, alias, autoscalingPolicy, repository);
+
+        boolean allowMultipleSubscription = Boolean.
+                valueOf(System.getProperty(CartridgeConstants.FEATURE_MULTI_TENANT_MULTIPLE_SUBSCRIPTION_ENABLED));
+
+        if (!allowMultipleSubscription) {
+            // If the cartridge is multi-tenant. We should not let users createSubscription twice.
+            boolean subscribed;
+            try {
+                subscribed = PersistenceManager.isAlreadySubscribed(getType(), subscriber.getTenantId());
+            } catch (Exception e) {
+                String msg = "Error checking whether the cartridge type " + getType()
+                        + " is already subscribed";
+                log.error(msg, e);
+                throw new ADCException(msg, e);
+            }
+
+            if (subscribed) {
+                String msg = "Already subscribed to " + getType()
+                        + ". This multi-tenant cartridge will not be available to createSubscription";
+                if (log.isDebugEnabled()) {
+                    log.debug(msg);
+                }
+                throw new AlreadySubscribedException(msg, getType());
+            }
+        }
+
+        TopologyManagementService topologyService = DataHolder.getTopologyMgtService();
+        DomainContext[] domainContexts = topologyService.getDomainsAndSubdomains(getType(), subscriber.getTenantId());
+        log.info("Retrieved " + domainContexts.length + " domain and corresponding subdomain pairs");
+
+        if (domainContexts.length > 0) {
+            if(domainContexts.length > 2) {
+                if(log.isDebugEnabled())
+                    log.debug("Too many domain sub domain pairs");
+            }
+
+            for (DomainContext domainContext : domainContexts) {
+                if (domainContext.getSubDomain().equalsIgnoreCase("mgt")) {
+                    setMgtClusterDomain(domainContext.getDomain());
+                    setMgtClusterSubDomain(domainContext.getSubDomain());
+                } else {
+                    setClusterDomain(domainContext.getDomain());
+                    setClusterSubDomain(domainContext.getSubDomain());
+                }
+            }
+        } else {
+            String msg = "Domain contexts not found for " + getType() + " and tenant id " + subscriber.getTenantId();
+            log.warn(msg);
+            throw new ADCException(msg);
+        }
+    }
+
+    @Override
+    public void removeSubscription() throws ADCException, NotSubscribedException {
+
+        log.info("Cartridge with alias " + getAlias() + ", and type " + getType() +
+                " is a multi-tenant cartridge and therefore will not terminate all instances and " +
+                "unregister services");
+
+        super.cleanupSubscription();
+    }
+
+    @Override
+    public CartridgeSubscriptionInfo registerSubscription(Properties properties) {
+
+        return ApplicationManagementUtil.createCartridgeSubscription(getCartridgeInfo(), getAutoscalingPolicy(),
+                getType(), getAlias(), getSubscriber().getTenantId(), getSubscriber().getTenantDomain(),
+                getRepository(), getHostName(), getClusterDomain(), getClusterSubDomain(),
+                getMgtClusterDomain(), getMgtClusterSubDomain(), null, "PENDING");
+    }
+
+    @Override
+    public PayloadArg createPayloadParameters() {
+
+        return null;
+    }
+
+}