You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ma...@apache.org on 2014/07/08 09:41:54 UTC

[04/14] Clustering changes for stratos

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/payload/BasicPayloadData.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/payload/BasicPayloadData.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/payload/BasicPayloadData.java
index 0d27b1b..70fb974 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/payload/BasicPayloadData.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/payload/BasicPayloadData.java
@@ -47,6 +47,7 @@ public class BasicPayloadData implements Serializable {
     private String gitRepositoryUrl;
     private String portMappings;
     private String multitenant;
+    private String provider;
 
     protected StringBuilder payloadBuilder;
 
@@ -74,13 +75,15 @@ public class BasicPayloadData implements Serializable {
         payloadBuilder.append(",");
         payloadBuilder.append("CARTRIDGE_KEY=" + getSubscriptionKey());
         payloadBuilder.append(",");
-        payloadBuilder.append("DEPLOYMENT=" + getDeployment());
-        payloadBuilder.append(",");
+        //payloadBuilder.append("DEPLOYMENT=" + getDeployment());
+        //payloadBuilder.append(",");
         //payloadBuilder.append("APP_PATH=" + getApplicationPath());
         //payloadBuilder.append(",");
         payloadBuilder.append("REPO_URL=" + getGitRepositoryUrl());
         payloadBuilder.append(",");
         payloadBuilder.append("PORTS=" + getPortMappings());
+        payloadBuilder.append(",");
+        payloadBuilder.append("PROVIDER=" + getProvider());
 
         //Payload Data exposed as system variables
         payloadBuilder.append(",");
@@ -216,4 +219,12 @@ public class BasicPayloadData implements Serializable {
     public void setPuppetEnvironment(String puppetEnvironment) {
         this.puppetEnvironment = puppetEnvironment;
     }
+
+    public String getProvider() {
+        return provider;
+    }
+
+    public void setProvider(String provider) {
+        this.provider = provider;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/publisher/InstanceNotificationPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/publisher/InstanceNotificationPublisher.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/publisher/InstanceNotificationPublisher.java
index e10d4ff..6a885e8 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/publisher/InstanceNotificationPublisher.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/publisher/InstanceNotificationPublisher.java
@@ -57,10 +57,11 @@ public class InstanceNotificationPublisher {
         artifactUpdateEvent.setRepoPassword(repository.getPassword());
         artifactUpdateEvent.setRepoURL(repository.getUrl());
         artifactUpdateEvent.setTenantId(tenantId);
+        artifactUpdateEvent.setCommitEnabled(repository.isCommitEnabled());
 
         log.info(String.format("Publishing artifact updated event: [cluster] %s " +
-                "[repo-URL] %s [repo-username] %s [repo-password] %s [tenant-id] %s",
-                clusterId, repository.getUrl(), repository.getUserName(), repository.getPassword(), tenantId));
+                "[repo-URL] %s [repo-username] %s [tenant-id] %s",
+                clusterId, repository.getUrl(), repository.getUserName(), tenantId));
         publish(artifactUpdateEvent);
     }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/publisher/TenantSynzhronizerTask.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/publisher/TenantSynzhronizerTask.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/publisher/TenantSynzhronizerTask.java
index 3eac3f5..1e291ab 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/publisher/TenantSynzhronizerTask.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/publisher/TenantSynzhronizerTask.java
@@ -24,18 +24,17 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.manager.internal.DataHolder;
 import org.apache.stratos.manager.retriever.DataInsertionAndRetrievalManager;
 import org.apache.stratos.manager.subscription.CartridgeSubscription;
+import org.apache.stratos.manager.subscription.SubscriptionDomain;
 import org.apache.stratos.messaging.broker.publish.EventPublisher;
 import org.apache.stratos.messaging.broker.publish.EventPublisherPool;
+import org.apache.stratos.messaging.domain.tenant.Subscription;
 import org.apache.stratos.messaging.domain.tenant.Tenant;
 import org.apache.stratos.messaging.event.tenant.CompleteTenantEvent;
 import org.apache.stratos.messaging.util.Constants;
 import org.wso2.carbon.ntask.core.Task;
 import org.wso2.carbon.user.core.tenant.TenantManager;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * Tenant synchronizer task for publishing complete tenant event periodically
@@ -71,12 +70,18 @@ public class TenantSynzhronizerTask implements Task {
                 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                 Collection<CartridgeSubscription> cartridgeSubscriptions = new DataInsertionAndRetrievalManager().getCartridgeSubscriptions(tenant.getTenantId());
                 if (cartridgeSubscriptions != null && !cartridgeSubscriptions.isEmpty()) {
-                    for (CartridgeSubscription subscription : cartridgeSubscriptions) {
+                    for (CartridgeSubscription cartridgeSubscription : cartridgeSubscriptions) {
                         if(log.isDebugEnabled()) {
                             log.debug(String.format("Tenant subscription found: [tenant-id] %d [tenant-domain] %s [service] %s",
-                                    carbonTenant.getId(), carbonTenant.getDomain(), subscription.getType()));
+                                    carbonTenant.getId(), carbonTenant.getDomain(), cartridgeSubscription.getType()));
                         }
-                        tenant.addServiceSubscription(subscription.getType());
+                        HashSet<String> clusterIds = new HashSet<String>();
+                        clusterIds.add(cartridgeSubscription.getCluster().getClusterDomain());
+                        Subscription subscription = new Subscription(cartridgeSubscription.getType(),clusterIds);
+                        for(SubscriptionDomain subscriptionDomain : cartridgeSubscription.getSubscriptionDomains()) {
+                            subscription.addSubscriptionDomain(subscriptionDomain.getDomainName(), subscriptionDomain.getApplicationContext());
+                        }
+                        tenant.addSubscription(subscription);
                     }
                 }
                 tenants.add(tenant);

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/repository/Repository.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/repository/Repository.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/repository/Repository.java
index 16cc2c4..ab95ae3 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/repository/Repository.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/repository/Repository.java
@@ -29,6 +29,7 @@ public class Repository implements Serializable {
     private String userName;
     private String password;
     private boolean isPrivateRepository;
+    private boolean commitEnabled;
 
     public String getUserName() {
         return userName;
@@ -75,4 +76,12 @@ public class Repository implements Serializable {
         return "Repository [id=" + id + ", url=" + url + ", userName=" + userName +
                ", isPrivateRepository=" + isPrivateRepository + "]";
     }
+
+    public boolean isCommitEnabled() {
+        return commitEnabled;
+    }
+
+    public void setCommitEnabled(boolean commitEnabled) {
+        this.commitEnabled = commitEnabled;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/repository/RepositoryNotification.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/repository/RepositoryNotification.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/repository/RepositoryNotification.java
index 8c10d5a..778b3fc 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/repository/RepositoryNotification.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/repository/RepositoryNotification.java
@@ -57,7 +57,7 @@ public class RepositoryNotification {
 		if (cartridgeSubscription.getRepository() != null) {
 			InstanceNotificationPublisher publisher = new InstanceNotificationPublisher();
 			publisher.sendArtifactUpdateEvent(cartridgeSubscription.getRepository(),
-					String.valueOf(cartridgeSubscription.getCluster().getId()),
+					String.valueOf(cartridgeSubscription.getCluster().getClusterDomain()),
 					String.valueOf(cartridgeSubscription.getSubscriber().getTenantId()));
 
 			if (log.isDebugEnabled()) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/retriever/DataInsertionAndRetrievalManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/retriever/DataInsertionAndRetrievalManager.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/retriever/DataInsertionAndRetrievalManager.java
index 386758f..0504fd3 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/retriever/DataInsertionAndRetrievalManager.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/retriever/DataInsertionAndRetrievalManager.java
@@ -68,6 +68,31 @@ public class DataInsertionAndRetrievalManager {
         }
     }
 
+    public void cacheAndUpdateSubscription(CartridgeSubscription cartridgeSubscription) throws PersistenceManagerException {
+
+        // get the write lock
+        LookupDataHolder.getInstance().acquireWriteLock();
+
+        try {
+            // store in LookupDataHolder
+            LookupDataHolder.getInstance().putSubscription(cartridgeSubscription);
+
+            try {
+                // store in Persistence Manager
+                persistenceManager.persistCartridgeSubscription(cartridgeSubscription);
+
+            } catch (PersistenceManagerException e) {
+                String errorMsg = "Error in updating cartridge subscription in persistence manager";
+                log.error(errorMsg, e);
+                throw e;
+            }
+
+        } finally {
+            // release the write lock
+            LookupDataHolder.getInstance().releaseWriteLock();
+        }
+    }
+
     public void removeSubscription (int tenantId, String subscriptionAlias) throws PersistenceManagerException {
 
         CartridgeSubscription cartridgeSubscription = getCartridgeSubscription(tenantId, subscriptionAlias);

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CartridgeSubscription.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CartridgeSubscription.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CartridgeSubscription.java
index e143bc3..ebf7276 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CartridgeSubscription.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CartridgeSubscription.java
@@ -34,7 +34,7 @@ import org.apache.stratos.manager.utils.ApplicationManagementUtil;
 import org.apache.stratos.manager.utils.CartridgeConstants;
 
 import java.io.Serializable;
-import java.util.Map;
+import java.util.*;
 
 public abstract class CartridgeSubscription implements Serializable {
 
@@ -58,7 +58,7 @@ public abstract class CartridgeSubscription implements Serializable {
     //private List<String> connectedSubscriptionAliases;
     private String subscriptionKey;
     private SubscriptionTenancyBehaviour subscriptionTenancyBehaviour;
-
+    private Map<String, SubscriptionDomain> subscriptionDomainMap;
     
     /**
      * Constructor
@@ -79,6 +79,7 @@ public abstract class CartridgeSubscription implements Serializable {
         //this.setSubscriptionStatus(CartridgeConstants.SUBSCRIBED);
         //this.connectedSubscriptionAliases = new ArrayList<String>();
         this.setSubscriptionTenancyBehaviour(subscriptionTenancyBehaviour);
+        this.subscriptionDomainMap = new HashMap<String, SubscriptionDomain>();
     }
 
     /**
@@ -117,6 +118,33 @@ public abstract class CartridgeSubscription implements Serializable {
                 getSubscriptionKey(), getCustomPayloadEntries()));
     }
 
+    public void addSubscriptionDomain(SubscriptionDomain subscriptionDomain) {
+        subscriptionDomainMap.put(subscriptionDomain.getDomainName(), subscriptionDomain);
+    }
+
+    public void removeSubscriptionDomain(String domainName) {
+        if(subscriptionDomainExists(domainName)) {
+            subscriptionDomainMap.remove(domainName);
+        }
+        else {
+            if(log.isWarnEnabled()) {
+                log.warn("Subscription domain does not exist: " + domainName);
+            }
+        }
+    }
+
+    public boolean subscriptionDomainExists(String domainName) {
+        return subscriptionDomainMap.containsKey(domainName);
+    }
+    
+    public SubscriptionDomain getSubscriptionDomain(String domainName) {
+        return subscriptionDomainMap.get(domainName);
+    }
+
+    public Collection<SubscriptionDomain> getSubscriptionDomains() {
+        return Collections.unmodifiableCollection(subscriptionDomainMap.values());
+    }
+
     /**
      * Unsubscribe from this cartridge subscription
      *
@@ -387,7 +415,7 @@ public abstract class CartridgeSubscription implements Serializable {
                ", alias=" + alias + ", autoscalingPolicyName=" + autoscalingPolicyName +
                ", deploymentPolicyName=" + deploymentPolicyName + ", subscriber=" + subscriber +
                ", repository=" + repository + ", cartridgeInfo=" + cartridgeInfo + ", payload=" +
-               payloadData + ", cluster=" + cluster + "]";
+               payloadData + ", cluster=" + cluster + "]" + ", subscriptionDomainMap=" + subscriptionDomainMap.toString();
     }
 
     public String getLbClusterId() {

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/InternalRepoBasedCartridgeSubscription.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/InternalRepoBasedCartridgeSubscription.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/InternalRepoBasedCartridgeSubscription.java
index ebd9a32..1b698e2 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/InternalRepoBasedCartridgeSubscription.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/InternalRepoBasedCartridgeSubscription.java
@@ -52,11 +52,23 @@ public class InternalRepoBasedCartridgeSubscription extends CartridgeSubscriptio
 			RepositoryRequiredException,
 			RepositoryCredentialsRequiredException,
 			RepositoryTransportException, InvalidRepositoryException {
+
+        if(log.isDebugEnabled()) {
+            log.debug("Managing internal repo for repo URL: " + repoURL);
+        }
 		
 		Repository repository = null;
 		String defaultRepoUserName = System.getProperty(CartridgeConstants.INTERNAL_GIT_USERNAME);
 		String defaultRepoPassword = System.getProperty(CartridgeConstants.INTERNAL_GIT_PASSWORD);
-		String[] dirArray = null;
+		String[] dirArray = {"test"};
+
+        if (repoURL != null && !repoURL.equalsIgnoreCase("null") && !repoURL.isEmpty()) {
+            repository = new Repository();
+            repository.setUrl(repoURL);
+            repository.setUserName(defaultRepoUserName);
+            repository.setPassword(defaultRepoPassword);
+            return repository;
+        }
 		
 		// Repo URL will be generated inside createInternalRepository method
 		RepositoryInfoBean repoInfoBean = new RepositoryInfoBean(repoURL, getAlias(), getSubscriber().getTenantDomain(),

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/LBCartridgeSubscription.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/LBCartridgeSubscription.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/LBCartridgeSubscription.java
index 3bad5fd..84610e6 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/LBCartridgeSubscription.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/LBCartridgeSubscription.java
@@ -41,6 +41,8 @@ import org.apache.stratos.manager.subscriber.Subscriber;
 import org.apache.stratos.manager.subscription.tenancy.SubscriptionTenancyBehaviour;
 import org.apache.stratos.manager.utils.ApplicationManagementUtil;
 
+import java.util.Set;
+
 public class LBCartridgeSubscription extends CartridgeSubscription {
 
     private LoadBalancerCategory loadBalancerCategory;
@@ -71,24 +73,26 @@ public class LBCartridgeSubscription extends CartridgeSubscription {
         setAutoscalingPolicyName(autoscalingPolicy);
         setDeploymentPolicyName(deploymentPolicyName);
         setRepository(repository);
+        setPayloadData(getLoadBalancerCategory().create(getAlias(), getCluster(), getSubscriber(), getRepository(), getCartridgeInfo(),
+                getSubscriptionKey(), getCustomPayloadEntries()));
         // If LB subscription is for MT service, payload data should not be set
-        if(!loadBalancerCategory.isLoadBalancedServiceMultiTenant()) {        	
-        	setPayloadData(getLoadBalancerCategory().create(getAlias(), getCluster(), getSubscriber(), getRepository(), getCartridgeInfo(),
-                    getSubscriptionKey(), getCustomPayloadEntries()));	
-        }        
+//        if(!loadBalancerCategory.isLoadBalancedServiceMultiTenant()) {
+//        	setPayloadData(getLoadBalancerCategory().create(getAlias(), getCluster(), getSubscriber(), getRepository(), getCartridgeInfo(),
+//                    getSubscriptionKey(), getCustomPayloadEntries()));
+//        }
     }
 
     
     @Override
-    public CartridgeSubscriptionInfo registerSubscription(Properties properties) throws ADCException, UnregisteredCartridgeException {    	
-    	if(!loadBalancerCategory.isLoadBalancedServiceMultiTenant()) {
-    		if(log.isDebugEnabled()) {
-    		 log.debug("Loadbalanced service is single tenant.");
-    		}
+    public CartridgeSubscriptionInfo registerSubscription(Properties properties) throws ADCException, UnregisteredCartridgeException {
+    	//if(!loadBalancerCategory.isLoadBalancedServiceMultiTenant()) {
+    		//if(log.isDebugEnabled()) {
+    		 //log.debug("Loadbalanced service is single tenant.");
+    		//}
     		getLoadBalancerCategory().register (getCartridgeInfo(), getCluster(), getPayloadData(), getAutoscalingPolicyName(),
     	                getDeploymentPolicyName(), properties);
-    	}
-       
+    	//}
+
 
         return ApplicationManagementUtil.createCartridgeSubscription(getCartridgeInfo(), getAutoscalingPolicyName(),
                 getType(), getAlias(), getSubscriber().getTenantId(), getSubscriber().getTenantDomain(),

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/SubscriptionData.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/SubscriptionData.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/SubscriptionData.java
index e267c24..ed14d87 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/SubscriptionData.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/SubscriptionData.java
@@ -20,6 +20,10 @@ package org.apache.stratos.manager.subscription;
 
 import org.apache.stratos.cloud.controller.stub.pojo.Property;
 
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
 /**
  * This holds the data that are gathered at the time of subscription. This is usefull when passing subscription details to the method calls.
  */
@@ -42,6 +46,12 @@ public class SubscriptionData {
     private PersistenceContext persistanceCtxt;
     private boolean isCommitsEnabled;
     private String serviceGroup;
+    private Set<String> domains;
+    private String serviceName;
+    
+    public SubscriptionData() {
+        this.domains = new HashSet<String>();
+    }
 
     public String getCartridgeType() {
         return cartridgeType;
@@ -170,5 +180,29 @@ public class SubscriptionData {
 	public void setServiceGroup(String serviceGroup) {
 		this.serviceGroup = serviceGroup;
 	}
+
+    public void addDomains(Set<String> domains) {
+        domains.addAll(domains);
+    }
+
+    public void removeDomain(String domain) {
+        domains.remove(domain);
+    }
+
+    public void removeDomains(Set<String> domains) {
+        domains.removeAll(domains);
+    }
+
+    public Set<String> getDomains() {
+        return Collections.unmodifiableSet(domains);
+    }
+
+	public String getServiceName() {
+		return serviceName;
+	}
+
+	public void setServiceName(String serviceName) {
+		this.serviceName = serviceName;
+	}
     
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/SubscriptionDomain.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/SubscriptionDomain.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/SubscriptionDomain.java
new file mode 100644
index 0000000..9fed0b0
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/SubscriptionDomain.java
@@ -0,0 +1,48 @@
+/*
+ * 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.manager.subscription;
+
+import java.io.Serializable;
+
+/**
+ * Subscription domain definition.
+ */
+public class SubscriptionDomain implements Serializable{
+    private final String domainName;
+    private final String applicationContext;
+
+    public SubscriptionDomain(String domainName, String applicationContext) {
+        this.domainName = domainName;
+        this.applicationContext = applicationContext;
+    }
+
+    public String getDomainName() {
+        return domainName;
+    }
+
+    public String getApplicationContext() {
+        return applicationContext;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("[domain-name] %s [application-context] %s", getDomainName(), getApplicationContext());
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/factory/CartridgeSubscriptionFactory.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/factory/CartridgeSubscriptionFactory.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/factory/CartridgeSubscriptionFactory.java
index fbeb159..203ae87 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/factory/CartridgeSubscriptionFactory.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/factory/CartridgeSubscriptionFactory.java
@@ -49,8 +49,13 @@ public class CartridgeSubscriptionFactory {
         //TODO: fix the logic properly
         CartridgeSubscription cartridgeSubscription = null;
         if(cartridgeInfo.getMultiTenant()) {
-            cartridgeSubscription = new FrameworkCartridgeSubscription(cartridgeInfo, subscriptionTenancyBehaviour);
-
+            if (cartridgeInfo.getProvider().equals(CartridgeConstants.INTERNAL_REPO_BASED_CARTRIDGE_PROVIDER)) {
+                cartridgeSubscription = new InternalRepoBasedCartridgeSubscription(cartridgeInfo, subscriptionTenancyBehaviour);
+            } else if (cartridgeInfo.getProvider().equals("application")) {
+                cartridgeSubscription = new ApplicationCartridgeSubscription(cartridgeInfo, subscriptionTenancyBehaviour);
+            } else {
+                cartridgeSubscription = new FrameworkCartridgeSubscription(cartridgeInfo, subscriptionTenancyBehaviour);
+            }
         } else {
             // TODO: fix properly with cartridgeCategory element
             if(cartridgeInfo.getProvider().equals(CartridgeConstants.DATA_CARTRIDGE_PROVIDER)) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/utils/CartridgeSubscriptionUtils.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/utils/CartridgeSubscriptionUtils.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/utils/CartridgeSubscriptionUtils.java
index a5c5517..a12f1f7 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/utils/CartridgeSubscriptionUtils.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/utils/CartridgeSubscriptionUtils.java
@@ -44,6 +44,8 @@ import org.apache.stratos.messaging.event.tenant.TenantSubscribedEvent;
 import org.apache.stratos.messaging.event.tenant.TenantUnSubscribedEvent;
 import org.apache.stratos.messaging.util.Constants;
 
+import java.util.HashSet;
+import java.util.Set;
 import java.util.concurrent.Executor;
 import java.util.regex.Pattern;
 
@@ -57,10 +59,11 @@ public class CartridgeSubscriptionUtils {
         BasicPayloadData basicPayloadData = new BasicPayloadData();
         basicPayloadData.setApplicationPath(cartridgeInfo.getBaseDir());
         basicPayloadData.setSubscriptionKey(subscriptionKey);
-        basicPayloadData.setDeployment("default");//currently hard coded to default
+        //basicPayloadData.setDeployment("default");//currently hard coded to default
         basicPayloadData.setMultitenant(String.valueOf(cartridgeInfo.getMultiTenant()));
         basicPayloadData.setPortMappings(createPortMappingPayloadString(cartridgeInfo));
         basicPayloadData.setServiceName(cartridgeInfo.getType());
+        basicPayloadData.setProvider(cartridgeInfo.getProvider());
 
         if(repository != null) {
             basicPayloadData.setGitRepositoryUrl(repository.getUrl());
@@ -95,7 +98,7 @@ public class CartridgeSubscriptionUtils {
         basicPayloadData.setApplicationPath(service.getCartridgeInfo().getBaseDir());
         basicPayloadData.setSubscriptionKey(service.getSubscriptionKey());
         basicPayloadData.setClusterId(service.getClusterId());
-        basicPayloadData.setDeployment("default");//currently hard coded to default
+        //basicPayloadData.setDeployment("default");//currently hard coded to default
         basicPayloadData.setHostName(service.getHostName());
         basicPayloadData.setMultitenant(String.valueOf(service.getCartridgeInfo().getMultiTenant()));
         basicPayloadData.setPortMappings(createPortMappingPayloadString(service.getCartridgeInfo()));
@@ -146,19 +149,19 @@ public class CartridgeSubscriptionUtils {
     }
 
     public static String generateSubscriptionKey() {
-        String key = RandomStringUtils.randomAlphanumeric(16);
-        log.info("Generated key  : " + key); // TODO -- remove the log
-        return key;
+        return RandomStringUtils.randomAlphanumeric(16);
     }
 
     static class TenantSubscribedEventPublisher implements Runnable {
     	
-    	int tenantId;
-    	String serviceName;
+    	private int tenantId;
+    	private String serviceName;
+        private Set<String> clusterIds;
 
-    	public TenantSubscribedEventPublisher(int tenantId, String service) {
+        public TenantSubscribedEventPublisher(int tenantId, String service, Set<String> clusterIds) {
     		this.tenantId = tenantId;
     		this.serviceName = service;
+            this.clusterIds = clusterIds;
 		}
 		@Override
 		public void run() {
@@ -166,7 +169,7 @@ public class CartridgeSubscriptionUtils {
 				if(log.isInfoEnabled()) {
 					log.info(String.format("Publishing tenant subscribed event: [tenant-id] %d [service] %s", tenantId, serviceName));
 				}
-				TenantSubscribedEvent subscribedEvent = new TenantSubscribedEvent(tenantId, serviceName);
+				TenantSubscribedEvent subscribedEvent = new TenantSubscribedEvent(tenantId, serviceName, clusterIds);
 				EventPublisher eventPublisher = EventPublisherPool.getPublisher(Constants.TENANT_TOPIC);
 				eventPublisher.publish(subscribedEvent);
 			} catch (Exception e) {
@@ -178,7 +181,7 @@ public class CartridgeSubscriptionUtils {
 		}
     	
     }
-    public static void publishTenantSubscribedEvent(int tenantId, String serviceName) {
+    public static void publishTenantSubscribedEvent(int tenantId, String serviceName, Set<String> clusterIds) {
     	
     	
     	Executor exec = new Executor() {
@@ -188,15 +191,15 @@ public class CartridgeSubscriptionUtils {
 			}
 		};
 		
-		exec.execute(new TenantSubscribedEventPublisher(tenantId, serviceName));
+		exec.execute(new TenantSubscribedEventPublisher(tenantId, serviceName, clusterIds));
     }
 
-    public static void publishTenantUnSubscribedEvent(int tenantId, String serviceName) {
+    public static void publishTenantUnSubscribedEvent(int tenantId, String serviceName, Set<String> clusterIds) {
         try {
             if(log.isInfoEnabled()) {
                 log.info(String.format("Publishing tenant un-subscribed event: [tenant-id] %d [service] %s", tenantId, serviceName));
             }
-            TenantUnSubscribedEvent event = new TenantUnSubscribedEvent(tenantId, serviceName);
+            TenantUnSubscribedEvent event = new TenantUnSubscribedEvent(tenantId, serviceName, clusterIds);
             EventPublisher eventPublisher = EventPublisherPool.getPublisher(Constants.TENANT_TOPIC);
             eventPublisher.publish(event);
         } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/topology/model/TopologyClusterInformationModel.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/topology/model/TopologyClusterInformationModel.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/topology/model/TopologyClusterInformationModel.java
index 928c3ce..2b73dff 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/topology/model/TopologyClusterInformationModel.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/topology/model/TopologyClusterInformationModel.java
@@ -41,6 +41,7 @@ public class TopologyClusterInformationModel {
     //private Map<Integer, Set<CartridgeTypeContext>> tenantIdToCartridgeTypeContextMap;
     private static TopologyClusterInformationModel topologyClusterInformationModel;
     private Map<String, Cluster> clusterIdToClusterMap;
+    private Map<String, Cluster> serviceNameToClusterMap;
     private DataInsertionAndRetrievalManager dataInsertionNRetrievalMgr;
     private boolean initialized;
 
@@ -51,6 +52,7 @@ public class TopologyClusterInformationModel {
     private TopologyClusterInformationModel() {
         //tenantIdToCartridgeTypeContextMap = new HashMap<Integer, Set<CartridgeTypeContext>>();
         clusterIdToClusterMap = new HashMap<String, Cluster>();
+        serviceNameToClusterMap = new HashMap<String, Cluster>();
         dataInsertionNRetrievalMgr = new DataInsertionAndRetrievalManager();
     }
 
@@ -73,6 +75,7 @@ public class TopologyClusterInformationModel {
     		log.debug(" Adding cluster ["+cluster.getClusterId()+"] ");
     	}
     	clusterIdToClusterMap.put(cluster.getClusterId(), cluster);
+    	serviceNameToClusterMap.put(cluster.getServiceName(), cluster);
     }   
 
     public Cluster getCluster (int tenantId, String cartridgeType, String subscriptionAlias) {
@@ -136,6 +139,22 @@ public class TopologyClusterInformationModel {
     	return clusterSet;
     }
    
+	public Set<Cluster> getClusters(String cartridgeType) {
+
+		Set<Cluster> clusterSet = new HashSet<Cluster>();
+
+		if (log.isDebugEnabled()) {
+			log.info("Finding cluster with service name [" + cartridgeType
+					+ "] ");
+		}
+		Cluster foundCluster = serviceNameToClusterMap.get(cartridgeType);
+		if (foundCluster != null) {
+			clusterSet.add(foundCluster);
+		}
+
+		return clusterSet;
+	}
+	
 //    public void removeCluster (int tenantId, String cartridgeType, String subscriptionAlias) {
 //
 //        Set<CartridgeTypeContext> cartridgeTypeContextSet = null;

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/utils/RepositoryCreator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/utils/RepositoryCreator.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/utils/RepositoryCreator.java
index b17b85f..c6406f1 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/utils/RepositoryCreator.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/utils/RepositoryCreator.java
@@ -120,7 +120,7 @@ public class RepositoryCreator implements Runnable {
 			handleException(e.getMessage(), e);
 		}
 		
-		repository.setUrl(System.getProperty(CartridgeConstants.INTERNAL_GIT_URL)+repoName);
+		repository.setUrl(System.getProperty(CartridgeConstants.INTERNAL_GIT_URL) + "/git/" + repoName);
 		repository.setUserName(userName);
 		repository.setPassword(password);
 		
@@ -155,8 +155,9 @@ public class RepositoryCreator implements Runnable {
 
 		CloneCommand cloneCmd =
 		                        git.cloneRepository()
-		                           .setURI(System.getProperty(CartridgeConstants.INTERNAL_GIT_URL) + tenantDomain + "/" +
-		                                           cartridgeName + ".git")
+		                           .setURI(System.getProperty(CartridgeConstants.INTERNAL_GIT_URL) +
+                                                    "/git/" + tenantDomain + "/" +
+		                                            cartridgeName + ".git")
 		                           .setDirectory(new File(parentDirName));
 
 		cloneCmd.setCredentialsProvider(credentialsProvider);

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.messaging/pom.xml
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/pom.xml b/components/org.apache.stratos.messaging/pom.xml
index f145a1e..8545681 100644
--- a/components/org.apache.stratos.messaging/pom.xml
+++ b/components/org.apache.stratos.messaging/pom.xml
@@ -64,6 +64,11 @@
             <version>${wso2carbon.version}</version>
         </dependency>
         <dependency>
+            <groupId>org.wso2.carbon</groupId>
+            <artifactId>org.wso2.carbon.utils</artifactId>
+            <version>${wso2carbon.version}</version>
+        </dependency>
+        <dependency>
     		<groupId>com.jamesmurty.utils</groupId>
     		<artifactId>java-xmlbuilder</artifactId>
     		<version>0.6</version>

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/Subscription.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/Subscription.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/Subscription.java
new file mode 100644
index 0000000..caab423
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/Subscription.java
@@ -0,0 +1,77 @@
+/*
+ * 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.messaging.domain.tenant;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.*;
+
+/**
+ * Tenant's service subscription.
+ */
+public class Subscription {
+    private static final Log log = LogFactory.getLog(Subscription.class);
+
+    private final String serviceName;
+    private final Set<String> clusterIds;
+    private final Map<String, SubscriptionDomain> subscriptionDomainMap;
+
+    public Subscription(String serviceName, Set<String> clusterIds) {
+        this.serviceName = serviceName;
+        this.clusterIds = clusterIds;
+        this.subscriptionDomainMap = new HashMap<String, SubscriptionDomain>();
+    }
+
+    public String getServiceName() {
+        return serviceName;
+    }
+
+    public Set<String> getClusterIds() {
+        return Collections.unmodifiableSet(clusterIds);
+    }
+
+    public void addSubscriptionDomain(SubscriptionDomain subscriptionDomain) {
+        subscriptionDomainMap.put(subscriptionDomain.getDomainName(), subscriptionDomain);
+    }
+
+    public void addSubscriptionDomain(String domainName, String applicationContext) {
+        addSubscriptionDomain(new SubscriptionDomain(domainName, applicationContext));
+    }
+
+    public void removeSubscriptionDomain(String domainName) {
+        if(subscriptionDomainExists(domainName)) {
+            subscriptionDomainMap.remove(domainName);
+        }
+        else {
+            if(log.isWarnEnabled()) {
+                log.warn("Subscription domain does not exist: " + domainName);
+            }
+        }
+    }
+
+    public boolean subscriptionDomainExists(String domainName) {
+        return subscriptionDomainMap.containsKey(domainName);
+    }
+
+    public Collection<SubscriptionDomain> getSubscriptionDomains() {
+        return Collections.unmodifiableCollection(subscriptionDomainMap.values());
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/SubscriptionDomain.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/SubscriptionDomain.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/SubscriptionDomain.java
new file mode 100644
index 0000000..84df4c8
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/SubscriptionDomain.java
@@ -0,0 +1,41 @@
+/*
+ * 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.messaging.domain.tenant;
+
+/**
+ * Subscription domain definition.
+ */
+public class SubscriptionDomain {
+    private final String domainName;
+    private final String applicationContext;
+
+    public SubscriptionDomain(String domainName, String applicationContext) {
+        this.domainName = domainName;
+        this.applicationContext = applicationContext;
+    }
+
+    public String getDomainName() {
+        return domainName;
+    }
+
+    public String getApplicationContext() {
+        return applicationContext;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/Tenant.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/Tenant.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/Tenant.java
index bc4244a..ed20bd0 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/Tenant.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/Tenant.java
@@ -32,13 +32,13 @@ public class Tenant implements Serializable{
 
     private int tenantId;
     private String tenantDomain;
-    // Map<ServiceName, Subscribed>
-    private Map<String, Boolean> serviceNameMap;
+    // Map<ServiceName, Subscription>
+    private Map<String, Subscription> serviceNameSubscriptionMap;
 
     public Tenant(int tenantId, String tenantDomain) {
         this.tenantId = tenantId;
         this.tenantDomain = tenantDomain;
-        this.serviceNameMap = new HashMap<String, Boolean>();
+        this.serviceNameSubscriptionMap = new HashMap<String, Subscription>();
     }
 
     public int getTenantId() {
@@ -53,19 +53,26 @@ public class Tenant implements Serializable{
         this.tenantDomain = tenantDomain;
     }
 
-    public Collection<String> getServiceSubscriptions() {
-        return serviceNameMap.keySet();
+    public Subscription getSubscription(String serviceName) {
+        if(serviceNameSubscriptionMap.containsKey(serviceName)) {
+            return serviceNameSubscriptionMap.get(serviceName);
+        }
+        return null;
     }
 
-    public boolean isServiceSubscribed(String serviceName) {
-        return serviceNameMap.containsKey(serviceName);
+    public Collection<Subscription> getSubscriptions() {
+        return serviceNameSubscriptionMap.values();
     }
 
-    public void addServiceSubscription(String serviceName) {
-        serviceNameMap.put(serviceName, true);
+    public boolean isSubscribed(String serviceName) {
+        return serviceNameSubscriptionMap.containsKey(serviceName);
     }
 
-    public void removeServiceSubscription(String serviceName) {
-        serviceNameMap.remove(serviceName);
+    public void addSubscription(Subscription subscription) {
+        serviceNameSubscriptionMap.put(subscription.getServiceName(), subscription);
+    }
+
+    public void removeSubscription(String serviceName) {
+        serviceNameSubscriptionMap.remove(serviceName);
     }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
index dddb869..08bd262 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
@@ -49,6 +49,8 @@ public class Cluster implements Serializable {
     @XmlJavaTypeAdapter(MapAdapter.class)
     private Map<String, Member> memberMap;
 
+    private ClusterStatus status;
+
     private String loadBalanceAlgorithmName;
     @XmlJavaTypeAdapter(MapAdapter.class)
     private Properties properties;
@@ -200,5 +202,13 @@ public class Cluster implements Serializable {
         }
         return partitionIds.keySet();
     }
+
+    public ClusterStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(ClusterStatus status) {
+        this.status = status;
+    }
 }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ClusterStatus.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ClusterStatus.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ClusterStatus.java
new file mode 100644
index 0000000..b3301c8
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ClusterStatus.java
@@ -0,0 +1,36 @@
+/*
+ * 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.messaging.domain.topology;
+public enum ClusterStatus {
+    Created(1),
+    In_Maintenance(2),
+    Removed(3);
+
+    private int code;
+
+    private ClusterStatus(int code) {
+        this.code = code;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java
index b942e2e..4a3bf17 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java
@@ -24,10 +24,7 @@ import org.apache.stratos.messaging.util.bean.type.map.MapAdapter;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 import java.io.Serializable;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
+import java.util.*;
 
 /**
  * Defines a member node in a cluster.
@@ -42,13 +39,13 @@ public class Member implements Serializable {
     private final String networkPartitionId;
     private final String partitionId;
     private final String memberId;
-    
+    // Key: Port.proxy
+    @XmlJavaTypeAdapter(MapAdapter.class)
+    private final Map<Integer, Port> portMap;
     private String memberPublicIp;
     private MemberStatus status;
     private String memberIp;
     @XmlJavaTypeAdapter(MapAdapter.class)
-    private final Map<String, Port> portMap;
-    @XmlJavaTypeAdapter(MapAdapter.class)
     private Properties properties;
     private String lbClusterId;
 
@@ -58,7 +55,7 @@ public class Member implements Serializable {
         this.networkPartitionId = networkPartitionId;
         this.partitionId = partitionId;
         this.memberId = memberId;
-        this.portMap = new HashMap<String, Port>();
+        this.portMap = new HashMap<Integer, Port>();
     }
 
     public String getServiceName() {
@@ -86,33 +83,32 @@ public class Member implements Serializable {
     }
 
     public Collection<Port> getPorts() {
-        return portMap.values();
+        return Collections.unmodifiableCollection(portMap.values());
+    }
+
+    public Port getPort(int proxy) {
+        if(portMap.containsKey(proxy)) {
+            return portMap.get(proxy);
+        }
+        return null;
     }
 
     public void addPort(Port port) {
-        this.portMap.put(port.getProtocol(), port);
+        this.portMap.put(port.getProxy(), port);
     }
 
     public void addPorts(Collection<Port> ports) {
-        for(Port port: ports) {
+        for(Port port : ports) {
             addPort(port);
         }
     }
 
     public void removePort(Port port) {
-        this.portMap.remove(port.getProtocol());
-    }
-
-    public void removePort(String protocol) {
-        this.portMap.remove(protocol);
+        this.portMap.remove(port.getProxy());
     }
 
     public boolean portExists(Port port) {
-        return this.portMap.containsKey(port.getProtocol());
-    }
-
-    public Port getPort(String protocol) {
-        return this.portMap.get(protocol);
+        return this.portMap.containsKey(port.getProxy());
     }
 
     public Properties getProperties() {
@@ -123,37 +119,37 @@ public class Member implements Serializable {
         this.properties = properties;
     }
 
-	public String getMemberIp() {
-	    return memberIp;
+    public String getMemberIp() {
+        return memberIp;
     }
 
-	public void setMemberIp(String memberIp) {
-	    this.memberIp = memberIp;
+    public void setMemberIp(String memberIp) {
+        this.memberIp = memberIp;
     }
 
     public String getPartitionId() {
         return partitionId;
     }
 
-    public void setLbClusterId(String lbClusterId) {
-        this.lbClusterId = lbClusterId;
-    }
-
     public String getLbClusterId() {
         return lbClusterId;
     }
 
+    public void setLbClusterId(String lbClusterId) {
+        this.lbClusterId = lbClusterId;
+    }
+
     public String getNetworkPartitionId() {
         return networkPartitionId;
     }
 
-	public String getMemberPublicIp() {
-		return memberPublicIp;
-	}
+    public String getMemberPublicIp() {
+        return memberPublicIp;
+    }
+
+    public void setMemberPublicIp(String memberPublicIp) {
+        this.memberPublicIp = memberPublicIp;
+    }
 
-	public void setMemberPublicIp(String memberPublicIp) {
-		this.memberPublicIp = memberPublicIp;
-	}
-    
 }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Service.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Service.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Service.java
index 21cc5e7..46d46d4 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Service.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Service.java
@@ -34,14 +34,15 @@ public class Service implements Serializable{
     private final ServiceType serviceType;
     // Key: Cluster.clusterId
     private Map<String, Cluster> clusterIdClusterMap;
-    private Map<String, Port> portMap;
+    // Key: Port.proxy
+    private Map<Integer, Port> portMap;
     private Properties properties;
 
     public Service(String serviceName, ServiceType serviceType) {
         this.serviceName = serviceName;
         this.serviceType = serviceType;
         this.clusterIdClusterMap = new HashMap<String, Cluster>();
-        this.portMap = new HashMap<String, Port>();
+        this.portMap = new HashMap<Integer, Port>();
     }
 
     public String getServiceName() {
@@ -77,33 +78,32 @@ public class Service implements Serializable{
     }
 
     public Collection<Port> getPorts() {
-        return portMap.values();
+        return Collections.unmodifiableCollection(portMap.values());
+    }
+
+    public Port getPort(int proxy) {
+        if(portMap.containsKey(proxy)) {
+            return portMap.get(proxy);
+        }
+        return null;
     }
 
     public void addPort(Port port) {
-        this.portMap.put(port.getProtocol(), port);
+        this.portMap.put(port.getProxy(), port);
     }
 
     public void addPorts(Collection<Port> ports) {
-        for(Port port: ports) {
+        for(Port port : ports) {
             addPort(port);
         }
     }
 
     public void removePort(Port port) {
-        this.portMap.remove(port.getProtocol());
-    }
-
-    public void removePort(String protocol) {
-        this.portMap.remove(protocol);
+        this.portMap.remove(port.getProxy());
     }
 
     public boolean portExists(Port port) {
-        return this.portMap.containsKey(port.getProtocol());
-    }
-
-    public Port getPort(String protocol) {
-        return this.portMap.get(protocol);
+        return this.portMap.containsKey(port.getProxy());
     }
 
     public Properties getProperties() {

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/instance/notifier/ArtifactUpdatedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/instance/notifier/ArtifactUpdatedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/instance/notifier/ArtifactUpdatedEvent.java
index fe0240d..0f6aaef 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/instance/notifier/ArtifactUpdatedEvent.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/instance/notifier/ArtifactUpdatedEvent.java
@@ -33,6 +33,7 @@ public class ArtifactUpdatedEvent extends InstanceNotifierEvent implements Seria
     private String repoPassword;
     private String repoURL;
     private String tenantId;
+    private boolean commitEnabled;
 
     public String getClusterId() {
         return clusterId;
@@ -87,4 +88,12 @@ public class ArtifactUpdatedEvent extends InstanceNotifierEvent implements Seria
         return String.format("[cluster] %s [repo-url] %s [repo-username] %s [tenant] %s",
                 getClusterId(), getRepoURL(), getRepoUserName(), getTenantId());
     }
+
+    public boolean isCommitEnabled() {
+        return commitEnabled;
+    }
+
+    public void setCommitEnabled(boolean commitEnabled) {
+        this.commitEnabled = commitEnabled;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainAddedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainAddedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainAddedEvent.java
new file mode 100644
index 0000000..e2b87d4
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainAddedEvent.java
@@ -0,0 +1,67 @@
+/*
+ * 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.messaging.event.tenant;
+
+import org.apache.stratos.messaging.event.Event;
+
+import java.io.Serializable;
+import java.util.*;
+
+/**
+ * This event is fired when domains are added to a tenant subscription.
+ */
+public class SubscriptionDomainAddedEvent extends Event implements Serializable {
+    private static final long serialVersionUID = 3457484382856403382L;
+
+    private final int tenantId;
+    private final String serviceName;
+    private final Set<String> clusterIds;
+    private final String domainName;
+    private final String applicationContext;
+
+    public SubscriptionDomainAddedEvent(int tenantId, String serviceName, Set<String> clusterIds, String domainName,
+                                        String applicationContext) {
+        this.tenantId = tenantId;
+        this.serviceName = serviceName;
+        this.clusterIds = clusterIds;
+        this.domainName = domainName;
+        this.applicationContext = applicationContext;
+    }
+
+    public int getTenantId() {
+        return tenantId;
+    }
+
+    public String getServiceName() {
+        return serviceName;
+    }
+
+    public Set<String> getClusterIds() {
+        return Collections.unmodifiableSet(clusterIds);
+    }
+
+    public String getDomainName() {
+        return domainName;
+    }
+
+    public String getApplicationContext() {
+        return applicationContext;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainRemovedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainRemovedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainRemovedEvent.java
new file mode 100644
index 0000000..b3d9578
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainRemovedEvent.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.messaging.event.tenant;
+
+import org.apache.stratos.messaging.event.Event;
+
+import java.io.Serializable;
+import java.util.*;
+
+/**
+ * This event is fired when domains are removed from a tenant subscription.
+ */
+public class SubscriptionDomainRemovedEvent extends Event implements Serializable {
+    private static final long serialVersionUID = -8837521344795740210L;
+
+    private final int tenantId;
+    private final String serviceName;
+    private final Set<String> clusterIds;
+    private final String domainName;
+
+    public SubscriptionDomainRemovedEvent(int tenantId, String serviceName, Set<String> clusterIds, String domainName) {
+        this.tenantId = tenantId;
+        this.serviceName = serviceName;
+        this.clusterIds = clusterIds;
+        this.domainName = domainName;
+    }
+
+    public int getTenantId() {
+        return tenantId;
+    }
+
+    public String getServiceName() {
+        return serviceName;
+    }
+
+    public Set<String> getClusterIds() {
+        return Collections.unmodifiableSet(clusterIds);
+    }
+
+    public String getDomainName() {
+        return domainName;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainsAddedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainsAddedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainsAddedEvent.java
new file mode 100644
index 0000000..312571a
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainsAddedEvent.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.messaging.event.tenant;
+
+import org.apache.stratos.messaging.event.Event;
+
+import java.io.Serializable;
+import java.util.*;
+
+/**
+ * This event is fired when domains are added to a tenant subscription.
+ */
+public class SubscriptionDomainsAddedEvent extends Event implements Serializable {
+    private static final long serialVersionUID = 3457484382856403382L;
+
+    private final int tenantId;
+    private final String serviceName;
+    private final Set<String> clusterIds;
+    private final Set<String> domains;
+
+    public SubscriptionDomainsAddedEvent(int tenantId, String serviceName, Set<String> clusterIds, Set<String> domains) {
+        this.tenantId = tenantId;
+        this.serviceName = serviceName;
+        this.clusterIds = clusterIds;
+        this.domains = (domains != null) ? domains : new HashSet<String>();
+    }
+
+    public int getTenantId() {
+        return tenantId;
+    }
+
+    public String getServiceName() {
+        return serviceName;
+    }
+
+    public Set<String> getClusterIds() {
+        return Collections.unmodifiableSet(clusterIds);
+    }
+
+    public Set<String> getDomains() {
+        return Collections.unmodifiableSet(domains);
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainsRemovedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainsRemovedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainsRemovedEvent.java
new file mode 100644
index 0000000..3cc5664
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainsRemovedEvent.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.messaging.event.tenant;
+
+import org.apache.stratos.messaging.event.Event;
+
+import java.io.Serializable;
+import java.util.*;
+
+/**
+ * This event is fired when domains are removed from a tenant subscription.
+ */
+public class SubscriptionDomainsRemovedEvent extends Event implements Serializable {
+    private static final long serialVersionUID = -8837521344795740210L;
+
+    private final int tenantId;
+    private final String serviceName;
+    private final Set<String> clusterIds;
+    private Set<String> domains;
+
+    public SubscriptionDomainsRemovedEvent(int tenantId, String serviceName, Set<String> clusterIds, Set<String> domains) {
+        this.tenantId = tenantId;
+        this.serviceName = serviceName;
+        this.clusterIds = clusterIds;
+        this.domains = (domains != null) ? domains : new HashSet<String>();
+    }
+
+    public int getTenantId() {
+        return tenantId;
+    }
+
+    public String getServiceName() {
+        return serviceName;
+    }
+
+    public Set<String> getClusterIds() {
+        return Collections.unmodifiableSet(clusterIds);
+    }
+
+    public Set<String> getDomains() {
+        return Collections.unmodifiableSet(domains);
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/TenantSubscribedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/TenantSubscribedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/TenantSubscribedEvent.java
index 2be1ad3..d89de12 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/TenantSubscribedEvent.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/TenantSubscribedEvent.java
@@ -20,6 +20,7 @@
 package org.apache.stratos.messaging.event.tenant;
 
 import java.io.Serializable;
+import java.util.*;
 
 /**
  * This event is fired when a tenant is subscribed to a service.
@@ -29,10 +30,12 @@ public class TenantSubscribedEvent extends TenantEvent implements Serializable {
 
     private final int tenantId;
     private final String serviceName;
+    private final Set<String> clusterIds;
 
-    public TenantSubscribedEvent(int tenantId, String serviceName) {
+    public TenantSubscribedEvent(int tenantId, String serviceName, Set<String> clusterIds) {
         this.tenantId = tenantId;
         this.serviceName = serviceName;
+        this.clusterIds = clusterIds;
     }
 
     public int getTenantId() {
@@ -42,4 +45,8 @@ public class TenantSubscribedEvent extends TenantEvent implements Serializable {
     public String getServiceName() {
         return serviceName;
     }
+
+    public Set<String> getClusterIds() {
+        return Collections.unmodifiableSet(clusterIds);
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/TenantUnSubscribedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/TenantUnSubscribedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/TenantUnSubscribedEvent.java
index 2262cd4..5cfcfdf 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/TenantUnSubscribedEvent.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/TenantUnSubscribedEvent.java
@@ -20,6 +20,8 @@
 package org.apache.stratos.messaging.event.tenant;
 
 import java.io.Serializable;
+import java.util.Collections;
+import java.util.Set;
 
 /**
  * This event is fired when a tenant is un-subscribed from a service.
@@ -29,10 +31,12 @@ public class TenantUnSubscribedEvent extends TenantEvent implements Serializable
 
     private final int tenantId;
     private final String serviceName;
+    private final Set<String> clusterIds;
 
-    public TenantUnSubscribedEvent(int tenantId, String serviceName) {
+    public TenantUnSubscribedEvent(int tenantId, String serviceName, Set<String> clusterIds) {
         this.tenantId = tenantId;
         this.serviceName = serviceName;
+        this.clusterIds = clusterIds;
     }
 
     public int getTenantId() {
@@ -42,4 +46,8 @@ public class TenantUnSubscribedEvent extends TenantEvent implements Serializable
     public String getServiceName() {
         return serviceName;
     }
+
+    public Set<String> getClusterIds() {
+        return Collections.unmodifiableSet(clusterIds);
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ClusterMaintenanceModeEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ClusterMaintenanceModeEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ClusterMaintenanceModeEvent.java
new file mode 100644
index 0000000..76e5820
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ClusterMaintenanceModeEvent.java
@@ -0,0 +1,58 @@
+/*
+ * 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.messaging.event.topology;
+
+import org.apache.stratos.messaging.domain.topology.ClusterStatus;
+
+import java.io.Serializable;
+
+public class ClusterMaintenanceModeEvent extends TopologyEvent implements Serializable {
+
+	private final String serviceName;
+	private final String clusterId;
+    private ClusterStatus status;
+
+    public ClusterMaintenanceModeEvent(String serviceName, String clusterId) {
+        this.serviceName = serviceName;
+        this.clusterId = clusterId;
+    }
+
+    public String getServiceName() {
+        return serviceName;
+    }
+
+    @Override
+    public String toString() {
+        return "ClusterMaintenanceModeEvent [serviceName=" + serviceName + ", clusterStatus=" +
+                status.toString() + "]";
+    }
+
+    public String getClusterId() {
+        return clusterId;
+    }
+
+    public ClusterStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(ClusterStatus status) {
+        this.status = status;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/InstanceSpawnedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/InstanceSpawnedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/InstanceSpawnedEvent.java
index f42dda8..3e99a30 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/InstanceSpawnedEvent.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/InstanceSpawnedEvent.java
@@ -20,6 +20,7 @@ package org.apache.stratos.messaging.event.topology;
 
 
 import java.io.Serializable;
+import java.util.Properties;
 
 
 /**
@@ -36,6 +37,8 @@ public class InstanceSpawnedEvent extends TopologyEvent implements Serializable
     private String lbClusterId;
     private String memberPublicIp;
     private String memberIp;
+    private Properties properties;
+
 
     public InstanceSpawnedEvent(String serviceName, String clusterId, String networkPartitionId, String partitionId, String memberId) {
         this.serviceName = serviceName;
@@ -88,5 +91,12 @@ public class InstanceSpawnedEvent extends TopologyEvent implements Serializable
 	public void setMemberIp(String memberIp) {
 		this.memberIp = memberIp;
 	}
-    
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+    public void setProperties(Properties properties) {
+        this.properties = properties;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/MemberActivatedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/MemberActivatedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/MemberActivatedEvent.java
index 3cda807..e505537 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/MemberActivatedEvent.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/MemberActivatedEvent.java
@@ -20,9 +20,7 @@
 package org.apache.stratos.messaging.event.topology;
 
 import java.io.Serializable;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 
 import org.apache.stratos.messaging.domain.topology.Port;
 
@@ -38,7 +36,8 @@ public class MemberActivatedEvent extends TopologyEvent implements Serializable
     private final String networkPartitionId;
     private final String partitionId;
     private final String memberId;
-    private Map<String, Port> portMap;
+    // Key: Port.proxy
+    private Map<Integer, Port> portMap;
     private String memberIp;
 
     public MemberActivatedEvent(String serviceName, String clusterId, String networkPartitionId, String partitionId, String memberId) {
@@ -47,7 +46,7 @@ public class MemberActivatedEvent extends TopologyEvent implements Serializable
         this.networkPartitionId = networkPartitionId;
         this.partitionId = partitionId;
         this.memberId = memberId;
-    	this.portMap = new HashMap<String, Port>();
+    	this.portMap = new HashMap<Integer, Port>();
     }
     
     public String getServiceName() {
@@ -69,32 +68,37 @@ public class MemberActivatedEvent extends TopologyEvent implements Serializable
     public String getMemberId() {
         return memberId;
     }
-    
+
     public Collection<Port> getPorts() {
-        return portMap.values();
+        return Collections.unmodifiableCollection(portMap.values());
     }
 
-    public void addPort(Port port) {
-        this.portMap.put(port.getProtocol(), port);
+    public Port getPort(int proxy) {
+        if(portMap.containsKey(proxy)) {
+            return portMap.get(proxy);
+        }
+        return null;
     }
 
-    public void removePort(Port port) {
-        this.portMap.remove(port.getProtocol());
+    public void addPort(Port port) {
+        this.portMap.put(port.getProxy(), port);
     }
 
-    public void removePort(String portName) {
-        this.portMap.remove(portName);
+    public void addPorts(Collection<Port> ports) {
+        for(Port port : ports) {
+            addPort(port);
+        }
     }
 
-    public boolean portExists(Port port) {
-        return this.portMap.containsKey(port.getProtocol());
+    public void removePort(Port port) {
+        this.portMap.remove(port.getProxy());
     }
 
-    public Port getPort(String portName) {
-        return this.portMap.get(portName);
+    public boolean portExists(Port port) {
+        return this.portMap.containsKey(port.getProxy());
     }
 
-	public String getMemberIp() {
+    public String getMemberIp() {
 	    return memberIp;
     }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/MemberTerminatedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/MemberTerminatedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/MemberTerminatedEvent.java
index 986b309..21aa340 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/MemberTerminatedEvent.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/MemberTerminatedEvent.java
@@ -20,6 +20,7 @@
 package org.apache.stratos.messaging.event.topology;
 
 import java.io.Serializable;
+import java.util.Properties;
 
 /**
  * This event is fired by Cloud Controller when a member is terminated.
@@ -33,6 +34,8 @@ public class
     private final String networkPartitionId;
     private final String partitionId;
     private final String memberId;
+    private Properties properties;
+
 
     public MemberTerminatedEvent(String serviceName, String clusterId, String networkPartitionId, String partitionId, String memberId) {
         this.serviceName = serviceName;
@@ -61,4 +64,12 @@ public class
     public String getNetworkPartitionId() {
         return networkPartitionId;
     }
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+    public void setProperties(Properties properties) {
+        this.properties = properties;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ServiceCreatedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ServiceCreatedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ServiceCreatedEvent.java
index 846091e..8ed701a 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ServiceCreatedEvent.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ServiceCreatedEvent.java
@@ -23,10 +23,7 @@ import org.apache.stratos.messaging.domain.topology.Port;
 import org.apache.stratos.messaging.domain.topology.ServiceType;
 
 import java.io.Serializable;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
+import java.util.*;
 
 /**
  * This event is fired by Cloud Controller when a service is added to a topology.
@@ -37,13 +34,14 @@ public class ServiceCreatedEvent extends TopologyEvent implements Serializable {
 
     private final String serviceName;
     private final ServiceType serviceType;
-    private final Map<String, Port> portMap;
+    // Key: Port.proxy
+    private final Map<Integer, Port> portMap;
     private Properties properties;
 
     public ServiceCreatedEvent(String serviceName, ServiceType serviceType) {
         this.serviceName = serviceName;
         this.serviceType = serviceType;
-        this.portMap = new HashMap<String, Port>();
+        this.portMap = new HashMap<Integer, Port>();
     }
 
     public String getServiceName() {
@@ -55,27 +53,32 @@ public class ServiceCreatedEvent extends TopologyEvent implements Serializable {
     }
 
     public Collection<Port> getPorts() {
-        return portMap.values();
+        return Collections.unmodifiableCollection(portMap.values());
     }
 
-    public void addPort(Port port) {
-        this.portMap.put(port.getProtocol(), port);
+    public Port getPort(int proxy) {
+        if(portMap.containsKey(proxy)) {
+            return portMap.get(proxy);
+        }
+        return null;
     }
 
-    public void removePort(Port port) {
-        this.portMap.remove(port.getProtocol());
+    public void addPort(Port port) {
+        this.portMap.put(port.getProxy(), port);
     }
 
-    public void removePort(String portName) {
-        this.portMap.remove(portName);
+    public void addPorts(Collection<Port> ports) {
+        for(Port port : ports) {
+            addPort(port);
+        }
     }
 
-    public boolean portExists(Port port) {
-        return this.portMap.containsKey(port.getProtocol());
+    public void removePort(Port port) {
+        this.portMap.remove(port.getProxy());
     }
 
-    public Port getPort(String portName) {
-        return this.portMap.get(portName);
+    public boolean portExists(Port port) {
+        return this.portMap.containsKey(port.getProxy());
     }
 
     public Properties getProperties() {

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/tenant/SubscriptionDomainsAddedEventListener.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/tenant/SubscriptionDomainsAddedEventListener.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/tenant/SubscriptionDomainsAddedEventListener.java
new file mode 100644
index 0000000..3f169b7
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/tenant/SubscriptionDomainsAddedEventListener.java
@@ -0,0 +1,28 @@
+/*
+ * 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.messaging.listener.tenant;
+
+import org.apache.stratos.messaging.listener.EventListener;
+
+/**
+ * Tenant subscription domains added event listener.
+ */
+public abstract class SubscriptionDomainsAddedEventListener extends EventListener {
+}