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/07/10 13:12:17 UTC

[02/14] versions of components are set to 3.0.0-SNAPSHOT

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/publisher/CartridgeInstanceDataPublisherTask.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/publisher/CartridgeInstanceDataPublisherTask.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/publisher/CartridgeInstanceDataPublisherTask.java
new file mode 100644
index 0000000..96756f4
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/publisher/CartridgeInstanceDataPublisherTask.java
@@ -0,0 +1,476 @@
+/*
+*  Copyright (c) 2005-2011, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+*
+*  WSO2 Inc. 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.cloud.controller.publisher;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jclouds.compute.ComputeService;
+import org.jclouds.compute.domain.ComputeMetadata;
+import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.domain.internal.NodeMetadataImpl;
+import org.wso2.carbon.base.ServerConfiguration;
+import org.wso2.carbon.databridge.agent.thrift.Agent;
+import org.wso2.carbon.databridge.agent.thrift.DataPublisher;
+import org.wso2.carbon.databridge.agent.thrift.conf.AgentConfiguration;
+import org.wso2.carbon.databridge.commons.Event;
+import org.wso2.carbon.databridge.commons.exception.NoStreamDefinitionExistException;
+import org.wso2.carbon.ntask.core.Task;
+import org.apache.stratos.cloud.controller.exception.CloudControllerException;
+import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder;
+import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
+import org.apache.stratos.cloud.controller.util.CartridgeInstanceData;
+import org.apache.stratos.cloud.controller.util.IaasContext;
+import org.apache.stratos.cloud.controller.util.IaasProvider;
+import org.apache.stratos.cloud.controller.util.ServiceContext;
+import org.wso2.carbon.utils.CarbonUtils;
+
+import com.google.common.collect.MapDifference;
+import com.google.common.collect.MapDifference.ValueDifference;
+import com.google.common.collect.Maps;
+
+public class CartridgeInstanceDataPublisherTask implements Task{
+    
+    private static final Log log = LogFactory.getLog(CartridgeInstanceDataPublisherTask.class);
+    private static DataPublisher dataPublisher;
+    private static String streamId;
+    private static final String cloudControllerEventStreamVersion = "1.0.0";
+    private static List<CartridgeInstanceData> dataToBePublished ;
+
+    protected enum NodeStatus {
+        PENDING, RUNNING, SUSPENDED, TERMINATED, ERROR, UNRECOGNIZED
+    };   
+
+    @Override
+    public void execute() {
+        
+        publish();
+    }
+    
+    public static void publish(){
+        if(FasterLookUpDataHolder.getInstance().isPublisherRunning() ||
+                // this is a temporary fix to avoid task execution - limitation with ntask
+                !FasterLookUpDataHolder.getInstance().getEnableBAMDataPublisher()){
+            return;
+        }
+        
+        log.debug(CloudControllerConstants.DATA_PUB_TASK_NAME+" cycle started.");
+        FasterLookUpDataHolder.getInstance().setPublisherRunning(true);
+        dataToBePublished = new ArrayList<CartridgeInstanceData>();
+
+        if(dataPublisher==null){
+            createDataPublisher();
+
+            //If we cannot create a data publisher we should give up
+            //this means data will not be published
+            if(dataPublisher == null){
+                log.error("Data Publisher cannot be created or found.");
+                release();
+                return;
+            }
+        }
+
+        if(streamId == null){
+            try{
+                streamId = dataPublisher.findStream(CloudControllerConstants.CLOUD_CONTROLLER_EVENT_STREAM, cloudControllerEventStreamVersion);
+            }catch (NoStreamDefinitionExistException e){
+                log.info("Defining the event stream because it was not found in BAM");
+                try{
+                    defineStream();
+                } catch(Exception ex){
+                    String msg = "Error occurred while defining the event stream for publishing Cloud Controller data. " + ex.getMessage();
+                    log.error(msg, ex);
+                    //We do not want to proceed without an event stream. Therefore we return.
+                    release();
+                    return;
+                }
+            }catch (Exception exc){
+                log.error("Error occurred while searching for stream id. " + exc.getMessage(), exc);
+                //We do not want to proceed without an event stream. Therefore we return.
+                release();
+                return;
+            }
+        }
+        
+        // build the new node - state Map
+        Map<String, String> newNodeToStateMap;
+        try{
+            newNodeToStateMap = getNodeIdToStatusMap();
+        }catch (Exception e) {
+
+            release();
+            throw new CloudControllerException(e.getMessage(), e);
+            
+        } 
+        
+        // compare it with old map and populate data to be published with ones newly added
+        // and once whose state got changed
+        populateNewlyAddedOrStateChangedNodes(newNodeToStateMap);
+        
+        // issue events for the ones obtained from above
+        for (CartridgeInstanceData dataObj : dataToBePublished) {
+            StringBuffer temp = new StringBuffer("");
+            
+            String privateIpAddresses="";
+            // Concatenate private IP addresses
+            for (String ip : dataObj.getMetaData().getPrivateAddresses()) {
+                temp.append(ip+",");
+            }
+            
+            if(!"".equals(temp.toString())){
+                // remove comma at the end of the string
+                privateIpAddresses = temp.toString().substring(0, temp.toString().length()-1);
+            }
+            
+            temp = new StringBuffer("");
+            String publicIpAddresses="";
+            // Concatenate public IP addresses
+            for (String ip : dataObj.getMetaData().getPublicAddresses()) {
+                temp.append(ip+",");
+            }
+            
+            if(!"".equals(temp.toString())){
+                // remove comma at the end of the string
+                publicIpAddresses = temp.toString().substring(0, temp.toString().length()-1);
+            }
+            
+            try {
+
+                Event cloudControllerEvent = new Event(streamId, System.currentTimeMillis(), new Object[]{}, null,
+                                            new Object[]{dataObj.getNodeId(),
+                                                         dataObj.getType(),
+                                                         dataObj.getDomain(),
+                                                         dataObj.getSubDomain(),
+                                                         dataObj.getAlias(),
+                                                         dataObj.getTenantRange(),
+                                                         String.valueOf(dataObj.isMultiTenant()),
+                                                         dataObj.getIaas(),
+                                                         dataObj.getStatus(),
+                                                         dataObj.getMetaData().getHostname(),
+                                                         dataObj.getMetaData().getHardware().getHypervisor(),
+                                                         String.valueOf(dataObj.getMetaData().getHardware().getRam()),
+                                                         dataObj.getMetaData().getImageId(),
+                                                         String.valueOf(dataObj.getMetaData().getLoginPort()),
+                                                         dataObj.getMetaData().getOperatingSystem().getName(),
+                                                         dataObj.getMetaData().getOperatingSystem().getVersion(),
+                                                         dataObj.getMetaData().getOperatingSystem().getArch(),
+                                                         String.valueOf(dataObj.getMetaData().getOperatingSystem().is64Bit()),
+                                                         privateIpAddresses,
+                                                         publicIpAddresses});
+
+                dataPublisher.publish(cloudControllerEvent);
+                
+                log.debug("Data published : "+cloudControllerEvent.toString());
+
+            } catch (Exception e) {
+                String msg = "Error occurred while publishing Cartridge instance event to BAM. ";
+                log.error(msg, e);
+                release();
+                throw new CloudControllerException(msg, e);
+            }
+            
+        }
+        
+        // replace old map with new one only if data is published
+        FasterLookUpDataHolder.getInstance().setNodeIdToStatusMap(newNodeToStateMap);
+        
+        //TODO remove
+//        CassandraDataRetriever.init();
+//        CassandraDataRetriever.connect();
+//        HiveQueryExecutor hive = new HiveQueryExecutor();
+//        hive.createHiveTable();
+//        System.out.println("***********");
+//        for (String str : hive.getRunningNodeIds()) {
+//         
+//            System.out.println(str);
+//        }
+//        System.out.println("***********");
+        release();
+    }
+    
+    private static void release(){
+        FasterLookUpDataHolder.getInstance().setPublisherRunning(false);
+    }
+    
+    private static void defineStream() throws Exception {
+        streamId = dataPublisher.
+                defineStream("{" +
+                        "  'name':'" + CloudControllerConstants.CLOUD_CONTROLLER_EVENT_STREAM +"'," +
+                        "  'version':'" + cloudControllerEventStreamVersion +"'," +
+                        "  'nickName': 'cloud.controller'," +
+                        "  'description': 'Instances booted up by the Cloud Controller '," +
+                        "  'metaData':[]," +
+                        "  'payloadData':[" +
+                        "          {'name':'"+CloudControllerConstants.NODE_ID_COL+"','type':'STRING'}," +
+                        "          {'name':'"+CloudControllerConstants.CARTRIDGE_TYPE_COL+"','type':'STRING'}," +
+                        "          {'name':'"+CloudControllerConstants.DOMAIN_COL+"','type':'STRING'}," +
+                        "          {'name':'"+CloudControllerConstants.SUB_DOMAIN_COL+"','type':'STRING'}," +
+                        "          {'name':'"+CloudControllerConstants.ALIAS_COL+"','type':'STRING'}," +
+                        "          {'name':'"+CloudControllerConstants.TENANT_RANGE_COL+"','type':'STRING'}," +
+                        "          {'name':'"+CloudControllerConstants.IS_MULTI_TENANT_COL+"','type':'STRING'}," +
+                        "          {'name':'"+CloudControllerConstants.IAAS_COL+"','type':'STRING'}," +
+                        "          {'name':'"+CloudControllerConstants.STATUS_COL+"','type':'STRING'}," +
+                        "          {'name':'"+CloudControllerConstants.HOST_NAME_COL+"','type':'STRING'}," +
+                        "          {'name':'"+CloudControllerConstants.HYPERVISOR_COL+"','type':'STRING'}," +
+                        "          {'name':'"+CloudControllerConstants.RAM_COL+"','type':'STRING'}," +
+                        "          {'name':'"+CloudControllerConstants.IMAGE_ID_COL+"','type':'STRING'}," +
+                        "          {'name':'"+CloudControllerConstants.LOGIN_PORT_COL+"','type':'STRING'}," +
+                        "          {'name':'"+CloudControllerConstants.OS_NAME_COL+"','type':'STRING'}," +
+                        "          {'name':'"+CloudControllerConstants.OS_VERSION_COL+"','type':'STRING'}," +
+                        "          {'name':'"+CloudControllerConstants.OS_ARCH_COL+"','type':'STRING'}," +
+                        "          {'name':'"+CloudControllerConstants.OS_BIT_COL+"','type':'STRING'}," +
+                        "          {'name':'"+CloudControllerConstants.PRIV_IP_COL+"','type':'STRING'}," +
+                        "          {'name':'"+CloudControllerConstants.PUB_IP_COL+"','type':'STRING'}" +
+                        "  ]" +
+                        "}");
+        
+    }
+
+    @Override
+    public void init() {
+
+    	// this is a temporary fix to avoid task execution - limitation with ntask
+		if(!FasterLookUpDataHolder.getInstance().getEnableBAMDataPublisher()){
+			log.debug("BAM data publisher is disabled. ");
+			return;
+		}
+		
+        if((dataPublisher = FasterLookUpDataHolder.getInstance().getDataPublisher()) == null){
+            createDataPublisher();
+        }
+        streamId = FasterLookUpDataHolder.getInstance().getStreamId();
+        
+    }
+
+    @Override
+    public void setProperties(Map<String, String> arg0) {}
+    
+    private static void createDataPublisher(){
+        //creating the agent
+        AgentConfiguration agentConfiguration = new AgentConfiguration();
+
+        ServerConfiguration serverConfig =  CarbonUtils.getServerConfiguration();
+        String trustStorePath = serverConfig.getFirstProperty("Security.TrustStore.Location");
+        String trustStorePassword = serverConfig.getFirstProperty("Security.TrustStore.Password");
+        String bamServerUrl = serverConfig.getFirstProperty("BamServerURL");
+        String adminUsername = FasterLookUpDataHolder.getInstance().getBamUsername();
+        String adminPassword = FasterLookUpDataHolder.getInstance().getBamPassword();
+
+        System.setProperty("javax.net.ssl.trustStore", trustStorePath);
+        System.setProperty("javax.net.ssl.trustStorePassword", trustStorePassword);
+
+        Agent agent = new Agent(agentConfiguration);
+
+        try {
+            dataPublisher = new DataPublisher(bamServerUrl, adminUsername, adminPassword, agent);
+            FasterLookUpDataHolder.getInstance().setDataPublisher(dataPublisher);
+            
+        } catch (Exception e) {
+            String msg = "Unable to create a data publisher to " + bamServerUrl +
+                    ". Usage Agent will not function properly. ";
+            log.error(msg, e);
+            throw new CloudControllerException(msg, e);
+        }
+        
+    }
+    
+    private static void bundleData(String key, String val, ServiceContext serviceCtxt) {
+        
+        CartridgeInstanceData instanceData = new CartridgeInstanceData();
+        instanceData.setNodeId(key);
+        instanceData.setStatus(val);
+        instanceData.setDomain(serviceCtxt.getDomainName());
+        instanceData.setSubDomain(serviceCtxt.getSubDomainName());
+        instanceData.setAlias("".equals(serviceCtxt.getProperty(CloudControllerConstants.ALIAS_PROPERTY))
+            ? "NULL"
+                : serviceCtxt.getProperty(CloudControllerConstants.ALIAS_PROPERTY));
+        instanceData.setTenantRange("".equals(serviceCtxt.getProperty(CloudControllerConstants.TENANT_ID_PROPERTY))
+            ? serviceCtxt.getTenantRange()
+                : serviceCtxt.getProperty(CloudControllerConstants.TENANT_ID_PROPERTY));
+        
+        if (serviceCtxt.getCartridge() != null) {
+            instanceData.setMultiTenant(serviceCtxt.getCartridge().isMultiTenant());
+
+            for (IaasProvider iaas : serviceCtxt.getCartridge().getIaases()) {
+
+                IaasContext ctxt = null;
+                if ((ctxt = serviceCtxt.getIaasContext(iaas.getType())) == null) {
+                    ctxt = serviceCtxt.addIaasContext(iaas.getType());
+                }
+
+                if (ctxt.didISpawn(key)) {
+                    instanceData.setIaas(iaas.getType());
+                    instanceData.setMetaData(ctxt.getNode(key));
+
+                    // clear to be removed data
+                    ctxt.removeToBeRemovedNodeId(key);
+
+                    // if the node is terminated
+                    if (val.equals(NodeStatus.TERMINATED.toString())) {
+                        // since this node is terminated
+                        FasterLookUpDataHolder.getInstance().removeNodeId(key);
+
+                        // remove node meta data
+                        ctxt.removeNodeMetadata(ctxt.getNode(key));
+                    }
+
+                    break;
+                }
+            }
+
+            instanceData.setType(serviceCtxt.getCartridge().getType());
+        } else {
+            log.warn("Cartridge is null for Service Context : (domain: " +
+                serviceCtxt.getDomainName() +
+                    ", sub domain: " +
+                    serviceCtxt.getSubDomainName() +
+                    ")");
+        }
+        
+        dataToBePublished.add(instanceData);
+        
+    }
+    
+    private static Map<String, String> getNodeIdToStatusMap() throws Exception {
+        
+        Map<String, String> statusMap = new HashMap<String, String>();
+        
+        // iterate through all ServiceContexts
+        for (Iterator<?> it1 = FasterLookUpDataHolder.getInstance().getServiceContexts().entrySet().iterator(); it1.hasNext();) {
+            @SuppressWarnings("unchecked")
+            Map.Entry<String, Map<String, ServiceContext>> entry = (Map.Entry<String, Map<String, ServiceContext>>) it1.next();
+            
+            Map<String, ServiceContext> map = (Map<String, ServiceContext>) entry.getValue();
+            
+            for (Iterator<ServiceContext> it2 = map.values().iterator(); it2.hasNext();) {
+                ServiceContext subjectedSerCtxt = (ServiceContext) it2.next();
+                
+                if (subjectedSerCtxt != null && subjectedSerCtxt.getCartridge() != null) {
+                    List<IaasProvider> iaases = subjectedSerCtxt.getCartridge().getIaases();
+
+                    for (IaasProvider iaas : iaases) {
+
+                        ComputeService computeService = iaas.getComputeService();
+                        
+                        if(computeService == null){
+                            continue;
+                        }
+                        
+                        IaasContext ctxt = null;
+                        if((ctxt = subjectedSerCtxt.getIaasContext(iaas.getType())) == null){
+                        	ctxt = subjectedSerCtxt.addIaasContext(iaas.getType());
+                        }
+
+                        // get list of node Ids
+                        List<String> nodeIds = ctxt.getAllNodeIds();
+
+                        if (nodeIds.isEmpty()) {
+                            
+                            continue;
+                        }
+                        
+                        try {
+
+                            // get all the nodes spawned by this IaasContext
+                            Set<? extends ComputeMetadata> set = computeService.listNodes();
+
+                            Iterator<? extends ComputeMetadata> iterator = set.iterator();
+
+                            // traverse through all nodes of this ComputeService object
+                            while (iterator.hasNext()) {
+                                NodeMetadata nodeMetadata = (NodeMetadataImpl) iterator.next();
+
+                                // if this node belongs to the requested domain
+                                if (nodeIds.contains(nodeMetadata.getId())) {
+
+                                    statusMap.put(nodeMetadata.getId(), nodeMetadata.getStatus()
+                                                                                    .toString());
+
+                                    ctxt.addNodeMetadata(nodeMetadata);
+                                }
+
+                            }
+
+                        }catch (Exception e) {
+                            log.error(e.getMessage(), e);
+                            throw e;
+                        }
+
+                    }
+                }
+            }
+            
+            
+        }
+        return statusMap;
+
+    }
+    
+    private static void populateNewlyAddedOrStateChangedNodes(Map<String, String> newMap){
+        
+        MapDifference<String, String> diff = Maps.difference(newMap, 
+                                                             FasterLookUpDataHolder.getInstance().getNodeIdToStatusMap());
+        
+        // adding newly added nodes
+        Map<String, String> newlyAddedNodes = diff.entriesOnlyOnLeft();
+        
+        for (Iterator<?> it = newlyAddedNodes.entrySet().iterator(); it.hasNext();) {
+            @SuppressWarnings("unchecked")
+            Map.Entry<String, String> entry = (Map.Entry<String, String>) it.next();
+            String key = entry.getKey();
+            String val = entry.getValue();
+            ServiceContext ctxt = FasterLookUpDataHolder.getInstance().getServiceContext(key);
+            
+            log.debug("------ Node id: "+key+" --- node status: "+val+" -------- ctxt: "+ctxt);
+            
+            if (ctxt != null && key != null && val != null) {
+                // bundle the data to be published
+                bundleData(key, val, ctxt);
+            }   
+                    
+        }
+        
+        // adding nodes with state changes
+        Map<String, ValueDifference<String>> stateChangedNodes = diff.entriesDiffering();
+        
+        for (Iterator<?> it = stateChangedNodes.entrySet().iterator(); it.hasNext();) {
+            @SuppressWarnings("unchecked")
+            Map.Entry<String, ValueDifference<String>> entry = (Map.Entry<String, ValueDifference<String>>) it.next();
+            
+            String key = entry.getKey();
+            String newState = entry.getValue().leftValue();
+            ServiceContext ctxt = FasterLookUpDataHolder.getInstance().getServiceContext(key);
+            
+            log.debug("------- Node id: "+key+" --- node status: "+newState+" -------- ctxt: "+ctxt);
+            
+            if (ctxt != null && key != null && newState != null) {
+                // bundle the data to be published
+                bundleData(key, newState, ctxt);
+            }  
+            
+        }
+
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/registry/RegistryManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/registry/RegistryManager.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/registry/RegistryManager.java
new file mode 100644
index 0000000..13bb688
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/registry/RegistryManager.java
@@ -0,0 +1,101 @@
+package org.apache.stratos.cloud.controller.registry;
+
+import org.apache.stratos.cloud.controller.exception.CloudControllerException;
+import org.apache.stratos.cloud.controller.persist.Serializer;
+import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder;
+import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
+import org.apache.stratos.cloud.controller.util.DeclarativeServiceReferenceHolder;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.wso2.carbon.registry.core.Registry;
+import org.wso2.carbon.registry.core.Resource;
+import org.wso2.carbon.registry.core.exceptions.RegistryException;
+import org.wso2.carbon.registry.core.exceptions.ResourceNotFoundException;
+
+/**
+ *
+ */
+public class RegistryManager {
+	private final static Log log = LogFactory.getLog(RegistryManager.class);
+	private static Registry registryService;
+	private static RegistryManager registryManager;
+	
+	public static RegistryManager getInstance() {
+
+		registryService = DeclarativeServiceReferenceHolder.getInstance().getRegistry();
+				
+		if (registryManager == null) {
+			synchronized(RegistryManager.class){
+				if (registryManager == null) {
+					if(registryService == null){
+//						log.warn("Registry Service is null. Hence unable to fetch data from registry.");
+						return registryManager;
+					}
+					registryManager = new RegistryManager();
+				}
+			}
+		}
+
+		return registryManager;
+	}
+	
+	private RegistryManager() {
+		try {
+			if (!registryService.resourceExists(CloudControllerConstants.CLOUD_CONTROLLER_RESOURCE)) {
+				registryService.put(CloudControllerConstants.CLOUD_CONTROLLER_RESOURCE,
+				                    registryService.newCollection());
+			}
+		} catch (RegistryException e) {
+			String msg =
+			             "Failed to create the registry resource " +
+			                     CloudControllerConstants.CLOUD_CONTROLLER_RESOURCE;
+			log.error(msg, e);
+			throw new CloudControllerException(msg, e);
+		}
+	}
+
+	/**
+     * Persist an object in the local registry.
+     * @param dataObj object to be persisted.
+     */
+	public void persist(FasterLookUpDataHolder dataObj) throws RegistryException {
+		try {
+
+			registryService.beginTransaction();
+			
+			Resource nodeResource = registryService.newResource();
+
+			nodeResource.setContent(Serializer.serializeToByteArray(dataObj));
+
+			registryService.put(CloudControllerConstants.CLOUD_CONTROLLER_RESOURCE+ CloudControllerConstants.DATA_RESOURCE, nodeResource);
+			
+			registryService.commitTransaction();
+			
+		} catch (Exception e) {
+			String msg = "Failed to persist the cloud controller data in registry.";
+			registryService.rollbackTransaction();
+			log.error(msg, e);
+			throw new CloudControllerException(msg, e);
+			
+		} 
+	}
+	
+	public Object retrieve(){
+		
+		try {
+	        Resource resource = registryService.get(CloudControllerConstants.CLOUD_CONTROLLER_RESOURCE+ CloudControllerConstants.DATA_RESOURCE);
+	        
+	        return resource.getContent();
+	        
+        } catch (ResourceNotFoundException ignore) {
+        	// this means, we've never persisted CC info in registry
+        	return null;
+        }catch (RegistryException e) {
+        	String msg = "Failed to retrieve cloud controller data from registry.";
+			log.error(msg, e);
+			throw new CloudControllerException(msg, e);
+        }
+		
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/registry/RegistryManager.java.back
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/registry/RegistryManager.java.back b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/registry/RegistryManager.java.back
new file mode 100644
index 0000000..3ab6681
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/registry/RegistryManager.java.back
@@ -0,0 +1,96 @@
+package org.wso2.carbon.stratos.cloud.controller.registry;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.wso2.carbon.registry.core.Registry;
+import org.wso2.carbon.registry.core.Resource;
+import org.wso2.carbon.registry.core.exceptions.RegistryException;
+import org.wso2.carbon.stratos.cloud.controller.exception.CloudControllerException;
+import org.wso2.carbon.stratos.cloud.controller.persist.Serializer;
+import org.wso2.carbon.stratos.cloud.controller.util.CloudControllerConstants;
+import org.wso2.carbon.stratos.cloud.controller.util.CloudControllerServiceReferenceHolder;
+
+/**
+ *
+ */
+public class RegistryManager {
+	private final static Log log = LogFactory.getLog(RegistryManager.class);
+	private static Registry registryService = CloudControllerServiceReferenceHolder.getInstance().getRegistry();
+	private static RegistryManager registryManager;
+	
+	public static RegistryManager getInstance() {
+
+		if (registryManager == null) {
+			synchronized(RegistryManager.class){
+				if (registryManager == null) {
+					if(registryService == null){
+						log.warn("Registry Service is null. Hence unable to fetch data from registry.");
+						return registryManager;
+					}
+					registryManager = new RegistryManager();
+				}
+			}
+		}
+
+		return registryManager;
+	}
+	
+	private RegistryManager() {
+		try {
+			if (!registryService.resourceExists(CloudControllerConstants.CLOUD_CONTROLLER_RESOURCE)) {
+				registryService.put(CloudControllerConstants.CLOUD_CONTROLLER_RESOURCE,
+				                    registryService.newCollection());
+			}
+		} catch (RegistryException e) {
+			String msg =
+			             "Failed to create the registry resource " +
+			                     CloudControllerConstants.CLOUD_CONTROLLER_RESOURCE;
+			log.error(msg, e);
+			throw new CloudControllerException(msg, e);
+		}
+	}
+
+	/**
+     * Persist a node id in the local registry.
+     * @param nodeId node id to be persisted.
+     */
+	public void persist(Object dataObj) throws RegistryException {
+		try {
+
+			registryService.beginTransaction();
+			
+			Resource nodeResource = registryService.newResource();
+
+			nodeResource.setContent(Serializer.serializeToByteArray(dataObj));
+
+			registryService.put(CloudControllerConstants.CLOUD_CONTROLLER_RESOURCE+ CloudControllerConstants.DATA_RESOURCE, nodeResource);
+			
+			registryService.commitTransaction();
+			
+		} catch (Exception e) {
+			String msg = "Failed to persist the cloud controller data in registry.";
+			log.error(msg, e);
+			throw new CloudControllerException(msg, e);
+			
+		} finally{
+			registryService.rollbackTransaction();
+			
+		}
+	}
+	
+	public Object retrieve(){
+		
+		try {
+	        Resource resource = registryService.get(CloudControllerConstants.CLOUD_CONTROLLER_RESOURCE+ CloudControllerConstants.DATA_RESOURCE);
+	        
+	        return resource.getContent();
+	        
+        } catch (RegistryException e) {
+        	String msg = "Failed to retrieve cloud controller data from registry.";
+			log.error(msg, e);
+			throw new CloudControllerException(msg, e);
+        }
+		
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/runtime/FasterLookUpDataHolder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/runtime/FasterLookUpDataHolder.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/runtime/FasterLookUpDataHolder.java
new file mode 100644
index 0000000..049a068
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/runtime/FasterLookUpDataHolder.java
@@ -0,0 +1,425 @@
+/*
+ * Copyright (c) 2005-2011, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ * 
+ * WSO2 Inc. 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.cloud.controller.runtime;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import org.wso2.carbon.databridge.agent.thrift.DataPublisher;
+import org.apache.stratos.cloud.controller.registry.RegistryManager;
+import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
+import org.apache.stratos.cloud.controller.util.Cartridge;
+import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
+import org.apache.stratos.cloud.controller.util.IaasProvider;
+import org.apache.stratos.cloud.controller.util.ServiceContext;
+
+/**
+ * This object holds all runtime data and provides faster access. This is a Singleton class.
+ */
+public class FasterLookUpDataHolder implements Serializable{
+
+    private static final long serialVersionUID = -2662307358852779897L;
+
+	private static volatile FasterLookUpDataHolder ctxt;
+
+	/* We keep following maps in order to make the look up time, small. */
+
+	/**
+	 * Map of maps.
+	 * Map 1:
+	 * Key - domain
+	 * Value - is another map
+	 * Map 2:
+	 * key - sub domain
+	 * value - {@link ServiceContext}
+	 */
+	private Map<String, Map<String, ServiceContext>> serviceCtxts;
+	
+	/**
+	 * To make data retrieval from registry faster.
+	 */
+	private List<ServiceContext> serviceCtxtList;
+
+	public List<ServiceContext> getServiceCtxtList() {
+    	return serviceCtxtList;
+    }
+
+	/**
+	 * Key - node id
+	 * Value - {@link ServiceContext}
+	 */
+	private Map<String, ServiceContext> nodeIdToServiceCtxt;
+	
+	/**
+	 * List of registered {@link Cartridge}s
+	 */
+	private List<Cartridge> cartridges;
+
+	/**
+	 * List of IaaS Providers.
+	 */
+	private List<IaasProvider> iaasProviders;
+
+	private String serializationDir;
+	private boolean enableBAMDataPublisher;
+	private boolean enableTopologySync;
+	private String bamUsername = CloudControllerConstants.DEFAULT_BAM_SERVER_USER_NAME;
+	private String bamPassword = CloudControllerConstants.DEFAULT_BAM_SERVER_PASSWORD;
+	private String dataPublisherCron = CloudControllerConstants.PUB_CRON_EXPRESSION;
+	private String cassandraConnUrl = CloudControllerConstants.DEFAULT_CASSANDRA_URL;
+	private String cassandraUser = CloudControllerConstants.DEFAULT_CASSANDRA_USER;
+	private String cassandraPassword = CloudControllerConstants.DEFAULT_CASSANDRA_PASSWORD;
+	/**
+	 * Key - node id 
+	 * Value - Status of the instance
+	 * This map is only used by BAM data publisher in CC.
+	 */
+	private Map<String, String> nodeIdToStatusMap = new HashMap<String, String>();
+	private transient DataPublisher dataPublisher;
+	private String streamId;
+	private boolean isPublisherRunning;
+	private boolean isTopologySyncRunning;
+	private String topologySynchronizerCron = CloudControllerConstants.TOPOLOGY_SYNC_CRON;
+
+	private BlockingQueue<List<ServiceContext>> sharedTopologyDiffQueue = new LinkedBlockingQueue<List<ServiceContext>>();
+
+
+	private String mbServerUrl = CloudControllerConstants.MB_SERVER_URL;
+
+	public static FasterLookUpDataHolder getInstance() {
+
+		if (ctxt == null) {
+			synchronized (FasterLookUpDataHolder.class) {
+				if (ctxt == null && RegistryManager.getInstance() != null) {
+
+					Object obj = RegistryManager.getInstance().retrieve();
+					if (obj != null) {
+						if (obj instanceof FasterLookUpDataHolder) {
+							ctxt = (FasterLookUpDataHolder) obj;
+							System.out.println("*********** FasterLookUpDataHolder ********");
+						} else {
+							System.out.println("*********** Not a FasterLookUpDataHolder *******");
+						}
+
+					} 
+					
+				}
+				if(ctxt == null) {
+					ctxt = new FasterLookUpDataHolder();
+				}
+			}
+		}
+
+		return ctxt;
+	}
+
+	private FasterLookUpDataHolder() {
+
+		serviceCtxtList = new ArrayList<ServiceContext>();
+		serviceCtxts = new ConcurrentHashMap<String, Map<String, ServiceContext>>();
+		nodeIdToServiceCtxt = new LinkedHashMap<String, ServiceContext>();
+		cartridges = new ArrayList<Cartridge>();
+
+	}
+
+	public void addServiceContext(ServiceContext ctx) {
+
+		if (ctx == null) {
+			return;
+		}
+
+		String domain = ctx.getDomainName();
+		String subDomain = ctx.getSubDomainName();
+
+		if (domain != null && subDomain != null) {
+			addToServiceCtxts(domain, subDomain, ctx);
+		}
+
+	}
+
+	public void removeServiceContext(ServiceContext ctxt) {
+
+		if (ctxt == null) {
+			return;
+		}
+
+		String domain = ctxt.getDomainName();
+		String subDomain = ctxt.getSubDomainName();
+
+		if (domain != null && subDomain != null) {
+			if (serviceCtxts.containsKey(domain)) {
+				Map<String, ServiceContext> subDomainMap = serviceCtxts.get(domain);
+				subDomainMap.remove(subDomain);
+			}
+		}
+		
+		serviceCtxtList.remove(ctxt);
+
+	}
+
+	public ServiceContext getServiceContext(String domain, String subDomain) {
+
+		if (serviceCtxts.get(domain) != null) {
+			return serviceCtxts.get(domain).get(subDomain);
+		}
+		return null;
+	}
+
+	public ServiceContext getServiceContext(String nodeId) {
+
+		return nodeIdToServiceCtxt.get(nodeId);
+	}
+	
+	public List<Object> getNodeIdsOfServiceCtxt(ServiceContext ctxt){
+		return CloudControllerUtil.getKeysFromValue(nodeIdToServiceCtxt, ctxt);
+	}
+
+	public Map<String, Map<String, ServiceContext>> getServiceContexts() {
+		return serviceCtxts;
+	}
+
+	public void addNodeId(String nodeId, ServiceContext ctxt) {
+		nodeIdToServiceCtxt.put(nodeId, ctxt);
+	}
+
+	public void removeNodeId(String nodeId) {
+		nodeIdToServiceCtxt.remove(nodeId);
+	}
+	
+	public void setNodeIdToServiceContextMap(Map<String, ServiceContext> map) {
+		nodeIdToServiceCtxt = map;
+	}
+
+	public Map<String, ServiceContext> getNodeIdToServiceContextMap() {
+		return nodeIdToServiceCtxt;
+	}
+
+	private void addToServiceCtxts(String domainName, String subDomainName, ServiceContext ctxt) {
+
+		Map<String, ServiceContext> map;
+
+		if (serviceCtxts.get(domainName) == null) {
+			map = new HashMap<String, ServiceContext>();
+
+		} else {
+			map = serviceCtxts.get(domainName);
+		}
+
+		map.put(subDomainName, ctxt);
+		serviceCtxts.put(domainName, map);
+		
+		serviceCtxtList.add(ctxt);
+
+	}
+
+	public List<Cartridge> getCartridges() {
+		return cartridges;
+	}
+
+	public Cartridge getCartridge(String cartridgeType) {
+		for (Cartridge cartridge : cartridges) {
+			if (cartridge.getType().equals(cartridgeType)) {
+				return cartridge;
+			}
+		}
+
+		return null;
+
+	}
+
+//	public void addCartridges(List<Cartridge> newCartridges) {
+//		if (this.cartridges == null) {
+//			this.cartridges = newCartridges;
+//		} else {
+//			for (Cartridge cartridge : newCartridges) {
+//				int idx;
+//				if ((idx = cartridges.indexOf(cartridge)) != -1) {
+//					Cartridge ref = cartridges.get(idx);
+//					ref = cartridge;
+//				} else {
+//					cartridges.add(cartridge);
+//				}
+//			}
+//		}
+//
+//	}
+	
+	public void addCartridge(Cartridge newCartridges) {
+	
+		cartridges.add(newCartridges);
+	}
+
+	public void removeCartridges(List<Cartridge> cartridges) {
+		if (this.cartridges != null) {
+			this.cartridges.removeAll(cartridges);
+		}
+
+	}
+
+	public List<IaasProvider> getIaasProviders() {
+		return iaasProviders;
+	}
+
+	public void setIaasProviders(List<IaasProvider> iaasProviders) {
+		this.iaasProviders = iaasProviders;
+	}
+
+	public String getSerializationDir() {
+		return serializationDir;
+	}
+
+	public void setSerializationDir(String serializationDir) {
+		this.serializationDir = serializationDir;
+	}
+
+	public String getBamUsername() {
+		return bamUsername;
+	}
+
+	public void setBamUsername(String bamUsername) {
+		this.bamUsername = bamUsername;
+	}
+
+	public String getBamPassword() {
+		return bamPassword;
+	}
+
+	public void setBamPassword(String bamPassword) {
+		this.bamPassword = bamPassword;
+	}
+
+	public String getDataPublisherCron() {
+		return dataPublisherCron;
+	}
+
+	public void setDataPublisherCron(String dataPublisherCron) {
+		this.dataPublisherCron = dataPublisherCron;
+	}
+
+	public Map<String, String> getNodeIdToStatusMap() {
+		return nodeIdToStatusMap;
+	}
+
+	public void setNodeIdToStatusMap(Map<String, String> nodeIdToStatusMap) {
+		this.nodeIdToStatusMap = nodeIdToStatusMap;
+	}
+
+	public DataPublisher getDataPublisher() {
+		return dataPublisher;
+	}
+
+	public void setDataPublisher(DataPublisher dataPublisher) {
+		this.dataPublisher = dataPublisher;
+	}
+
+	public String getStreamId() {
+		return streamId;
+	}
+
+	public void setStreamId(String streamId) {
+		this.streamId = streamId;
+	}
+
+	public boolean getEnableBAMDataPublisher() {
+		return enableBAMDataPublisher;
+	}
+
+	public void setEnableBAMDataPublisher(boolean enableBAMDataPublisher) {
+		this.enableBAMDataPublisher = enableBAMDataPublisher;
+	}
+
+	public String getCassandraConnUrl() {
+		return cassandraConnUrl;
+	}
+
+	public void setCassandraConnUrl(String cassandraHostAddr) {
+		this.cassandraConnUrl = cassandraHostAddr;
+	}
+
+	public String getCassandraUser() {
+		return cassandraUser;
+	}
+
+	public void setCassandraUser(String cassandraUser) {
+		this.cassandraUser = cassandraUser;
+	}
+
+	public String getCassandraPassword() {
+		return cassandraPassword;
+	}
+
+	public void setCassandraPassword(String cassandraPassword) {
+		this.cassandraPassword = cassandraPassword;
+	}
+
+	public boolean isPublisherRunning() {
+		return isPublisherRunning;
+	}
+
+	public void setPublisherRunning(boolean isPublisherRunning) {
+		this.isPublisherRunning = isPublisherRunning;
+	}
+
+	public BlockingQueue<List<ServiceContext>> getSharedTopologyDiffQueue() {
+		return sharedTopologyDiffQueue;
+	}
+
+	public void setSharedTopologyDiffQueue(BlockingQueue<List<ServiceContext>> sharedTopologyDiffQueue) {
+		this.sharedTopologyDiffQueue = sharedTopologyDiffQueue;
+	}
+
+	public String getTopologySynchronizerCron() {
+		return topologySynchronizerCron;
+	}
+
+	public void setTopologySynchronizerCron(String topologySynchronizerCron) {
+		this.topologySynchronizerCron = topologySynchronizerCron;
+	}
+
+	public void setMBServerUrl(String ip) {
+		this.mbServerUrl = ip;
+	}
+
+	public String getMBServerUrl() {
+		return mbServerUrl;
+	}
+
+	public boolean getEnableTopologySync() {
+		return enableTopologySync;
+	}
+
+	public void setEnableTopologySync(boolean enableTopologySync) {
+		this.enableTopologySync = enableTopologySync;
+	}
+
+	public boolean isTopologySyncRunning() {
+	    return isTopologySyncRunning;
+    }
+
+	public void setTopologySyncRunning(boolean isTopologySyncRunning) {
+	    this.isTopologySyncRunning = isTopologySyncRunning;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topic/ConfigurationPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topic/ConfigurationPublisher.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topic/ConfigurationPublisher.java
new file mode 100644
index 0000000..0339fd7
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topic/ConfigurationPublisher.java
@@ -0,0 +1,65 @@
+package org.apache.stratos.cloud.controller.topic;
+
+import java.util.Properties;
+
+import javax.jms.*;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class ConfigurationPublisher {
+	private TopicPublisher topicPublisher;
+	private TopicSession topicSession;
+	private TopicConnection topicConnection;
+	private TopicConnectionFactory topicConnectionFactory;
+	private static final Log log = LogFactory.getLog(ConfigurationPublisher.class);
+	
+	
+	public ConfigurationPublisher() {
+	    
+		Properties initialContextProperties = new Properties();
+		initialContextProperties.put("java.naming.factory.initial",
+				"org.wso2.andes.jndi.PropertiesFileInitialContextFactory");
+		String connectionString = "amqp://admin:admin@clientID/carbon?brokerlist='tcp://"+ FasterLookUpDataHolder.getInstance().getMBServerUrl()+"'";
+		initialContextProperties.put("connectionfactory.qpidConnectionfactory", connectionString);
+		
+		try {
+			InitialContext initialContext = new InitialContext(initialContextProperties);
+			topicConnectionFactory =
+					(TopicConnectionFactory) initialContext.lookup("qpidConnectionfactory");
+			
+//			topicConnection.stop();
+//			topicConnection.close();
+			
+		} catch (NamingException e) {
+			log.error(e.getMessage(), e);
+		} 
+    }
+
+	
+	public void publish(String topicName, String message) {
+		try {
+			topicConnection = topicConnectionFactory.createTopicConnection();
+			topicConnection.start();
+			topicSession = topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
+
+			Topic topic = topicSession.createTopic(topicName);
+			topicPublisher = topicSession.createPublisher(topic);
+			TextMessage textMessage = topicSession.createTextMessage(message);
+
+			topicPublisher.publish(textMessage);
+			
+			topicPublisher.close();
+			topicSession.close();
+			topicConnection.stop();
+			topicConnection.close();
+			
+		}  catch (JMSException e) {
+			log.error(e.getMessage(), e);
+		}
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topic/TopologySynchronizerTask.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topic/TopologySynchronizerTask.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topic/TopologySynchronizerTask.java
new file mode 100644
index 0000000..08a40e4
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topic/TopologySynchronizerTask.java
@@ -0,0 +1,79 @@
+/*
+*  Copyright (c) 2005-2011, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+*
+*  WSO2 Inc. 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.cloud.controller.topic;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Map;
+
+import org.apache.stratos.cloud.controller.exception.CloudControllerException;
+import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder;
+import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
+import org.apache.stratos.cloud.controller.util.DeclarativeServiceReferenceHolder;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.wso2.carbon.ntask.core.Task;
+
+public class TopologySynchronizerTask implements Task{
+    
+    private static final Log log = LogFactory.getLog(TopologySynchronizerTask.class);
+    private DeclarativeServiceReferenceHolder data = DeclarativeServiceReferenceHolder.getInstance();
+    private File topologyFile;
+    
+    @Override
+    public void execute() {
+    	if(FasterLookUpDataHolder.getInstance().isTopologySyncRunning()||
+        		// this is a temporary fix to avoid task execution - limitation with ntask
+        		!FasterLookUpDataHolder.getInstance().getEnableTopologySync()){
+            return;
+        }
+    	
+    	log.debug("TopologySynchronizerTask ... ");
+        
+    	// publish to the topic 
+		try {
+			if (topologyFile.exists()) {
+				data.getConfigPub().publish(CloudControllerConstants.TOPIC_NAME,
+				                               FileUtils.readFileToString(topologyFile));
+			}
+		} catch (IOException e) {
+        	String msg = "Failed when publishing to the topic "+CloudControllerConstants.TOPIC_NAME+
+        			" - Reason : Failed while reading topology from "+topologyFile.getAbsolutePath();
+        	log.error(msg, e);
+        	throw new CloudControllerException(msg, e);
+        }
+    }
+    
+    @Override
+    public void init() {
+
+    	// this is a temporary fix to avoid task execution - limitation with ntask
+		if(!FasterLookUpDataHolder.getInstance().getEnableTopologySync()){
+			log.debug("Topology Sync is disabled.");
+			return;
+		}
+    	
+    	topologyFile = new File(CloudControllerConstants.TOPOLOGY_FILE_PATH);
+        
+    }
+
+    @Override
+    public void setProperties(Map<String, String> arg0) {}
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/AppType.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/AppType.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/AppType.java
new file mode 100644
index 0000000..3ca9bfc
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/AppType.java
@@ -0,0 +1,44 @@
+package org.apache.stratos.cloud.controller.util;
+
+import java.io.Serializable;
+
+/**
+ * domain mapping related data.
+ *
+ */
+public class AppType implements Serializable{
+	
+    private static final long serialVersionUID = 3550489774139807168L;
+	private String name;
+	private boolean appSpecificMapping = true;
+	
+	public AppType(){
+		
+	}
+	
+	public AppType(String name){
+		this.setName(name);
+	}
+	
+	public AppType(String name, boolean appSpecificMapping){
+		this.setName(name);
+		this.setAppSpecificMapping(appSpecificMapping);
+	}
+
+	public String getName() {
+	    return name;
+    }
+
+	public void setName(String name) {
+	    this.name = name;
+    }
+
+	public boolean isAppSpecificMapping() {
+	    return appSpecificMapping;
+    }
+
+	public void setAppSpecificMapping(boolean appSpecificMapping) {
+	    this.appSpecificMapping = appSpecificMapping;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/Cartridge.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/Cartridge.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/Cartridge.java
new file mode 100644
index 0000000..8625965
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/Cartridge.java
@@ -0,0 +1,254 @@
+/*
+*  Copyright (c) 2005-2011, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+*
+*  WSO2 Inc. 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.cloud.controller.util;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang.builder.HashCodeBuilder;
+
+/**
+ * Holds information regarding a Cartridge.
+ */
+public class Cartridge implements Serializable{
+
+    private static final long serialVersionUID = 6637409027085059072L;
+
+	private String type;
+    
+    private String hostName;
+    
+    private String provider;
+    
+    private String displayName;
+    
+    private String description;
+    
+    private String baseDir;
+    
+    private String version;
+    
+    private boolean multiTenant;
+    
+    private List<PortMapping> portMappings = new ArrayList<PortMapping>();
+    
+    private List<AppType> appTypeMappings = new ArrayList<AppType>();
+    
+    /**
+     * Property map of this Cartridge.
+     */
+    private Map<String, String> properties = new HashMap<String, String>();
+    
+    /**
+     * A Cartridge can have 1..n {@link IaasProvider}s
+     */
+    private List<IaasProvider> iaases = new ArrayList<IaasProvider>();
+    
+    private List<String> deploymentDirs = new ArrayList<String>();
+    
+    private IaasProvider lastlyUsedIaas;
+    
+    public Cartridge(){}
+    
+    public Cartridge(String type, String host, String provider, String version, boolean multiTenant) {
+        this.type = type;
+        this.hostName = host;
+        this.provider = provider;
+        this.version = version;
+        this.multiTenant = multiTenant;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public Map<String, String> getProperties() {
+        return properties;
+    }
+    
+    public String getProperty(String key) {
+        return properties.get(key);
+    }
+
+    public void setProperties(Map<String, String> properties) {
+        this.properties = properties;
+    }
+    
+    public void addIaasProvider(IaasProvider iaas) {
+        for (IaasProvider anIaas : iaases) {
+            if(anIaas.equals(iaas)){
+                int idx = iaases.indexOf(anIaas);
+                iaases.remove(idx);
+                iaases.add(idx, iaas);
+                return;
+            }
+        }
+        this.iaases.add(iaas);
+    }
+    
+    public IaasProvider getIaasProvider(String iaasType){
+    	for (IaasProvider iaas : iaases) {
+	        if(iaas.getType().equals(iaasType)){
+	        	return iaas;
+	        }
+        }
+    	
+    	return null;
+    }
+
+    public List<IaasProvider> getIaases() {
+        return iaases;
+    }
+
+    public void setIaases(List<IaasProvider> iaases) {
+        this.iaases = iaases;
+    }
+    
+	public boolean equals(Object obj) {
+		if (obj instanceof Cartridge) {
+			return this.type.equals(((Cartridge)obj).getType());
+		}
+		return false;
+	}
+    
+    public int hashCode() {
+        return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers
+            append(type).
+            toHashCode();
+    }
+
+    public IaasProvider getLastlyUsedIaas() {
+        return lastlyUsedIaas;
+    }
+
+    public void setLastlyUsedIaas(IaasProvider lastlyUsedIaas) {
+        this.lastlyUsedIaas = lastlyUsedIaas;
+    }
+
+//    public boolean isJcloudsObjectsBuilt() {
+//        return isJcloudsObjectsBuilt;
+//    }
+//
+//    public void setJcloudsObjectsBuilt(boolean isJcloudsObjectsBuilt) {
+//        this.isJcloudsObjectsBuilt = isJcloudsObjectsBuilt;
+//    }
+
+	public String getDisplayName() {
+		return displayName;
+	}
+
+	public void setDisplayName(String displayName) {
+		this.displayName = displayName;
+	}
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+	public String getHostName() {
+	    return hostName;
+    }
+
+	public void setHostName(String hostName) {
+	    this.hostName = hostName;
+    }
+	
+	public void reset(){
+//		lastlyUsedIaas = null;
+	}
+
+	public List<String> getDeploymentDirs() {
+	    return deploymentDirs;
+    }
+
+	public void setDeploymentDirs(List<String> deploymentDirs) {
+	    this.deploymentDirs = deploymentDirs;
+    }
+	
+	public void addDeploymentDir(String dir){
+		deploymentDirs.add(dir);
+	}
+	
+	public void addPortMapping(PortMapping mapping){
+		portMappings.add(mapping);
+	}
+	
+	public void addAppType(AppType type){
+		appTypeMappings.add(type);
+	}
+
+	public String getProvider() {
+	    return provider;
+    }
+
+	public void setProvider(String provider) {
+	    this.provider = provider;
+    }
+
+	public String getVersion() {
+		return version;
+	}
+
+	public void setVersion(String version) {
+		this.version = version;
+	}
+
+	public boolean isMultiTenant() {
+		return multiTenant;
+	}
+
+	public void setMultiTenant(boolean multiTenant) {
+		this.multiTenant = multiTenant;
+	}
+
+	public String getBaseDir() {
+	    return baseDir;
+    }
+
+	public void setBaseDir(String baseDir) {
+	    this.baseDir = baseDir;
+    }
+
+	public List<PortMapping> getPortMappings() {
+	    return portMappings;
+    }
+
+	public void setPortMappings(List<PortMapping> portMappings) {
+	    this.portMappings = portMappings;
+    }
+
+	public List<AppType> getAppTypeMappings() {
+    	return appTypeMappings;
+    }
+
+	public void setAppTypeMappings(List<AppType> appTypeMappings) {
+    	this.appTypeMappings = appTypeMappings;
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CartridgeInfo.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CartridgeInfo.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CartridgeInfo.java
new file mode 100644
index 0000000..daeef80
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CartridgeInfo.java
@@ -0,0 +1,162 @@
+/*
+*  Copyright (c) 2005-2011, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+*
+*  WSO2 Inc. 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.cloud.controller.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Holds useful information for externals, regarding a Cartridge.
+ */
+public class CartridgeInfo {
+
+    private String type;
+    
+    private String hostName;
+    
+    private String displayName;
+    
+    private String description;
+    
+    private String[] deploymentDirs;
+    
+    private PortMapping[] portMappings;
+    
+    private AppType[] appTypes;
+    
+    private String provider;
+    
+    private String version;
+    
+    private boolean multiTenant;
+    
+    private String baseDir;
+    
+    private Property[] properties;
+    
+    public CartridgeInfo(){
+    	
+    }
+    
+    public CartridgeInfo(String type, String host, String desc, List<String> deploymentDirs, String provider) {
+        this.type = type;
+        this.hostName = host;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getDisplayName() {
+		return displayName;
+	}
+
+	public void setDisplayName(String displayName) {
+		this.displayName = displayName;
+	}
+
+	public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+	public String getHostName() {
+	    return hostName;
+    }
+
+	public void setHostName(String hostName) {
+	    this.hostName = hostName;
+    }
+
+	public String[] getDeploymentDirs() {
+	    return deploymentDirs;
+    }
+
+	public void setDeploymentDirs(List<String> deploymentDirsList) {
+		if(deploymentDirsList == null){
+			deploymentDirsList = new ArrayList<String>();
+		}
+	    this.deploymentDirs = new String[deploymentDirsList.size()];
+	    
+	    deploymentDirsList.toArray(deploymentDirs);
+	    
+    }
+	
+    public String getProvider() {
+	    return provider;
+    }
+
+	public void setProvider(String provider) {
+	    this.provider = provider;
+    }
+
+	public String getVersion() {
+		return version;
+	}
+
+	public void setVersion(String version) {
+		this.version = version;
+	}
+
+	public boolean isMultiTenant() {
+		return multiTenant;
+	}
+
+	public void setMultiTenant(boolean multiTenant) {
+		this.multiTenant = multiTenant;
+	}
+
+	public String getBaseDir() {
+	    return baseDir;
+    }
+
+	public void setBaseDir(String baseDir) {
+	    this.baseDir = baseDir;
+    }
+
+	public PortMapping[] getPortMappings() {
+	    return portMappings;
+    }
+
+	public void setPortMappings(PortMapping[] portMappings) {
+	    this.portMappings = portMappings;
+    }
+
+	public AppType[] getAppTypes() {
+	    return appTypes;
+    }
+
+	public void setAppTypes(AppType[] appTypes) {
+	    this.appTypes = appTypes;
+    }
+
+	public Property[] getProperties() {
+	    return properties;
+    }
+
+	public void setProperties(Property[] properties) {
+	    this.properties = properties;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CartridgeInstanceData.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CartridgeInstanceData.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CartridgeInstanceData.java
new file mode 100644
index 0000000..ee6efee
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CartridgeInstanceData.java
@@ -0,0 +1,129 @@
+/*
+*  Copyright (c) 2005-2011, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+*
+*  WSO2 Inc. 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.cloud.controller.util;
+
+import org.jclouds.compute.domain.NodeMetadata;
+
+/**
+ * This class holds the data to be published to BAM.
+ */
+public class CartridgeInstanceData {
+
+    // Cartridge type
+    private String type;
+    
+    private String nodeId;
+    
+    private String domain;
+    
+    private String subDomain;
+    
+    private String iaas;
+    
+    private String status;
+    
+    private String tenantRange;
+    
+    private String alias;
+    
+    private boolean isMultiTenant;
+    
+    private NodeMetadata metaData;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getNodeId() {
+        return nodeId;
+    }
+
+    public void setNodeId(String nodeId) {
+        this.nodeId = nodeId;
+    }
+
+    public String getDomain() {
+        return domain;
+    }
+
+    public void setDomain(String domain) {
+        this.domain = domain;
+    }
+
+    public String getSubDomain() {
+        return subDomain;
+    }
+
+    public void setSubDomain(String subDomain) {
+        this.subDomain = subDomain;
+    }
+
+    public String getIaas() {
+        return iaas;
+    }
+
+    public void setIaas(String iaas) {
+        this.iaas = iaas;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public NodeMetadata getMetaData() {
+        return metaData;
+    }
+
+    public void setMetaData(NodeMetadata metaData) {
+        this.metaData = metaData;
+    }
+
+    public String getTenantRange() {
+        return tenantRange;
+    }
+
+    public void setTenantRange(String tenantRange) {
+        this.tenantRange = tenantRange;
+    }
+
+    public boolean isMultiTenant() {
+        return isMultiTenant;
+    }
+
+    public void setMultiTenant(boolean isMultiTenant) {
+        this.isMultiTenant = isMultiTenant;
+    }
+
+    public String getAlias() {
+        return alias;
+    }
+
+    public void setAlias(String alias) {
+        this.alias = alias;
+    }
+    
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerConstants.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerConstants.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerConstants.java
new file mode 100644
index 0000000..534b896
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerConstants.java
@@ -0,0 +1,216 @@
+/*
+*  Copyright (c) 2005-2011, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+*
+*  WSO2 Inc. 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.cloud.controller.util;
+
+import java.io.File;
+
+import org.wso2.carbon.utils.CarbonUtils;
+
+public final class CloudControllerConstants {
+
+    /**
+     * cloud-controller XML file's elements
+     */
+    public static final String CLOUD_CONTROLLER_ELEMENT = "cloudController";
+    public static final String SERIALIZATION_DIR_ELEMENT = "serializationDir";
+    public static final String IAAS_PROVIDERS_ELEMENT = "iaasProviders";
+    public static final String IAAS_PROVIDER_ELEMENT = "iaasProvider";
+    public static final String DEPLOYMENT_ELEMENT = "deployment";
+    public static final String PORT_MAPPING_ELEMENT = "portMapping";
+    public static final String APP_TYPES_ELEMENT = "appTypes";
+    public static final String TYPE_ATTR = "type";
+    public static final String HOST_ATTR = "host";
+    public static final String BASE_DIR_ATTR = "baseDir";
+    public static final String PROVIDER_ATTR = "provider";
+    public static final String VERSION_ATTR = "version";
+    public static final String MULTI_TENANT_ATTR = "multiTenant";
+    public static final String PORT_ATTR = "port";
+    public static final String PROXY_PORT_ATTR = "proxyPort";
+    public static final String NAME_ATTR = "name";
+    public static final String APP_SPECIFIC_MAPPING_ATTR = "appSpecificMapping";
+    
+    public static final String CARTRIDGES_ELEMENT = "cartridges";
+    public static final String CARTRIDGE_ELEMENT = "cartridge";
+    
+    public static final String DISPLAY_NAME_ELEMENT = "displayName";
+    public static final String DESCRIPTION_ELEMENT = "description";
+    public static final String PROPERTY_ELEMENT = "property";
+    public static final String PROPERTY_NAME_ATTR= "name";
+    public static final String PROPERTY_VALUE_ATTR = "value";
+    public static final String IMAGE_ID_ELEMENT = "imageId";
+    public static final String SCALE_DOWN_ORDER_ELEMENT = "scaleDownOrder";
+    public static final String SCALE_UP_ORDER_ELEMENT = "scaleUpOrder";
+    public static final String CLASS_NAME_ELEMENT = "className";
+    public static final String MAX_INSTANCE_LIMIT_ELEMENT = "maxInstanceLimit";
+    public static final String PROVIDER_ELEMENT = "provider";
+    public static final String IDENTITY_ELEMENT = "identity";
+    public static final String CREDENTIAL_ELEMENT = "credential";
+    public static final String DEFAULT_SERVICE_ELEMENT = "default";
+    public static final String SERVICE_ELEMENT = "service";
+    public static final String SERVICES_ELEMENT = "services";
+    public static final String DIRECTORY_ELEMENT = "dir";
+    public static final String HTTP_ELEMENT = "http";
+    public static final String HTTPS_ELEMENT = "https";
+    public static final String APP_TYPE_ELEMENT = "appType";
+    public static final String SERVICE_DOMAIN_ATTR = "domain";
+    public static final String SERVICE_SUB_DOMAIN_ATTR = "subDomain";
+    public static final String SERVICE_TENANT_RANGE_ATTR = "tenantRange";
+    public static final String PAYLOAD_ELEMENT = "payload";
+    public static final String DATA_PUBLISHER_ELEMENT = "dataPublisher";
+    public static final String TOPOLOGY_SYNC_ELEMENT = "topologySync";
+    public static final String ENABLE_ATTR = "enable";
+    public static final String BAM_SERVER_ELEMENT = "bamServer";
+    public static final String MB_SERVER_ELEMENT = "mbServerUrl";
+    public static final String CRON_ELEMENT = "cron";
+    public static final String BAM_SERVER_ADMIN_USERNAME_ELEMENT = "adminUserName";
+    public static final String BAM_SERVER_ADMIN_PASSWORD_ELEMENT = "adminPassword";
+    public static final String CASSANDRA_INFO_ELEMENT = "cassandraInfo";
+    public static final String HOST_ELEMENT = "host";
+    public static final String CONNECTION_URL_ELEMENT = "connectionUrl";
+    public static final String HOST_PORT_ELEMENT = "port";
+    public static final String USER_NAME_ELEMENT = "userName";
+    public static final String PASSWORD_ELEMENT = "password";
+    public static final String CLOUD_CONTROLLER_EVENT_STREAM = "org.wso2.stratos.cloud.controller";
+    public static final String CLOUD_CONTROLLER_COL_FAMILY = CLOUD_CONTROLLER_EVENT_STREAM.replaceAll("[/.]", "_");
+    
+    /**
+     * column names
+     */
+    public static final String PAYLOAD_PREFIX = "payload_";
+    public static final String NODE_ID_COL = "nodeId";
+    public static final String CARTRIDGE_TYPE_COL = "cartridgeType";
+    public static final String DOMAIN_COL = "domain";
+    public static final String SUB_DOMAIN_COL = "subDomain";
+    public static final String ALIAS_COL = "alias";
+    public static final String TENANT_RANGE_COL = "tenantRange";
+    public static final String IS_MULTI_TENANT_COL = "isMultiTenant";
+    public static final String IAAS_COL = "iaas";
+    public static final String STATUS_COL = "status";
+    public static final String HOST_NAME_COL = "hostName";
+    public static final String HYPERVISOR_COL = "hypervisor";
+    public static final String RAM_COL = "ram";
+    public static final String IMAGE_ID_COL = "imageId";
+    public static final String LOGIN_PORT_COL = "loginPort";
+    public static final String OS_NAME_COL = "osName";
+    public static final String OS_VERSION_COL = "osVersion";
+    public static final String OS_ARCH_COL = "osArch";
+    public static final String OS_BIT_COL = "is64bitOS";
+    public static final String PRIV_IP_COL = "privateIPAddresses";
+    public static final String PUB_IP_COL = "publicIPAddresses";
+    
+    
+    /**
+     * Properties
+     */
+    public static final String REGION_PROPERTY = "region";
+    public static final String PUBLIC_IP_PROPERTY = "public_ip";
+    public static final String TENANT_ID_PROPERTY = "tenant_id";
+    public static final String ALIAS_PROPERTY = "alias";
+    public static final String AUTO_ASSIGN_IP_PROPERTY = "autoAssignIp";
+    
+    /**
+     * XPath expressions
+     */
+    public static final String IAAS_PROVIDER_XPATH = "/"+CLOUD_CONTROLLER_ELEMENT+"/"+
+     IAAS_PROVIDERS_ELEMENT+"/"+IAAS_PROVIDER_ELEMENT;
+    public static final String PROPERTY_ELEMENT_XPATH = "/"+PROPERTY_ELEMENT;
+    public static final String IMAGE_ID_ELEMENT_XPATH = "/"+IMAGE_ID_ELEMENT;
+    public static final String SCALE_UP_ORDER_ELEMENT_XPATH = "/"+SCALE_UP_ORDER_ELEMENT;
+    public static final String SCALE_DOWN_ORDER_ELEMENT_XPATH = "/"+SCALE_DOWN_ORDER_ELEMENT;
+    public static final String PROVIDER_ELEMENT_XPATH = "/"+PROPERTY_ELEMENT;
+    public static final String IDENTITY_ELEMENT_XPATH = "/"+IDENTITY_ELEMENT;
+    public static final String CREDENTIAL_ELEMENT_XPATH = "/"+CREDENTIAL_ELEMENT;
+    public static final String SERVICES_ELEMENT_XPATH = "/"+SERVICES_ELEMENT+"/"+SERVICE_ELEMENT;
+    public static final String SERVICE_ELEMENT_XPATH = "/"+SERVICE_ELEMENT;
+    public static final String CARTRIDGE_ELEMENT_XPATH = "/"+CARTRIDGE_ELEMENT;
+    public static final String PAYLOAD_ELEMENT_XPATH = "/"+PAYLOAD_ELEMENT;
+    public static final String HOST_ELEMENT_XPATH = "/"+HOST_ELEMENT;
+    public static final String CARTRIDGES_ELEMENT_XPATH = "/"+CARTRIDGES_ELEMENT+"/"+CARTRIDGE_ELEMENT;
+    public static final String IAAS_PROVIDER_ELEMENT_XPATH = "/"+IAAS_PROVIDER_ELEMENT;
+    public static final String DEPLOYMENT_ELEMENT_XPATH = "/"+DEPLOYMENT_ELEMENT;
+    public static final String PORT_MAPPING_ELEMENT_XPATH = "/"+PORT_MAPPING_ELEMENT;
+    public static final String APP_TYPES_ELEMENT_XPATH = "/"+APP_TYPES_ELEMENT;
+    
+    public static final String DATA_PUBLISHER_XPATH = "/"+CLOUD_CONTROLLER_ELEMENT+
+            "/"+DATA_PUBLISHER_ELEMENT;
+    public static final String TOPOLOGY_SYNC_XPATH = "/"+CLOUD_CONTROLLER_ELEMENT+
+            "/"+TOPOLOGY_SYNC_ELEMENT;
+    public static final String DATA_PUBLISHER_CRON_XPATH = "/"+CLOUD_CONTROLLER_ELEMENT+
+            "/"+CRON_ELEMENT;
+    public static final String BAM_SERVER_ADMIN_USERNAME_XPATH = "/"+CLOUD_CONTROLLER_ELEMENT+
+            "/"+BAM_SERVER_ADMIN_USERNAME_ELEMENT;
+    public static final String BAM_SERVER_ADMIN_PASSWORD_XPATH = "/"+CLOUD_CONTROLLER_ELEMENT+
+            "/"+BAM_SERVER_ADMIN_PASSWORD_ELEMENT;
+//    public static final String CASSANDRA_HOST_ADDRESS_XPATH = "/"+CLOUD_CONTROLLER_ELEMENT+
+//            "/"+CASSANDRA_HOST_ADDRESS;
+//    public static final String CASSANDRA_HOST_PORT_XPATH = "/"+CLOUD_CONTROLLER_ELEMENT+
+//            "/"+CASSANDRA_HOST_PORT;
+    
+    
+    /**
+     * Secret Manager related aliases.
+     */
+    public static final String ALIAS_ATTRIBUTE = "svns:secretAlias";
+    
+    /**
+     * Payload related constants
+     */
+    public static final String PAYLOAD_FOLDER = "payload";
+    public static final String ENTRY_SEPARATOR = ",";
+    
+    /**
+     * Publisher task related constants
+     */
+    public static final String DATA_PUB_TASK_TYPE = "CLOUD_CONTROLLER_DATA_PUBLISHER_TASK";
+    // default is : data publisher will run in first second of every minute
+    public static final String PUB_CRON_EXPRESSION = "1 * * * * ? *";
+    public static final String DATA_PUB_TASK_NAME = "CartridgeInstanceDataPublisherTask";
+    public static final String DEFAULT_BAM_SERVER_USER_NAME = "admin";
+    public static final String DEFAULT_BAM_SERVER_PASSWORD = "admin";
+    public static final String DEFAULT_CASSANDRA_URL = "localhost:9160";
+    public static final String DEFAULT_CASSANDRA_USER = "admin";
+    public static final String DEFAULT_CASSANDRA_PASSWORD = "admin";
+    public static final String DEFAULT_CASSANDRA_CLUSTER_NAME = "Test Cluster";
+    public static final String DEFAULT_CASSANDRA_KEY_SPACE = "EVENT_KS";
+    
+	/**
+	 * Directories
+	 */
+	public static final String PAYLOAD_DIR = CarbonUtils.getCarbonHome() + File.separator +
+	                                         "resources" + File.separator + PAYLOAD_FOLDER +
+	                                         File.separator;
+	public static final String SERVICES_DIR = CarbonUtils.getCarbonRepository() 
+    		+ File.separator + "services"+File.separator;
+    
+    /**
+     * Topology sync related constants
+     */
+    public static final String TOPOLOGY_FILE_PATH = CarbonUtils.getCarbonConfigDirPath()+File.separator+"service-topology.conf";
+    public static final String TOPIC_NAME = "cloud-controller-topology";
+	public static final String TOPOLOGY_SYNC_CRON = "1 * * * * ? *";
+	public static final String TOPOLOGY_SYNC_TASK_NAME = "TopologySynchronizerTask";
+	public static final String TOPOLOGY_SYNC_TASK_TYPE = "TOPOLOGY_SYNC_TASK";
+	public static final String MB_SERVER_URL = "localhost:5672";
+    
+	/**
+	 * Persistence
+	 */
+	public static final String CLOUD_CONTROLLER_RESOURCE = "/cloud.controller";
+	public static final String DATA_RESOURCE = "/data";
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java
new file mode 100644
index 0000000..a1f5551
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java
@@ -0,0 +1,102 @@
+package org.apache.stratos.cloud.controller.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import javax.xml.stream.XMLStreamException;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.util.AXIOMUtil;
+import org.apache.stratos.cloud.controller.exception.CloudControllerException;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class CloudControllerUtil {
+	private static final Log log = LogFactory.getLog(CloudControllerUtil.class);
+
+	public static OMElement serviceCtxtToOMElement(ServiceContext ctxt) throws XMLStreamException{
+		String xml;
+		
+		xml = ctxt.toXml();
+		
+		return AXIOMUtil.stringToOM(xml);
+	}
+
+	public static byte[] getBytesFromFile(String path) {
+
+		try {
+	        return FileUtils.readFileToByteArray(new File(path));
+        } catch (IOException e) {
+
+        	handleException("Failed to read the file "+path, e);
+        }
+		return new byte[0];
+    }
+	
+	public static CartridgeInfo toCartridgeInfo(Cartridge cartridge) {
+
+		CartridgeInfo carInfo = new CartridgeInfo();
+		carInfo.setType(cartridge.getType());
+		carInfo.setDisplayName(cartridge.getDisplayName());
+		carInfo.setDescription(cartridge.getDescription());
+		carInfo.setHostName(cartridge.getHostName());
+		carInfo.setDeploymentDirs(cartridge.getDeploymentDirs());
+		carInfo.setProvider(cartridge.getProvider());
+		carInfo.setVersion(cartridge.getVersion());
+		carInfo.setMultiTenant(cartridge.isMultiTenant());
+		carInfo.setBaseDir(cartridge.getBaseDir());
+		carInfo.setPortMappings(cartridge.getPortMappings()
+		                                 .toArray(new PortMapping[cartridge.getPortMappings()
+		                                                                   .size()]));
+		carInfo.setAppTypes(cartridge.getAppTypeMappings()
+                                .toArray(new AppType[cartridge.getAppTypeMappings()
+                                                                  .size()]));
+		
+		List<Property> propList = new ArrayList<Property>();
+		
+		for (Iterator<?> iterator = cartridge.getProperties().entrySet().iterator(); iterator.hasNext();) {
+	        @SuppressWarnings("unchecked")
+            Map.Entry<String, String> entry = (Entry<String, String>) iterator.next();
+	        
+	        Property prop = new Property(entry.getKey(), entry.getValue());
+	        propList.add(prop);
+        }
+		Property[] props = new Property[propList.size()];
+		
+		carInfo.setProperties(propList.toArray(props));
+
+		return carInfo;
+	}
+	
+	public static List<Object> getKeysFromValue(Map<?, ?> hm, Object value) {
+		List<Object> list = new ArrayList<Object>();
+		for (Object o : hm.keySet()) {
+			if (hm.get(o).equals(value)) {
+				list.add(o);
+			}
+		}
+		return list;
+	}
+	
+	public static void sleep(long time){
+    	try {
+    		Thread.sleep(time);
+    	} catch (InterruptedException ignore) {}
+    	
+    }
+	
+	public static void handleException(String msg, Exception e){
+		log.error(msg, e);
+		throw new CloudControllerException(msg, e);
+	}
+	
+	public static void handleException(String msg){
+		log.error(msg);
+		throw new CloudControllerException(msg);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/DeclarativeServiceReferenceHolder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/DeclarativeServiceReferenceHolder.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/DeclarativeServiceReferenceHolder.java
new file mode 100644
index 0000000..bf38da7
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/DeclarativeServiceReferenceHolder.java
@@ -0,0 +1,69 @@
+/*
+*  Copyright (c) 2005-2011, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+*
+*  WSO2 Inc. 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.cloud.controller.util;
+
+import org.wso2.carbon.ntask.core.service.TaskService;
+import org.wso2.carbon.registry.core.Registry;
+import org.wso2.carbon.registry.core.session.UserRegistry;
+import org.apache.stratos.cloud.controller.topic.ConfigurationPublisher;
+
+/**
+ * Singleton class to hold all the service references.
+ */
+public class DeclarativeServiceReferenceHolder {
+
+    private static DeclarativeServiceReferenceHolder instance;
+    private TaskService taskService;
+    private ConfigurationPublisher configPub;
+    private Registry registry;
+    
+    private DeclarativeServiceReferenceHolder() {
+    }
+
+    public static DeclarativeServiceReferenceHolder getInstance() {
+        if (instance == null) {
+            instance = new DeclarativeServiceReferenceHolder();
+        }
+        return instance;
+    }
+    
+    public ConfigurationPublisher getConfigPub(){
+    	return configPub;
+    }
+
+    public TaskService getTaskService() {
+        return taskService;
+    }
+
+    public void setTaskService(TaskService taskService) {
+        this.taskService = taskService;
+    }
+    
+    public void setConfigPub(ConfigurationPublisher configPub) {
+        this.configPub = configPub;
+    }
+
+	public void setRegistry(UserRegistry governanceSystemRegistry) {
+		registry = governanceSystemRegistry;
+    }
+
+	public Registry getRegistry() {
+	    return registry;
+    }
+    
+}