Repository: stratos Updated Branches: refs/heads/4.0.0-grouping b2a254895 -> 0434c2ffd
refactoring App definition parsing logic - part 1 Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/0434c2ff Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/0434c2ff Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/0434c2ff Branch: refs/heads/4.0.0-grouping Commit: 0434c2ffd39238a79cdd9ad735d84d8310cba9f6 Parents: b2a2548 Author: Isuru Haththotuwa <[email protected]> Authored: Wed Sep 24 01:09:15 2014 +0530 Committer: Isuru Haththotuwa <[email protected]> Committed: Wed Sep 24 01:09:15 2014 +0530 ---------------------------------------------------------------------- .../application/ApplicationUtils.java | 31 +- .../parser/DefaultApplicationParser.java | 363 +++++++++++-------- .../impl/CloudControllerServiceImpl.java | 18 +- .../interfaces/ApplicationParser.java | 11 +- .../internal/CloudControllerDSComponent.java | 2 + .../pojo/ApplicationClusterContext.java | 116 ++++++ .../controller/pojo/ApplicationDataHolder.java | 12 +- .../controller/pojo/ClusterDataHolder.java | 122 +++---- .../controller/pojo/payload/MetaDataHolder.java | 93 +++++ .../pojo/payload/PayloadDataHolder.java | 93 ----- .../controller/topology/TopologyBuilder.java | 36 +- 11 files changed, 545 insertions(+), 352 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/ApplicationUtils.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/ApplicationUtils.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/ApplicationUtils.java index 43f9786..ce9b112 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/ApplicationUtils.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/ApplicationUtils.java @@ -23,8 +23,7 @@ import org.apache.stratos.cloud.controller.pojo.Cartridge; import org.apache.stratos.cloud.controller.pojo.PortMapping; import org.apache.stratos.cloud.controller.pojo.application.SubscribableContext; import org.apache.stratos.cloud.controller.pojo.application.SubscribableInfoContext; -import org.apache.stratos.cloud.controller.pojo.payload.PayloadDataHolder; -import org.apache.stratos.messaging.domain.topology.Cluster; +import org.apache.stratos.cloud.controller.pojo.payload.MetaDataHolder; import org.apache.stratos.metadata.client.config.MetaDataClientConfig; import java.util.*; @@ -69,13 +68,13 @@ public class ApplicationUtils { return globalProperties; } - public static PayloadDataHolder getClusterLevelPayloadData (String appId, String groupName, int tenantId, String key, - Cluster cluster, + public static MetaDataHolder getClusterLevelPayloadData (String appId, String groupName, int tenantId, String key, + String hostname, String tenantRange, String clusterId, SubscribableContext subscribableCtxt, SubscribableInfoContext subscribableInfoCtxt, Cartridge cartridge) { - PayloadDataHolder payloadDataHolder = new PayloadDataHolder(appId, subscribableCtxt.getType(), cluster.getClusterId()); + MetaDataHolder metaDataHolder = new MetaDataHolder(appId, subscribableCtxt.getType(), clusterId); Properties clusterLevelPayloadProperties = new Properties(); // app id @@ -89,22 +88,22 @@ public class ApplicationUtils { clusterLevelPayloadProperties.put("SERVICE_NAME", subscribableCtxt.getType()); } // host name - if (cluster.getHostNames().get(0) != null) { - clusterLevelPayloadProperties.put("HOST_NAME", cluster.getHostNames().get(0)); + if (hostname != null) { + clusterLevelPayloadProperties.put("HOST_NAME", hostname); } // multi tenant clusterLevelPayloadProperties.put("MULTITENANT", String.valueOf(cartridge.isMultiTenant())); // tenant range - if (cluster.getTenantRange() != null) { - clusterLevelPayloadProperties.put("TENANT_RANGE", cluster.getTenantRange()); + if (tenantRange != null) { + clusterLevelPayloadProperties.put("TENANT_RANGE", tenantRange); } // cartridge alias if (subscribableCtxt.getAlias() != null) { clusterLevelPayloadProperties.put("CARTRIDGE_ALIAS", subscribableCtxt.getAlias()); } // cluster id - if (cluster.getClusterId() != null) { - clusterLevelPayloadProperties.put("CLUSTER_ID", cluster.getClusterId()); + if (clusterId != null) { + clusterLevelPayloadProperties.put("CLUSTER_ID", clusterId); } // repo url if (subscribableInfoCtxt.getRepoUrl() != null) { @@ -125,8 +124,8 @@ public class ApplicationUtils { // get global payload params clusterLevelPayloadProperties.putAll(ApplicationUtils.getGlobalPayloadData()); - payloadDataHolder.setProperties(clusterLevelPayloadProperties); - return payloadDataHolder; + metaDataHolder.setProperties(clusterLevelPayloadProperties); + return metaDataHolder; } private static String createPortMappingPayloadString (Cartridge cartridge) { @@ -156,9 +155,11 @@ public class ApplicationUtils { payloadBuilder.append("CLUSTER_ID=" + clusterId); // meta data endpoint if (MetaDataClientConfig.getInstance().getMetaDataServiceBaseUrl() != null) { - payloadBuilder.append(","); - payloadBuilder.append("METADATA_ENDPOINT=" + MetaDataClientConfig.getInstance().getMetaDataServiceBaseUrl()); + // TODO + //payloadBuilder.append(","); + //payloadBuilder.append("METADATA_ENDPOINT=" + MetaDataClientConfig.getInstance().getMetaDataServiceBaseUrl()); } + payloadBuilder.append(","); return payloadBuilder; } http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/parser/DefaultApplicationParser.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/parser/DefaultApplicationParser.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/parser/DefaultApplicationParser.java index a693942..341f42a 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/parser/DefaultApplicationParser.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/parser/DefaultApplicationParser.java @@ -26,30 +26,35 @@ import org.apache.stratos.cloud.controller.application.ClusterInformation; import org.apache.stratos.cloud.controller.application.MTClusterInformation; import org.apache.stratos.cloud.controller.application.STClusterInformation; import org.apache.stratos.cloud.controller.exception.ApplicationDefinitionException; -import org.apache.stratos.cloud.controller.exception.CloudControllerException; import org.apache.stratos.cloud.controller.interfaces.ApplicationParser; import org.apache.stratos.cloud.controller.pojo.*; import org.apache.stratos.cloud.controller.pojo.Cartridge; import org.apache.stratos.cloud.controller.pojo.application.*; -import org.apache.stratos.cloud.controller.pojo.payload.PayloadDataHolder; -import org.apache.stratos.cloud.controller.registry.RegistryManager; +import org.apache.stratos.cloud.controller.pojo.payload.MetaDataHolder; import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder; import org.apache.stratos.messaging.domain.topology.*; import org.apache.stratos.messaging.domain.topology.StartupOrder; -import org.apache.stratos.messaging.util.Constants; -import org.wso2.carbon.registry.core.exceptions.RegistryException; import java.util.*; -import java.util.Properties; public class DefaultApplicationParser implements ApplicationParser { private static Log log = LogFactory.getLog(DefaultApplicationParser.class); - private static FasterLookUpDataHolder dataHolder = FasterLookUpDataHolder.getInstance(); +// private static FasterLookUpDataHolder dataHolder = FasterLookUpDataHolder.getInstance(); + + private Set<ApplicationClusterContext> applicationClusterContexts; + + private Set<MetaDataHolder> metaDataHolders; + + public DefaultApplicationParser () { + + this.applicationClusterContexts = new HashSet<ApplicationClusterContext>(); + this.metaDataHolders = new HashSet<MetaDataHolder>(); + } @Override - public ApplicationDataHolder parse(Object obj) throws ApplicationDefinitionException { + public Application parse(Object obj) throws ApplicationDefinitionException { ApplicationContext applicationCtxt = null; @@ -99,6 +104,16 @@ public class DefaultApplicationParser implements ApplicationParser { return buildCompositeAppStructure (applicationCtxt, definedGroups, subscribablesInfo); } + @Override + public Set<ApplicationClusterContext> getApplicationClusterContexts() throws ApplicationDefinitionException { + return applicationClusterContexts; + } + + @Override + public Set<MetaDataHolder> getPayloadData() throws ApplicationDefinitionException { + return metaDataHolders; + } + private Map<String, GroupContext> getDefinedGroups (ApplicationContext appCtxt) throws ApplicationDefinitionException { @@ -180,7 +195,7 @@ public class DefaultApplicationParser implements ApplicationParser { return FasterLookUpDataHolder.getInstance().getServiceGroup(serviceGroupName) != null; } - private ApplicationDataHolder buildCompositeAppStructure (ApplicationContext appCtxt, + private Application buildCompositeAppStructure (ApplicationContext appCtxt, Map<String, GroupContext> definedGroupCtxts, Map<String, SubscribableInfoContext> subscribableInfoCtxts) throws ApplicationDefinitionException { @@ -194,24 +209,24 @@ public class DefaultApplicationParser implements ApplicationParser { // following keeps track of all Clusters created for this application //Set<Cluster> clusters = new HashSet<Cluster>(); - ClusterDataHolder clusterDataHolder = null; + //ClusterDataHolder clusterDataHolder = null; + Map<String, Set<String>> serviceNameToClusterIds; if (appCtxt.getComponents() != null) { // get top level Subscribables if (appCtxt.getComponents().getSubscribableContexts() != null) { - clusterDataHolder = getClusterInformation(appCtxt.getApplicationId(), appCtxt.getTenantId(), + serviceNameToClusterIds = parseLeafLevelSubscriptions(appCtxt.getApplicationId(), appCtxt.getTenantId(), application.getKey(), null, Arrays.asList(appCtxt.getComponents().getSubscribableContexts()), subscribableInfoCtxts); - application.setClusterIds(clusterDataHolder.getClusterIdMap()); - //clusters.addAll(clusterDataHolder.getClusters()); + application.setClusterIds(serviceNameToClusterIds); + //clusters.addAll(clusterDataHolder.getApplicationClusterContexts()); } // get Groups if (appCtxt.getComponents().getGroupContexts() != null) { - application.setGroups(getGroupInfo(appCtxt.getApplicationId(), appCtxt.getTenantId(), - application.getKey(), clusterDataHolder, - Arrays.asList(appCtxt.getComponents().getGroupContexts()), subscribableInfoCtxts, - definedGroupCtxts)); + application.setGroups(parseGroups(appCtxt.getApplicationId(), appCtxt.getTenantId(), + application.getKey(), Arrays.asList(appCtxt.getComponents().getGroupContexts()), + subscribableInfoCtxts, definedGroupCtxts)); } // get top level Dependency definitions @@ -230,41 +245,38 @@ public class DefaultApplicationParser implements ApplicationParser { log.info("Application with id " + appCtxt.getApplicationId() + " parsed successfully"); - ApplicationDataHolder applicationDataHolder = new ApplicationDataHolder(); - assert clusterDataHolder != null; - applicationDataHolder.setClusters(clusterDataHolder.getClusters()); - applicationDataHolder.setPayloadDataHolders(clusterDataHolder.getPayloadDataHolders()); - applicationDataHolder.setApplication(application); + return application; + + //ApplicationDataHolder applicationDataHolder = new ApplicationDataHolder(); + //assert clusterDataHolder != null; + //applicationDataHolder.setClusters(clusterDataHolder.getApplicationClusterContexts()); + //applicationDataHolder.setPayloadDataHolders(clusterDataHolder.getPayloadDataHolders()); + //applicationDataHolder.setApplication(application); // persist the information in FasterLookUpDataHolder - persist(dataHolder); + //persist(dataHolder); - return applicationDataHolder; + //return applicationDataHolder; } - private Map<String, Group> getGroupInfo (String appId, int tenantId, String key, - ClusterDataHolder clusterDataHolder, List<GroupContext> groupCtxts, - Map<String, SubscribableInfoContext> subscribableInformation, - Map<String, GroupContext> definedGroupCtxts) + private Map<String, Group> parseGroups (String appId, int tenantId, String key, List<GroupContext> groupCtxts, + Map<String, SubscribableInfoContext> subscribableInformation, + Map<String, GroupContext> definedGroupCtxts) throws ApplicationDefinitionException { - Map<String, Group> groupNameToGroup = new HashMap<String, Group>(); + Map<String, Group> groupAliasToGroup = new HashMap<String, Group>(); for (GroupContext groupCtxt : groupCtxts) { - Group group = getGroup(appId, tenantId, key, clusterDataHolder, groupCtxt, subscribableInformation, definedGroupCtxts); - groupNameToGroup.put(group.getName(), group); -// if(groupNameToGroup.put(group.getName(), group) != null) { -// // Application Definition has same Group multiple times at the top-level -// handleError("Group [ " + group.getName() + " ] appears twice in the Application Definition's top level"); -// } + Group group = parseGroup(appId, tenantId, key, groupCtxt, subscribableInformation, definedGroupCtxts); + groupAliasToGroup.put(group.getAlias(), group); } - //Set<GroupContext> topLevelGroupContexts = getTopLevelGroupContexts(groupNameToGroup); + //Set<GroupContext> topLevelGroupContexts = getTopLevelGroupContexts(groupAliasToGroup); Set<Group> nestedGroups = new HashSet<Group>(); - getNestedGroupContexts(nestedGroups, groupNameToGroup.values()); - filterDuplicatedGroupContexts(groupNameToGroup.values(), nestedGroups); + getNestedGroupContexts(nestedGroups, groupAliasToGroup.values()); + filterDuplicatedGroupContexts(groupAliasToGroup.values(), nestedGroups); - return groupNameToGroup; + return groupAliasToGroup; } private void getNestedGroupContexts (Set<Group> nestedGroups, Collection<Group> groups) { @@ -299,9 +311,9 @@ public class DefaultApplicationParser implements ApplicationParser { } } - private Group getGroup(String appId, int tenantId, String key, ClusterDataHolder clusterDataHolder, - GroupContext groupCtxt, Map<String,SubscribableInfoContext> subscribableInfoCtxts, - Map<String, GroupContext> definedGroupCtxts) + private Group parseGroup (String appId, int tenantId, String key, GroupContext groupCtxt, + Map<String, SubscribableInfoContext> subscribableInfoCtxts, + Map<String, GroupContext> definedGroupCtxts) throws ApplicationDefinitionException { // check if are in the defined Group set @@ -324,21 +336,22 @@ public class DefaultApplicationParser implements ApplicationParser { dependencyOrder.setKillbehavior(getKillbehaviour(groupCtxt.getName())); group.setDependencyOrder(dependencyOrder); - ClusterDataHolder clusterDataHolderOfGroup; + //ClusterDataHolder clusterDataHolderOfGroup; + Map<String, Set<String>> serviceNameToClusterIds; // get group level Subscribables if (groupCtxt.getSubscribableContexts() != null) { - clusterDataHolderOfGroup = getClusterInformation(appId, tenantId, key, groupCtxt.getName(), + serviceNameToClusterIds = parseLeafLevelSubscriptions(appId, tenantId, key, groupCtxt.getName(), Arrays.asList(groupCtxt.getSubscribableContexts()), subscribableInfoCtxts); - group.setClusterIds(clusterDataHolderOfGroup.getClusterIdMap()); - //clusters.addAll(clusterDataHolderOfGroup.getClusters()); - if (clusterDataHolder == null) { - clusterDataHolder = clusterDataHolderOfGroup; - } else { - clusterDataHolder.getClusters().addAll(clusterDataHolderOfGroup.getClusters()); - clusterDataHolder.getClusterIdMap().putAll(clusterDataHolderOfGroup.getClusterIdMap()); - clusterDataHolder.getPayloadDataHolders().addAll(clusterDataHolderOfGroup.getPayloadDataHolders()); - } + group.setClusterIds(serviceNameToClusterIds); + //clusters.addAll(clusterDataHolderOfGroup.getApplicationClusterContexts()); +// if (clusterDataHolder == null) { +// clusterDataHolder = clusterDataHolderOfGroup; +// } else { +// clusterDataHolder.getApplicationClusterContexts().addAll(clusterDataHolderOfGroup.getApplicationClusterContexts()); +// clusterDataHolder.getClusterIdMap().putAll(clusterDataHolderOfGroup.getClusterIdMap()); +// //clusterDataHolder.getPayloadDataHolders().addAll(clusterDataHolderOfGroup.getPayloadDataHolders()); +// } } // get nested groups @@ -348,7 +361,7 @@ public class DefaultApplicationParser implements ApplicationParser { for (GroupContext subGroupCtxt : groupCtxt.getGroupContexts()) { // get the complete Group Definition subGroupCtxt = definedGroupCtxts.get(subGroupCtxt.getAlias()); - Group nestedGroup = getGroup(appId, tenantId, key, clusterDataHolder, subGroupCtxt, + Group nestedGroup = parseGroup(appId, tenantId, key, subGroupCtxt, subscribableInfoCtxts, definedGroupCtxts); nestedGroups.put(nestedGroup.getName(), nestedGroup); @@ -443,16 +456,17 @@ public class DefaultApplicationParser implements ApplicationParser { // return subscribableContexts; // } - private ClusterDataHolder getClusterInformation (String appId, int tenantId, String key, String groupName, - List<SubscribableContext> subscribableCtxts, - Map<String, SubscribableInfoContext> subscribableInfoCtxts) + private Map<String, Set<String>> parseLeafLevelSubscriptions (String appId, int tenantId, String key, String groupName, + List<SubscribableContext> subscribableCtxts, + Map<String, SubscribableInfoContext> subscribableInfoCtxts) throws ApplicationDefinitionException { Map<String, Set<String>> clusterIdMap = new HashMap<String, Set<String>>(); - Set<Cluster> clusters = new HashSet<Cluster>(); - Set<PayloadDataHolder> payloadDataHolders = new HashSet<PayloadDataHolder>(); +// Set<Cluster> clusters = new HashSet<Cluster>(); + //Set<PayloadDataHolder> payloadDataHolders = new HashSet<PayloadDataHolder>(); for (SubscribableContext subscribableCtxt : subscribableCtxts) { + // check is there is a related Subscribable Information SubscribableInfoContext subscribableInfoCtxt = subscribableInfoCtxts.get(subscribableCtxt.getAlias()); if (subscribableInfoCtxt == null) { @@ -473,25 +487,56 @@ public class DefaultApplicationParser implements ApplicationParser { " ] for Composite Application"); } - Cluster cluster = getCluster(subscribableCtxt, subscribableInfoCtxt, cartridge); - addClusterId(clusterIdMap, subscribableCtxt.getType(), cluster.getClusterId()); + // get hostname and cluster id + ClusterInformation clusterInfo; + assert cartridge != null; + if (cartridge.isMultiTenant()) { + clusterInfo = new MTClusterInformation(); + } else { + clusterInfo = new STClusterInformation(); + } + + String hostname = clusterInfo.getHostName(subscribableCtxt.getAlias(), cartridge.getHostName()); + String clusterId = clusterInfo.getClusterId(subscribableCtxt.getAlias(), subscribableCtxt.getType()); + + // create and collect this cluster's information + assert subscribableInfoCtxt != null; + ApplicationClusterContext appClusterCtxt = createApplicationClusterContext(subscribableCtxt.getType(), + appId, groupName, clusterId, hostname, subscribableInfoCtxt.getDeploymentPolicy(), false); + this.applicationClusterContexts.add(appClusterCtxt); + + // create cluster level meta data + this.metaDataHolders.add(ApplicationUtils.getClusterLevelPayloadData(appId, groupName, tenantId, key, + hostname, appClusterCtxt.getTenantRange(), clusterId, subscribableCtxt, subscribableInfoCtxt, cartridge)); + //////////// + //Cluster cluster = getCluster(subscribableCtxt, subscribableInfoCtxt, cartridge); + addClusterId(clusterIdMap, subscribableCtxt.getType(), clusterId); //clusterIdMap.put(subscribableCtxt.getType(), cluster.getClusterId()); - clusters.add(cluster); + //clusters.add(cluster); // if (clusterIdMap.put(subscribableCtxt.getType(), cluster.getClusterId()) != null) { // // Application Definition has same cartridge multiple times at the top-level // handleError("Cartridge [ " + subscribableCtxt.getType() + " ] appears twice in the Application Definition's top level"); // } + /////////////// - payloadDataHolders.add(ApplicationUtils.getClusterLevelPayloadData(appId, groupName, tenantId, key, cluster, - subscribableCtxt, subscribableInfoCtxt, cartridge)); - createClusterContext(appId, groupName, subscribableCtxt.getType(), cluster.getClusterId(), - cluster.getHostNames().get(0)); +// createClusterContext(appId, groupName, subscribableCtxt.getType(), cluster.getClusterId(), +// cluster.getHostNames().get(0)); } - ClusterDataHolder clusterDataHolder = new ClusterDataHolder(clusterIdMap, clusters); - clusterDataHolder.setPayloadDataHolders(payloadDataHolders); + return clusterIdMap; + //return new ClusterDataHolder(clusterIdMap, clusters); + //clusterDataHolder.setPayloadDataHolders(payloadDataHolders); + } + + private ApplicationClusterContext createApplicationClusterContext (String serviceType, String appId, + String groupName, String clusterId, + String hostname, String deploymentPolicy, + boolean isLB) { - return clusterDataHolder; + // Create text payload + String textPayload = ApplicationUtils.getTextPayload(appId, groupName, clusterId).toString(); + + return new ApplicationClusterContext(serviceType, clusterId, hostname, textPayload, deploymentPolicy, isLB); } public void addClusterId (Map<String, Set<String>> serviceNameToClusterIdsMap, String serviceName, String clusterId) { @@ -507,95 +552,95 @@ public class DefaultApplicationParser implements ApplicationParser { } } - private void createClusterContext (String appId, String groupName, String serviceType, String clusterId, - String hostName) throws ApplicationDefinitionException { - - Cartridge cartridge; - if ((cartridge = dataHolder.getCartridge(serviceType)) == null) { - - String msg = "Unregistered Cartridge type: " + serviceType; - log.error(msg); - throw new ApplicationDefinitionException(msg); - } - - //Properties props = CloudControllerUtil.toJavaUtilProperties(registrant.getProperties()); - //String property = props.getProperty(Constants.IS_LOAD_BALANCER); - //boolean isLb = property != null ? Boolean.parseBoolean(property) : false; - String payload = ApplicationUtils.getTextPayload(appId, groupName, clusterId).toString(); - - ClusterContext ctxt = buildClusterContext(cartridge, clusterId, - payload, hostName, null, false, null); - - dataHolder.addClusterContext(ctxt); - } - - private void persist(FasterLookUpDataHolder dataHolder) { - try { - RegistryManager.getInstance().persist( - dataHolder); - } catch (RegistryException e) { - - String msg = "Failed to persist the Cloud Controller data in registry. Further, transaction roll back also failed."; - log.fatal(msg); - throw new CloudControllerException(msg, e); - } - } - - private ClusterContext buildClusterContext(Cartridge cartridge, - String clusterId, String payload, String hostName, - Properties props, boolean isLb, Persistence persistence) { - - - // initialize ClusterContext - ClusterContext ctxt = new ClusterContext(clusterId, cartridge.getType(), payload, - hostName, isLb); - - String property = null; - if (props != null) { - property = props.getProperty(Constants.GRACEFUL_SHUTDOWN_TIMEOUT); - } - - long timeout = property != null ? Long.parseLong(property) : 30000; - - boolean persistanceRequired = false; - if(persistence != null){ - persistanceRequired = persistence.isPersistanceRequired(); - } - - if(persistanceRequired){ - ctxt.setVolumes(persistence.getVolumes()); - ctxt.setVolumeRequired(true); - }else{ - ctxt.setVolumeRequired(false); - } - ctxt.setTimeoutInMillis(timeout); - return ctxt; - } - - private Cluster getCluster (SubscribableContext subscribableCtxt, SubscribableInfoContext subscribableInfoCtxt, Cartridge cartridge) - - throws ApplicationDefinitionException { - - // get hostname and cluster id - ClusterInformation clusterInfo; - if (cartridge.isMultiTenant()) { - clusterInfo = new MTClusterInformation(); - } else { - clusterInfo = new STClusterInformation(); - } - - String hostname = clusterInfo.getHostName(subscribableCtxt.getAlias(), cartridge.getHostName()); - String clusterId = clusterInfo.getClusterId(subscribableCtxt.getAlias(), subscribableCtxt.getType()); - - Cluster cluster = new Cluster(subscribableCtxt.getType(), clusterId, subscribableInfoCtxt.getDeploymentPolicy(), - subscribableInfoCtxt.getAutoscalingPolicy()); - - cluster.addHostName(hostname); - cluster.setLbCluster(false); - cluster.setStatus(Status.Created); - - return cluster; - } +// private void createClusterContext (String appId, String groupName, String serviceType, String clusterId, +// String hostName) throws ApplicationDefinitionException { +// +// Cartridge cartridge; +// if ((cartridge = dataHolder.getCartridge(serviceType)) == null) { +// +// String msg = "Unregistered Cartridge type: " + serviceType; +// log.error(msg); +// throw new ApplicationDefinitionException(msg); +// } +// +// //Properties props = CloudControllerUtil.toJavaUtilProperties(registrant.getProperties()); +// //String property = props.getProperty(Constants.IS_LOAD_BALANCER); +// //boolean isLb = property != null ? Boolean.parseBoolean(property) : false; +// String payload = ApplicationUtils.getTextPayload(appId, groupName, clusterId).toString(); +// +// ClusterContext ctxt = buildClusterContext(cartridge, clusterId, +// payload, hostName, null, false, null); +// +// dataHolder.addClusterContext(ctxt); +// } +// +// private void persist(FasterLookUpDataHolder dataHolder) { +// try { +// RegistryManager.getInstance().persist( +// dataHolder); +// } catch (RegistryException e) { +// +// String msg = "Failed to persist the Cloud Controller data in registry. Further, transaction roll back also failed."; +// log.fatal(msg); +// throw new CloudControllerException(msg, e); +// } +// } +// +// private ClusterContext buildClusterContext(Cartridge cartridge, +// String clusterId, String payload, String hostName, +// Properties props, boolean isLb, Persistence persistence) { +// +// +// // initialize ClusterContext +// ClusterContext ctxt = new ClusterContext(clusterId, cartridge.getType(), payload, +// hostName, isLb); +// +// String property = null; +// if (props != null) { +// property = props.getProperty(Constants.GRACEFUL_SHUTDOWN_TIMEOUT); +// } +// +// long timeout = property != null ? Long.parseLong(property) : 30000; +// +// boolean persistanceRequired = false; +// if(persistence != null){ +// persistanceRequired = persistence.isPersistanceRequired(); +// } +// +// if(persistanceRequired){ +// ctxt.setVolumes(persistence.getVolumes()); +// ctxt.setVolumeRequired(true); +// }else{ +// ctxt.setVolumeRequired(false); +// } +// ctxt.setTimeoutInMillis(timeout); +// return ctxt; +// } +// +// private Cluster getCluster (SubscribableContext subscribableCtxt, SubscribableInfoContext subscribableInfoCtxt, Cartridge cartridge) +// +// throws ApplicationDefinitionException { +// +// // get hostname and cluster id +// ClusterInformation clusterInfo; +// if (cartridge.isMultiTenant()) { +// clusterInfo = new MTClusterInformation(); +// } else { +// clusterInfo = new STClusterInformation(); +// } +// +// String hostname = clusterInfo.getHostName(subscribableCtxt.getAlias(), cartridge.getHostName()); +// String clusterId = clusterInfo.getClusterId(subscribableCtxt.getAlias(), subscribableCtxt.getType()); +// +// Cluster cluster = new Cluster(subscribableCtxt.getType(), clusterId, subscribableInfoCtxt.getDeploymentPolicy(), +// subscribableInfoCtxt.getAutoscalingPolicy()); +// Clo +// cluster.addHostName(hostname); +// cluster.setLbCluster(false); +// cluster.setStatus(Status.Created); +// +// return cluster; +// } // private GroupDataHolder getGroupInformation (List<GroupContext> groupCtxts, // Map<String, SubscribableInfoContext> subscribableInformation, @@ -605,7 +650,7 @@ public class DefaultApplicationParser implements ApplicationParser { // Set<GroupContext> groupContexts = new HashSet<GroupContext>(); // // for (GroupContext groupCtxt : groupCtxts) { -// groupContexts.add(getGroup(groupCtxt, subscribableInformation, definedGroupCtxts)); +// groupContexts.add(parseGroup(groupCtxt, subscribableInformation, definedGroupCtxts)); // } // // //Set<GroupContext> topLevelGroupContexts = getTopLevelGroupContexts(groupContexts); http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/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 f0971c3..6f72e63 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 @@ -43,6 +43,7 @@ import org.apache.stratos.cloud.controller.topology.TopologyManager; import org.apache.stratos.cloud.controller.util.CloudControllerConstants; import org.apache.stratos.cloud.controller.util.CloudControllerUtil; import org.apache.stratos.cloud.controller.validate.interfaces.PartitionValidator; +import org.apache.stratos.messaging.domain.topology.Application; import org.apache.stratos.messaging.domain.topology.ConfigCompositeApplication; import org.apache.stratos.messaging.domain.topology.Member; import org.apache.stratos.messaging.domain.topology.MemberStatus; @@ -1427,12 +1428,21 @@ public class CloudControllerServiceImpl implements CloudControllerService { public void deployApplicationDefinition (ApplicationContext applicationContext) throws ApplicationDefinitionException { ApplicationParser applicationParser = new DefaultApplicationParser(); - ApplicationDataHolder applicationDataHolder = applicationParser.parse(applicationContext); + Application application = applicationParser.parse(applicationContext); - //TODO: publish the data to the meta data service - applicationDataHolder.getPayloadDataHolders(); + for (ApplicationClusterContext applicationClusterContext : applicationParser.getApplicationClusterContexts()) { + dataHolder.addClusterContext(new ClusterContext(applicationClusterContext.getClusterId(), + applicationClusterContext.getCartridgeType(), applicationClusterContext.getTextPayload(), + applicationClusterContext.getHostName(), applicationClusterContext.isLbCluster())); + } + + //TODO: publish data to meta data service + applicationParser.getPayloadData(); - TopologyBuilder.handleApplicationDeployed(applicationDataHolder); + TopologyBuilder.handleApplicationDeployed(application, applicationParser.getApplicationClusterContexts(), + applicationParser.getPayloadData()); + + persist(); } @Override http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/ApplicationParser.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/ApplicationParser.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/ApplicationParser.java index 48bae4f..77cbe33 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/ApplicationParser.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/ApplicationParser.java @@ -20,10 +20,17 @@ package org.apache.stratos.cloud.controller.interfaces; import org.apache.stratos.cloud.controller.exception.ApplicationDefinitionException; -import org.apache.stratos.cloud.controller.pojo.ApplicationDataHolder; +import org.apache.stratos.cloud.controller.pojo.ApplicationClusterContext; +import org.apache.stratos.cloud.controller.pojo.payload.MetaDataHolder; import org.apache.stratos.messaging.domain.topology.Application; +import java.util.Set; + public interface ApplicationParser { - public ApplicationDataHolder parse (Object obj) throws ApplicationDefinitionException; + public Application parse (Object obj) throws ApplicationDefinitionException; + + public Set<ApplicationClusterContext> getApplicationClusterContexts() throws ApplicationDefinitionException; + + public Set<MetaDataHolder> getPayloadData () throws ApplicationDefinitionException; } http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/internal/CloudControllerDSComponent.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/internal/CloudControllerDSComponent.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/internal/CloudControllerDSComponent.java index b1d6c6d..572e619 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/internal/CloudControllerDSComponent.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/internal/CloudControllerDSComponent.java @@ -89,6 +89,8 @@ public class CloudControllerDSComponent { TopologySynchronizerTaskScheduler .schedule(ServiceReferenceHolder.getInstance() .getTaskService()); + + } catch (Throwable e) { log.error("******* Cloud Controller Service bundle is failed to activate ****", e); http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ApplicationClusterContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ApplicationClusterContext.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ApplicationClusterContext.java new file mode 100644 index 0000000..fb37d99 --- /dev/null +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ApplicationClusterContext.java @@ -0,0 +1,116 @@ +/* + * 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.pojo; + +public class ApplicationClusterContext { + + // cluster id + private String clusterId; + // cartridge type + private String cartridgeType; + // payload as a String + private String textPayload; + // host name + private String hostName; + // flag to indicate LB cluster + private boolean isLbCluster; + // autoscaling policy + private String autoscalePolicyName; + // deployment policy + private String deploymentPolicyName; + // tenant rance + private String tenantRange; + + public ApplicationClusterContext (String cartridgeType, String clusterId, String hostName, + String textPayload, String deploymentPolicyName, boolean isLbCluster) { + + this.cartridgeType = cartridgeType; + this.clusterId = clusterId; + this.hostName = hostName; + this.textPayload = textPayload; + this.deploymentPolicyName = deploymentPolicyName; + this.isLbCluster = isLbCluster; + this.tenantRange = "*"; + } + + public String getClusterId() { + return clusterId; + } + + public void setClusterId(String clusterId) { + this.clusterId = clusterId; + } + + public String getCartridgeType() { + return cartridgeType; + } + + public void setCartridgeType(String cartridgeType) { + this.cartridgeType = cartridgeType; + } + + public String getTextPayload() { + return textPayload; + } + + public void setTextPayload(String textPayload) { + this.textPayload = textPayload; + } + + public String getHostName() { + return hostName; + } + + public void setHostName(String hostName) { + this.hostName = hostName; + } + + public boolean isLbCluster() { + return isLbCluster; + } + + public void setLbCluster(boolean lbCluster) { + isLbCluster = lbCluster; + } + + public String getAutoscalePolicyName() { + return autoscalePolicyName; + } + + public void setAutoscalePolicyName(String autoscalePolicyName) { + this.autoscalePolicyName = autoscalePolicyName; + } + + public String getDeploymentPolicyName() { + return deploymentPolicyName; + } + + public void setDeploymentPolicyName(String deploymentPolicyName) { + this.deploymentPolicyName = deploymentPolicyName; + } + + public String getTenantRange() { + return tenantRange; + } + + public void setTenantRange(String tenantRange) { + this.tenantRange = tenantRange; + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ApplicationDataHolder.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ApplicationDataHolder.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ApplicationDataHolder.java index c1fa44b..601f625 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ApplicationDataHolder.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ApplicationDataHolder.java @@ -19,7 +19,7 @@ package org.apache.stratos.cloud.controller.pojo; -import org.apache.stratos.cloud.controller.pojo.payload.PayloadDataHolder; +import org.apache.stratos.cloud.controller.pojo.payload.MetaDataHolder; import org.apache.stratos.messaging.domain.topology.Application; import org.apache.stratos.messaging.domain.topology.Cluster; @@ -31,7 +31,7 @@ public class ApplicationDataHolder { private Set<Cluster> clusters; - private Set<PayloadDataHolder> payloadDataHolders; + private Set<MetaDataHolder> metaDataHolders; public Application getApplication() { return application; @@ -49,11 +49,11 @@ public class ApplicationDataHolder { this.clusters = clusters; } - public Set<PayloadDataHolder> getPayloadDataHolders() { - return payloadDataHolders; + public Set<MetaDataHolder> getMetaDataHolders() { + return metaDataHolders; } - public void setPayloadDataHolders(Set<PayloadDataHolder> payloadDataHolders) { - this.payloadDataHolders = payloadDataHolders; + public void setMetaDataHolders(Set<MetaDataHolder> metaDataHolders) { + this.metaDataHolders = metaDataHolders; } } http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ClusterDataHolder.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ClusterDataHolder.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ClusterDataHolder.java index af81c8e..874d18e 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ClusterDataHolder.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ClusterDataHolder.java @@ -1,61 +1,61 @@ -/* - * 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.pojo; - -import org.apache.stratos.cloud.controller.pojo.payload.PayloadDataHolder; -import org.apache.stratos.messaging.domain.topology.Cluster; -import org.apache.stratos.metadata.client.pojo.DataContext; - -import java.util.Map; -import java.util.Set; - -public class ClusterDataHolder { - - // Cluster Ids map, key = service name - private Map<String, Set<String>> clusterIdMap; - - // Cluster object collection - private Set<Cluster> clusters; - - // payload related information - private Set<PayloadDataHolder> payloadDataHolders; - - public ClusterDataHolder (Map<String, Set<String>> clusterIdMap, Set<Cluster> clusters) { - this.clusterIdMap = clusterIdMap; - this.clusters = clusters; - } - - public Map<String, Set<String>> getClusterIdMap() { - return clusterIdMap; - } - - public Set<Cluster> getClusters() { - return clusters; - } - - - public Set<PayloadDataHolder> getPayloadDataHolders() { - return payloadDataHolders; - } - - public void setPayloadDataHolders(Set<PayloadDataHolder> payloadDataHolders) { - this.payloadDataHolders = payloadDataHolders; - } -} +///* +// * 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.pojo; +// +//import org.apache.stratos.cloud.controller.pojo.payload.PayloadDataHolder; +//import org.apache.stratos.messaging.domain.topology.Cluster; +//import org.apache.stratos.metadata.client.pojo.DataContext; +// +//import java.util.Map; +//import java.util.Set; +// +//public class ClusterDataHolder { +// +// // Cluster Ids map, key = service name +// private Map<String, Set<String>> clusterIdMap; +// +// // Cluster object collection +// private Set<Cluster> clusters; +// +//// // payload related information +//// private Set<PayloadDataHolder> payloadDataHolders; +// +// public ClusterDataHolder (Map<String, Set<String>> clusterIdMap, Set<Cluster> clusters) { +// this.clusterIdMap = clusterIdMap; +// this.clusters = clusters; +// } +// +// public Map<String, Set<String>> getClusterIdMap() { +// return clusterIdMap; +// } +// +// public Set<Cluster> getApplicationClusterContexts() { +// return clusters; +// } +// +// +//// public Set<PayloadDataHolder> getPayloadDataHolders() { +//// return payloadDataHolders; +//// } +//// +//// public void setPayloadDataHolders(Set<PayloadDataHolder> payloadDataHolders) { +//// this.payloadDataHolders = payloadDataHolders; +//// } +//} http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/MetaDataHolder.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/MetaDataHolder.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/MetaDataHolder.java new file mode 100644 index 0000000..8ab745e --- /dev/null +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/MetaDataHolder.java @@ -0,0 +1,93 @@ +/* + * 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.pojo.payload; + +import java.util.Properties; + +/** + * Holds payload/meta data related to a cluster + */ + +public class MetaDataHolder { + + private String appId; + + private String groupName; + + private String clusterId; + + private Properties properties; + + public MetaDataHolder(String appId, String groupName, String clusterId) { + + this.appId = appId; + this.groupName = groupName; + this.clusterId = clusterId; + } + + public String getAppId() { + return appId; + } + + public String getGroupName() { + return groupName; + } + + public String getClusterId() { + return clusterId; + } + + public boolean equals(Object other) { + + if(other == null || !(other instanceof MetaDataHolder)) { + return false; + } + + if(this == other) { + return true; + } + + MetaDataHolder that = (MetaDataHolder)other; + + if (this.groupName == null || that.groupName == null) { + return this.appId.equals(that.appId) && this.clusterId.equals(that.clusterId); + } else { + return this.appId.equals(that.appId) && this.groupName.equals(that.groupName) && + this.clusterId.equals(that.clusterId); + } + } + + public int hashCode () { + + if (this.getGroupName() == null) { + return this.appId.hashCode() + this.clusterId.hashCode(); + } else { + return this.appId.hashCode() + this.groupName.hashCode() + this.clusterId.hashCode(); + } + } + + public Properties getProperties() { + return properties; + } + + public void setProperties(Properties properties) { + this.properties = properties; + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/PayloadDataHolder.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/PayloadDataHolder.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/PayloadDataHolder.java deleted file mode 100644 index 6f74453..0000000 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/PayloadDataHolder.java +++ /dev/null @@ -1,93 +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.pojo.payload; - -import java.util.Properties; - -/** - * Holds payload/meta data related to a cluster - */ - -public class PayloadDataHolder { - - private String appId; - - private String groupName; - - private String clusterId; - - private Properties properties; - - public PayloadDataHolder (String appId, String groupName, String clusterId) { - - this.appId = appId; - this.groupName = groupName; - this.clusterId = clusterId; - } - - public String getAppId() { - return appId; - } - - public String getGroupName() { - return groupName; - } - - public String getClusterId() { - return clusterId; - } - - public boolean equals(Object other) { - - if(other == null || !(other instanceof PayloadDataHolder)) { - return false; - } - - if(this == other) { - return true; - } - - PayloadDataHolder that = (PayloadDataHolder)other; - - if (this.groupName == null || that.groupName == null) { - return this.appId.equals(that.appId) && this.clusterId.equals(that.clusterId); - } else { - return this.appId.equals(that.appId) && this.groupName.equals(that.groupName) && - this.clusterId.equals(that.clusterId); - } - } - - public int hashCode () { - - if (this.getGroupName() == null) { - return this.appId.hashCode() + this.clusterId.hashCode(); - } else { - return this.appId.hashCode() + this.groupName.hashCode() + this.clusterId.hashCode(); - } - } - - public Properties getProperties() { - return properties; - } - - public void setProperties(Properties properties) { - this.properties = properties; - } -} http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/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 c958ec2..a926411 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 @@ -27,6 +27,7 @@ import org.apache.stratos.cloud.controller.pojo.ClusterContext; import org.apache.stratos.cloud.controller.pojo.PortMapping; import org.apache.stratos.cloud.controller.pojo.Registrant; import org.apache.stratos.cloud.controller.pojo.*; +import org.apache.stratos.cloud.controller.pojo.payload.MetaDataHolder; import org.apache.stratos.cloud.controller.publisher.CartridgeInstanceDataPublisher; import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder; import org.apache.stratos.cloud.controller.util.CloudControllerUtil; @@ -612,34 +613,45 @@ public class TopologyBuilder { } } - public static void handleApplicationDeployed(ApplicationDataHolder applicationDataHolder) { + public static void handleApplicationDeployed(Application application, + Set<ApplicationClusterContext> applicationClusterContexts, + Set<MetaDataHolder> metaDataHolders) { + + Topology topology = TopologyManager.getTopology(); try { TopologyManager.acquireWriteLock(); - if (topology.applicationExists(applicationDataHolder.getApplication().getId())) { - log.warn("Application with id [ " + applicationDataHolder.getApplication().getId() + " ] already exists in Topology"); + if (topology.applicationExists(application.getId())) { + log.warn("Application with id [ " + application.getId() + " ] already exists in Topology"); return; } - for (Cluster cluster : applicationDataHolder.getClusters()) { - String cartridgeType = cluster.getServiceName(); - Service service = topology.getService(cartridgeType); + for (ApplicationClusterContext applicationClusterContext : applicationClusterContexts) { + Cluster cluster = new Cluster(applicationClusterContext.getCartridgeType(), + applicationClusterContext.getClusterId(), applicationClusterContext.getDeploymentPolicyName(), + applicationClusterContext.getAutoscalePolicyName()); + cluster.setStatus(Status.Created); + cluster.addHostName(applicationClusterContext.getHostName()); + cluster.setTenantRange(applicationClusterContext.getTenantRange()); + + Service service = topology.getService(applicationClusterContext.getCartridgeType()); if (service != null) { - topology.getService(cartridgeType).addCluster(cluster); - log.info("Added Cluster " + cluster.toString() + " to Topology for Application with id: " + applicationDataHolder.getApplication().getId()); + service.addCluster(cluster); + log.info("Added Cluster " + cluster.toString() + " to Topology for Application with id: " + application.getId()); } else { - log.error("Service " + cartridgeType + " not found"); + log.error("Service " + applicationClusterContext.getCartridgeType() + " not found"); return; } } + // add to Topology and update - topology.addApplication(applicationDataHolder.getApplication()); + topology.addApplication(application); TopologyManager.updateTopology(topology); - log.info("Application with id [ " + applicationDataHolder.getApplication().getId() + " ] added to Topology successfully"); + log.info("Application with id [ " + application.getId() + " ] added to Topology successfully"); - TopologyEventPublisher.sendApplicationCreatedEvent(applicationDataHolder.getApplication()); + TopologyEventPublisher.sendApplicationCreatedEvent(application); } finally { TopologyManager.releaseWriteLock();
