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()));
