You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by im...@apache.org on 2014/12/10 10:19:46 UTC

stratos git commit: Moving jclouds member termination methods to JcloudsIaas and renaming logTermination() method to executeMemberTerminationPostProcess()

Repository: stratos
Updated Branches:
  refs/heads/4.1.0-test 0e540557e -> aeb4458ce


Moving jclouds member termination methods to JcloudsIaas and renaming logTermination() method to executeMemberTerminationPostProcess()


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

Branch: refs/heads/4.1.0-test
Commit: aeb4458cef748fe44e96b4d52a37d89a5368d847
Parents: 0e54055
Author: Imesh Gunaratne <im...@apache.org>
Authored: Wed Dec 10 14:49:38 2014 +0530
Committer: Imesh Gunaratne <im...@apache.org>
Committed: Wed Dec 10 14:49:38 2014 +0530

----------------------------------------------------------------------
 .../cloud/controller/iaases/JcloudsIaas.java    |  79 +++++--
 .../controller/iaases/mock/MockIaasService.java |   5 -
 .../CartridgeInstanceDataPublisher.java         | 214 -------------------
 .../publisher/StatisticsDataPublisher.java      | 212 ++++++++++++++++++
 .../messaging/topology/TopologyBuilder.java     |  54 ++---
 .../impl/CloudControllerServiceImpl.java        |  95 ++++----
 .../impl/CloudControllerServiceUtil.java        |  99 +--------
 .../services/impl/InstanceCreator.java          |  12 +-
 .../services/impl/InstanceTerminator.java       |   4 +
 9 files changed, 359 insertions(+), 415 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/aeb4458c/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/JcloudsIaas.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/JcloudsIaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/JcloudsIaas.java
index 8a0656a..6c02770 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/JcloudsIaas.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/JcloudsIaas.java
@@ -34,6 +34,7 @@ import org.jclouds.compute.ComputeService;
 import org.jclouds.compute.domain.NodeMetadata;
 import org.jclouds.compute.domain.NodeMetadataBuilder;
 import org.jclouds.compute.domain.Template;
+import org.jclouds.rest.ResourceNotFoundException;
 
 import java.util.Set;
 
