volume support related changes to CC and some improvements

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

Branch: refs/heads/master
Commit: 9adc520f5076aaf799a051b83c368d137f89ce29
Parents: e141f07
Author: Nirmal Fernando <[email protected]>
Authored: Tue Feb 11 18:18:00 2014 +0530
Committer: Nirmal Fernando <[email protected]>
Committed: Tue Feb 11 18:18:00 2014 +0530

----------------------------------------------------------------------
 .../impl/CloudControllerServiceImpl.java        |  94 +++++++-
 .../jcloud/ComputeServiceBuilderUtil.java       |  11 +
 .../cloud/controller/pojo/ClusterContext.java   |  53 ++++-
 .../cloud/controller/pojo/IaasProvider.java     |   9 +
 .../cloud/controller/pojo/MemberContext.java    |  10 +
 .../runtime/FasterLookUpDataHolder.java         | 223 ++++---------------
 .../controller/topology/TopologyBuilder.java    |   6 +-
 .../topology/TopologyEventPublisher.java        |   4 +-
 8 files changed, 218 insertions(+), 192 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/9adc520f/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
index 59ccb1a..3432703 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
@@ -25,7 +25,6 @@ import 
org.apache.stratos.cloud.controller.deployment.partition.Partition;
 import org.apache.stratos.cloud.controller.exception.*;
 import org.apache.stratos.cloud.controller.interfaces.CloudControllerService;
 import org.apache.stratos.cloud.controller.interfaces.Iaas;
-import org.apache.stratos.cloud.controller.jcloud.ComputeServiceBuilderUtil;
 import org.apache.stratos.cloud.controller.persist.Deserializer;
 import org.apache.stratos.cloud.controller.pojo.*;
 import 
org.apache.stratos.cloud.controller.publisher.CartridgeInstanceDataPublisher;
@@ -42,10 +41,9 @@ import org.apache.stratos.messaging.util.Constants;
 import org.jclouds.compute.ComputeService;
 import org.jclouds.compute.domain.NodeMetadata;
 import org.jclouds.compute.domain.Template;
+import org.jclouds.rest.ResourceNotFoundException;
 import org.wso2.carbon.registry.core.exceptions.RegistryException;
 
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
 import java.util.*;
 import java.util.Properties;
 import java.util.concurrent.ConcurrentHashMap;
