further changes to topoogy and app definition parsing. removed rest EP schema validation temporarily
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/66f92f79 Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/66f92f79 Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/66f92f79 Branch: refs/heads/4.0.0-grouping Commit: 66f92f794fc3a8ff3cc1a6ea93c044b7b54b2c9d Parents: 581412b Author: Isuru Haththotuwa <[email protected]> Authored: Mon Sep 15 23:15:57 2014 +0530 Committer: Isuru Haththotuwa <[email protected]> Committed: Mon Sep 15 23:15:57 2014 +0530 ---------------------------------------------------------------------- .../org.apache.stratos.cloud.controller/pom.xml | 2 + .../application/ApplicationUtils.java | 9 + .../application/ClusterInformation.java | 27 + .../application/MTClusterInformation.java | 45 ++ .../application/STClusterInformation.java | 55 ++ .../parser/DefaultApplicationParser.java | 520 ++++++++------- .../application/parser/ParserUtils.java | 43 ++ .../impl/CloudControllerServiceImpl.java | 9 +- .../interfaces/ApplicationParser.java | 3 +- .../controller/pojo/ApplicationDataHolder.java | 48 ++ .../controller/pojo/ClusterDataHolder.java | 47 ++ .../cloud/controller/pojo/GroupDataHolder.java | 67 ++ .../pojo/application/ApplicationContext.java | 8 +- .../pojo/application/ComponentContext.java | 14 +- .../pojo/application/DependencyContext.java | 7 +- .../pojo/application/GroupContext.java | 14 +- .../pojo/application/StartupOrderContext.java | 4 + .../controller/topology/TopologyBuilder.java | 20 + .../topology/TopologyEventPublisher.java | 9 + .../client/CloudControllerServiceClient.java | 19 +- .../application/beans/GroupDefinition.java | 1 - .../deployer/DefaultServiceGroupDeployer.java | 71 +- .../messaging/domain/topology/Application.java | 11 + .../messaging/domain/topology/Cluster.java | 17 + .../domain/topology/DependencyOrder.java | 4 + .../messaging/domain/topology/Group.java | 50 +- .../domain/topology/SubscribableBehavior.java | 5 + .../bean/util/converter/PojoConverter.java | 128 ++++ .../rest/endpoint/services/ServiceUtils.java | 44 +- .../rest/endpoint/services/StratosAdmin.java | 2 +- .../main/webapp/stratos/WEB-INF/cxf-servlet.xml | 8 +- .../pom.xml | 7 +- .../pom.xml | 3 +- .../main/resources/CloudControllerService.wsdl | 665 ++++++++++--------- 34 files changed, 1348 insertions(+), 638 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/pom.xml ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/pom.xml b/components/org.apache.stratos.cloud.controller/pom.xml index ec808d1..6a1ffee 100644 --- a/components/org.apache.stratos.cloud.controller/pom.xml +++ b/components/org.apache.stratos.cloud.controller/pom.xml @@ -55,6 +55,7 @@ org.apache.stratos.cloud.controller.topology.*, org.apache.stratos.cloud.controller.iaases.*, org.apache.stratos.cloud.controller.pojo.*, + org.apache.stratos.cloud.controller.pojo.application.*, org.apache.stratos.cloud.controller.deployers.*, org.apache.stratos.cloud.controller.exception.*, </Export-Package> @@ -64,6 +65,7 @@ !org.apache.stratos.cloud.controller.topic.*, !org.apache.stratos.cloud.controller.iaases.*, !org.apache.stratos.cloud.controller.pojo.*, + !org.apache.stratos.cloud.controller.pojo.application.*, !org.apache.stratos.cloud.controller.deployers.*, !org.apache.stratos.cloud.controller.exception.*, !org.apache.stratos.cloud.controller.topology.*, http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/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 ac78453..3cd3a0e 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 @@ -30,4 +30,13 @@ public class ApplicationUtils { return pattern.matcher(alias).matches(); } + + public static boolean isValid (String arg) { + + if (arg == null || arg.isEmpty()) { + return false; + } else { + return true; + } + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/ClusterInformation.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/ClusterInformation.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/ClusterInformation.java new file mode 100644 index 0000000..5fd6d57 --- /dev/null +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/ClusterInformation.java @@ -0,0 +1,27 @@ +/* + * 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.application; + +public interface ClusterInformation { + + public String getClusterId (String alias, String cartridgeType); + + public String getHostName (String alias, String cartridgeDefinitionHostName); +} http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/MTClusterInformation.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/MTClusterInformation.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/MTClusterInformation.java new file mode 100644 index 0000000..ef3b255 --- /dev/null +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/MTClusterInformation.java @@ -0,0 +1,45 @@ +/* + * 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.application; + +public class MTClusterInformation implements ClusterInformation { + + @Override + public String getClusterId(String alias, String cartridgeType) { + + if (!ApplicationUtils.isValid(cartridgeType)) { + // cannot happen + throw new IllegalArgumentException("Invalid cartridge type value provided: [ " + cartridgeType + " ]"); + } + + return cartridgeType + ".domain"; + } + + @Override + public String getHostName(String alias, String cartridgeDefinitionHostName) { + + if (!ApplicationUtils.isValid(cartridgeDefinitionHostName)) { + // cannot happen + throw new IllegalArgumentException("Invalid host name value provided: [ " + cartridgeDefinitionHostName + " ]"); + } + + return cartridgeDefinitionHostName; + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/STClusterInformation.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/STClusterInformation.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/STClusterInformation.java new file mode 100644 index 0000000..c8c3d9b --- /dev/null +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/STClusterInformation.java @@ -0,0 +1,55 @@ +/* + * 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.application; + +public class STClusterInformation implements ClusterInformation { + + @Override + public String getClusterId(String alias, String cartridgeType) { + + if (!ApplicationUtils.isValid(alias)) { + // cannot happen + throw new IllegalArgumentException("Invalid alias value provided: [ " + alias + " ]"); + } + + if (!ApplicationUtils.isValid(cartridgeType)) { + // cannot happen + throw new IllegalArgumentException("Invalid cartridge type value provided: [ " + cartridgeType + " ]"); + } + + return alias + "." + cartridgeType + ".domain"; + } + + @Override + public String getHostName(String alias, String cartridgeDefinitionHostName) { + + if (!ApplicationUtils.isValid(alias)) { + // cannot happen + throw new IllegalArgumentException("Invalid alias value provided: [ " + alias + " ]"); + } + + if (!ApplicationUtils.isValid(cartridgeDefinitionHostName)) { + // cannot happen + throw new IllegalArgumentException("Invalid host name value provided: [ " + cartridgeDefinitionHostName + " ]"); + } + + return alias + "." + cartridgeDefinitionHostName; + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/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 ef9432f..80cf4ae 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 @@ -19,19 +19,22 @@ package org.apache.stratos.cloud.controller.application.parser; -import org.apache.axis2.AxisFault; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.stratos.cloud.controller.application.ApplicationUtils; +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.interfaces.ApplicationParser; -import org.apache.stratos.cloud.controller.pojo.application.ApplicationContext; -import org.apache.stratos.cloud.controller.pojo.application.GroupContext; -import org.apache.stratos.cloud.controller.pojo.application.SubscribableContext; -import org.apache.stratos.cloud.controller.pojo.application.SubscribableInfoContext; -import org.apache.stratos.messaging.domain.topology.Application; +import org.apache.stratos.cloud.controller.pojo.ApplicationDataHolder; +import org.apache.stratos.cloud.controller.pojo.Cartridge; +import org.apache.stratos.cloud.controller.pojo.ClusterDataHolder; +import org.apache.stratos.cloud.controller.pojo.ServiceGroup; +import org.apache.stratos.cloud.controller.pojo.application.*; +import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder; +import org.apache.stratos.messaging.domain.topology.*; -import java.rmi.RemoteException; import java.util.*; public class DefaultApplicationParser implements ApplicationParser { @@ -39,7 +42,7 @@ public class DefaultApplicationParser implements ApplicationParser { private static Log log = LogFactory.getLog(DefaultApplicationParser.class); @Override - public Application parse(Object obj) throws ApplicationDefinitionException { + public ApplicationDataHolder parse(Object obj) throws ApplicationDefinitionException { ApplicationContext applicationCtxt = null; @@ -85,9 +88,7 @@ public class DefaultApplicationParser implements ApplicationParser { throw new ApplicationDefinitionException("Invalid Composite Application Definition, no Subscribable Information specified"); } - //TODO - //return buildCompositeAppStructure (applicationCtxt, definedGroups, subscribablesInfo); - return null; + return buildCompositeAppStructure (applicationCtxt, definedGroups, subscribablesInfo); } private Map<String, GroupContext> getDefinedGroups (ApplicationContext appCtxt) throws @@ -168,247 +169,316 @@ public class DefaultApplicationParser implements ApplicationParser { private boolean isGroupDeployed (String serviceGroupName) throws ApplicationDefinitionException { - //TODO - return true; + return FasterLookUpDataHolder.getInstance().getServiceGroup(serviceGroupName) != null; + } + + private ApplicationDataHolder buildCompositeAppStructure (ApplicationContext appCtxt, + Map<String, GroupContext> definedGroupCtxts, + Map<String, SubscribableInfoContext> subscribableInfoCtxts) + throws ApplicationDefinitionException { + + Application application = new Application(appCtxt.getApplicationId()); + // following keeps track of all Clusters created for this application + Set<Cluster> clusters = new HashSet<Cluster>(); + + if (appCtxt.getComponents() != null) { + // get top level Subscribables + if (appCtxt.getComponents().getSubscribableContexts() != null) { + ClusterDataHolder clusterDataHolder = getClusterInformation(Arrays.asList(appCtxt.getComponents().getSubscribableContexts()), subscribableInfoCtxts); + application.setClusterIds(clusterDataHolder.getClusterIdMap()); + clusters.addAll(clusterDataHolder.getClusters()); + } + + // get Groups + if (appCtxt.getComponents().getGroupContexts() != null) { + application.setGroups(getGroupInfo(clusters, Arrays.asList(appCtxt.getComponents().getGroupContexts()), subscribableInfoCtxts, definedGroupCtxts)); + } + + // get top level Dependency definitions + if (appCtxt.getComponents().getDependencyContext() != null) { + DependencyOrder appDependencyOrder = new DependencyOrder(); + Set<StartupOrder> startupOrders = getStartupOrderForApplicationComponents(new HashSet<StartupOrderContext>(Arrays.asList(appCtxt.getComponents(). + getDependencyContext().getStartupOrderContext()))); + if (startupOrders != null) { + appDependencyOrder.setStartupOrders(startupOrders); + } + appDependencyOrder.setKillbehavior(appCtxt.getComponents().getDependencyContext().getKillBehaviour()); + + application.setDependencyOrder(appDependencyOrder); + } + } + + log.info("Application with id " + appCtxt.getApplicationId() + " parsed successfully"); + + ApplicationDataHolder applicationDataHolder = new ApplicationDataHolder(); + applicationDataHolder.setClusters(clusters); + applicationDataHolder.setApplication(application); + + return applicationDataHolder; + } + + private Map<String, Group> getGroupInfo (Set<Cluster> clusters, List<GroupContext> groupCtxts, + Map<String, SubscribableInfoContext> subscribableInformation, + Map<String, GroupContext> definedGroupCtxts) + throws ApplicationDefinitionException { + + Map<String, Group> groupNameToGroup = new HashMap<String, Group>(); + + for (GroupContext groupCtxt : groupCtxts) { + Group group = getGroup(clusters, groupCtxt, subscribableInformation, definedGroupCtxts); + groupNameToGroup.put(group.getName(), group); + } + + //Set<GroupContext> topLevelGroupContexts = getTopLevelGroupContexts(groupNameToGroup); + Set<Group> nestedGroups = new HashSet<Group>(); + getNestedGroupContexts(nestedGroups, groupNameToGroup.values()); + filterDuplicatedGroupContexts(groupNameToGroup.values(), nestedGroups); + + return groupNameToGroup; + } + + private void getNestedGroupContexts (Set<Group> nestedGroups, Collection<Group> groups) { + + if (groups != null) { + for (Group group : groups) { + if (group.getGroups() != null) { + nestedGroups.addAll(group.getGroups()); + getNestedGroupContexts(nestedGroups, group.getGroups()); + } + } + } + } + + private void filterDuplicatedGroupContexts (Collection<Group> topLevelGroups, Set<Group> nestedGroups) { + + for (Group nestedGroup : nestedGroups) { + filterNestedGroupFromTopLevel(topLevelGroups, nestedGroup); + } + } + + private void filterNestedGroupFromTopLevel (Collection<Group> topLevelGroups, Group nestedGroup) { + + Iterator<Group> parentIterator = topLevelGroups.iterator(); + while (parentIterator.hasNext()) { + Group parentGroup = parentIterator.next(); + // if there is an exactly similar nested Group Context and a top level Group Context + // it implies that they are duplicates. Should be removed from top level. + if (parentGroup.equals(nestedGroup)) { + parentIterator.remove(); + } + } + } + + private Group getGroup(Set<Cluster> clusters, GroupContext groupCtxt, Map<String, SubscribableInfoContext> subscribableInfoCtxts, + Map<String, GroupContext> definedGroupCtxts) throws ApplicationDefinitionException { + + // check if are in the defined Group set + GroupContext definedGroupDef = definedGroupCtxts.get(groupCtxt.getAlias()); + if (definedGroupDef == null) { + throw new ApplicationDefinitionException("Group Definition with name: " + groupCtxt.getName() + ", alias: " + + groupCtxt.getAlias() + " is not found in the all Group Definitions collection"); + } + + Group group = new Group(groupCtxt.getName(), groupCtxt.getAlias()); + + group.setAutoscalingPolicy(groupCtxt.getAutoscalingPolicy()); + group.setDeploymentPolicy(groupCtxt.getDeploymentPolicy()); + DependencyOrder dependencyOrder = new DependencyOrder(); + // create the Dependency Ordering + Set<StartupOrder> startupOrders = getStartupOrderForGroup(groupCtxt.getName()); + if (startupOrders != null) { + dependencyOrder.setStartupOrders(startupOrders); + } + dependencyOrder.setKillbehavior(getKillbehaviour(groupCtxt.getName())); + group.setDependencyOrder(dependencyOrder); + + ClusterDataHolder clusterDataHolder; + + // get group level Subscribables + if (groupCtxt.getSubscribableContexts() != null) { + clusterDataHolder = getClusterInformation(Arrays.asList(groupCtxt.getSubscribableContexts()), subscribableInfoCtxts); + group.setClusterIds(clusterDataHolder.getClusterIdMap()); + clusters.addAll(clusterDataHolder.getClusters()); + } + + // get nested groups + if (groupCtxt.getGroupContexts() != null) { + Map<String, Group> nestedGroups = new HashMap<String, Group>(); + // check sub groups + for (GroupContext subGroupCtxt : groupCtxt.getGroupContexts()) { + // get the complete Group Definition + subGroupCtxt = definedGroupCtxts.get(subGroupCtxt.getAlias()); + Group nestedGroup = getGroup(clusters, subGroupCtxt, subscribableInfoCtxts, definedGroupCtxts); + nestedGroups.put(nestedGroup.getName(), nestedGroup); + } + + group.setGroups(nestedGroups); + } + + return group; + } + + private Set<StartupOrder> getStartupOrderForGroup(String serviceGroupName) throws ApplicationDefinitionException { + + ServiceGroup serviceGroup = FasterLookUpDataHolder.getInstance().getServiceGroup(serviceGroupName); + + if (serviceGroup == null) { + throw new ApplicationDefinitionException("Service Group Definition not found for name " + serviceGroupName); + } + + if (serviceGroup.getDependencies() != null) { + if (serviceGroup.getDependencies().getStartupOrder() != null) { + return ParserUtils.convert(serviceGroup.getDependencies().getStartupOrder()); + } + } + + return null; + } + + private Set<StartupOrder> getStartupOrderForApplicationComponents (Set<StartupOrderContext> startupOrderCtxts) + throws ApplicationDefinitionException { + + if (startupOrderCtxts == null) { + return null; + } + + Set<StartupOrder> startupOrders = new HashSet<StartupOrder>(); + + for (StartupOrderContext startupOrderContext : startupOrderCtxts) { + startupOrders.add(new StartupOrder(startupOrderContext.getStart(), startupOrderContext.getAfter())); + } + + return startupOrders; + } + + private String getKillbehaviour (String serviceGroupName) throws ApplicationDefinitionException { + + ServiceGroup serviceGroup = FasterLookUpDataHolder.getInstance().getServiceGroup(serviceGroupName); + + if (serviceGroup == null) { + throw new ApplicationDefinitionException("Service Group Definition not found for name " + serviceGroupName); + } + + if (serviceGroup.getDependencies() != null) { + return serviceGroup.getDependencies().getKillBehaviour(); + } + + return null; + } -// private Application buildCompositeAppStructure (ApplicationContext appCtxt, -// Map<String, GroupContext> definedGroupCtxts, -// Map<String, SubscribableInfoContext> subscribableInfoCtxts) +// private Set<SubscribableContext> getSubsribableContexts (List<SubscribableContext> subscribableCtxts, +// Map<String, SubscribableInfoContext> subscribableInfoCtxts) // throws ApplicationDefinitionException { // -// Application application = new Application(appCtxt.getApplicationId()); -// -// if (appCtxt.getComponents() != null) { -// // get top level Subscribables -// if (appCtxt.getComponents().getSubscribableContexts() != null) { -// application.setSubscribableContexts(getSubsribableContexts(appCtxt.getComponents().getSubscribables(), -// subscribableInfoCtxts)); -// } -// -// // get Groups -// if (appCtxt.getComponents().getGroups() != null) { -// application.setGroupContexts(getGroupContexts(appCtxt.getComponents().getGroups(), -// subscribableInfoCtxts, definedGroupCtxts)); -// } -// -// // get top level Dependency definitions -// if (appCtxt.getComponents().getDependencies() != null) { -// application.setStartupOrder(getStartupOrderForApplicationComponents(appCtxt.getComponents(). -// getDependencies().getStartupOrder())); -// -// application.setKillBehaviour(appCtxt.getComponents().getDependencies().getKillBehaviour()); -// } -// } -// -// return application; -// } -// -// private Set<GroupContext> getGroupContexts (List<GroupDefinition> groupDefinitions, -// Map<String, SubscribableInfo> subscribableInformation, -// Map<String, GroupDefinition> definedGroups) -// throws CompositeApplicationDefinitionException { -// -// Set<GroupContext> groupContexts = new HashSet<GroupContext>(); -// -// for (GroupDefinition group : groupDefinitions) { -// groupContexts.add(getGroupContext(group, subscribableInformation, definedGroups)); -// } -// -// //Set<GroupContext> topLevelGroupContexts = getTopLevelGroupContexts(groupContexts); -// Set<GroupContext> nestedGroupContexts = new HashSet<GroupContext>(); -// getNestedGroupContexts(nestedGroupContexts, groupContexts); -// filterDuplicatedGroupContexts(groupContexts, nestedGroupContexts); -// -// return groupContexts; -// } -// -// private void getNestedGroupContexts (Set<GroupContext> nestedGroupContexts, Set<GroupContext> groupContexts) { -// -// if (groupContexts != null) { -// for (GroupContext groupContext : groupContexts) { -// if (groupContext.getGroupContexts() != null) { -// nestedGroupContexts.addAll(groupContext.getGroupContexts()); -// getNestedGroupContexts(nestedGroupContexts, groupContext.getGroupContexts()); -// } -// } -// } -// } -// -// private void filterDuplicatedGroupContexts (Set<GroupContext> topLevelGroupContexts, Set<GroupContext> nestedGroupContexts) { -// -// for (GroupContext nestedGropCtxt : nestedGroupContexts) { -// filterNestedGroupFromTopLevel(topLevelGroupContexts, nestedGropCtxt); -// } -// } -// -// private void filterNestedGroupFromTopLevel (Set<GroupContext> topLevelGroupContexts, GroupContext nestedGroupCtxt) { -// -// Iterator<GroupContext> parentIterator = topLevelGroupContexts.iterator(); -// while (parentIterator.hasNext()) { -// GroupContext parentGroupCtxt = parentIterator.next(); -// // if there is an exactly similar nested Group Context and a top level Group Context -// // it implies that they are duplicates. Should be removed from top level. -// if (parentGroupCtxt.equals(nestedGroupCtxt)) { -// parentIterator.remove(); -// } -// } -// } -// -// private GroupContext getGroupContext (GroupDefinition group, Map<String, SubscribableInfo> subscribableInformation, -// Map<String, GroupDefinition> definedGroups) throws CompositeApplicationDefinitionException { -// -// // check if are in the defined Group set -// GroupDefinition definedGroupDef = definedGroups.get(group.getAlias()); -// if (definedGroupDef == null) { -// throw new CompositeApplicationDefinitionException("Group Definition with name: " + group.getName() + ", alias: " + -// group.getAlias() + " is not found in the all Group Definitions collection"); -// } -// -// GroupContext groupContext = new GroupContext(); -// -// groupContext.setName(group.getName()); -// groupContext.setAlias(group.getAlias()); -// groupContext.setAutoscalingPolicy(group.getAutoscalingPolicy()); -// groupContext.setDeploymentPolicy(group.getDeploymentPolicy()); -// groupContext.setStartupOrder(getStartupOrderForGroup(group.getName())); -// groupContext.setKillBehaviour(getKillbehaviour(group.getName())); -// -// // get group level Subscribables -// if (group.getSubscribables() != null) { -// groupContext.setSubscribableContexts(getSubsribableContexts(group.getSubscribables(), subscribableInformation)); -// } -// // get nested groups -// if (group.getSubGroups() != null) { -// Set<GroupContext> nestedGroupContexts = new HashSet<GroupContext>(); -// // check sub groups -// for (GroupDefinition subGroup : group.getSubGroups()) { -// // get the complete Group Definition -// subGroup = definedGroups.get(subGroup.getAlias()); -// nestedGroupContexts.add(getGroupContext(subGroup, subscribableInformation, definedGroups)); -// } -// -// groupContext.setGroupContexts(nestedGroupContexts); -// } -// -// return groupContext; -// } -// -// private Set<StartupOrder> getStartupOrderForGroup(String serviceGroupName) throws CompositeApplicationDefinitionException { -// -// ServiceGroupDefinition groupDefinition; -// -// try { -// groupDefinition = dataInsertionAndRetrievalMgr.getServiceGroupDefinition(serviceGroupName); -// -// } catch (PersistenceManagerException e) { -// throw new CompositeApplicationDefinitionException(e); -// } -// -// if (groupDefinition == null) { -// throw new CompositeApplicationDefinitionException("Service Group Definition not found for name " + serviceGroupName); -// } -// -// if (groupDefinition.getDependencies() != null) { -// if (groupDefinition.getDependencies().getStartupOrder() != null) { -// return ParserUtils.convert(groupDefinition.getDependencies().getStartupOrder()); -// } -// } -// -// return null; -// } -// -// private Set<StartupOrder> getStartupOrderForApplicationComponents (List<StartupOrderDefinition> startupOrderDefinitions) -// throws CompositeApplicationDefinitionException { -// -// if (startupOrderDefinitions == null) { -// return null; -// } -// -// Set<StartupOrder> startupOrders = new HashSet<StartupOrder>(); -// -// for (StartupOrderDefinition startupOrderDefinition : startupOrderDefinitions) { -// startupOrders.add(new StartupOrder(startupOrderDefinition.getStart(), startupOrderDefinition.getAfter())); -// } -// -// return startupOrders; -// } -// -// private String getKillbehaviour (String serviceGroupName) throws CompositeApplicationDefinitionException { -// -// ServiceGroupDefinition groupDefinition; -// -// try { -// groupDefinition = dataInsertionAndRetrievalMgr.getServiceGroupDefinition(serviceGroupName); -// -// } catch (PersistenceManagerException e) { -// throw new CompositeApplicationDefinitionException(e); -// } -// -// if (groupDefinition == null) { -// throw new CompositeApplicationDefinitionException("Service Group Definition not found for name " + serviceGroupName); -// } -// -// if (groupDefinition.getDependencies() != null) { -// return groupDefinition.getDependencies().getKillBehaviour(); -// } -// -// return null; -// -// } -// -// private Set<SubscribableContext> getSubsribableContexts (List<SubscribableDefinition> subscribableDefinitions, -// Map<String, SubscribableInfo> subscribableInformation) -// throws CompositeApplicationDefinitionException { -// // Set<SubscribableContext> subscribableContexts = new HashSet<SubscribableContext>(); // -// for (SubscribableDefinition subscribableDefinition : subscribableDefinitions) { +// for (SubscribableContext subscribableCtxt : subscribableCtxts) { // // check is there is a related Subscribable Information -// SubscribableInfo subscribableInfo = subscribableInformation.get(subscribableDefinition.getAlias()); +// SubscribableInfo subscribableInfo = subscribableInfoCtxts.get(subscribableCtxt.getAlias()); // if (subscribableInfo == null) { // throw new CompositeApplicationDefinitionException("Related Subscribable Information not found for Subscribable with alias: " -// + subscribableDefinition.getAlias()); +// + subscribableCtxt.getAlias()); // } // // // check if Cartridge Type is valid -// if (subscribableDefinition.getType() == null || subscribableDefinition.getType().isEmpty()) { +// if (subscribableCtxt.getType() == null || subscribableCtxt.getType().isEmpty()) { // throw new CompositeApplicationDefinitionException ("Invalid Cartridge Type specified : [ " -// + subscribableDefinition.getType() + " ]"); +// + subscribableCtxt.getType() + " ]"); // } // // // check if a cartridge with relevant type is already deployed. else, can't continue -// if (!isCartrigdeDeployed(subscribableDefinition.getType())) { -// throw new CompositeApplicationDefinitionException("No deployed Cartridge found with type [ " + subscribableDefinition.getType() + +// if (!isCartrigdeDeployed(subscribableCtxt.getType())) { +// throw new CompositeApplicationDefinitionException("No deployed Cartridge found with type [ " + subscribableCtxt.getType() + // " ] for Composite Application"); // } // -// subscribableContexts.add(ParserUtils.convert(subscribableDefinition, subscribableInfo)); +// subscribableContexts.add(ParserUtils.convert(subscribableCtxt, subscribableInfo)); // } // // return subscribableContexts; // } + + private ClusterDataHolder getClusterInformation (List<SubscribableContext> subscribableCtxts, + Map<String, SubscribableInfoContext> subscribableInfoCtxts) + throws ApplicationDefinitionException { + + Map<String, String> clusterIdMap = new HashMap<String, String>(); + Set<Cluster> clusters = new HashSet<Cluster>(); + + for (SubscribableContext subscribableCtxt : subscribableCtxts) { + // check is there is a related Subscribable Information + SubscribableInfoContext subscribableInfoCtxt = subscribableInfoCtxts.get(subscribableCtxt.getAlias()); + if (subscribableInfoCtxt == null) { + throw new ApplicationDefinitionException("Related Subscribable Information Ctxt not found for Subscribable with alias: " + + subscribableCtxt.getAlias()); + } + + // check if Cartridge Type is valid + if (subscribableCtxt.getType() == null || subscribableCtxt.getType().isEmpty()) { + throw new ApplicationDefinitionException ("Invalid Cartridge Type specified : [ " + + subscribableCtxt.getType() + " ]"); + } + + // check if a cartridge with relevant type is already deployed. else, can't continue + Cartridge cartridge = getCartridge(subscribableCtxt.getType()); + if (cartridge == null) { + throw new ApplicationDefinitionException("No deployed Cartridge found with type [ " + subscribableCtxt.getType() + + " ] for Composite Application"); + } + + Cluster cluster = getCluster(subscribableCtxt, subscribableInfoCtxt, cartridge); + clusters.add(cluster); + clusterIdMap.put(subscribableCtxt.getType(), cluster.getClusterId()); + } + + return new ClusterDataHolder(clusterIdMap, clusters); + } + + 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(ClusterStatus.Created); + + return cluster; + } + +// private GroupDataHolder getGroupInformation (List<GroupContext> groupCtxts, +// Map<String, SubscribableInfoContext> subscribableInformation, +// Map<String, GroupContext> definedGroupCtxts) +// throws ApplicationDefinitionException { // -// private boolean isCartrigdeDeployed (String cartridgeType) throws CompositeApplicationDefinitionException { -// -// CloudControllerServiceClient ccServiceClient; -// -// try { -// ccServiceClient = CloudControllerServiceClient.getServiceClient(); +// Set<GroupContext> groupContexts = new HashSet<GroupContext>(); // -// } catch (AxisFault axisFault) { -// throw new CompositeApplicationDefinitionException(axisFault); +// for (GroupContext groupCtxt : groupCtxts) { +// groupContexts.add(getGroup(groupCtxt, subscribableInformation, definedGroupCtxts)); // } // -// try { -// return ccServiceClient.getCartridgeInfo(cartridgeType) != null; -// -// } catch (RemoteException e) { -// throw new CompositeApplicationDefinitionException(e); -// -// } catch (CloudControllerServiceUnregisteredCartridgeExceptionException e) { -// throw new CompositeApplicationDefinitionException(e); -// } +// //Set<GroupContext> topLevelGroupContexts = getTopLevelGroupContexts(groupContexts); +// Set<GroupContext> nestedGroupContexts = new HashSet<GroupContext>(); +// getNestedGroupContexts(nestedGroupContexts, groupContexts); +// filterDuplicatedGroupContexts(groupContexts, nestedGroupContexts); // } + private Cartridge getCartridge (String cartridgeType) { + + return FasterLookUpDataHolder.getInstance().getCartridge(cartridgeType); + } + } http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/parser/ParserUtils.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/parser/ParserUtils.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/parser/ParserUtils.java new file mode 100644 index 0000000..7ae9010 --- /dev/null +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/parser/ParserUtils.java @@ -0,0 +1,43 @@ +/* + * 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.application.parser; + +import org.apache.stratos.messaging.domain.topology.StartupOrder; + +import java.util.HashSet; +import java.util.Set; + +public class ParserUtils { + + public static Set<StartupOrder> convert (org.apache.stratos.cloud.controller.pojo.StartupOrder [] startupOrderArr) { + + Set<StartupOrder> startupOrders = new HashSet<StartupOrder>(); + + if (startupOrderArr == null) { + return startupOrders; + } + + for (int i = 0; i < startupOrderArr.length ; i++) { + startupOrders.add(new StartupOrder(startupOrderArr[i].getStart(), startupOrderArr[i].getAfter())); + } + + return startupOrders; + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/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 aa24cec..2a1c52c 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 @@ -24,10 +24,12 @@ import com.google.common.net.InetAddresses; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.stratos.cloud.controller.application.parser.DefaultApplicationParser; import org.apache.stratos.cloud.controller.concurrent.PartitionValidatorCallable; import org.apache.stratos.cloud.controller.concurrent.ThreadExecutor; import org.apache.stratos.cloud.controller.deployment.partition.Partition; import org.apache.stratos.cloud.controller.exception.*; +import org.apache.stratos.cloud.controller.interfaces.ApplicationParser; import org.apache.stratos.cloud.controller.interfaces.CloudControllerService; import org.apache.stratos.cloud.controller.interfaces.Iaas; import org.apache.stratos.cloud.controller.persist.Deserializer; @@ -1398,9 +1400,10 @@ public class CloudControllerServiceImpl implements CloudControllerService { public void deployApplicationDefinition (ApplicationContext applicationContext) throws ApplicationDefinitionException { - // TODO: - // 1. parse and create Composite App tree - // 2. send the ApplicationCreated event + ApplicationParser applicationParser = new DefaultApplicationParser(); + ApplicationDataHolder applicationDataHolder = applicationParser.parse(applicationContext); + + TopologyBuilder.handleApplicationDepolyed(applicationDataHolder); } private List<ConfigCompositeApplication> restoreConfigCompositeApplication () { http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/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 fc9fad8..48bae4f 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,9 +20,10 @@ 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.messaging.domain.topology.Application; public interface ApplicationParser { - public Application parse (Object obj) throws ApplicationDefinitionException; + public ApplicationDataHolder parse (Object obj) throws ApplicationDefinitionException; } http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/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 new file mode 100644 index 0000000..0007ab8 --- /dev/null +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ApplicationDataHolder.java @@ -0,0 +1,48 @@ +/* + * 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.messaging.domain.topology.Application; +import org.apache.stratos.messaging.domain.topology.Cluster; + +import java.util.Set; + +public class ApplicationDataHolder { + + private Application application; + + private Set<Cluster> clusters; + + public Application getApplication() { + return application; + } + + public void setApplication(Application application) { + this.application = application; + } + + public Set<Cluster> getClusters() { + return clusters; + } + + public void setClusters(Set<Cluster> clusters) { + this.clusters = clusters; + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/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 new file mode 100644 index 0000000..bc4f7eb --- /dev/null +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ClusterDataHolder.java @@ -0,0 +1,47 @@ +/* + * 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.messaging.domain.topology.Cluster; + +import java.util.Map; +import java.util.Set; + +public class ClusterDataHolder { + + // Cluster Id map, key = service name + private Map<String, String> clusterIdMap; + + // Cluster object collection + private Set<Cluster> clusters; + + public ClusterDataHolder (Map<String, String> clusterIdMap, Set<Cluster> clusters) { + this.clusterIdMap = clusterIdMap; + this.clusters = clusters; + } + + public Map<String, String> getClusterIdMap() { + return clusterIdMap; + } + + public Set<Cluster> getClusters() { + return clusters; + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/GroupDataHolder.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/GroupDataHolder.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/GroupDataHolder.java new file mode 100644 index 0000000..534814f --- /dev/null +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/GroupDataHolder.java @@ -0,0 +1,67 @@ +/* + * 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.messaging.domain.topology.Group; + +import java.util.HashMap; +import java.util.Map; + +public class GroupDataHolder { + + // Sub Group Map, key = Group.name + private Map<String, Group> groupMap; + // Cluster Data Holder + private ClusterDataHolder clusterDataHolder; + // nested Group Data + private GroupDataHolder groupDataHolder; + + public GroupDataHolder () { + this.groupMap = new HashMap<String, Group>(); + } + + public void addGroup (Group group) { + groupMap.put(group.getName(), group); + } + + public void addGroups (Map<String, Group> groupNameToGroup) { + groupMap.putAll(groupNameToGroup); + } + + public Map<String, Group> getGroupMap() { + return groupMap; + } + + public ClusterDataHolder getClusterDataHolder() { + return clusterDataHolder; + } + + public GroupDataHolder getGroupDataHolder() { + return groupDataHolder; + } + + public void setGroupDataHolder(GroupDataHolder groupDataHolder) { + this.groupDataHolder = groupDataHolder; + } + + public void setClusterDataHolder(ClusterDataHolder clusterDataHolder) { + this.clusterDataHolder = clusterDataHolder; + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/ApplicationContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/ApplicationContext.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/ApplicationContext.java index 898dcdd..7dfdb44 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/ApplicationContext.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/ApplicationContext.java @@ -19,8 +19,6 @@ package org.apache.stratos.cloud.controller.pojo.application; -import java.util.List; - public class ApplicationContext { private String applicationId; @@ -29,7 +27,7 @@ public class ApplicationContext { private ComponentContext componentContext; - private List<SubscribableInfoContext> subscribableInfoContexts; + private SubscribableInfoContext[] subscribableInfoContexts; public String getApplicationId() { return applicationId; @@ -55,11 +53,11 @@ public class ApplicationContext { this.componentContext = componentContext; } - public List<SubscribableInfoContext> getSubscribableInfoContext() { + public SubscribableInfoContext[] getSubscribableInfoContext() { return subscribableInfoContexts; } - public void setSubscribableInfoContext(List<SubscribableInfoContext> subscribableInfoContexts) { + public void setSubscribableInfoContext(SubscribableInfoContext[] subscribableInfoContexts) { this.subscribableInfoContexts = subscribableInfoContexts; } } http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/ComponentContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/ComponentContext.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/ComponentContext.java index f8ab53b..d1a13a5 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/ComponentContext.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/ComponentContext.java @@ -19,30 +19,28 @@ package org.apache.stratos.cloud.controller.pojo.application; -import java.util.List; - public class ComponentContext { - private List<GroupContext> groupContexts; + private GroupContext[] groupContexts; - private List<SubscribableContext> subscribableContexts; + private SubscribableContext[] subscribableContexts; private DependencyContext dependencyContext; - public List<GroupContext> getGroupContexts() { + public GroupContext[] getGroupContexts() { return groupContexts; } - public void setGroupContexts(List<GroupContext> groupContexts) { + public void setGroupContexts(GroupContext[] groupContexts) { this.groupContexts = groupContexts; } - public List<SubscribableContext> getSubscribableContexts() { + public SubscribableContext[] getSubscribableContexts() { return subscribableContexts; } - public void setSubscribableContexts(List<SubscribableContext> subscribableContexts) { + public void setSubscribableContexts(SubscribableContext[] subscribableContexts) { this.subscribableContexts = subscribableContexts; } http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/DependencyContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/DependencyContext.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/DependencyContext.java index fe7331d..2b31729 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/DependencyContext.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/DependencyContext.java @@ -19,19 +19,18 @@ package org.apache.stratos.cloud.controller.pojo.application; -import java.util.List; public class DependencyContext { - private List<StartupOrderContext> startupOrderContexts; + private StartupOrderContext[] startupOrderContexts; private String killBehaviour; - public List<StartupOrderContext> getStartupOrder() { + public StartupOrderContext[] getStartupOrderContext() { return startupOrderContexts; } - public void setStartupOrder(List<StartupOrderContext> startupOrderContexts) { + public void setStartupOrderContext(StartupOrderContext[] startupOrderContexts) { this.startupOrderContexts = startupOrderContexts; } http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/GroupContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/GroupContext.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/GroupContext.java index 54908c1..fda4bec 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/GroupContext.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/GroupContext.java @@ -19,8 +19,6 @@ package org.apache.stratos.cloud.controller.pojo.application; -import java.util.List; - public class GroupContext { private String name; @@ -31,9 +29,9 @@ public class GroupContext { private String autoscalingPolicy; - private List<SubscribableContext> subscribableContexts; + private SubscribableContext[] subscribableContexts; - private List<GroupContext> groupContexts; + private GroupContext[] groupContexts; public String getName() { @@ -68,19 +66,19 @@ public class GroupContext { this.autoscalingPolicy = autoscalingPolicy; } - public List<SubscribableContext> getSubscribableContexts() { + public SubscribableContext[] getSubscribableContexts() { return subscribableContexts; } - public void setSubscribableContexts(List<SubscribableContext> subscribableContexts) { + public void setSubscribableContexts(SubscribableContext[] subscribableContexts) { this.subscribableContexts = subscribableContexts; } - public List<GroupContext> getGroupContexts() { + public GroupContext[] getGroupContexts() { return groupContexts; } - public void setGroupContexts(List<GroupContext> groupContexts) { + public void setGroupContexts(GroupContext[] groupContexts) { this.groupContexts = groupContexts; } } http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/StartupOrderContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/StartupOrderContext.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/StartupOrderContext.java index 1312039..3c2a2da 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/StartupOrderContext.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/StartupOrderContext.java @@ -25,6 +25,10 @@ public class StartupOrderContext { private String after; + public StartupOrderContext () { + + } + public String getStart() { return start; } http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/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 a051cf4..4420b0b 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 @@ -613,6 +613,26 @@ public class TopologyBuilder { } } + public static void handleApplicationDepolyed (ApplicationDataHolder applicationDataHolder) { + + Topology topology = TopologyManager.getTopology(); + try { + TopologyManager.acquireWriteLock(); + + for (Cluster cluster : applicationDataHolder.getClusters()) { + String cartridgeType = cluster.getServiceName(); + topology.getService(cartridgeType).addCluster(cluster); + log.info("Added Cluster " + cluster.toString() + " to Topology for Application with id: " + applicationDataHolder.getApplication().getId()); + } + TopologyManager.updateTopology(topology); + + TopologyEventPublisher.sendApplicationCreatedEvent(applicationDataHolder.getApplication()); + + } finally { + TopologyManager.releaseWriteLock(); + } + } + public static void handleCompositeApplicationCreated(ConfigCompositeApplication messConfigApp) { Topology topology = TopologyManager.getTopology(); http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/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 0ffc0ff..ee10f9d 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 @@ -90,6 +90,15 @@ public class TopologyEventPublisher { } + public static void sendApplicationCreatedEvent (Application application) { + + if(log.isInfoEnabled()) { + log.info("Publishing Application created event: " + application.toString()); + } + + publishEvent(new ApplicationCreatedEvent(application)); + } + public static void sendClusterRemovedEvent(ClusterContext ctxt, String deploymentPolicy) { ClusterRemovedEvent clusterRemovedEvent = new ClusterRemovedEvent(ctxt.getCartridgeType(), ctxt.getClusterId(), deploymentPolicy, ctxt.isLbCluster()); http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/CloudControllerServiceClient.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/CloudControllerServiceClient.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/CloudControllerServiceClient.java index 5c31ff9..92b9da7 100644 --- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/CloudControllerServiceClient.java +++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/CloudControllerServiceClient.java @@ -24,18 +24,11 @@ import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.transport.http.HTTPConstants; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.stratos.cloud.controller.stub.pojo.application.ApplicationContext; +import org.apache.stratos.cloud.controller.stub.*; import org.apache.stratos.cloud.controller.stub.pojo.*; import org.apache.stratos.manager.internal.DataHolder; import org.apache.stratos.manager.utils.CartridgeConstants; -import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidCartridgeDefinitionExceptionException; -import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidCartridgeTypeExceptionException; -import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidClusterExceptionException; -import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidCompositeApplicationDefinitionExceptionException; -import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidIaasProviderExceptionException; -import org.apache.stratos.cloud.controller.stub.CloudControllerServiceStub; -import org.apache.stratos.cloud.controller.stub.CloudControllerServiceUnregisteredCartridgeExceptionException; -import org.apache.stratos.cloud.controller.stub.CloudControllerServiceUnregisteredClusterExceptionException; -import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidServiceGroupExceptionException; import java.rmi.RemoteException; import java.util.Iterator; @@ -126,11 +119,11 @@ public class CloudControllerServiceClient { } - public void deployCompositeApplicationDefinition (CompositeApplicationDefinition compositeApplicationDefinition) - throws RemoteException, CloudControllerServiceInvalidCompositeApplicationDefinitionExceptionException, CloudControllerServiceInvalidIaasProviderExceptionException - { + public void deployApplicationDefinition(ApplicationContext applicationContext) + throws RemoteException, CloudControllerServiceInvalidCompositeApplicationDefinitionExceptionException, + CloudControllerServiceInvalidIaasProviderExceptionException, CloudControllerServiceApplicationDefinitionExceptionException { - stub.deployCompositeApplicationDefinition(compositeApplicationDefinition); + stub.deployApplicationDefinition(applicationContext); } http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java index 4cb77f9..d7418c7 100644 --- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java +++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java @@ -19,7 +19,6 @@ package org.apache.stratos.manager.composite.application.beans; -import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import java.util.List; http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/deployer/DefaultServiceGroupDeployer.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/deployer/DefaultServiceGroupDeployer.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/deployer/DefaultServiceGroupDeployer.java index 9a2ea18..8735ab3 100644 --- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/deployer/DefaultServiceGroupDeployer.java +++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/deployer/DefaultServiceGroupDeployer.java @@ -229,19 +229,24 @@ public class DefaultServiceGroupDeployer implements ServiceGroupDeployer { servicegroup.setCartridges(cartridges); DependencyDefinitions depDefs = serviceGroupDefinition.getDependencies(); - List<StartupOrderDefinition> startDefs = depDefs.getStartupOrder(); - - Dependencies deps = new Dependencies(); - StartupOrder [] startups = new StartupOrder [startDefs.size()]; - for (int i = 0; i < startDefs.size(); i++) { - StartupOrderDefinition stDef = startDefs.get(i); - StartupOrder st = new StartupOrder(); - st.setStart(stDef.getStart()); - st.setAfter(stDef.getAfter()); - startups[i] = st; - } - deps.setStartupOrder(startups); - servicegroup.setDependencies(deps); + if (depDefs != null) { + List<StartupOrderDefinition> startDefs = depDefs.getStartupOrder(); + + Dependencies deps = new Dependencies(); + if (startDefs != null) { + StartupOrder [] startups = new StartupOrder [startDefs.size()]; + for (int i = 0; i < startDefs.size(); i++) { + StartupOrderDefinition stDef = startDefs.get(i); + StartupOrder st = new StartupOrder(); + st.setStart(stDef.getStart()); + st.setAfter(stDef.getAfter()); + startups[i] = st; + } + deps.setStartupOrder(startups); + } + deps.setKillBehaviour(depDefs.getKillBehaviour()); + servicegroup.setDependencies(deps); + } return servicegroup; } @@ -252,23 +257,33 @@ public class DefaultServiceGroupDeployer implements ServiceGroupDeployer { String [] cartridges = serviceGroup.getCartridges(); String [] subGroups = serviceGroup.getSubGroups(); Dependencies deps = serviceGroup.getDependencies(); - StartupOrder [] startupOrders = deps.getStartupOrder(); - - List<String> cartridgesDef = new ArrayList<String>(Arrays.asList(cartridges)); - List<String> subGroupsDef = new ArrayList<String>(Arrays.asList(subGroups)); - DependencyDefinitions depsDef = new DependencyDefinitions(); - List<StartupOrderDefinition> startupsDef = new ArrayList<StartupOrderDefinition>(); - for (StartupOrder startupOrder : startupOrders) { - StartupOrderDefinition astartupDef = new StartupOrderDefinition(); - astartupDef.setAfter(startupOrder.getAfter()); - astartupDef.setStart(startupOrder.getStart()); - startupsDef.add(astartupDef); - } - depsDef.setStartupOrder(startupsDef); - depsDef.setKillBehaviour(deps.getKillBehaviour()); + + if (deps != null) { + DependencyDefinitions depsDef = new DependencyDefinitions(); + StartupOrder [] startupOrders = deps.getStartupOrder(); + if (startupOrders != null && startupOrders.length > 0) { + List<StartupOrderDefinition> startupsDef = new ArrayList<StartupOrderDefinition>(); + for (StartupOrder startupOrder : startupOrders) { + if (startupOrder != null) { + StartupOrderDefinition astartupDef = new StartupOrderDefinition(); + astartupDef.setAfter(startupOrder.getAfter()); + astartupDef.setStart(startupOrder.getStart()); + startupsDef.add(astartupDef); + } + } + + depsDef.setStartupOrder(startupsDef); + } + + depsDef.setKillBehaviour(deps.getKillBehaviour()); + servicegroupDef.setDependencies(depsDef); + } + + List<String> cartridgesDef = new ArrayList<String>(Arrays.asList(cartridges)); + List<String> subGroupsDef = new ArrayList<String>(Arrays.asList(subGroups)); + servicegroupDef.setCartridges(cartridgesDef); servicegroupDef.setSubGroups(subGroupsDef); - servicegroupDef.setDependencies(depsDef); return servicegroupDef; } http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Application.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Application.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Application.java index 5e57a5d..e442996 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Application.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Application.java @@ -27,6 +27,7 @@ import java.util.Map; public class Application implements SubscribableBehavior { + private static final long serialVersionUID = -5092959597171649688L; // Unique id for the Application, defined in Application Definition private String id; // Key used for authentication (with metadata service, etc.) @@ -51,6 +52,11 @@ public class Application implements SubscribableBehavior { } @Override + public void setGroups(Map<String, Group> groupNameToGroup) { + groupMap.putAll(groupNameToGroup); + } + + @Override public Group getGroup(String groupName) { return groupMap.get(groupName); } @@ -76,6 +82,11 @@ public class Application implements SubscribableBehavior { } @Override + public void setClusterIds(Map<String, String> serviceNameToClusterId) { + clusterIdMap.putAll(serviceNameToClusterId); + } + + @Override public String getClusterId(String serviceName) { return clusterIdMap.get(serviceName); } http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java index 08bd262..80a2277 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java @@ -210,5 +210,22 @@ public class Cluster implements Serializable { public void setStatus(ClusterStatus status) { this.status = status; } + + public boolean equals(Object other) { + if(other == null || !(other instanceof Cluster)) { + return false; + } + + if(this == other) { + return true; + } + + Cluster that = (Cluster)other; + return this.clusterId.equals(that.clusterId); + } + + public int hashCode () { + return clusterId.hashCode(); + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/DependencyOrder.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/DependencyOrder.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/DependencyOrder.java index b25b7ad..b5992ad 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/DependencyOrder.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/DependencyOrder.java @@ -32,6 +32,10 @@ public class DependencyOrder { this.startupOrders = new HashSet<StartupOrder>(); } + public void setStartupOrders (Set<StartupOrder> startupOrders) { + this.startupOrders.addAll(startupOrders); + } + public Set<StartupOrder> getStartupOrders() { return startupOrders; } http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Group.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Group.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Group.java index 66cdb66..16ec775 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Group.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Group.java @@ -25,15 +25,20 @@ import java.util.Map; public class Group implements SubscribableBehavior { + private static final long serialVersionUID = 8347096598203655846L; // Name of the Group, specified in Group Definition private String name; // Group alias private String alias; + // Group deployment policy + private String deploymentPolicy; + // Group level autoscaling policy + private String autoscalingPolicy; // Dependency Order private DependencyOrder dependencyOrder; // Sub Group Map, key = Group.name private Map<String, Group> groupMap; - // Cluster Id map, key = service name + // Cluster id map, key = service name private Map<String, String> clusterIdMap; public Group (String name, String alias) { @@ -49,6 +54,11 @@ public class Group implements SubscribableBehavior { } @Override + public void setGroups(Map<String, Group> groupNameToGroup) { + groupMap.putAll(groupNameToGroup); + } + + @Override public Group getGroup(String groupName) { return groupMap.get(groupName); } @@ -74,6 +84,11 @@ public class Group implements SubscribableBehavior { } @Override + public void setClusterIds(Map<String, String> serviceNameToClusterId) { + clusterIdMap.putAll(serviceNameToClusterId); + } + + @Override public String getClusterId(String serviceName) { return clusterIdMap.get(serviceName); } @@ -90,4 +105,37 @@ public class Group implements SubscribableBehavior { public String getAlias() { return alias; } + + public String getDeploymentPolicy() { + return deploymentPolicy; + } + + public void setDeploymentPolicy(String deploymentPolicy) { + this.deploymentPolicy = deploymentPolicy; + } + + public String getAutoscalingPolicy() { + return autoscalingPolicy; + } + + public void setAutoscalingPolicy(String autoscalingPolicy) { + this.autoscalingPolicy = autoscalingPolicy; + } + + public boolean equals(Object other) { + if(other == null || !(other instanceof Group)) { + return false; + } + + if(this == other) { + return true; + } + + Group that = (Group)other; + return this.name.equals(that.name) && this.alias.equals(that.alias); + } + + public int hashCode () { + return name.hashCode() + alias.hashCode(); + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/SubscribableBehavior.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/SubscribableBehavior.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/SubscribableBehavior.java index 05e42d1..b66b0c7 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/SubscribableBehavior.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/SubscribableBehavior.java @@ -21,11 +21,14 @@ package org.apache.stratos.messaging.domain.topology; import java.io.Serializable; import java.util.Collection; +import java.util.Map; public interface SubscribableBehavior extends Serializable { public void addGroup (Group group); + public void setGroups (Map<String, Group> groupNameToGroup); + public Group getGroup (String groupName); public Collection<Group> getGroups (); @@ -36,6 +39,8 @@ public interface SubscribableBehavior extends Serializable { public void addClusterId (String serviceName, String clusterId); + public void setClusterIds (Map<String,String> serviceNameToClusterId); + public String getClusterId (String serviceName); public Collection<String> getClusterIds ();
