http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java ---------------------------------------------------------------------- diff --cc components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java index df8cfd1,5e995da..a72e052 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java @@@ -32,7 -34,8 +34,9 @@@ import org.apache.stratos.autoscaler.ut import org.apache.stratos.autoscaler.util.Serializer; import org.apache.stratos.autoscaler.util.ServiceReferenceHolder; import org.apache.stratos.cloud.controller.stub.deployment.partition.Partition; + import org.apache.stratos.messaging.domain.applications.Application; + import org.apache.stratos.messaging.domain.applications.Applications; +import org.apache.stratos.common.kubernetes.KubernetesGroup; import org.wso2.carbon.registry.core.Registry; import org.wso2.carbon.registry.core.Resource; import org.wso2.carbon.registry.core.exceptions.RegistryException; @@@ -141,6 -144,68 +145,69 @@@ public class RegistryManager } } + ++ + public void persistApplication (Application application) { + + String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants.APPLICATIONS_RESOURCE + + "/" + application.getUniqueIdentifier(); + persist(application, resourcePath); + if(log.isDebugEnabled()) { + log.debug("Application [ " + application.getUniqueIdentifier() + + " ] persisted successfully in the Autoscaler Registry"); + } + } + + public String [] getApplicationResourcePaths () { + Object obj = retrieve(AutoScalerConstants.AUTOSCALER_RESOURCE + + AutoScalerConstants.APPLICATIONS_RESOURCE); + + if (obj != null) { + if (obj instanceof String []) { + return (String []) obj; + } else { + log.warn("Expected object type not found for Applications in Registry"); + return null; + } + } + return null; + } + + public Application getApplication (String applicationResourcePath) { + Object obj = retrieve(applicationResourcePath); + + if (obj != null) { + if (obj instanceof Application) { + return (Application) obj; + } else { + log.warn("Expected object type not found for Application " + applicationResourcePath + " in Registry"); + return null; + } + } + return null; + } + + public void removeApplication (String applicationId) { + delete(AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants.APPLICATIONS_RESOURCE + + "/" + applicationId); + } + + public void persistServiceGroup(ServiceGroup servicegroup) { + if(servicegroup == null || StringUtils.isEmpty(servicegroup.getName())){ + throw new IllegalArgumentException("Service group or group name can not be null"); + } + String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants.SERVICE_GROUP + "/" + servicegroup.getName(); + persist(servicegroup, resourcePath); + if(log.isDebugEnabled()) { + log.debug(String.format("Persisted service group %s at path %s", servicegroup.getName(), resourcePath)); + } + } + + public boolean serviceGroupExist(String serviceGroupName){ + String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants.SERVICE_GROUP + "/" + serviceGroupName; + return this.resourceExist(resourcePath); + } + private Object retrieve(String resourcePath) { try { Resource resource = registryService.get(resourcePath); @@@ -286,99 -353,91 +357,138 @@@ return depPolicyList; } - public void removeAutoscalerPolicy(AutoscalePolicy autoscalePolicy) { - String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants.AS_POLICY_RESOURCE + "/" + autoscalePolicy.getId(); - this.delete(resourcePath); - if (log.isDebugEnabled()) { - log.debug(String.format("Autoscaler policy deleted from registry: [id] %s [name] %s [description] %s", - autoscalePolicy.getId(), autoscalePolicy.getDisplayName(), autoscalePolicy.getDescription())); + public ServiceGroup getServiceGroup(String name) throws Exception{ + String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants.SERVICE_GROUP + "/" + name; + Object serializedObj = registryManager.retrieve(resourcePath); + ServiceGroup group = null; + if (serializedObj != null) { + + Object dataObj = Deserializer.deserializeFromByteArray((byte[]) serializedObj); + if (dataObj instanceof ServiceGroup) { + group = (ServiceGroup) dataObj; + if(log.isDebugEnabled()) { + log.debug(group.toString()); + } + } else { + return null; + } } + return group; } - public void removeDeploymentPolicy(DeploymentPolicy depPolicy) { - String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants.DEPLOYMENT_POLICY_RESOURCE; - this.delete(resourcePath); - if (log.isDebugEnabled()) { - log.debug(String.format("Deployment policy deleted from registry: [id] %s", - depPolicy.getId())); + public ServiceGroup removeServiceGroup(String name) throws Exception{ + String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + + AutoScalerConstants.SERVICE_GROUP + "/" + name; + Object serializedObj = registryManager.retrieve(resourcePath); + ServiceGroup group = null; + if (serializedObj != null) { + Object dataObj = Deserializer.deserializeFromByteArray((byte[]) serializedObj); + if (dataObj instanceof ServiceGroup) { + group = (ServiceGroup) dataObj; + if(log.isDebugEnabled()) { + log.debug(group.toString()); + } + } else { + return null; + } } - } - public void removeNetworkPartition(String networkPartition) { - String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants.NETWORK_PARTITION_LB_HOLDER_RESOURCE; - this.delete(resourcePath); - if (log.isDebugEnabled()) { - log.debug(String.format("Network partition deleted from registry: [id] %s", - networkPartition)); - } + return group; } + public void removeAutoscalerPolicy(AutoscalePolicy autoscalePolicy) { + String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants.AS_POLICY_RESOURCE + "/" + autoscalePolicy.getId(); + this.delete(resourcePath); + if(log.isDebugEnabled()) { + log.debug(String.format("Autoscaler policy deleted from registry: [id] %s [name] %s [description] %s", + autoscalePolicy.getId(), autoscalePolicy.getDisplayName(), autoscalePolicy.getDescription())); + } + + } + + public void removeDeploymentPolicy(DeploymentPolicy depPolicy){ + String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants.DEPLOYMENT_POLICY_RESOURCE; + this.delete(resourcePath); + if(log.isDebugEnabled()) { + log.debug(String.format("Deployment policy deleted from registry: [id] %s" , + depPolicy.getId())); + } + } + + public void removeNetworkPartition(String networkPartition){ + String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants.NETWORK_PARTITION_LB_HOLDER_RESOURCE; + this.delete(resourcePath); + if(log.isDebugEnabled()) { + log.debug(String.format("Network partition deleted from registry: [id] %s" , + networkPartition)); + } + } - - private void delete(String resourcePath) { - try { - registryService.beginTransaction(); - registryService.delete(resourcePath); - registryService.commitTransaction(); - } catch (RegistryException e) { - try { - registryService.rollbackTransaction(); - } catch (RegistryException e1) { - if(log.isErrorEnabled()) { - log.error("Could not rollback transaction", e); - } - } - log.error("Could not delete resource at "+ resourcePath); - throw new AutoScalerException("Could not delete data in registry at " + resourcePath, e); - } + private void delete(String resourcePath) { + try { + registryService.beginTransaction(); + registryService.delete(resourcePath); + registryService.commitTransaction(); + } catch (RegistryException e) { + try { + registryService.rollbackTransaction(); + } catch (RegistryException e1) { + if (log.isErrorEnabled()) { + log.error("Could not rollback transaction", e); + } + } + log.error("Could not delete resource at " + resourcePath); + throw new AutoScalerException("Could not delete data in registry at " + resourcePath, e); + } + + } - } + public void persistKubernetesGroup(KubernetesGroup kubernetesGroup) { + String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants.KUBERNETES_RESOURCE + + "/" + kubernetesGroup.getGroupId(); + persist(kubernetesGroup, resourcePath); + if (log.isDebugEnabled()) { + log.debug(String.format("KubernetesGroup written to registry: [id] %s ", kubernetesGroup.getGroupId())); + } + } + + public List<KubernetesGroup> retrieveKubernetesGroups() { + List<KubernetesGroup> kubernetesGroupList = new ArrayList<KubernetesGroup>(); + RegistryManager registryManager = RegistryManager.getInstance(); + String[] kubernetesGroupResourceList = (String[]) registryManager.retrieve(AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants.KUBERNETES_RESOURCE); + + if (kubernetesGroupResourceList != null) { + KubernetesGroup kubernetesGroup; + for (String resourcePath : kubernetesGroupResourceList) { + Object serializedObj = registryManager.retrieve(resourcePath); + if (serializedObj != null) { + try { + Object dataObj = Deserializer.deserializeFromByteArray((byte[]) serializedObj); + if (dataObj instanceof KubernetesGroup) { + kubernetesGroup = (KubernetesGroup) dataObj; + if (log.isDebugEnabled()) { + log.debug(kubernetesGroup.toString()); + } + kubernetesGroupList.add(kubernetesGroup); + } else { + return null; + } + } catch (Exception e) { + String msg = "Unable to retrieve data from Registry. Hence, any historical Kubernetes groups deployments will not get reflected."; + log.warn(msg, e); + } + } + } + } + return kubernetesGroupList; + } + + public void removeKubernetesGroup(KubernetesGroup kubernetesGroup) { + String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants.KUBERNETES_RESOURCE + "/" + kubernetesGroup.getGroupId(); + this.delete(resourcePath); + if (log.isDebugEnabled()) { + log.debug(String.format("Kubernetes group deleted from registry: [id] %s", kubernetesGroup.getGroupId())); + } + } }
http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java ---------------------------------------------------------------------- diff --cc components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java index 73d85f0,3586420..d828309 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java @@@ -23,9 -23,14 +23,15 @@@ import org.apache.commons.logging.LogFa import org.apache.stratos.autoscaler.AutoscalerContext; import org.apache.stratos.autoscaler.NetworkPartitionContext; import org.apache.stratos.autoscaler.PartitionContext; + import org.apache.stratos.autoscaler.applications.topic.ApplicationBuilder; + import org.apache.stratos.autoscaler.applications.topic.ApplicationsEventPublisher; + import org.apache.stratos.autoscaler.grouping.topic.ClusterStatusEventPublisher; + import org.apache.stratos.autoscaler.monitor.AbstractClusterMonitor; -import org.apache.stratos.autoscaler.monitor.cluster.ClusterMonitor; + import org.apache.stratos.messaging.domain.applications.*; +import org.apache.stratos.autoscaler.grouping.topic.StatusEventPublisher; +import org.apache.stratos.autoscaler.monitor.cluster.VMClusterMonitor; import org.apache.stratos.messaging.domain.topology.*; + import org.apache.stratos.messaging.message.receiver.applications.ApplicationManager; import org.apache.stratos.messaging.message.receiver.topology.TopologyManager; import java.util.Map; http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoScalerConstants.java ---------------------------------------------------------------------- diff --cc components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoScalerConstants.java index b68f16d,3587afe..f5fede9 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoScalerConstants.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoScalerConstants.java @@@ -39,18 -38,12 +39,21 @@@ public final class AutoScalerConstants public static final String NETWORK_PARTITION_LB_HOLDER_RESOURCE = "/network-partitions"; public static final String AS_POLICY_RESOURCE = "/policies/autoscalingPolicies"; public static final String DEPLOYMENT_POLICY_RESOURCE = "/policies/deploymentPolicies"; - + public static final String APPLICATIONS_RESOURCE = "/applications"; /** - * Configs + * Cluster monitoring interval */ + public static final String AUTOSCALER_MONITOR_INTERVAL = "autoscaler.monitorInterval"; + + public static final String SERVICE_GROUP = "/groups"; + public static final String VMService_Cluster_MONITOR_INTERVAL = "autoscaler.monitorInterval.vm.service"; + public static final String VMLb_Cluster_MONITOR_INTERVAL = "autoscaler.monitorInterval.vm.lb"; + public static final String KubernetesService_Cluster_MONITOR_INTERVAL = "autoscaler.monitorInterval.kubernetes.service"; + + /** + * PortRange min max + */ + public static final int PORT_RANGE_MAX = 65535; + public static final int PORT_RANGE_MIN = 1; } http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java ---------------------------------------------------------------------- diff --cc components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java index e7c16fe,835e284..93aa988 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java @@@ -27,8 -22,15 +27,16 @@@ import javax.xml.namespace.QName import org.apache.axiom.om.OMElement; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + import org.apache.stratos.autoscaler.registry.RegistryManager; + import org.apache.stratos.cloud.controller.stub.pojo.Property; import org.apache.stratos.cloud.controller.stub.pojo.Properties; +import org.apache.stratos.cloud.controller.stub.pojo.Property; + import org.apache.stratos.messaging.domain.applications.Application; + import org.apache.stratos.messaging.domain.applications.Applications; + + + import javax.xml.namespace.QName; + import java.util.*; /** * This class contains utility methods used by Autoscaler. http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/CloudControllerService.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/internal/CloudControllerDSComponent.java ---------------------------------------------------------------------- diff --cc components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/internal/CloudControllerDSComponent.java index 604aed8,8aa3d4f..19efc44 --- 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 @@@ -79,20 -78,19 +78,25 @@@ public class CloudControllerDSComponen InstanceStatusEventMessageDelegator delegator = new InstanceStatusEventMessageDelegator(); Thread tdelegator = new Thread(delegator); tdelegator.start(); + if(log.isInfoEnabled()) { + log.info("Instance status message receiver thread started"); + } + ApplicationStatusTopicReceiver applicationStatusTopicReceiver = new ApplicationStatusTopicReceiver(); + Thread appThread = new Thread(applicationStatusTopicReceiver); + clusterStatusTopicReceiver = new ClusterStatusTopicReceiver(); + Thread appThread = new Thread(clusterStatusTopicReceiver); appThread.start(); + if(log.isInfoEnabled()) { + log.info("Application status message receiver thread started"); + if (log.isDebugEnabled()) { + log.debug("Cluster status Receiver thread started"); } - // Register cloud controller service BundleContext bundleContext = context.getBundleContext(); - bundleContext.registerService(CloudControllerService.class.getName(), new CloudControllerServiceImpl(), null); + bundleContext.registerService(CloudControllerService.class.getName(), + new CloudControllerServiceImpl(), null); if(log.isInfoEnabled()) { log.info("Scheduling tasks"); http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/MetaDataHolder.java ---------------------------------------------------------------------- diff --cc components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/MetaDataHolder.java index 662e481,0000000..3db9f71 mode 100644,000000..100644 --- 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 @@@ -1,102 -1,0 +1,99 @@@ +/* + * 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.io.Serializable; +import java.util.Properties; + +/** + * Holds payload/meta data related to a cluster + */ + - public class MetaDataHolder implements Serializable { - - private static final long serialVersionUID = -3015788285718847360L; ++public class MetaDataHolder { + + private String appId; + + private String groupName; + + private String clusterId; + + private Properties properties; + + public MetaDataHolder (String appId, String clusterId) { + + this.appId = appId; + this.clusterId = clusterId; + } + + 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/89fb37af/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java ---------------------------------------------------------------------- diff --cc components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java index 2c01be7,0ec8f01..eebc077 --- 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 @@@ -23,16 -22,14 +23,15 @@@ import org.apache.commons.logging.Log import org.apache.commons.logging.LogFactory; import org.apache.stratos.cloud.controller.exception.InvalidCartridgeTypeException; import org.apache.stratos.cloud.controller.exception.InvalidMemberException; - import org.apache.stratos.cloud.controller.pojo.*; import org.apache.stratos.cloud.controller.pojo.Cartridge; - import org.apache.stratos.cloud.controller.pojo.payload.MetaDataHolder; + import org.apache.stratos.cloud.controller.pojo.*; import org.apache.stratos.cloud.controller.publisher.CartridgeInstanceDataPublisher; - import org.apache.stratos.cloud.controller.registry.RegistryManager; import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder; import org.apache.stratos.cloud.controller.util.CloudControllerUtil; +import org.apache.stratos.common.constants.StratosConstants; import org.apache.stratos.messaging.domain.topology.*; - import org.apache.stratos.messaging.event.application.status.*; + import org.apache.stratos.messaging.event.applications.ApplicationTerminatedEvent; + import org.apache.stratos.messaging.event.cluster.status.*; import org.apache.stratos.messaging.event.instance.status.InstanceActivatedEvent; import org.apache.stratos.messaging.event.instance.status.InstanceMaintenanceModeEvent; import org.apache.stratos.messaging.event.instance.status.InstanceReadyToShutdownEvent; @@@ -57,10 -54,10 +56,10 @@@ public class TopologyBuilder Service service; Topology topology = TopologyManager.getTopology(); if (cartridgeList == null) { - log.warn(String.format("Cartridge list is empty")); - return; + log.warn(String.format("Cartridge list is empty")); + return; } - + try { TopologyManager.acquireWriteLock(); @@@ -168,20 -229,10 +231,19 @@@ } finally { TopologyManager.releaseWriteLock(); - } - **/ + }*/ } - public static void handleClusterRemoved(ClusterContext ctxt) { + + private static void setKubernetesCluster(Cluster cluster) { + boolean isKubernetesCluster = (cluster.getProperties().getProperty(StratosConstants.KUBERNETES_CLUSTER_ID) != null); + if (log.isDebugEnabled()) { + log.debug(" Kubernetes Cluster ["+ isKubernetesCluster + "] "); + } + cluster.setKubernetesCluster(isKubernetesCluster); + } + + public static void handleClusterRemoved(ClusterContext ctxt) { Topology topology = TopologyManager.getTopology(); Service service = topology.getService(ctxt.getCartridgeType()); String deploymentPolicy; @@@ -545,122 -567,8 +607,118 @@@ } } - public static synchronized void handleApplicationDeployed(Application application, - Set<ApplicationClusterContext> applicationClusterContexts, - Set<MetaDataHolder> metaDataHolders) { - - + public static void handleClusterActivatedEvent(ClusterStatusClusterActivatedEvent clusterActivatedEvent) { Topology topology = TopologyManager.getTopology(); + try { + TopologyManager.acquireWriteLock(); + + if (topology.applicationExists(application.getUniqueIdentifier())) { + log.warn("Application with id [ " + application.getUniqueIdentifier() + " ] already exists in Topology"); + return; + } + List<Cluster> clusters = new ArrayList<Cluster>(); + for (ApplicationClusterContext applicationClusterContext : applicationClusterContexts) { + Cluster cluster = new Cluster(applicationClusterContext.getCartridgeType(), + applicationClusterContext.getClusterId(), applicationClusterContext.getDeploymentPolicyName(), + applicationClusterContext.getAutoscalePolicyName(), application.getUniqueIdentifier()); + //cluster.setStatus(Status.Created); + cluster.addHostName(applicationClusterContext.getHostName()); + cluster.setTenantRange(applicationClusterContext.getTenantRange()); + cluster.setLbCluster(applicationClusterContext.isLbCluster()); + cluster.setKubernetesCluster(applicationClusterContext.isKubernetesCluster()); + cluster.setProperties(CloudControllerUtil.toJavaUtilProperties(applicationClusterContext.getProperties())); + clusters.add(cluster); + + Service service = topology.getService(applicationClusterContext.getCartridgeType()); + if (service != null) { + service.addCluster(cluster); + log.info("Added Cluster " + cluster.toString() + " to Topology for Application with id: " + application.getUniqueIdentifier()); + } else { + log.error("Service " + applicationClusterContext.getCartridgeType() + " not found"); + return; + } + } + + // add to Topology and update + topology.addApplication(application); + TopologyManager.updateTopology(topology); + + log.info("Application with id [ " + application.getUniqueIdentifier() + " ] added to Topology successfully"); + org.apache.stratos.messaging.event.topology.ApplicationCreatedEvent applicationCreatedEvent = new org.apache.stratos.messaging.event.topology.ApplicationCreatedEvent(application, clusters); + TopologyEventPublisher.sendApplicationCreatedEvent(applicationCreatedEvent); + + } finally { + TopologyManager.releaseWriteLock(); + } + } + + public static synchronized void handleApplicationUndeployed(String applicationId) { + + Set<ClusterDataHolder> clusterData; + + // update the Application and Cluster Statuses as 'Terminating' + TopologyManager.acquireWriteLock(); + + try { + + Topology topology = TopologyManager.getTopology(); + + if (!topology.applicationExists(applicationId)) { + log.warn("Application with id [ " + applicationId + " ] doesn't exist in Topology"); + return; + } + + Application application = topology.getApplication(applicationId); + // check and update application status to 'Terminating' + if (!application.isStateTransitionValid(ApplicationStatus.Terminating)) { + log.error("Invalid state transfer from " + application.getStatus() + " to " + ApplicationStatus.Terminating); + } + // for now anyway update the status forcefully + application.setStatus(ApplicationStatus.Terminating); + + // update all the Clusters' statuses to 'Terminating' + clusterData = application.getClusterDataRecursively(); + for (ClusterDataHolder clusterDataHolder : clusterData) { + Service service = topology.getService(clusterDataHolder.getServiceType()); + if (service != null) { + Cluster aCluster = service.getCluster(clusterDataHolder.getClusterId()); + if (aCluster != null) { + // validate state transition + if (!aCluster.isStateTransitionValid(ClusterStatus.Terminating)) { + log.error("Invalid state transfer from " + aCluster.getStatus() + " to " + + ClusterStatus.Terminating); + } + // for now anyway update the status forcefully + aCluster.setStatus(ClusterStatus.Terminating); + + } else { + log.warn("Unable to find Cluster with cluster id " + clusterDataHolder.getClusterId() + + " in Topology"); + } + + } else { + log.warn("Unable to remove cluster with cluster id: " + clusterDataHolder.getClusterId() + " from Topology, " + + " associated Service [ " + clusterDataHolder.getServiceType() + " ] not found"); + } + } + + // update all Group's statuses to 'Terminating' + if (application.getGroups() != null) { + updateGroupStatusesRecursively(GroupStatus.Terminating, application.getGroups()); + } + + TopologyManager.updateTopology(topology); + + } finally { + TopologyManager.releaseWriteLock(); + } + + TopologyEventPublisher.sendApplicationUndeployedEvent(applicationId, clusterData); + } + + + public static void handleClusterActivatedEvent(AppStatusClusterActivatedEvent clusterActivatedEvent) { + Topology topology = TopologyManager.getTopology(); Service service = topology.getService(clusterActivatedEvent.getServiceName()); //update the status of the cluster if (service == null) { http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java ---------------------------------------------------------------------- diff --cc components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java index b561afe,3f58080..aff2b6d --- 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 @@@ -44,53 -43,57 +46,70 @@@ import java.util.Set public class TopologyEventPublisher { private static final Log log = LogFactory.getLog(TopologyEventPublisher.class); - - public static void sendServiceCreateEvent(List<Cartridge> cartridgeList) { - ServiceCreatedEvent serviceCreatedEvent; - for(Cartridge cartridge : cartridgeList) { - serviceCreatedEvent = new ServiceCreatedEvent(cartridge.getType(), (cartridge.isMultiTenant() ? ServiceType.MultiTenant : ServiceType.SingleTenant)); - - // Add ports to the event - Port port; - List<PortMapping> portMappings = cartridge.getPortMappings(); - for(PortMapping portMapping : portMappings) { - port = new Port(portMapping.getProtocol(), - Integer.parseInt(portMapping.getPort()), - Integer.parseInt(portMapping.getProxyPort())); - serviceCreatedEvent.addPort(port); - } - - if(log.isInfoEnabled()) { - log.info(String.format("Publishing service created event: [service] %s", cartridge.getType())); - } - publishEvent(serviceCreatedEvent); - } - } - - public static void sendServiceRemovedEvent(List<Cartridge> cartridgeList) { - ServiceRemovedEvent serviceRemovedEvent; - for(Cartridge cartridge : cartridgeList) { - serviceRemovedEvent = new ServiceRemovedEvent(cartridge.getType()); - if(log.isInfoEnabled()) { - log.info(String.format("Publishing service removed event: [service] %s", serviceRemovedEvent.getServiceName())); - } - publishEvent(serviceRemovedEvent); - } - } - + public static void sendServiceCreateEvent(List<Cartridge> cartridgeList) { + ServiceCreatedEvent serviceCreatedEvent; + for (Cartridge cartridge : cartridgeList) { + serviceCreatedEvent = new ServiceCreatedEvent(cartridge.getType(), + (cartridge.isMultiTenant() ? ServiceType.MultiTenant + : ServiceType.SingleTenant)); + + // Add ports to the event + Port port; + List<PortMapping> portMappings = cartridge.getPortMappings(); + for (PortMapping portMapping : portMappings) { + port = new Port(portMapping.getProtocol(), + Integer.parseInt(portMapping.getPort()), + Integer.parseInt(portMapping.getProxyPort())); + serviceCreatedEvent.addPort(port); + } + + if (log.isInfoEnabled()) { + log.info(String.format( + "Publishing service created event: [service] %s", + cartridge.getType())); + } + publishEvent(serviceCreatedEvent); + } + } + + public static void sendServiceRemovedEvent(List<Cartridge> cartridgeList) { + ServiceRemovedEvent serviceRemovedEvent; + for (Cartridge cartridge : cartridgeList) { + serviceRemovedEvent = new ServiceRemovedEvent(cartridge.getType()); + if (log.isInfoEnabled()) { + log.info(String.format( + "Publishing service removed event: [service] %s", + serviceRemovedEvent.getServiceName())); + } + publishEvent(serviceRemovedEvent); + } + } + + public static void sendClusterCreatedEvent(String appId, String serviceName, String clusterId) { + ClusterCreatedEvent clusterCreatedEvent = new ClusterCreatedEvent(appId, serviceName, clusterId); + + if (log.isInfoEnabled()) { + log.info("Publishing cluster created event: " + clusterId); + } + publishEvent(clusterCreatedEvent); + } + public static void sendClusterResetEvent(String appId, String serviceName, String clusterId) { + ClusterResetEvent clusterResetEvent = new ClusterResetEvent(appId,serviceName, clusterId); + + if(log.isInfoEnabled()) { + log.info("Publishing cluster reset event: " + clusterId); + } + publishEvent(clusterResetEvent); + } + + public static void sendClusterCreatedEvent(Cluster cluster) { + ClusterCreatedEvent clusterCreatedEvent = new ClusterCreatedEvent(cluster); + + if(log.isInfoEnabled()) { + log.info("Publishing cluster created event: " + cluster.getClusterId()); + } + publishEvent(clusterCreatedEvent); + } public static void sendApplicationCreatedEvent (ApplicationCreatedEvent applicationCreatedEvent) { http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/AutoscalerServiceClient.java ---------------------------------------------------------------------- diff --cc components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/AutoscalerServiceClient.java index c1f0df8,7e33897..27c1640 --- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/AutoscalerServiceClient.java +++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/AutoscalerServiceClient.java @@@ -24,14 -24,12 +24,19 @@@ import org.apache.axis2.context.Configu import org.apache.axis2.transport.http.HTTPConstants; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.stratos.autoscaler.stub.*; +import org.apache.stratos.autoscaler.stub.deployment.policy.DeploymentPolicy; +import org.apache.stratos.autoscaler.stub.kubernetes.KubernetesGroup; +import org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost; +import org.apache.stratos.autoscaler.stub.kubernetes.KubernetesMaster; +import org.apache.stratos.autoscaler.stub.policy.model.AutoscalePolicy; + import org.apache.stratos.autoscaler.applications.pojo.stub.ApplicationContext; + import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy; + import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy; + import org.apache.stratos.autoscaler.stub.*; + import org.apache.stratos.autoscaler.stub.pojo.ServiceGroup; import org.apache.stratos.cloud.controller.stub.deployment.partition.Partition; +import org.apache.stratos.cloud.controller.stub.pojo.Properties; import org.apache.stratos.manager.internal.DataHolder; import org.apache.stratos.manager.utils.CartridgeConstants; @@@ -220,64 -212,21 +225,83 @@@ public class AutoscalerServiceClient } + public ServiceGroup getServiceGroup(String serviceGroupDefinitionName) throws RemoteException { + return stub.getServiceGroup(serviceGroupDefinitionName); + } + + public void deployServiceGroup(ServiceGroup serviceGroup) throws AutoScalerServiceInvalidServiceGroupExceptionException, RemoteException { + stub.deployServiceGroup(serviceGroup); + } + + public void deployApplication (ApplicationContext applicationContext) throws + AutoScalerServiceApplicationDefinitionExceptionException, RemoteException { + stub.deployApplicationDefinition(applicationContext); + } + + public void undeployApplication (String applicationId, int tenantId, String tenantDomain) throws + AutoScalerServiceApplicationDefinitionExceptionException, RemoteException { + stub.unDeployApplicationDefinition(applicationId, tenantId, tenantDomain); + } ++ ++ + public String getServiceLBClusterId(String serviceType, String deploymentPolicy) throws RemoteException { + return stub.getServiceLBClusterId(serviceType, deploymentPolicy); + } + + public boolean deployKubernetesGroup(KubernetesGroup kubernetesGroup) throws RemoteException, + AutoScalerServiceInvalidKubernetesGroupExceptionException { + return stub.addKubernetesGroup(kubernetesGroup); + } + + public boolean deployKubernetesHost(String kubernetesGroupId, KubernetesHost kubernetesHost) + throws RemoteException, AutoScalerServiceInvalidKubernetesHostExceptionException, + AutoScalerServiceNonExistingKubernetesGroupExceptionException { + + return stub.addKubernetesHost(kubernetesGroupId, kubernetesHost); + } + + public boolean updateKubernetesMaster(KubernetesMaster kubernetesMaster) + throws RemoteException, AutoScalerServiceInvalidKubernetesMasterExceptionException, + AutoScalerServiceNonExistingKubernetesMasterExceptionException { + return stub.updateKubernetesMaster(kubernetesMaster); + } + + public KubernetesGroup[] getAvailableKubernetesGroups() throws RemoteException { + return stub.getAllKubernetesGroups(); + } + + public KubernetesGroup getKubernetesGroup(String kubernetesGroupId) + throws RemoteException, AutoScalerServiceNonExistingKubernetesGroupExceptionException { + return stub.getKubernetesGroup(kubernetesGroupId); + } + + public boolean undeployKubernetesGroup(String kubernetesGroupId) + throws RemoteException, AutoScalerServiceNonExistingKubernetesGroupExceptionException { + return stub.removeKubernetesGroup(kubernetesGroupId); + } + + public boolean undeployKubernetesHost(String kubernetesHostId) + throws RemoteException, AutoScalerServiceNonExistingKubernetesHostExceptionException { + return stub.removeKubernetesHost(kubernetesHostId); + } + + public KubernetesHost[] getKubernetesHosts(String kubernetesGroupId) + throws RemoteException, AutoScalerServiceNonExistingKubernetesGroupExceptionException { + return stub.getHostsForKubernetesGroup(kubernetesGroupId); + } + + public KubernetesMaster getKubernetesMaster(String kubernetesGroupId) + throws RemoteException, AutoScalerServiceNonExistingKubernetesGroupExceptionException { + return stub.getMasterForKubernetesGroup(kubernetesGroupId); + } + + public boolean updateKubernetesHost(KubernetesHost kubernetesHost) + throws RemoteException, AutoScalerServiceInvalidKubernetesHostExceptionException, + AutoScalerServiceNonExistingKubernetesHostExceptionException { + return stub.updateKubernetesHost(kubernetesHost); + } + + public void updateClusterMonitor(String clusterId, Properties properties) throws RemoteException, AutoScalerServiceInvalidArgumentExceptionException { + stub.updateClusterMonitor(clusterId, properties); + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/CloudControllerServiceClient.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/DefaultCompositeApplicationParser.java ---------------------------------------------------------------------- diff --cc components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/DefaultCompositeApplicationParser.java index c16c248,38956be..c59dd74 --- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/DefaultCompositeApplicationParser.java +++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/DefaultCompositeApplicationParser.java @@@ -24,10 -24,12 +24,9 @@@ import org.apache.commons.logging.Log import org.apache.commons.logging.LogFactory; import org.apache.stratos.cloud.controller.stub.CloudControllerServiceUnregisteredCartridgeExceptionException; import org.apache.stratos.manager.client.CloudControllerServiceClient; -import org.apache.stratos.manager.composite.application.beans.ApplicationDefinition; -import org.apache.stratos.manager.composite.application.beans.GroupDefinition; -import org.apache.stratos.manager.composite.application.beans.SubscribableDefinition; -import org.apache.stratos.manager.composite.application.beans.SubscribableInfo; +import org.apache.stratos.manager.composite.application.beans.*; import org.apache.stratos.manager.composite.application.structure.CompositeAppContext; import org.apache.stratos.manager.composite.application.structure.GroupContext; - import org.apache.stratos.manager.composite.application.structure.StartupOrder; import org.apache.stratos.manager.composite.application.structure.SubscribableContext; import org.apache.stratos.manager.composite.application.utils.ApplicationUtils; import org.apache.stratos.manager.exception.CompositeApplicationDefinitionException; @@@ -213,17 -215,8 +211,17 @@@ public class DefaultCompositeApplicatio startupOrders = startupOrderList.toArray(startupOrders); compositeAppContext.setStartupOrders(startupOrders); - compositeAppContext.setKillBehaviour(compositeAppDefinition.getComponents().getDependencies().getKillBehaviour()); + compositeAppContext.setKillBehaviour(compositeAppDefinition.getComponents().getDependencies().getTerminationBehaviour()); } + + // Set application properties + if(compositeAppDefinition.getProperty() != null) { + Properties properties = new Properties(); + for(PropertyBean propertyBean : compositeAppDefinition.getProperty()) { + properties.put(propertyBean.getName(), propertyBean.getValue()); + } + compositeAppContext.setProperties(properties); + } } return compositeAppContext; http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java ---------------------------------------------------------------------- diff --cc components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java index 0000000,3c2814f..0ede0f1 mode 000000,100644..100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java @@@ -1,0 -1,212 +1,212 @@@ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + package org.apache.stratos.messaging.domain.applications; + + import java.io.Serializable; + import java.util.*; + + /** + * Abstraction for a an entity that can have child entities - * in an Application withing the Topology ++ * in an Application within the Topology + */ + + public abstract class ParentComponent implements Serializable { + + // Dependency Order + private DependencyOrder dependencyOrder; + // Group Map, key = Group.alias + private Map<String, Group> aliasToGroupMap; + // Cluster Id map, key = subscription alias for the cartridge type + private Map<String, ClusterDataHolder> aliasToClusterDataMap; + // Application status + + public ParentComponent () { + aliasToGroupMap = new HashMap<String, Group>(); + aliasToClusterDataMap = new HashMap<String, ClusterDataHolder>(); + } + + /** + * This method should be implemented in each concrete child class + * to return the unique identifier for each implementation + * ex.: group alias for a Group, app id for an Application + * + * @return unique identifier String + */ + public abstract String getUniqueIdentifier (); + + /** + * Adds a group + * + * @param group Group instance to be added + */ + public void addGroup(Group group) { + aliasToGroupMap.put(group.getUniqueIdentifier(), group); + } + + /** + * Setter for Group alias to Group map + * + * @param groupAliasToGroup Map, key = alias given to the Group, value = Group + */ + public void setGroups(Map<String, Group> groupAliasToGroup) { + aliasToGroupMap.putAll(groupAliasToGroup); + } + + /** + * Get the Group for the given alias in the context of the parent entity. + * Will not search recursively in the nested levels. + * + * @param groupAlias alias of the Group + * @return Group, if exists for the given alias, else null + */ + public Group getGroup(String groupAlias) { + return aliasToGroupMap.get(groupAlias); + } + + /** + * Get the Group for the given alias in the context of the parent entity. + * Will search recursively in the nested levels. + * + * @param groupAlias alias of the Group + * @return Group, if exists for the given alias, else null + */ + public Group getGroupRecursively(String groupAlias) { + + return travereAndCheckRecursively(aliasToGroupMap, groupAlias); + } + + private Group travereAndCheckRecursively (Map<String,Group> aliasToGroupMap, String groupAlias) { + + if (aliasToGroupMap.containsKey(groupAlias)) { + synchronized (aliasToGroupMap) { + if (aliasToGroupMap.containsKey(groupAlias)) { + return aliasToGroupMap.get(groupAlias); + } + } + } else { + for (Group group : aliasToGroupMap.values()) { + return travereAndCheckRecursively(group.getAliasToGroupMap(), groupAlias); + } + } + + return null; + } + + /** + * Getter for alias to Group map + * Will not search recursively in the nested levels. + * + * @return Map, key = alias given to the Group, value = Group + */ + public Map<String, Group> getAliasToGroupMap() { + return this.aliasToGroupMap; + } + + /** + * Getter for cluster alias to ClusterData map for this level + * + * @return Map, key = alias given to the cluster, value = ClusterData object + */ + public Map<String, ClusterDataHolder> getClusterDataMap() { + return this.aliasToClusterDataMap; + } + + /** + * Collection of Groups in this level + * + * @return Group Collection object, empty if no Groups are found + */ + public Collection<Group> getGroups() { + return aliasToGroupMap.values(); + } + + /** + * Setter for Dependency Order + * + * @param dependencyOrder Dependency Order object + */ + public void setDependencyOrder(DependencyOrder dependencyOrder) { + this.dependencyOrder = dependencyOrder; + } + + /** + * Getter for Dependency Order for this level + * + * @return Dependency Order object + */ + public DependencyOrder getDependencyOrder() { + return dependencyOrder; + } + + /** + * Setter for alias to Cluster Data map + * + * @param aliasToClusterData Map, key = alias given to the cluster, value = ClusterData object + */ + public void setClusterData(Map<String, ClusterDataHolder> aliasToClusterData) { + this.aliasToClusterDataMap.putAll(aliasToClusterData); + } + + /** + * Getter for Cluster Data instance for the given alias + * Will not search recursively in the nested levels. + * + * @param alias + * @return + */ + public ClusterDataHolder getClusterData(String alias) { + return aliasToClusterDataMap.get(alias); + } + + /** + * Collects the Cluster Data for the parent component and all the + * child components recursively + * + * @return Set of ClusterDataHolder objects if available, else null + */ + public Set<ClusterDataHolder> getClusterDataRecursively () { + + Set<ClusterDataHolder> appClusterData = new HashSet<ClusterDataHolder>(); + + // get top level Cluster Data + if (this.aliasToClusterDataMap != null && !this.aliasToClusterDataMap.isEmpty()) { + appClusterData.addAll(this.aliasToClusterDataMap.values()); + } + + // find other nested Cluster Data (in the Groups) + if (getGroups() != null) { + getClusterData(appClusterData, getGroups()); + } + + return appClusterData; + } + + private void getClusterData (Set<ClusterDataHolder> clusterData, Collection<Group> groups) { + + for (Group group : groups) { + if (group.getClusterDataMap() != null && !group.getClusterDataMap().isEmpty()) { + clusterData.addAll(group.getClusterDataMap().values()); + if (group.getGroups() != null) { + getClusterData(clusterData, group.getGroups()); + } + } + } + } + } http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/applications/ApplicationsEventMessageListener.java ---------------------------------------------------------------------- diff --cc components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/applications/ApplicationsEventMessageListener.java index 0000000,936c174..e53e083 mode 000000,100644..100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/applications/ApplicationsEventMessageListener.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/applications/ApplicationsEventMessageListener.java @@@ -1,0 -1,54 +1,74 @@@ + /* + * 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.messaging.message.receiver.applications; ++package org.apache.stratos.messaging.message.receiver.application.status; + ++import org.apache.activemq.command.ActiveMQTextMessage; + import org.apache.commons.logging.Log; + import org.apache.commons.logging.LogFactory; ++import org.apache.stratos.messaging.util.Constants; ++import org.apache.stratos.messaging.util.Util; ++import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; ++import org.eclipse.paho.client.mqttv3.MqttCallback; ++import org.eclipse.paho.client.mqttv3.MqttMessage; + + import javax.jms.JMSException; + import javax.jms.Message; + import javax.jms.MessageListener; + import javax.jms.TextMessage; + -public class ApplicationsEventMessageListener implements MessageListener { - private static final Log log = LogFactory.getLog(ApplicationsEventMessageListener.class); ++public class ApplicationStatusEventMessageListener implements MqttCallback { ++ private static final Log log = LogFactory.getLog(ApplicationStatusEventMessageListener.class); + - private ApplicationsEventMessageQueue messageQueue; ++ private ApplicationStatusEventMessageQueue messageQueue; + - public ApplicationsEventMessageListener(ApplicationsEventMessageQueue messageQueue) { ++ public ApplicationStatusEventMessageListener(ApplicationStatusEventMessageQueue messageQueue) { + this.messageQueue = messageQueue; + } + + @Override - public void onMessage(Message message) { - if (message instanceof TextMessage) { - TextMessage receivedMessage = (TextMessage) message; - try { - if (log.isDebugEnabled()) { - log.debug(String.format("Tenant message received: %s", ((TextMessage) message).getText())); - } - // Add received message to the queue - messageQueue.add(receivedMessage); - - } catch (JMSException e) { - log.error(e.getMessage(), e); ++ public void connectionLost(Throwable throwable) { ++ log.warn("Connection is lost", throwable); ++ } ++ ++ @Override ++ public void deliveryComplete(IMqttDeliveryToken deliveryToken) { ++ if (log.isDebugEnabled()) { ++ log.debug(String.format("Message delivery is complete: %s", ++ ((deliveryToken != null) ? deliveryToken.toString() : ""))); ++ } ++ } ++ ++ @Override ++ public void messageArrived(String topicName, MqttMessage message) throws Exception { ++ TextMessage textMessage = new ActiveMQTextMessage(); ++ textMessage.setText(new String(message.getPayload())); ++ textMessage.setStringProperty(Constants.EVENT_CLASS_NAME, Util.getEventNameForTopic(topicName)); ++ ++ try { ++ if (log.isDebugEnabled()) { ++ log.debug(String.format("Tenant message received: %s", textMessage.getText())); + } ++ // Add received message to the queue ++ messageQueue.add(textMessage); ++ ++ } catch (JMSException e) { ++ log.error(e.getMessage(), e); + } + } + } http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java ---------------------------------------------------------------------- diff --cc components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java index 172f252,cb7d9b3..212a5d0 --- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java +++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java @@@ -20,16 -20,12 +20,20 @@@ package org.apache.stratos.rest.endpoint.bean.util.converter; import org.apache.commons.lang.StringUtils; +import org.apache.stratos.autoscaler.stub.kubernetes.PropertiesE; +import org.apache.stratos.autoscaler.stub.kubernetes.PropertyE; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.stratos.cloud.controller.pojo.application.xsd.ApplicationContext; +import org.apache.stratos.cloud.controller.pojo.application.xsd.ComponentContext; +import org.apache.stratos.cloud.controller.pojo.application.xsd.DependencyContext; +import org.apache.stratos.cloud.controller.pojo.application.xsd.GroupContext; +import org.apache.stratos.cloud.controller.pojo.application.xsd.SubscribableContext; +import org.apache.stratos.cloud.controller.pojo.application.xsd.SubscribableInfoContext; + import org.apache.stratos.autoscaler.applications.pojo.stub.DependencyContext; + import org.apache.stratos.autoscaler.applications.pojo.stub.GroupContext; + import org.apache.stratos.autoscaler.applications.pojo.stub.SubscribableContext; + import org.apache.stratos.autoscaler.applications.pojo.stub.SubscribableInfoContext; import org.apache.stratos.cloud.controller.stub.pojo.*; import org.apache.stratos.manager.composite.application.beans.ApplicationDefinition; import org.apache.stratos.manager.composite.application.beans.GroupDefinition; @@@ -725,177 -677,16 +729,177 @@@ public class PojoConverter for (Service service : services) { serviceDefinitionBeans.add(convertToServiceDefinitionBean(service)); } - return serviceDefinitionBeans; } - - private static Log log = LogFactory.getLog(PojoConverter.class); - public static org.apache.stratos.autoscaler.applications.pojo.stub.ApplicationContext - convertApplicationBeanToApplicationContext (ApplicationDefinition compositeAppDefinition) { + public static org.apache.stratos.autoscaler.stub.kubernetes.KubernetesGroup convertToASKubernetesGroupPojo(KubernetesGroup kubernetesGroupBean) { + + org.apache.stratos.autoscaler.stub.kubernetes.KubernetesGroup kubernetesGroup = new + org.apache.stratos.autoscaler.stub.kubernetes.KubernetesGroup(); + + kubernetesGroup.setGroupId(kubernetesGroupBean.getGroupId()); + kubernetesGroup.setDescription(kubernetesGroupBean.getDescription()); + kubernetesGroup.setKubernetesMaster(convertToASKubernetesMasterPojo(kubernetesGroupBean.getKubernetesMaster())); + kubernetesGroup.setPortRange(convertToASPortRange(kubernetesGroupBean.getPortRange())); + kubernetesGroup.setKubernetesHosts(convertToASKubernetesHostsPojo(kubernetesGroupBean.getKubernetesHosts())); + kubernetesGroup.setProperties((getASProperties(kubernetesGroupBean.getProperty()))); + + return kubernetesGroup; + } + + private static org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost[] convertToASKubernetesHostsPojo(List<KubernetesHost> kubernetesHosts) { + if (kubernetesHosts == null || kubernetesHosts.isEmpty()) { + return null; + } + int kubernetesHostCount = kubernetesHosts.size(); + org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost[] + kubernetesHostsArr = new org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost[kubernetesHostCount]; + for (int i = 0; i < kubernetesHostCount; i++) { + KubernetesHost kubernetesHostBean = kubernetesHosts.get(i); + kubernetesHostsArr[i] = convertToASKubernetesHostPojo(kubernetesHostBean); + } + return kubernetesHostsArr; + } + + + private static org.apache.stratos.autoscaler.stub.kubernetes.PortRange convertToASPortRange(PortRange portRangeBean) { + if (portRangeBean == null) { + return null; + } + org.apache.stratos.autoscaler.stub.kubernetes.PortRange + portRange = new org.apache.stratos.autoscaler.stub.kubernetes.PortRange(); + portRange.setLower(portRangeBean.getLower()); + portRange.setUpper(portRangeBean.getUpper()); + return portRange; + } + + public static org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost convertToASKubernetesHostPojo(KubernetesHost kubernetesHostBean) { + if (kubernetesHostBean == null) { + return null; + } + + org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost + kubernetesHost = new org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost(); + kubernetesHost.setHostId(kubernetesHostBean.getHostId()); + kubernetesHost.setHostIpAddress(kubernetesHostBean.getHostIpAddress()); + kubernetesHost.setHostname(kubernetesHostBean.getHostname()); + kubernetesHost.setProperties(getASProperties(kubernetesHostBean.getProperty())); + + return kubernetesHost; + } + + public static org.apache.stratos.autoscaler.stub.kubernetes.KubernetesMaster convertToASKubernetesMasterPojo(KubernetesMaster kubernetesMasterBean) { + if (kubernetesMasterBean == null) { + return null; + } + + org.apache.stratos.autoscaler.stub.kubernetes.KubernetesMaster + kubernetesMaster = new org.apache.stratos.autoscaler.stub.kubernetes.KubernetesMaster(); + kubernetesMaster.setHostId(kubernetesMasterBean.getHostId()); + kubernetesMaster.setHostIpAddress(kubernetesMasterBean.getHostIpAddress()); + kubernetesMaster.setHostname(kubernetesMasterBean.getHostname()); + kubernetesMaster.setEndpoint(kubernetesMasterBean.getEndpoint()); + kubernetesMaster.setProperties(getASProperties(kubernetesMasterBean.getProperty())); + + return kubernetesMaster; + } + + public static KubernetesGroup[] populateKubernetesGroupsPojo(org.apache.stratos.autoscaler.stub.kubernetes.KubernetesGroup[] kubernetesGroups) { + + if (kubernetesGroups == null){ + return null; + } + KubernetesGroup[] kubernetesGroupsBean = new KubernetesGroup[kubernetesGroups.length]; + for (int i = 0; i < kubernetesGroups.length; i++){ + kubernetesGroupsBean[i] = populateKubernetesGroupPojo(kubernetesGroups[i]); + } + return kubernetesGroupsBean; + } + + public static KubernetesGroup populateKubernetesGroupPojo(org.apache.stratos.autoscaler.stub.kubernetes.KubernetesGroup kubernetesGroup) { + if (kubernetesGroup == null){ + return null; + } + KubernetesGroup kubernetesGroupBean = new KubernetesGroup(); + kubernetesGroupBean.setGroupId(kubernetesGroup.getGroupId()); + kubernetesGroupBean.setDescription(kubernetesGroup.getDescription()); + kubernetesGroupBean.setPortRange(populatePortRangePojo(kubernetesGroup.getPortRange())); + kubernetesGroupBean.setKubernetesHosts(populateKubernetesHostsPojo(kubernetesGroup.getKubernetesHosts())); + kubernetesGroupBean.setKubernetesMaster(populateKubernetesMasterPojo(kubernetesGroup.getKubernetesMaster())); + kubernetesGroupBean.setProperty(populateASProperties(kubernetesGroup.getProperties())); + return kubernetesGroupBean; + } + + public static KubernetesMaster populateKubernetesMasterPojo(org.apache.stratos.autoscaler.stub.kubernetes.KubernetesMaster kubernetesMaster) { + if (kubernetesMaster == null){ + return null; + } + KubernetesMaster kubernetesMasterBean = new KubernetesMaster(); + kubernetesMasterBean.setHostId(kubernetesMaster.getHostId()); + kubernetesMasterBean.setHostname(kubernetesMaster.getHostname()); + kubernetesMasterBean.setHostIpAddress(kubernetesMaster.getHostIpAddress()); + kubernetesMasterBean.setProperty(populateASProperties(kubernetesMaster.getProperties())); + kubernetesMasterBean.setEndpoint(kubernetesMaster.getEndpoint()); + return kubernetesMasterBean; + } + + public static List<KubernetesHost> populateKubernetesHostsPojo(org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost[] kubernetesHosts) { + if (kubernetesHosts == null){ + return null; + } + List<KubernetesHost> kubernetesHostList = new ArrayList<KubernetesHost>(); + for (int i = 0; i < kubernetesHosts.length; i++){ + kubernetesHostList.add(populateKubernetesHostPojo(kubernetesHosts[i])); + } + return kubernetesHostList; + } + + private static KubernetesHost populateKubernetesHostPojo(org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost kubernetesHost) { + if (kubernetesHost == null){ + return null; + } + KubernetesHost kubernetesHostBean = new KubernetesHost(); + kubernetesHostBean.setHostId(kubernetesHost.getHostId()); + kubernetesHostBean.setHostname(kubernetesHost.getHostname()); + kubernetesHostBean.setHostIpAddress(kubernetesHost.getHostIpAddress()); + kubernetesHostBean.setProperty(populateASProperties(kubernetesHost.getProperties())); + return kubernetesHostBean; + } + + private static List<PropertyBean> populateASProperties(PropertiesE properties) { + if (properties == null || properties.getProperties() == null){ + return null; + } + List<PropertyBean> propertyBeanList = new ArrayList<PropertyBean>(); + for (int i = 0; i < properties.getProperties().length; i++){ + propertyBeanList.add(populateASProperty(properties.getProperties()[i])); + } + return propertyBeanList; + } + + private static PropertyBean populateASProperty(PropertyE propertyE) { + if (propertyE == null){ + return null; + } + PropertyBean propertyBean = new PropertyBean(); + propertyBean.name = propertyE.getName(); + propertyBean.value = propertyE.getValue(); + return propertyBean; + } + + private static PortRange populatePortRangePojo(org.apache.stratos.autoscaler.stub.kubernetes.PortRange portRange) { + if (portRange == null){ + return null; + } + PortRange portRangeBean = new PortRange(); + portRangeBean.setUpper(portRange.getUpper()); + portRangeBean.setLower(portRange.getLower()); + return portRangeBean; + } + + public static ApplicationContext convertApplicationBeanToApplicationContext (ApplicationDefinition compositeAppDefinition) { - ApplicationContext applicationContext = new ApplicationContext(); + org.apache.stratos.autoscaler.applications.pojo.stub.ApplicationContext applicationContext = new org.apache.stratos.autoscaler.applications.pojo.stub.ApplicationContext(); applicationContext.setApplicationId(compositeAppDefinition.getApplicationId()); applicationContext.setAlias(compositeAppDefinition.getAlias()); http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java ---------------------------------------------------------------------- diff --cc components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java index 97eda89,a7ab51b..38880d7 --- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java +++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java @@@ -23,18 -23,16 +23,22 @@@ import org.apache.axis2.context.Configu import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.stratos.autoscaler.stub.*; +import org.apache.stratos.autoscaler.stub.deployment.policy.DeploymentPolicy; +import org.apache.stratos.cloud.controller.pojo.application.xsd.ApplicationContext; +import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidCartridgeTypeExceptionException; + import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy; + import org.apache.stratos.autoscaler.stub.AutoScalerServiceApplicationDefinitionExceptionException; import org.apache.stratos.autoscaler.stub.AutoScalerServiceInvalidPartitionExceptionException; import org.apache.stratos.autoscaler.stub.AutoScalerServiceInvalidPolicyExceptionException; import org.apache.stratos.cloud.controller.stub.*; - import org.apache.stratos.cloud.controller.stub.pojo.*; - import org.apache.stratos.cloud.controller.stub.pojo.Properties; + import org.apache.stratos.cloud.controller.stub.pojo.CartridgeConfig; + import org.apache.stratos.cloud.controller.stub.pojo.CartridgeInfo; + import org.apache.stratos.cloud.controller.stub.pojo.Property; ++import org.apache.stratos.cloud.controller.stub.pojo.application.ApplicationContext; import org.apache.stratos.manager.client.AutoscalerServiceClient; import org.apache.stratos.manager.client.CloudControllerServiceClient; +import org.apache.stratos.manager.deploy.cartridge.CartridgeDeploymentManager; import org.apache.stratos.manager.composite.application.beans.ApplicationDefinition; import org.apache.stratos.manager.deploy.service.Service; import org.apache.stratos.manager.deploy.service.ServiceDeploymentManager; @@@ -135,26 -154,23 +144,27 @@@ public class ServiceUtils applicationContext.setTenantDomain(tenantDomain); applicationContext.setTeantAdminUsername(userName); -// try { -// CloudControllerServiceClient.getServiceClient().deployApplicationDefinition(applicationContext); -// -// } catch (RemoteException e) { -// throw new RestAPIException(e); -// } catch (CloudControllerServiceInvalidIaasProviderExceptionException e) { -// throw new RestAPIException(e); -// } catch (CloudControllerServiceApplicationDefinitionExceptionException e) { -// throw new RestAPIException(e); -// } + Properties properties = new Properties(); + if(appDefinition.getProperty() != null) { + for (org.apache.stratos.manager.composite.application.beans.PropertyBean propertyBean : appDefinition.getProperty()) { + Property property = new Property(); + property.setName(propertyBean.getName()); + property.setValue(propertyBean.getValue()); + properties.addProperties(property); + } + applicationContext.setProperties(properties); + } try { - CloudControllerServiceClient.getServiceClient().deployApplicationDefinition(applicationContext); - + AutoscalerServiceClient.getServiceClient().deployApplication(applicationContext); + } catch (AutoScalerServiceApplicationDefinitionExceptionException e) { + throw new RestAPIException(e); } catch (RemoteException e) { throw new RestAPIException(e); + } catch (CloudControllerServiceInvalidIaasProviderExceptionException e) { + throw new RestAPIException(e); + } catch (CloudControllerServiceApplicationDefinitionExceptionException e) { + throw new RestAPIException(e); } } http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.rest.endpoint/src/main/webapp/stratos/WEB-INF/schemas/schema.xsd ----------------------------------------------------------------------