@@ -296,6 +294,14 @@ public class CloudControllerServiceImpl implements 
CloudControllerService {
             // Should have a length between 3-15
             String str = clusterId.length() > 10 ? clusterId.substring(0, 10) 
: clusterId.substring(0, clusterId.length());
             String group = str.replaceAll("[^a-z0-9-]", "");
+            
+            if(ctxt.isVolumeRequired()) {
+               if (ctxt.getVolumeId() == null) {
+                       // create a new volume
+                       createVolumeAndSetInClusterContext(ctxt, iaasProvider);
+               } 
+            }
+            
             NodeMetadata node;
 
 //            create and start a node
@@ -321,6 +327,16 @@ public class CloudControllerServiceImpl implements 
CloudControllerService {
                 if(log.isDebugEnabled()) {
                     log.debug("Node id was set. "+memberContext.toString());
                 }
+                
+                // attach volume
+                       if (ctxt.isVolumeRequired()) {
+                               // remove region prefix
+                               String instanceId = nodeId.indexOf('/') != -1 ? 
nodeId
+                                               .substring(nodeId.indexOf('/') 
+ 1, nodeId.length())
+                                               : nodeId;
+                               memberContext.setInstanceId(instanceId);
+                               iaas.attachVolume(instanceId, 
ctxt.getVolumeId(), ctxt.getDeviceName());
+                       }
 
             log.info("Instance is successfully starting up. 
"+memberContext.toString());
 
@@ -334,6 +350,25 @@ public class CloudControllerServiceImpl implements 
CloudControllerService {
 
     }
 
+       private void createVolumeAndSetInClusterContext(ClusterContext ctxt,
+                       IaasProvider iaasProvider) {
+
+               Iaas iaas = iaasProvider.getIaas();
+               
+               if(iaas == null) {
+                       try {
+                               iaas = 
CloudControllerUtil.setIaas(iaasProvider);
+                       } catch (InvalidIaasProviderException e) {
+                               String msg = "Iaas could not be loaded from : 
"+iaasProvider;
+                               log.fatal(msg, e);
+                               throw new CloudControllerException(msg, e);
+                       }
+               }
+               int sizeGB = ctxt.getVolumeSize();
+               String volumeId = iaas.createVolume(sizeGB);
+               ctxt.setVolumeId(volumeId);
+       }
+
        private StringBuilder getPersistancePayload(Cartridge cartridge) {
                StringBuilder persistancePayload = new StringBuilder();
                if(isPersistanceMappingAvailable(cartridge)){
@@ -774,6 +809,10 @@ public class CloudControllerServiceImpl implements 
CloudControllerService {
                }
                
            }
+           
+           //detach volumes if any
+           detachVolume(iaasProvider, ctxt);
+           
                // destroy the node
                iaasProvider.getComputeService().destroyNode(nodeId);
 
@@ -789,11 +828,31 @@ public class CloudControllerServiceImpl implements 
CloudControllerService {
                return iaasProvider;
        }
 
+       private void detachVolume(IaasProvider iaasProvider, MemberContext 
ctxt) {
+               try {
+               String clusterId = ctxt.getClusterId();
+               ClusterContext clusterCtxt = 
dataHolder.getClusterContext(clusterId);
+               String volumeId = clusterCtxt.getVolumeId();
+               if(volumeId == null) {
+                       return;
+               }
+               Iaas iaas = iaasProvider.getIaas();
+               iaas.detachVolume(ctxt.getInstanceId(), volumeId);
+               } catch (ResourceNotFoundException ignore) {
+                       if(log.isDebugEnabled()) {
+                               log.debug(ignore);
+                       }
+               }
+       }
+
        private void logTermination(MemberContext memberContext) {
 
         //updating the topology
         
TopologyBuilder.handleMemberTerminated(memberContext.getCartridgeType(), 
memberContext.getClusterId(), memberContext.getNetworkPartitionId(), 
memberContext.getPartition().getId(), memberContext.getMemberId());
 
+        // update data holders
+        dataHolder.removeMemberContext(memberContext.getMemberId(), 
memberContext.getClusterId());
+        
         //publishing data
         CartridgeInstanceDataPublisher.publish(memberContext.getMemberId(),
                                                         
memberContext.getPartition().getId(),
@@ -836,7 +895,20 @@ public class CloudControllerServiceImpl implements 
CloudControllerService {
         String property = props.getProperty(Constants.IS_LOAD_BALANCER);
         boolean isLb = property != null ? Boolean.parseBoolean(property) : 
false;
         
-           dataHolder.addClusterContext(new ClusterContext(clusterId, 
cartridgeType, payload, hostName, isLb));
+        property = props.getProperty(Constants.IS_VOLUME_REQUIRED);
+        boolean isVolumeRequired = property != null ? 
Boolean.parseBoolean(property) : false;
+        
+        property = props.getProperty(Constants.SHOULD_DELETE_VOLUME);
+        boolean shouldDeleteVolume = property != null ? 
Boolean.parseBoolean(property) : false;
+        
+        property = props.getProperty(Constants.VOLUME_SIZE);
+        int volumeSize = property != null ? Integer.parseInt(property) : 8;
+        
+        property = props.getProperty(Constants.DEVICE_NAME);
+        String deviceName = property != null ? property : null;
+        
+           dataHolder.addClusterContext(new ClusterContext(clusterId, 
cartridgeType, payload, 
+                       hostName, isLb, isVolumeRequired, shouldDeleteVolume, 
volumeSize, deviceName));
            TopologyBuilder.handleClusterCreated(registrant, isLb);
            
            persist();
@@ -900,9 +972,21 @@ public class CloudControllerServiceImpl implements 
CloudControllerService {
                         log.error(msg);
                     }
                      log.info("Unregistration of service cluster: " + 
clusterId_);
+                     if(ctxt.shouldDeleteVolume()) {
+                        Cartridge cartridge = 
dataHolder.getCartridge(ctxt.getCartridgeType());
+                        if(cartridge != null && cartridge.getIaases() != null) 
{
+                                for (IaasProvider prov : 
cartridge.getIaases()) {
+                                                               if (prov != 
null) {
+                                                                       Iaas 
iaas = prov.getIaas();
+                                                                       
iaas.deleteVolume(ctxt.getVolumeId());
+                                                               }
+                                                       }
+                                
+                        }
+                     }
                      TopologyBuilder.handleClusterRemoved(ctxt);
                      dataHolder.removeClusterContext(clusterId_);
-                     dataHolder.removeMemberContext(clusterId_);
+                     dataHolder.removeMemberContextsOfCluster(clusterId_);
                      persist();
                  }
             };

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/9adc520f/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/jcloud/ComputeServiceBuilderUtil.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/jcloud/ComputeServiceBuilderUtil.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/jcloud/ComputeServiceBuilderUtil.java
index 0beba42..fc6ec41 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/jcloud/ComputeServiceBuilderUtil.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/jcloud/ComputeServiceBuilderUtil.java
@@ -102,6 +102,17 @@ public class ComputeServiceBuilderUtil {
         return region;
     }
     
+       public static String extractZone(IaasProvider iaas) {
+
+               return 
iaas.getProperty(CloudControllerConstants.AVAILABILITY_ZONE);
+       }
+       
+       public static String extractDevice(IaasProvider iaas, String 
defaultDevice) {
+
+               return iaas.getProperty(CloudControllerConstants.DEVICE) == 
null ? defaultDevice : 
+                       iaas.getProperty(CloudControllerConstants.DEVICE);
+       }
+    
     /** Returns the contents of the file in a byte array
      *
      * @param file

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/9adc520f/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ClusterContext.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ClusterContext.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ClusterContext.java
index 591be5a..7ec4dd3 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ClusterContext.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ClusterContext.java
@@ -36,13 +36,24 @@ public class ClusterContext implements Serializable{
     private String payload;
     private String hostName;
     private boolean isLbCluster;
+    private boolean isVolumeRequired;
+    private boolean shouldDeleteVolume;
+    private int volumeSize;
+    private String deviceName;
+    // optional volume id
+    private String volumeId;
 
-    public ClusterContext(String clusterId, String cartridgeType, String 
payload, String hostName, boolean isLbCluster) {
+    public ClusterContext(String clusterId, String cartridgeType, String 
payload, String hostName, 
+               boolean isLbCluster, boolean isVolumeRequired, boolean 
shouldDeleteVolume, int volumeSize, String deviceName) {
         this.clusterId = clusterId;
         this.cartridgeType = cartridgeType;
         this.payload = payload;
         this.setHostName(hostName);
         this.isLbCluster = isLbCluster;
+        this.isVolumeRequired = isVolumeRequired;
+        this.shouldDeleteVolume = shouldDeleteVolume;
+        this.volumeSize = volumeSize;
+        this.deviceName = deviceName;
     }
     
     public String getClusterId() {
@@ -80,4 +91,44 @@ public class ClusterContext implements Serializable{
                this.isLbCluster = isLbCluster;
        }
 
+       public boolean isVolumeRequired() {
+               return isVolumeRequired;
+       }
+
+       public void setVolumeRequired(boolean isVolumeRequired) {
+               this.isVolumeRequired = isVolumeRequired;
+       }
+
+       public String getVolumeId() {
+               return volumeId;
+       }
+
+       public void setVolumeId(String volumeId) {
+               this.volumeId = volumeId;
+       }
+
+       public boolean shouldDeleteVolume() {
+               return shouldDeleteVolume;
+       }
+
+       public void setShouldDeleteVolume(boolean shouldDeleteVolume) {
+               this.shouldDeleteVolume = shouldDeleteVolume;
+       }
+
+       public int getVolumeSize() {
+               return volumeSize;
+       }
+
+       public void setVolumeSize(int volumeSize) {
+               this.volumeSize = volumeSize;
+       }
+
+       public String getDeviceName() {
+               return deviceName;
+       }
+
+       public void setDeviceName(String deviceName) {
+               this.deviceName = deviceName;
+       }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/9adc520f/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/IaasProvider.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/IaasProvider.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/IaasProvider.java
index 5e6150b..307611d 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/IaasProvider.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/IaasProvider.java
@@ -19,7 +19,9 @@
 package org.apache.stratos.cloud.controller.pojo;
 
 import org.apache.commons.lang.builder.HashCodeBuilder;
+import 
org.apache.stratos.cloud.controller.exception.InvalidIaasProviderException;
 import org.apache.stratos.cloud.controller.interfaces.Iaas;
+import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
 import org.jclouds.compute.ComputeService;
 import org.jclouds.compute.domain.Template;
 
@@ -206,6 +208,13 @@ public class IaasProvider implements Serializable{
     }
 
     public Iaas getIaas() {
+       if (iaas == null) {
+               try {
+                               iaas = CloudControllerUtil.setIaas(this);
+                       } catch (InvalidIaasProviderException e) {
+                               return null;
+                       }
+       }
         return iaas;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/9adc520f/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/MemberContext.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/MemberContext.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/MemberContext.java
index 61c5665..2618bb2 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/MemberContext.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/MemberContext.java
@@ -34,6 +34,8 @@ public class MemberContext implements Serializable{
     private String memberId;
     // corresponding jclouds node id
     private String nodeId;
+    // instance id - derived from nodeId
+    private String instanceId;
     // cluster id of this member
     private String clusterId;
     // partition this member is in.
@@ -190,4 +192,12 @@ public class MemberContext implements Serializable{
                        return false;
                return true;
        }
+
+       public String getInstanceId() {
+               return instanceId;
+       }
+
+       public void setInstanceId(String instanceId) {
+               this.instanceId = instanceId;
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/9adc520f/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
index ec9d057..0c1cb91 100644
--- 
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
@@ -18,6 +18,8 @@
  */
 package org.apache.stratos.cloud.controller.runtime;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.cloud.controller.pojo.*;
 import org.apache.stratos.cloud.controller.registry.RegistryManager;
 import org.apache.stratos.messaging.broker.publish.EventPublisher;
@@ -26,8 +28,10 @@ import 
org.wso2.carbon.databridge.agent.thrift.AsyncDataPublisher;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * This object holds all runtime data and provides faster access. This is a 
Singleton class.
@@ -35,6 +39,8 @@ import java.util.Map;
 public class FasterLookUpDataHolder implements Serializable{
 
     private static final long serialVersionUID = -2662307358852779897L;
+    
+    private static final Log log = 
LogFactory.getLog(FasterLookUpDataHolder.class);
 
        private static volatile FasterLookUpDataHolder ctxt;
 
@@ -44,47 +50,20 @@ public class FasterLookUpDataHolder implements Serializable{
      * Key - cluster id
      * Value - list of {@link MemberContext}
      */
-    private Map<String, List<MemberContext>> clusterIdToMemberContext = new 
HashMap<String, List<MemberContext>>();
+    private Map<String, List<MemberContext>> clusterIdToMemberContext = new 
ConcurrentHashMap<String, List<MemberContext>>();
     
 
     /**
         * Key - member id
         * Value - {@link MemberContext}
         */
-       private Map<String, MemberContext> memberIdToContext = new 
HashMap<String, MemberContext>();
+       private Map<String, MemberContext> memberIdToContext = new 
ConcurrentHashMap<String, MemberContext>();
        
        /**
         * Key - cluster id
         * Value - {@link ClusterContext}
         */
-       private Map<String, ClusterContext> clusterIdToContext = new 
HashMap<String, ClusterContext>();
-       
-       /**
-        * Key - member id
-        * Value - node id
-        */
-//     private Map<String, String> memberIdToNodeId;
-
-       /**
-        * Key - domain
-        * value - {@link ServiceContext}
-        */
-//     private 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;
+       private Map<String, ClusterContext> clusterIdToContext = new 
ConcurrentHashMap<String, ClusterContext>();
        
        /**
         * List of registered {@link Cartridge}s
@@ -104,20 +83,6 @@ public class FasterLookUpDataHolder implements Serializable{
        private transient TopologyConfig topologyConfig;
        
        /**
-        * 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>();
-       
-       /**
-        * Key - iaas type
-        * Value - # of running instance count
-        * This map will be used to track the running instances count in each 
IaaS
-        */
-//     private Map<String, Integer> iaasToActiveInstanceCountMap = new 
HashMap<String, Integer>();
-       
-       /**
      * Key - name of the topic
      * Value - corresponding EventPublisher
      */
@@ -153,90 +118,10 @@ public class FasterLookUpDataHolder implements 
Serializable{
 
        private FasterLookUpDataHolder() {
 
-//             serviceCtxtList = new ArrayList<ServiceContext>();
-//             serviceCtxts = new ConcurrentHashMap<String,ServiceContext>();
-//             nodeIdToServiceCtxt = new LinkedHashMap<String, 
ServiceContext>();
                cartridges = new ArrayList<Cartridge>();
-//             setMemberIdToNodeId(new ConcurrentHashMap<String, String>());
 
        }
 
-//     public void addServiceContext(ServiceContext ctx) {
-//
-//             if (ctx == null) {
-//                     return;
-//             }
-//
-//             String domain = ctx.getClusterId();
-//
-//
-//             if (domain != null) {
-//                     addToServiceCtxts(domain, ctx);
-//             }
-//
-//     }
-//
-//     public void removeServiceContext(ServiceContext ctxt) {
-//
-//             if (ctxt == null) {
-//                     return;
-//             }
-//
-//             String domain = ctxt.getClusterId();
-//
-//             if (domain != null) {
-//                     if (serviceCtxts.containsKey(domain)) {
-//                serviceCtxts.remove(ctxt);
-//                     }
-//             }
-//             
-//             serviceCtxtList.remove(ctxt);
-//
-//     }
-//
-//     public ServiceContext getServiceContextFromDomain(String domain) {
-//
-//             if (serviceCtxts.get(domain) != null) {
-//                     return serviceCtxts.get(domain);
-//             }
-//             return null;
-//     }
-//
-//     public ServiceContext getServiceContextFromNodeId(String nodeId) {
-//
-//             return nodeIdToServiceCtxt.get(nodeId);
-//     }
-//     
-//     public List<Object> getNodeIdsOfServiceCtxt(ServiceContext ctxt){
-//             return 
CloudControllerUtil.getKeysFromValue(nodeIdToServiceCtxt, ctxt);
-//     }
-//
-//     public 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, ServiceContext ctxt) {
-//        serviceCtxts.put(domainName, ctxt);
-//        serviceCtxtList.add(ctxt);
-//
-//     }
-
        public List<Cartridge> getCartridges() {
                return cartridges;
        }
@@ -256,36 +141,6 @@ public class FasterLookUpDataHolder implements 
Serializable{
 
        }
        
-//     public void updateActiveInstanceCount(String iaasType, int count) {
-//             int currentCount = 0;
-//             if(iaasToActiveInstanceCountMap.containsKey(iaasType)){
-//                     currentCount = 
iaasToActiveInstanceCountMap.get(iaasType);
-//             }
-//             iaasToActiveInstanceCountMap.put(iaasType, currentCount+count);
-//     }
-//     
-//     public int getActiveInstanceCount(String iaasType) {
-//             Integer count = iaasToActiveInstanceCountMap.get(iaasType);
-//             return count == null ? 0 : count;
-//     }
-
-//     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);
@@ -327,16 +182,6 @@ public class FasterLookUpDataHolder implements 
Serializable{
                this.serializationDir = serializationDir;
        }
 
-       
-
-//     public Map<String, String> getNodeIdToStatusMap() {
-//             return nodeIdToStatusMap;
-//     }
-//
-//     public void setNodeIdToStatusMap(Map<String, String> nodeIdToStatusMap) 
{
-//             this.nodeIdToStatusMap = nodeIdToStatusMap;
-//     }
-
        public AsyncDataPublisher getDataPublisher() {
                return dataPublisher;
        }
@@ -361,8 +206,6 @@ public class FasterLookUpDataHolder implements Serializable{
                this.enableBAMDataPublisher = enableBAMDataPublisher;
        }
 
-       
-
        public boolean isPublisherRunning() {
                return isPublisherRunning;
        }
@@ -428,9 +271,13 @@ public class FasterLookUpDataHolder implements 
Serializable{
         }
         ctxts.add(ctxt);
         clusterIdToMemberContext.put(ctxt.getClusterId(), ctxts);
+        if(log.isDebugEnabled()) {
+               
+               log.debug("Added Member Context to the information model. 
"+ctxt);
+        }
     }
     
-    public void removeMemberContext(String clusterId) {
+    public void removeMemberContextsOfCluster(String clusterId) {
         List<MemberContext> ctxts = clusterIdToMemberContext.remove(clusterId);
         if(ctxts == null) {
             return;
@@ -439,6 +286,33 @@ public class FasterLookUpDataHolder implements 
Serializable{
             String memberId = memberContext.getMemberId();
             memberIdToContext.remove(memberId);
         }
+        if(log.isDebugEnabled()) {
+               
+               log.debug("Removed Member Context from the information model. 
"+ctxt);
+        }
+    }
+    
+    public void removeMemberContext(String memberId, String clusterId) {
+       memberIdToContext.remove(memberId);
+        List<MemberContext> ctxts = clusterIdToMemberContext.get(clusterId);
+        if(ctxts == null) {
+            return;
+        }
+        
+        List<MemberContext> newCtxts =  new ArrayList<MemberContext>(ctxts);
+        
+        for (Iterator<MemberContext> iterator = newCtxts.iterator(); 
iterator.hasNext();) {
+                       MemberContext memberContext = (MemberContext) 
iterator.next();
+                       if(memberId.equals(memberContext.getMemberId())) {
+                               if(log.isDebugEnabled()) {
+                                       
+                                       log.debug("MemberContext [id]: 
"+memberId+" removed from information model.");
+                               }
+               iterator.remove();
+            }
+               }
+        
+        clusterIdToMemberContext.put(clusterId, newCtxts);
     }
     
     public MemberContext getMemberContextOfMemberId(String memberId) {
@@ -456,21 +330,6 @@ public class FasterLookUpDataHolder implements 
Serializable{
     public void setClusterIdToMemberContext(Map<String, List<MemberContext>> 
clusterIdToMemberContext) {
         this.clusterIdToMemberContext = clusterIdToMemberContext;
     }
-//    public void addNodeId(String memberId, String nodeId) {
-//        memberIdToNodeId.put(memberId, nodeId);
-//    }
-//    
-//    public String getNodeId(String memberId) {
-//        return memberIdToNodeId.get(memberId);
-//    }
-//    
-//    public Map<String, String> getMemberIdToNodeId() {
-//        return memberIdToNodeId;
-//    }
-//
-//    public void setMemberIdToNodeId(Map<String, String> memberIdToNodeId) {
-//        this.memberIdToNodeId = memberIdToNodeId;
-//    }
 
     public Map<String, MemberContext> getMemberIdToContext() {
         return memberIdToContext;

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/9adc520f/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java
index 510f87b..0da9449 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java
@@ -147,6 +147,7 @@ public class TopologyBuilder {
     public static void handleClusterRemoved(ClusterContext ctxt) {
         Topology topology = TopologyManager.getTopology();
         Service service = topology.getService(ctxt.getCartridgeType());
+        String deploymentPolicy;
         if (service == null) {
             throw new RuntimeException(String.format("Service %s does not 
exist",
                     ctxt.getCartridgeType()));
@@ -160,12 +161,13 @@ public class TopologyBuilder {
 
         try {
             TopologyManager.acquireWriteLock();
-            service.removeCluster(ctxt.getClusterId());
+            Cluster cluster = service.removeCluster(ctxt.getClusterId());
+            deploymentPolicy = cluster.getDeploymentPolicyName();
             TopologyManager.updateTopology(topology);
         } finally {
             TopologyManager.releaseWriteLock();
         }
-        TopologyEventPublisher.sendClusterRemovedEvent(ctxt);
+        TopologyEventPublisher.sendClusterRemovedEvent(ctxt, deploymentPolicy);
     }
 
     public static void handleMemberSpawned(String memberId, String 
serviceName, String clusterId,

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/9adc520f/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
index 0209fe3..6ff3f75 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
@@ -84,9 +84,9 @@ public class TopologyEventPublisher {
 
     }
 
-    public static void sendClusterRemovedEvent(ClusterContext ctxt) {
+    public static void sendClusterRemovedEvent(ClusterContext ctxt, String 
deploymentPolicy) {
 
-        ClusterRemovedEvent clusterRemovedEvent = new 
ClusterRemovedEvent(ctxt.getCartridgeType(), ctxt.getClusterId(), 
ctxt.isLbCluster());
+        ClusterRemovedEvent clusterRemovedEvent = new 
ClusterRemovedEvent(ctxt.getCartridgeType(), ctxt.getClusterId(), 
deploymentPolicy, ctxt.isLbCluster());
 
         if(log.isInfoEnabled()) {
             log.info(String.format("Publishing cluster removed event: 
[service] %s [cluster] %s", ctxt.getCartridgeType(), ctxt.getClusterId()));

Reply via email to