@@ -173,8 +174,7 @@ public abstract class JcloudsIaas extends Iaas {
                                     " - terminating node:" + memberContext.toString();
                             log.error(msg);
                             // terminate instance
-                            CloudControllerServiceUtil.terminate(getIaasProvider(),
-                                    node.getId(), memberContext);
+                            destroyNode(node.getId(), memberContext);
                             throw new CloudControllerException(msg);
                         }
                     } else {
@@ -182,7 +182,7 @@ public abstract class JcloudsIaas extends Iaas {
                                 " - terminating node:" + memberContext.toString();
                         log.error(msg);
                         // terminate instance
-                        CloudControllerServiceUtil.terminate(getIaasProvider(), node.getId(), memberContext);
+                        destroyNode(node.getId(), memberContext);
                         throw new CloudControllerException(msg);
                     }
 
@@ -262,42 +262,81 @@ public abstract class JcloudsIaas extends Iaas {
     }
 
     public void terminateInstance(MemberContext memberContext) throws InvalidCartridgeTypeException, InvalidMemberException {
-
         String memberId = memberContext.getMemberId();
-        String clusterId = memberContext.getClusterId();
-        String partitionId = memberContext.getPartition().getId();
         String cartridgeType = memberContext.getCartridgeType();
         String nodeId = memberContext.getNodeId();
         Cartridge cartridge = CloudControllerContext.getInstance().getCartridge(cartridgeType);
 
-        log.info("Starting to terminate an instance with member id : " + memberId +
-                " in partition id: " + partitionId + " of cluster id: " + clusterId +
-                " and of cartridge type: " + cartridgeType);
+        if(log.isInfoEnabled()) {
+            log.info(String.format("Starting to terminate member: [cartridge-type] %s [member-id] %s",
+                    cartridgeType, memberId));
+        }
 
         if (cartridge == null) {
-            String msg = "Termination of Member Id: " + memberId + " failed. " +
-                    "Cannot find a matching Cartridge for type: " +
-                    cartridgeType;
+            String msg = String.format("Member termination failed, could not find cartridge in cloud controller " +
+                            "context: [cartridge-type] %s [member-id] %s",
+                    cartridgeType, memberId);
             log.error(msg);
             throw new InvalidCartridgeTypeException(msg);
         }
 
         // if no matching node id can be found.
         if (nodeId == null) {
-            String msg = "Termination failed. Cannot find a node id for Member Id: " + memberId;
+            String msg = String.format("Member termination failed, could not find node id in member context: " +
+                            "[cartridge-type] %s [member-id] %s",
+                    cartridgeType, memberId);
 
-            // log information
-            CloudControllerServiceUtil.logTermination(memberContext);
+            // Execute member termination post process
+            CloudControllerServiceUtil.executeMemberTerminationPostProcess(memberContext);
             log.error(msg);
             throw new InvalidMemberException(msg);
         }
 
-        IaasProvider iaasProvider = cartridge.getIaasProviderOfPartition(partitionId);
+        // Terminate the actual member instance
+        destroyNode(nodeId, memberContext);
+    }
 
-        // terminate it!
-        CloudControllerServiceUtil.terminate(iaasProvider, nodeId, memberContext);
+    /**
+     * Terminate member instance via jclouds API
+     *
+     * @param memberContext
+     * @param nodeId
+     * @return will return the IaaSProvider
+     */
+    private void destroyNode(String nodeId, MemberContext memberContext) {
+        // Detach volumes if any
+        detachVolume(memberContext);
 
-        // log information
-        CloudControllerServiceUtil.logTermination(memberContext);
+        // Destroy the node via jclouds
+        getIaasProvider().getComputeService().destroyNode(nodeId);
+
+        // release allocated IP address
+        if (memberContext.getAllocatedIpAddress() != null) {
+            releaseAddress(memberContext.getAllocatedIpAddress());
+        }
+
+        if (log.isInfoEnabled()) {
+            log.info("Member terminated: [member-id] " + memberContext.getMemberId());
+        }
+    }
+
+    private void detachVolume(MemberContext ctxt) {
+        String clusterId = ctxt.getClusterId();
+        ClusterContext clusterContext = CloudControllerContext.getInstance().getClusterContext(clusterId);
+        if (clusterContext.getVolumes() != null) {
+            for (Volume volume : clusterContext.getVolumes()) {
+                try {
+                    String volumeId = volume.getId();
+                    if (volumeId == null) {
+                        return;
+                    }
+                    detachVolume(ctxt.getInstanceId(), volumeId);
+                } catch (ResourceNotFoundException ignore) {
+                    if (log.isDebugEnabled()) {
+                        log.debug(ignore);
+                    }
+                }
+            }
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/aeb4458c/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/MockIaasService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/MockIaasService.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/MockIaasService.java
index f9d348c..5c3d83f 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/MockIaasService.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/MockIaasService.java
@@ -181,11 +181,6 @@ public class MockIaasService {
         synchronized (MockIaasService.class) {
             MockMember mockMember = membersMap.get(memberContext.getMemberId());
             if (mockMember != null) {
-                //updating the topology
-                TopologyBuilder.handleMemberTerminated(memberContext.getCartridgeType(),
-                        memberContext.getClusterId(), memberContext.getNetworkPartitionId(),
-                        memberContext.getPartition().getId(), memberContext.getMemberId());
-
                 mockMember.terminate();
                 membersMap.remove(memberContext.getMemberId());
             }

http://git-wip-us.apache.org/repos/asf/stratos/blob/aeb4458c/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/publisher/CartridgeInstanceDataPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/publisher/CartridgeInstanceDataPublisher.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/publisher/CartridgeInstanceDataPublisher.java
deleted file mode 100644
index 5f27a7a..0000000
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/publisher/CartridgeInstanceDataPublisher.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one 
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
- * KIND, either express or implied.  See the License for the 
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.stratos.cloud.controller.messaging.publisher;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.cloud.controller.config.CloudControllerConfig;
-import org.apache.stratos.cloud.controller.context.CloudControllerContext;
-import org.apache.stratos.cloud.controller.exception.CloudControllerException;
-import org.apache.stratos.cloud.controller.domain.Cartridge;
-import org.apache.stratos.cloud.controller.domain.MemberContext;
-import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
-import org.jclouds.compute.domain.NodeMetadata;
-import org.wso2.carbon.base.ServerConfiguration;
-import org.wso2.carbon.databridge.agent.thrift.AsyncDataPublisher;
-import org.wso2.carbon.databridge.agent.thrift.exception.AgentException;
-import org.wso2.carbon.databridge.commons.Attribute;
-import org.wso2.carbon.databridge.commons.AttributeType;
-import org.wso2.carbon.databridge.commons.Event;
-import org.wso2.carbon.databridge.commons.StreamDefinition;
-import org.wso2.carbon.utils.CarbonUtils;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-/**
- *  This will publish the state changes of a node in the topology to a data receiver
- */
-public class CartridgeInstanceDataPublisher {
-    
-    private static final Log log = LogFactory.getLog(CartridgeInstanceDataPublisher.class);
-    private static AsyncDataPublisher dataPublisher;
-    private static StreamDefinition streamDefinition;
-    private static final String cloudControllerEventStreamVersion = "1.0.0";
-
-    public static void publish(String memberId,
-                               String partitionId,
-                               String networkId,
-                               String clusterId,
-                               String serviceName,
-                               String status,
-                               NodeMetadata metadata) {
-        if(!CloudControllerConfig.getInstance().isBAMDataPublisherEnabled()){
-            return;
-        }
-        log.debug(CloudControllerConstants.DATA_PUB_TASK_NAME+" cycle started.");
-
-        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;
-            }
-        }
-
-
-        MemberContext memberContext = CloudControllerContext.getInstance().getMemberContextOfMemberId(memberId);
-        String cartridgeType = memberContext.getCartridgeType();
-        Cartridge cartridge = CloudControllerContext.getInstance().getCartridge(cartridgeType);
-        
-        //Construct the data to be published
-        List<Object> payload = new ArrayList<Object>();
-        // Payload values
-        payload.add(memberId);
-        payload.add(serviceName);
-        payload.add(clusterId);
-        payload.add(handleNull(memberContext.getLbClusterId()));
-        payload.add(handleNull(partitionId));
-        payload.add(handleNull(networkId));
-		if (cartridge != null) {
-			payload.add(handleNull(String.valueOf(cartridge.isMultiTenant())));
-		} else {
-			payload.add("");
-		}
-        payload.add(handleNull(memberContext.getPartition().getProvider()));
-        payload.add(handleNull(status));
-
-        if(metadata != null) {
-            payload.add(metadata.getHostname());
-            payload.add(metadata.getHardware().getHypervisor());
-            payload.add(String.valueOf(metadata.getHardware().getRam()));
-            payload.add(metadata.getImageId());
-            payload.add(metadata.getLoginPort());
-            payload.add(metadata.getOperatingSystem().getName());
-            payload.add(metadata.getOperatingSystem().getVersion());
-            payload.add(metadata.getOperatingSystem().getArch());
-            payload.add(String.valueOf(metadata.getOperatingSystem().is64Bit()));
-        } else {
-            payload.add("");
-            payload.add("");
-            payload.add("");
-            payload.add("");
-            payload.add(0);
-            payload.add("");
-            payload.add("");
-            payload.add("");
-            payload.add("");
-        }
-
-        payload.add(handleNull(memberContext.getPrivateIpAddress()));
-        payload.add(handleNull(memberContext.getPublicIpAddress()));
-        payload.add(handleNull(memberContext.getAllocatedIpAddress()));
-
-        Event event = new Event();
-        event.setPayloadData(payload.toArray());
-        event.setArbitraryDataMap(new HashMap<String, String>());
-
-        try {
-            if (log.isDebugEnabled()) {
-                log.debug(String.format("Publishing BAM event: [stream] %s [version] %s", streamDefinition.getName(), streamDefinition.getVersion()));
-            }
-            dataPublisher.publish(streamDefinition.getName(), streamDefinition.getVersion(), event);
-        } catch (AgentException e) {
-            if (log.isErrorEnabled()) {
-                log.error(String.format("Could not publish BAM event: [stream] %s [version] %s", streamDefinition.getName(), streamDefinition.getVersion()), e);
-            }
-        }
-    }
-    
-    private static void release(){
-        CloudControllerContext.getInstance().setPublisherRunning(false);
-    }
-    
-    private static StreamDefinition initializeStream() throws Exception {
-        streamDefinition = new StreamDefinition(
-                CloudControllerConstants.CLOUD_CONTROLLER_EVENT_STREAM,
-                cloudControllerEventStreamVersion);
-        streamDefinition.setNickName("cloud.controller");
-        streamDefinition.setDescription("Instances booted up by the Cloud Controller");
-        // Payload definition
-        List<Attribute> payloadData = new ArrayList<Attribute>();
-        payloadData.add(new Attribute(CloudControllerConstants.MEMBER_ID_COL, AttributeType.STRING));
-        payloadData.add(new Attribute(CloudControllerConstants.CARTRIDGE_TYPE_COL, AttributeType.STRING));
-        payloadData.add(new Attribute(CloudControllerConstants.CLUSTER_ID_COL, AttributeType.STRING));
-        payloadData.add(new Attribute(CloudControllerConstants.LB_CLUSTER_ID_COL, AttributeType.STRING));
-        payloadData.add(new Attribute(CloudControllerConstants.PARTITION_ID_COL, AttributeType.STRING));
-        payloadData.add(new Attribute(CloudControllerConstants.NETWORK_ID_COL, AttributeType.STRING));
-        payloadData.add(new Attribute(CloudControllerConstants.IS_MULTI_TENANT_COL, AttributeType.STRING));
-        payloadData.add(new Attribute(CloudControllerConstants.IAAS_COL, AttributeType.STRING));
-        payloadData.add(new Attribute(CloudControllerConstants.STATUS_COL, AttributeType.STRING));
-        payloadData.add(new Attribute(CloudControllerConstants.HOST_NAME_COL, AttributeType.STRING));
-        payloadData.add(new Attribute(CloudControllerConstants.HYPERVISOR_COL, AttributeType.STRING));
-        payloadData.add(new Attribute(CloudControllerConstants.RAM_COL, AttributeType.STRING));
-        payloadData.add(new Attribute(CloudControllerConstants.IMAGE_ID_COL, AttributeType.STRING));
-        payloadData.add(new Attribute(CloudControllerConstants.LOGIN_PORT_COL, AttributeType.INT));
-        payloadData.add(new Attribute(CloudControllerConstants.OS_NAME_COL, AttributeType.STRING));
-        payloadData.add(new Attribute(CloudControllerConstants.OS_VERSION_COL, AttributeType.STRING));
-        payloadData.add(new Attribute(CloudControllerConstants.OS_ARCH_COL, AttributeType.STRING));
-        payloadData.add(new Attribute(CloudControllerConstants.OS_BIT_COL, AttributeType.STRING));
-        payloadData.add(new Attribute(CloudControllerConstants.PRIV_IP_COL, AttributeType.STRING));
-        payloadData.add(new Attribute(CloudControllerConstants.PUB_IP_COL, AttributeType.STRING));
-        payloadData.add(new Attribute(CloudControllerConstants.ALLOCATE_IP_COL, AttributeType.STRING));
-        streamDefinition.setPayloadData(payloadData);
-        return streamDefinition;
-    }
-
-
-    private static void createDataPublisher(){
-        //creating the agent
-
-        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 = CloudControllerConfig.getInstance().getDataPubConfig().getBamUsername();
-        String adminPassword = CloudControllerConfig.getInstance().getDataPubConfig().getBamPassword();
-
-        System.setProperty("javax.net.ssl.trustStore", trustStorePath);
-        System.setProperty("javax.net.ssl.trustStorePassword", trustStorePassword);
-
-
-        try {
-            dataPublisher = new AsyncDataPublisher("tcp://" +  bamServerUrl + "", adminUsername, adminPassword);
-            CloudControllerContext.getInstance().setDataPublisher(dataPublisher);
-            initializeStream();
-            dataPublisher.addStreamDefinition(streamDefinition);
-        } 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 String handleNull(String val) {
-        if (val == null) {
-            return "";
-        }
-        return val;
-    }
-
-    
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/aeb4458c/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/publisher/StatisticsDataPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/publisher/StatisticsDataPublisher.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/publisher/StatisticsDataPublisher.java
new file mode 100644
index 0000000..15cf63b
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/publisher/StatisticsDataPublisher.java
@@ -0,0 +1,212 @@
+/*
+ * 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.cloud.controller.messaging.publisher;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.cloud.controller.config.CloudControllerConfig;
+import org.apache.stratos.cloud.controller.context.CloudControllerContext;
+import org.apache.stratos.cloud.controller.exception.CloudControllerException;
+import org.apache.stratos.cloud.controller.domain.Cartridge;
+import org.apache.stratos.cloud.controller.domain.MemberContext;
+import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
+import org.jclouds.compute.domain.NodeMetadata;
+import org.wso2.carbon.base.ServerConfiguration;
+import org.wso2.carbon.databridge.agent.thrift.AsyncDataPublisher;
+import org.wso2.carbon.databridge.agent.thrift.exception.AgentException;
+import org.wso2.carbon.databridge.commons.Attribute;
+import org.wso2.carbon.databridge.commons.AttributeType;
+import org.wso2.carbon.databridge.commons.Event;
+import org.wso2.carbon.databridge.commons.StreamDefinition;
+import org.wso2.carbon.utils.CarbonUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ *  Statistics data publisher for publishing instance statistics to BAM.
+ */
+public class StatisticsDataPublisher {
+    
+    private static final Log log = LogFactory.getLog(StatisticsDataPublisher.class);
+    private static AsyncDataPublisher dataPublisher;
+    private static StreamDefinition streamDefinition;
+    private static final String cloudControllerEventStreamVersion = "1.0.0";
+
+    public static void publish(String memberId,
+                               String partitionId,
+                               String networkId,
+                               String clusterId,
+                               String serviceName,
+                               String status,
+                               NodeMetadata metadata) {
+        if(!CloudControllerConfig.getInstance().isBAMDataPublisherEnabled()){
+            return;
+        }
+        log.debug(CloudControllerConstants.DATA_PUB_TASK_NAME+" cycle started.");
+
+        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;
+            }
+        }
+
+
+        MemberContext memberContext = CloudControllerContext.getInstance().getMemberContextOfMemberId(memberId);
+        String cartridgeType = memberContext.getCartridgeType();
+        Cartridge cartridge = CloudControllerContext.getInstance().getCartridge(cartridgeType);
+        
+        //Construct the data to be published
+        List<Object> payload = new ArrayList<Object>();
+        // Payload values
+        payload.add(memberId);
+        payload.add(serviceName);
+        payload.add(clusterId);
+        payload.add(handleNull(memberContext.getLbClusterId()));
+        payload.add(handleNull(partitionId));
+        payload.add(handleNull(networkId));
+		if (cartridge != null) {
+			payload.add(handleNull(String.valueOf(cartridge.isMultiTenant())));
+		} else {
+			payload.add("");
+		}
+        payload.add(handleNull(memberContext.getPartition().getProvider()));
+        payload.add(handleNull(status));
+
+        if(metadata != null) {
+            payload.add(metadata.getHostname());
+            payload.add(metadata.getHardware().getHypervisor());
+            payload.add(String.valueOf(metadata.getHardware().getRam()));
+            payload.add(metadata.getImageId());
+            payload.add(metadata.getLoginPort());
+            payload.add(metadata.getOperatingSystem().getName());
+            payload.add(metadata.getOperatingSystem().getVersion());
+            payload.add(metadata.getOperatingSystem().getArch());
+            payload.add(String.valueOf(metadata.getOperatingSystem().is64Bit()));
+        } else {
+            payload.add("");
+            payload.add("");
+            payload.add("");
+            payload.add("");
+            payload.add(0);
+            payload.add("");
+            payload.add("");
+            payload.add("");
+            payload.add("");
+        }
+
+        payload.add(handleNull(memberContext.getPrivateIpAddress()));
+        payload.add(handleNull(memberContext.getPublicIpAddress()));
+        payload.add(handleNull(memberContext.getAllocatedIpAddress()));
+
+        Event event = new Event();
+        event.setPayloadData(payload.toArray());
+        event.setArbitraryDataMap(new HashMap<String, String>());
+
+        try {
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Publishing BAM event: [stream] %s [version] %s", streamDefinition.getName(), streamDefinition.getVersion()));
+            }
+            dataPublisher.publish(streamDefinition.getName(), streamDefinition.getVersion(), event);
+        } catch (AgentException e) {
+            if (log.isErrorEnabled()) {
+                log.error(String.format("Could not publish BAM event: [stream] %s [version] %s", streamDefinition.getName(), streamDefinition.getVersion()), e);
+            }
+        }
+    }
+    
+    private static void release(){
+        CloudControllerContext.getInstance().setPublisherRunning(false);
+    }
+    
+    private static StreamDefinition initializeStream() throws Exception {
+        streamDefinition = new StreamDefinition(
+                CloudControllerConstants.CLOUD_CONTROLLER_EVENT_STREAM,
+                cloudControllerEventStreamVersion);
+        streamDefinition.setNickName("cloud.controller");
+        streamDefinition.setDescription("Instances booted up by the Cloud Controller");
+        // Payload definition
+        List<Attribute> payloadData = new ArrayList<Attribute>();
+        payloadData.add(new Attribute(CloudControllerConstants.MEMBER_ID_COL, AttributeType.STRING));
+        payloadData.add(new Attribute(CloudControllerConstants.CARTRIDGE_TYPE_COL, AttributeType.STRING));
+        payloadData.add(new Attribute(CloudControllerConstants.CLUSTER_ID_COL, AttributeType.STRING));
+        payloadData.add(new Attribute(CloudControllerConstants.LB_CLUSTER_ID_COL, AttributeType.STRING));
+        payloadData.add(new Attribute(CloudControllerConstants.PARTITION_ID_COL, AttributeType.STRING));
+        payloadData.add(new Attribute(CloudControllerConstants.NETWORK_ID_COL, AttributeType.STRING));
+        payloadData.add(new Attribute(CloudControllerConstants.IS_MULTI_TENANT_COL, AttributeType.STRING));
+        payloadData.add(new Attribute(CloudControllerConstants.IAAS_COL, AttributeType.STRING));
+        payloadData.add(new Attribute(CloudControllerConstants.STATUS_COL, AttributeType.STRING));
+        payloadData.add(new Attribute(CloudControllerConstants.HOST_NAME_COL, AttributeType.STRING));
+        payloadData.add(new Attribute(CloudControllerConstants.HYPERVISOR_COL, AttributeType.STRING));
+        payloadData.add(new Attribute(CloudControllerConstants.RAM_COL, AttributeType.STRING));
+        payloadData.add(new Attribute(CloudControllerConstants.IMAGE_ID_COL, AttributeType.STRING));
+        payloadData.add(new Attribute(CloudControllerConstants.LOGIN_PORT_COL, AttributeType.INT));
+        payloadData.add(new Attribute(CloudControllerConstants.OS_NAME_COL, AttributeType.STRING));
+        payloadData.add(new Attribute(CloudControllerConstants.OS_VERSION_COL, AttributeType.STRING));
+        payloadData.add(new Attribute(CloudControllerConstants.OS_ARCH_COL, AttributeType.STRING));
+        payloadData.add(new Attribute(CloudControllerConstants.OS_BIT_COL, AttributeType.STRING));
+        payloadData.add(new Attribute(CloudControllerConstants.PRIV_IP_COL, AttributeType.STRING));
+        payloadData.add(new Attribute(CloudControllerConstants.PUB_IP_COL, AttributeType.STRING));
+        payloadData.add(new Attribute(CloudControllerConstants.ALLOCATE_IP_COL, AttributeType.STRING));
+        streamDefinition.setPayloadData(payloadData);
+        return streamDefinition;
+    }
+
+
+    private static void createDataPublisher(){
+        //creating the agent
+
+        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 = CloudControllerConfig.getInstance().getDataPubConfig().getBamUsername();
+        String adminPassword = CloudControllerConfig.getInstance().getDataPubConfig().getBamPassword();
+
+        System.setProperty("javax.net.ssl.trustStore", trustStorePath);
+        System.setProperty("javax.net.ssl.trustStorePassword", trustStorePassword);
+
+
+        try {
+            dataPublisher = new AsyncDataPublisher("tcp://" +  bamServerUrl + "", adminUsername, adminPassword);
+            CloudControllerContext.getInstance().setDataPublisher(dataPublisher);
+            initializeStream();
+            dataPublisher.addStreamDefinition(streamDefinition);
+        } 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 String handleNull(String val) {
+        if (val == null) {
+            return "";
+        }
+        return val;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/aeb4458c/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/topology/TopologyBuilder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/topology/TopologyBuilder.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/topology/TopologyBuilder.java
index 1362f42..b97e98b 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/topology/TopologyBuilder.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/topology/TopologyBuilder.java
@@ -24,10 +24,9 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.cloud.controller.context.CloudControllerContext;
 import org.apache.stratos.cloud.controller.domain.*;
 import org.apache.stratos.cloud.controller.domain.Cartridge;
-import org.apache.stratos.cloud.controller.exception.CloudControllerException;
 import org.apache.stratos.cloud.controller.exception.InvalidCartridgeTypeException;
 import org.apache.stratos.cloud.controller.exception.InvalidMemberException;
-import org.apache.stratos.cloud.controller.messaging.publisher.CartridgeInstanceDataPublisher;
+import org.apache.stratos.cloud.controller.messaging.publisher.StatisticsDataPublisher;
 import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
 import org.apache.stratos.common.constants.StratosConstants;
 import org.apache.stratos.messaging.domain.applications.ClusterDataHolder;
@@ -42,7 +41,6 @@ import org.apache.stratos.messaging.event.instance.status.InstanceStartedEvent;
 import org.apache.stratos.messaging.event.topology.*;
 import org.apache.stratos.metadata.client.defaults.DefaultMetaDataServiceClient;
 import org.apache.stratos.metadata.client.defaults.MetaDataServiceClient;
-import org.wso2.carbon.registry.core.exceptions.RegistryException;
 
 import java.util.*;
 
@@ -510,13 +508,13 @@ public class TopologyBuilder {
         //memberStartedEvent.
         TopologyEventPublisher.sendMemberStartedEvent(instanceStartedEvent);
         //publishing data
-        CartridgeInstanceDataPublisher.publish(instanceStartedEvent.getMemberId(),
-                                            instanceStartedEvent.getPartitionId(),
-                                            instanceStartedEvent.getNetworkPartitionId(),
-                                            instanceStartedEvent.getClusterId(),
-                                            instanceStartedEvent.getServiceName(),
-                                            MemberStatus.Starting.toString(),
-                                            null);
+        StatisticsDataPublisher.publish(instanceStartedEvent.getMemberId(),
+                instanceStartedEvent.getPartitionId(),
+                instanceStartedEvent.getNetworkPartitionId(),
+                instanceStartedEvent.getClusterId(),
+                instanceStartedEvent.getServiceName(),
+                MemberStatus.Starting.toString(),
+                null);
     }
 
     public static void handleMemberActivated(InstanceActivatedEvent instanceActivatedEvent) {
@@ -585,13 +583,13 @@ public class TopologyBuilder {
         }
         TopologyEventPublisher.sendMemberActivatedEvent(memberActivatedEvent);
         //publishing data
-        CartridgeInstanceDataPublisher.publish(memberActivatedEvent.getMemberId(),
-                                            memberActivatedEvent.getPartitionId(),
-                                            memberActivatedEvent.getNetworkPartitionId(),
-                                            memberActivatedEvent.getClusterId(),
-                                            memberActivatedEvent.getServiceName(),
-                                            MemberStatus.Activated.toString(),
-                                            null);
+        StatisticsDataPublisher.publish(memberActivatedEvent.getMemberId(),
+                memberActivatedEvent.getPartitionId(),
+                memberActivatedEvent.getNetworkPartitionId(),
+                memberActivatedEvent.getClusterId(),
+                memberActivatedEvent.getServiceName(),
+                MemberStatus.Activated.toString(),
+                null);
     }
 
     public static void handleMemberReadyToShutdown(InstanceReadyToShutdownEvent instanceReadyToShutdownEvent)
@@ -641,13 +639,13 @@ public class TopologyBuilder {
         }
         TopologyEventPublisher.sendMemberReadyToShutdownEvent(memberReadyToShutdownEvent);
         //publishing data
-        CartridgeInstanceDataPublisher.publish(instanceReadyToShutdownEvent.getMemberId(),
-                                            instanceReadyToShutdownEvent.getPartitionId(),
-                                            instanceReadyToShutdownEvent.getNetworkPartitionId(),
-                                            instanceReadyToShutdownEvent.getClusterId(),
-                                            instanceReadyToShutdownEvent.getServiceName(),
-                                            MemberStatus.ReadyToShutDown.toString(),
-                                            null);
+        StatisticsDataPublisher.publish(instanceReadyToShutdownEvent.getMemberId(),
+                instanceReadyToShutdownEvent.getPartitionId(),
+                instanceReadyToShutdownEvent.getNetworkPartitionId(),
+                instanceReadyToShutdownEvent.getClusterId(),
+                instanceReadyToShutdownEvent.getServiceName(),
+                MemberStatus.ReadyToShutDown.toString(),
+                null);
         //termination of particular instance will be handled by autoscaler
     }
 
@@ -702,6 +700,14 @@ public class TopologyBuilder {
 
     }
 
+    /***
+     * Remove member from topology and send member terminated event.
+     * @param serviceName
+     * @param clusterId
+     * @param networkPartitionId
+     * @param partitionId
+     * @param memberId
+     */
     public static void handleMemberTerminated(String serviceName, String clusterId,
                                               String networkPartitionId, String partitionId,
                                               String memberId) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/aeb4458c/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
index f2a2e7b..e723cbd 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
@@ -35,8 +35,7 @@ import org.apache.stratos.cloud.controller.functions.ContainerClusterContextToKu
 import org.apache.stratos.cloud.controller.functions.ContainerClusterContextToReplicationController;
 import org.apache.stratos.cloud.controller.functions.PodToMemberContext;
 import org.apache.stratos.cloud.controller.iaases.Iaas;
-import org.apache.stratos.cloud.controller.iaases.validators.PartitionValidator;
-import org.apache.stratos.cloud.controller.messaging.publisher.CartridgeInstanceDataPublisher;
+import org.apache.stratos.cloud.controller.messaging.publisher.StatisticsDataPublisher;
 import org.apache.stratos.cloud.controller.messaging.topology.TopologyBuilder;
 import org.apache.stratos.cloud.controller.messaging.topology.TopologyEventPublisher;
 import org.apache.stratos.cloud.controller.messaging.topology.TopologyManager;
@@ -45,8 +44,6 @@ import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
 import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
 import org.apache.stratos.cloud.controller.util.PodActivationWatcher;
 import org.apache.stratos.common.Property;
-import org.apache.stratos.cloud.controller.iaases.validators.IaasBasedPartitionValidator;
-import org.apache.stratos.cloud.controller.iaases.validators.KubernetesBasedPartitionValidator;
 import org.apache.stratos.common.constants.StratosConstants;
 import org.apache.stratos.common.kubernetes.KubernetesGroup;
 import org.apache.stratos.common.kubernetes.KubernetesHost;
@@ -525,27 +522,23 @@ public class CloudControllerServiceImpl implements CloudControllerService {
     @Override
     public void terminateInstance(String memberId) throws InvalidMemberException, InvalidCartridgeTypeException {
 
-        handleNullObject(memberId, "Termination failed. Null member id.");
+        handleNullObject(memberId, "Member termination failed, member id is null.");
 
         MemberContext memberContext = CloudControllerContext.getInstance().getMemberContextOfMemberId(memberId);
-
         if (memberContext == null) {
-            String msg = "Termination failed. Invalid Member Id: " + memberId;
+            String msg = "Member termination failed, member context not found: [member-id] " + memberId;
             log.error(msg);
             throw new InvalidMemberException(msg);
         }
 
-        if (memberContext.getNodeId() == null && memberContext.getInstanceId() == null) {
-            // sending member terminated since this instance isn't reachable.
-            if (log.isInfoEnabled()){
-                log.info(String.format(
-                        "Member cannot be terminated because it is not reachable. [member] %s [nodeId] %s [instanceId] %s. Removing member from topology.",
-                        memberContext.getMemberId(),
-                        memberContext.getNodeId(),
-                        memberContext.getInstanceId()));
+        if ((memberContext.getNodeId() == null) && (memberContext.getInstanceId() == null)) {
+            if (log.isErrorEnabled()) {
+                log.error(String.format(
+                        "Member termination failed, node id and instance id are null: [member-id] %s " +
+                                "Removing member from topology.",
+                        memberContext.getMemberId()));
             }
-
-            CloudControllerServiceUtil.logTermination(memberContext);
+            CloudControllerServiceUtil.executeMemberTerminationPostProcess(memberContext);
         }
 
         // check if status == active, if true, then this is a termination on member faulty
@@ -553,44 +546,40 @@ public class CloudControllerServiceImpl implements CloudControllerService {
         try {
             TopologyManager.acquireReadLock();
             topology = TopologyManager.getTopology();
-        } finally {
-            TopologyManager.releaseReadLock();
-        }
-
-        org.apache.stratos.messaging.domain.topology.Service service = topology.getService(memberContext.getCartridgeType());
-
-        if (service != null) {
-            Cluster cluster = service.getCluster(memberContext.getClusterId());
-
-            if (cluster != null) {
-                Member member = cluster.getMember(memberId);
+            org.apache.stratos.messaging.domain.topology.Service service = topology.getService(memberContext.getCartridgeType());
+
+            if (service != null) {
+                Cluster cluster = service.getCluster(memberContext.getClusterId());
+                if (cluster != null) {
+                    Member member = cluster.getMember(memberId);
+                    if (member != null) {
+                        // change member status if termination on a faulty member
+                        if (fixMemberStatus(member, topology)) {
+                            // set the time this member was added to ReadyToShutdown status
+                            memberContext.setObsoleteInitTime(System.currentTimeMillis());
+                        }
 
-                if (member != null) {
-                    // change member status if termination on a faulty member
-                    if(fixMemberStatus(member, topology)){
-                        // set the time this member was added to ReadyToShutdown status
-                        memberContext.setObsoleteInitTime(System.currentTimeMillis());
-                    }
+                        // check if ready to shutdown member is expired and send
+                        // member terminated if it is.
+                        if (isMemberExpired(member, memberContext.getObsoleteInitTime(), memberContext.getObsoleteExpiryTime())) {
+                            if (log.isInfoEnabled()) {
+                                log.info(String.format(
+                                        "Member pending termination in ReadyToShutdown state exceeded expiry time. This member has to be manually deleted: %s",
+                                        memberContext.getMemberId()));
+                            }
 
-                    // check if ready to shutdown member is expired and send
-                    // member terminated if it is.
-                    if (isMemberExpired(member, memberContext.getObsoleteInitTime(), memberContext.getObsoleteExpiryTime())) {
-                        if (log.isInfoEnabled()) {
-                            log.info(String.format(
-                                    "Member pending termination in ReadyToShutdown state exceeded expiry time. This member has to be manually deleted: %s",
-                                    memberContext.getMemberId()));
+                            CloudControllerServiceUtil.executeMemberTerminationPostProcess(memberContext);
+                            return;
                         }
-
-                        CloudControllerServiceUtil.logTermination(memberContext);
-                        return;
                     }
                 }
             }
-        }
-
-        ThreadExecutor exec = ThreadExecutor.getInstance();
-        exec.execute(new InstanceTerminator(memberContext));
 
+            ThreadExecutor exec = ThreadExecutor.getInstance();
+            exec.execute(new InstanceTerminator(memberContext));
+        } finally {
+            TopologyManager.releaseReadLock();
+        }
     }
 
     /**
@@ -649,7 +638,7 @@ public class CloudControllerServiceImpl implements CloudControllerService {
 
             TopologyEventPublisher.sendMemberReadyToShutdownEvent(memberReadyToShutdownEvent);
             //publishing data
-            CartridgeInstanceDataPublisher.publish(member.getMemberId(),
+            StatisticsDataPublisher.publish(member.getMemberId(),
                     member.getPartitionId(),
                     member.getNetworkPartitionId(),
                     member.getClusterId(),
@@ -1263,7 +1252,7 @@ public class CloudControllerServiceImpl implements CloudControllerService {
     private String validateProperty(String property, org.apache.stratos.common.Properties properties, String object) {
 
         String propVal = CloudControllerUtil.getProperty(properties, property);
-        handleNullObject(propVal, "Property validation failed. Cannot find property: '" + property+ " in "+object);
+        handleNullObject(propVal, "Property validation failed. Cannot find property: '" + property + " in " + object);
         return propVal;
 
     }
@@ -1373,7 +1362,7 @@ public class CloudControllerServiceImpl implements CloudControllerService {
             List<MemberContext> membersToBeRemoved = CloudControllerContext.getInstance().getMemberContextsOfClusterId(clusterId);
 
             for (MemberContext memberContext : membersToBeRemoved) {
-                CloudControllerServiceUtil.logTermination(memberContext);
+                CloudControllerServiceUtil.executeMemberTerminationPostProcess(memberContext);
             }
 
             // persist
@@ -1509,7 +1498,7 @@ public class CloudControllerServiceImpl implements CloudControllerService {
                     for (Pod pod : difference) {
                         if (pod != null) {
                             MemberContext context = CloudControllerContext.getInstance().getMemberContextOfMemberId(pod.getId());
-                            CloudControllerServiceUtil.logTermination(context);
+                            CloudControllerServiceUtil.executeMemberTerminationPostProcess(context);
                             memberContexts.add(context);
                         }
                     }
@@ -1568,7 +1557,7 @@ public class CloudControllerServiceImpl implements CloudControllerService {
                 // member id = pod id
                 kubApi.deletePod(memberId);
                 MemberContext memberToBeRemoved = CloudControllerContext.getInstance().getMemberContextOfMemberId(memberId);
-                CloudControllerServiceUtil.logTermination(memberToBeRemoved);
+                CloudControllerServiceUtil.executeMemberTerminationPostProcess(memberToBeRemoved);
 
                 return memberToBeRemoved;
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/aeb4458c/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceUtil.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceUtil.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceUtil.java
index 1b014ab..cdde8d0 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceUtil.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceUtil.java
@@ -26,24 +26,19 @@ import com.google.common.net.InetAddresses;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.cloud.controller.context.CloudControllerContext;
-import org.apache.stratos.cloud.controller.domain.ClusterContext;
-import org.apache.stratos.cloud.controller.domain.ContainerClusterContext;
 import org.apache.stratos.cloud.controller.domain.IaasProvider;
 import org.apache.stratos.cloud.controller.domain.MemberContext;
 import org.apache.stratos.cloud.controller.domain.Partition;
-import org.apache.stratos.cloud.controller.domain.Volume;
-import org.apache.stratos.cloud.controller.exception.CloudControllerException;
 import org.apache.stratos.cloud.controller.exception.InvalidIaasProviderException;
 import org.apache.stratos.cloud.controller.exception.InvalidPartitionException;
 import org.apache.stratos.cloud.controller.iaases.Iaas;
 import org.apache.stratos.cloud.controller.iaases.validators.IaasBasedPartitionValidator;
 import org.apache.stratos.cloud.controller.iaases.validators.KubernetesBasedPartitionValidator;
-import org.apache.stratos.cloud.controller.messaging.publisher.CartridgeInstanceDataPublisher;
+import org.apache.stratos.cloud.controller.messaging.publisher.StatisticsDataPublisher;
 import org.apache.stratos.cloud.controller.messaging.topology.TopologyBuilder;
 import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
 import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
 import org.apache.stratos.messaging.domain.topology.MemberStatus;
-import org.jclouds.rest.ResourceNotFoundException;
 
 /**
  * Cloud controller service utility methods.
@@ -59,85 +54,24 @@ public class CloudControllerServiceUtil {
     }
 
     /**
-     * A helper method to terminate an instance.
-     *
-     * @param iaasProvider
-     * @param ctxt
-     * @param nodeId
-     * @return will return the IaaSProvider
+     * Update the topology, publish statistics to BAM, remove member context
+     * and persist cloud controller context.
+     * @param memberContext
      */
-    public static IaasProvider terminate(IaasProvider iaasProvider,
-                                   String nodeId, MemberContext ctxt) {
-        Iaas iaas = iaasProvider.getIaas();
-        if (iaas == null) {
-
-            try {
-                iaas = buildIaas(iaasProvider);
-            } catch (InvalidIaasProviderException e) {
-                String msg =
-                        "Instance termination failed. " + ctxt.toString() +
-                                ". Cause: Unable to build Iaas of this " + iaasProvider.toString();
-                log.error(msg, e);
-                throw new CloudControllerException(msg, e);
-            }
-
-        }
-
-        //detach volumes if any
-        detachVolume(iaasProvider, ctxt);
-
-        // destroy the node
-        iaasProvider.getComputeService().destroyNode(nodeId);
-
-        // release allocated IP address
-        if (ctxt.getAllocatedIpAddress() != null) {
-            iaas.releaseAddress(ctxt.getAllocatedIpAddress());
-        }
-
-        if (log.isDebugEnabled()) {
-            log.debug("Member is terminated: " + ctxt.toString());
-        } else if (log.isInfoEnabled()) {
-            log.info("Member with id " + ctxt.getMemberId() + " is terminated");
-        }
-        return iaasProvider;
-    }
-
-    private static void detachVolume(IaasProvider iaasProvider, MemberContext ctxt) {
-        String clusterId = ctxt.getClusterId();
-        ClusterContext clusterCtxt = CloudControllerContext.getInstance().getClusterContext(clusterId);
-        if (clusterCtxt.getVolumes() != null) {
-            for (Volume volume : clusterCtxt.getVolumes()) {
-                try {
-                    String volumeId = volume.getId();
-                    if (volumeId == null) {
-                        return;
-                    }
-                    Iaas iaas = iaasProvider.getIaas();
-                    iaas.detachVolume(ctxt.getInstanceId(), volumeId);
-                } catch (ResourceNotFoundException ignore) {
-                    if (log.isDebugEnabled()) {
-                        log.debug(ignore);
-                    }
-                }
-            }
-        }
-    }
-
-    public static void logTermination(MemberContext memberContext) {
-
+    public static void executeMemberTerminationPostProcess(MemberContext memberContext) {
         if (memberContext == null) {
             return;
         }
 
         String partitionId = memberContext.getPartition() == null ? null : memberContext.getPartition().getId();
 
-        //updating the topology
+        // Update the topology
         TopologyBuilder.handleMemberTerminated(memberContext.getCartridgeType(),
                 memberContext.getClusterId(), memberContext.getNetworkPartitionId(),
                 partitionId, memberContext.getMemberId());
 
-        //publishing data
-        CartridgeInstanceDataPublisher.publish(memberContext.getMemberId(),
+        // Publish statistics to BAM
+        StatisticsDataPublisher.publish(memberContext.getMemberId(),
                 partitionId,
                 memberContext.getNetworkPartitionId(),
                 memberContext.getClusterId(),
@@ -145,10 +79,10 @@ public class CloudControllerServiceUtil {
                 MemberStatus.Terminated.toString(),
                 null);
 
-        // update data holders
+        // Remove member context
         CloudControllerContext.getInstance().removeMemberContext(memberContext.getMemberId(), memberContext.getClusterId());
 
-        // persist
+        // Persist cloud controller context
         CloudControllerContext.getInstance().persist();
     }
 
@@ -166,19 +100,6 @@ public class CloudControllerServiceUtil {
             // if this is a IaaS based partition
             Iaas iaas = iaasProvider.getIaas();
 
-//            if (iaas == null) {
-//                try {
-//                    iaas = CloudControllerUtil.getIaas(iaasProvider);
-//                } catch (InvalidIaasProviderException e) {
-//                    String msg =
-//                            "Invalid Partition - " + partition.toString()
-//                                    + ". Cause: Unable to build Iaas of this IaasProvider [Provider] : " + provider
-//                                    + ". " + e.getMessage();
-//                    log.error(msg, e);
-//                    throw new InvalidPartitionException(msg, e);
-//                }
-//            }
-
             IaasBasedPartitionValidator validator = (IaasBasedPartitionValidator) iaas.getPartitionValidator();
             validator.setIaasProvider(iaasProvider);
             iaasProvider = validator.validate(partitionId, partitionProperties);

http://git-wip-us.apache.org/repos/asf/stratos/blob/aeb4458c/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/InstanceCreator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/InstanceCreator.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/InstanceCreator.java
index a1f38a9..b666c1c 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/InstanceCreator.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/InstanceCreator.java
@@ -19,24 +19,16 @@
 
 package org.apache.stratos.cloud.controller.services.impl;
 
-import com.google.common.collect.ImmutableSet;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.cloud.controller.context.CloudControllerContext;
 import org.apache.stratos.cloud.controller.domain.*;
-import org.apache.stratos.cloud.controller.exception.CloudControllerException;
 import org.apache.stratos.cloud.controller.iaases.Iaas;
-import org.apache.stratos.cloud.controller.iaases.JcloudsIaas;
-import org.apache.stratos.cloud.controller.messaging.publisher.CartridgeInstanceDataPublisher;
+import org.apache.stratos.cloud.controller.messaging.publisher.StatisticsDataPublisher;
 import org.apache.stratos.cloud.controller.messaging.topology.TopologyBuilder;
-import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
 import org.apache.stratos.messaging.domain.topology.MemberStatus;
-import org.jclouds.compute.ComputeService;
 import org.jclouds.compute.domain.NodeMetadata;
-import org.jclouds.compute.domain.NodeMetadataBuilder;
-import org.jclouds.compute.domain.Template;
 
-import java.util.Set;
 import java.util.concurrent.locks.Lock;
 
 /**
@@ -84,7 +76,7 @@ public class InstanceCreator implements Runnable {
                     memberContext);
 
             // Publish instance creation statistics to BAM
-            CartridgeInstanceDataPublisher.publish(memberContext.getMemberId(),
+            StatisticsDataPublisher.publish(memberContext.getMemberId(),
                     memberContext.getPartition().getId(),
                     memberContext.getNetworkPartitionId(),
                     memberContext.getClusterId(),

http://git-wip-us.apache.org/repos/asf/stratos/blob/aeb4458c/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/InstanceTerminator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/InstanceTerminator.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/InstanceTerminator.java
index 34c07e3..fdd6b29 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/InstanceTerminator.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/InstanceTerminator.java
@@ -52,7 +52,11 @@ public class InstanceTerminator implements Runnable {
         Lock lock = null;
         try {
             lock = CloudControllerContext.getInstance().acquireMemberContextWriteLock();
+            // Terminate the instance
             iaas.terminateInstance(memberContext);
+
+            // Execute member termination post process
+            CloudControllerServiceUtil.executeMemberTerminationPostProcess(memberContext);
         } catch (Exception e) {
             String msg = "Instance termination failed! " + memberContext.toString();
             log.error(msg, e);