You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by la...@apache.org on 2014/11/28 09:48:46 UTC
[3/5] stratos git commit: Adding package structure for context classes
http://git-wip-us.apache.org/repos/asf/stratos/blob/c20d28c2/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
index 8651966..82c9bb9 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
@@ -20,7 +20,7 @@ package org.apache.stratos.autoscaler.applications.topic;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.autoscaler.AutoscalerContext;
+import org.apache.stratos.autoscaler.context.AutoscalerContext;
import org.apache.stratos.autoscaler.applications.ApplicationHolder;
import org.apache.stratos.autoscaler.applications.pojo.ApplicationClusterContext;
import org.apache.stratos.autoscaler.client.CloudControllerClient;
http://git-wip-us.apache.org/repos/asf/stratos/blob/c20d28c2/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/AutoscalerContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/AutoscalerContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/AutoscalerContext.java
new file mode 100644
index 0000000..2b41987
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/AutoscalerContext.java
@@ -0,0 +1,89 @@
+/*
+ *
+ * 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.autoscaler.context;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.stratos.autoscaler.monitor.application.ApplicationMonitor;
+import org.apache.stratos.autoscaler.monitor.cluster.AbstractClusterMonitor;
+
+/**
+ * It holds all cluster monitors which are active in stratos.
+ */
+public class AutoscalerContext {
+
+ private static final AutoscalerContext INSTANCE = new AutoscalerContext();
+
+ // Map<ClusterId, AbstractClusterMonitor>
+ private Map<String, AbstractClusterMonitor> clusterMonitors;
+ // Map<ApplicationId, ApplicationMonitor>
+ private Map<String, ApplicationMonitor> applicationMonitors;
+
+ private AutoscalerContext() {
+ setClusterMonitors(new HashMap<String, AbstractClusterMonitor>());
+ setApplicationMonitors(new HashMap<String, ApplicationMonitor>());
+ }
+
+ public static AutoscalerContext getInstance() {
+ return INSTANCE;
+ }
+
+ public void addClusterMonitor(AbstractClusterMonitor clusterMonitor) {
+ getClusterMonitors().put(clusterMonitor.getClusterId(), clusterMonitor);
+ }
+
+ public AbstractClusterMonitor getClusterMonitor(String clusterId) {
+ return getClusterMonitors().get(clusterId);
+ }
+
+ public AbstractClusterMonitor removeClusterMonitor(String clusterId) {
+ return getClusterMonitors().remove(clusterId);
+ }
+
+ public void addAppMonitor(ApplicationMonitor applicationMonitor) {
+ getApplicationMonitors().put(applicationMonitor.getId(), applicationMonitor);
+ }
+
+ public ApplicationMonitor getAppMonitor(String applicationId) {
+ return getApplicationMonitors().get(applicationId);
+ }
+
+ public void removeAppMonitor(String applicationId) {
+ getApplicationMonitors().remove(applicationId);
+ }
+
+ public Map<String, AbstractClusterMonitor> getClusterMonitors() {
+ return clusterMonitors;
+ }
+
+ public void setClusterMonitors(Map<String, AbstractClusterMonitor> clusterMonitors) {
+ this.clusterMonitors = clusterMonitors;
+ }
+
+ public Map<String, ApplicationMonitor> getApplicationMonitors() {
+ return applicationMonitors;
+ }
+
+ public void setApplicationMonitors(Map<String, ApplicationMonitor> applicationMonitors) {
+ this.applicationMonitors = applicationMonitors;
+ }
+}
http://git-wip-us.apache.org/repos/asf/stratos/blob/c20d28c2/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/AbstractClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/AbstractClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/AbstractClusterContext.java
new file mode 100644
index 0000000..1629c99
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/AbstractClusterContext.java
@@ -0,0 +1,49 @@
+/*
+ * 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.autoscaler.context.cluster;
+
+import org.apache.commons.configuration.XMLConfiguration;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.cloud.controller.stub.pojo.MemberContext;
+import org.apache.stratos.common.constants.StratosConstants;
+
+import java.io.Serializable;
+
+/*
+ * It holds the runtime data of a service cluster
+ */
+public class AbstractClusterContext implements Serializable {
+
+ private static final Log log = LogFactory.getLog(AbstractClusterContext.class);
+
+
+ // cluster id
+ protected String clusterId;
+ private String serviceId;
+
+ public AbstractClusterContext(String clusterId, String serviceId){
+ this.clusterId = clusterId;
+ this.serviceId = serviceId;
+ }
+
+ public String getServiceId() {
+ return serviceId;
+ }
+}
http://git-wip-us.apache.org/repos/asf/stratos/blob/c20d28c2/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterContextFactory.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterContextFactory.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterContextFactory.java
new file mode 100644
index 0000000..fd35f82
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterContextFactory.java
@@ -0,0 +1,390 @@
+/*
+ * 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.autoscaler.context.cluster;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.*;
+import org.apache.stratos.autoscaler.client.CloudControllerClient;
+import org.apache.stratos.autoscaler.context.member.MemberStatsContext;
+import org.apache.stratos.autoscaler.context.partition.network.ClusterLevelNetworkPartitionContext;
+import org.apache.stratos.autoscaler.context.partition.ClusterLevelPartitionContext;
+import org.apache.stratos.autoscaler.exception.PartitionValidationException;
+import org.apache.stratos.autoscaler.exception.PolicyValidationException;
+import org.apache.stratos.autoscaler.partition.PartitionGroup;
+import org.apache.stratos.autoscaler.partition.PartitionManager;
+import org.apache.stratos.autoscaler.policy.PolicyManager;
+import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
+import org.apache.stratos.autoscaler.policy.model.DeploymentPolicy;
+import org.apache.stratos.cloud.controller.stub.deployment.partition.Partition;
+import org.apache.stratos.cloud.controller.stub.pojo.MemberContext;
+import org.apache.stratos.cloud.controller.stub.pojo.Properties;
+import org.apache.stratos.cloud.controller.stub.pojo.Property;
+import org.apache.stratos.common.constants.StratosConstants;
+import org.apache.stratos.messaging.domain.topology.Cluster;
+import org.apache.stratos.messaging.domain.topology.Member;
+import org.apache.stratos.messaging.domain.topology.MemberStatus;
+import org.apache.stratos.messaging.util.Constants;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+public class ClusterContextFactory {
+
+ private static final Log log = LogFactory.getLog(ClusterContextFactory.class);
+
+ public static VMServiceClusterContext getVMServiceClusterContext (Cluster cluster) throws PolicyValidationException, PartitionValidationException {
+
+ if (null == cluster) {
+ return null;
+ }
+
+ String autoscalePolicyName = cluster.getAutoscalePolicyName();
+ String deploymentPolicyName = cluster.getDeploymentPolicyName();
+
+ if (log.isDebugEnabled()) {
+ log.debug("Deployment policy name: " + deploymentPolicyName);
+ log.debug("Autoscaler policy name: " + autoscalePolicyName);
+ }
+
+ AutoscalePolicy autoscalePolicy =
+ PolicyManager.getInstance()
+ .getAutoscalePolicy(autoscalePolicyName);
+ DeploymentPolicy deploymentPolicy =
+ PolicyManager.getInstance()
+ .getDeploymentPolicy(deploymentPolicyName);
+
+ if (deploymentPolicy == null) {
+ String msg = "Deployment policy is null: [policy-name] " + deploymentPolicyName;
+ log.error(msg);
+ throw new PolicyValidationException(msg);
+ }
+
+ Partition[] allPartitions = deploymentPolicy.getAllPartitions();
+ if (allPartitions == null) {
+ String msg =
+ "Partitions are null in deployment policy: [policy-name]: " +
+ deploymentPolicyName;
+ log.error(msg);
+ throw new PolicyValidationException(msg);
+ }
+
+ CloudControllerClient.getInstance().validateDeploymentPolicy(cluster.getServiceName(), deploymentPolicy);
+
+ Map<String, ClusterLevelNetworkPartitionContext> networkPartitionContextMap = new HashMap<String, ClusterLevelNetworkPartitionContext>();
+
+ for (PartitionGroup partitionGroup : deploymentPolicy.getPartitionGroups()) {
+
+ String networkPartitionId = partitionGroup.getId();
+ ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext = new ClusterLevelNetworkPartitionContext(networkPartitionId,
+ partitionGroup.getPartitionAlgo(),
+ partitionGroup.getPartitions());
+
+ for (Partition partition : partitionGroup.getPartitions()) {
+ ClusterLevelPartitionContext clusterMonitorPartitionContext = new ClusterLevelPartitionContext(partition);
+ clusterMonitorPartitionContext.setServiceName(cluster.getServiceName());
+ clusterMonitorPartitionContext.setProperties(cluster.getProperties());
+ clusterMonitorPartitionContext.setNetworkPartitionId(partitionGroup.getId());
+
+ for (Member member : cluster.getMembers()) {
+ String memberId = member.getMemberId();
+ if (member.getPartitionId().equalsIgnoreCase(partition.getId())) {
+ MemberContext memberContext = new MemberContext();
+ memberContext.setClusterId(member.getClusterId());
+ memberContext.setMemberId(memberId);
+ memberContext.setInitTime(member.getInitTime());
+ memberContext.setPartition(partition);
+ memberContext.setProperties(convertMemberPropsToMemberContextProps(member.getProperties()));
+
+ if (MemberStatus.Activated.equals(member.getStatus())) {
+ if (log.isDebugEnabled()) {
+ String msg = String.format("Active member loaded from topology and added to active member list, %s", member.toString());
+ log.debug(msg);
+ }
+ clusterMonitorPartitionContext.addActiveMember(memberContext);
+// networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(), 1);
+// partitionContext.incrementCurrentActiveMemberCount(1);
+
+ } else if (MemberStatus.Created.equals(member.getStatus()) || MemberStatus.Starting.equals(member.getStatus())) {
+ if (log.isDebugEnabled()) {
+ String msg = String.format("Pending member loaded from topology and added to pending member list, %s", member.toString());
+ log.debug(msg);
+ }
+ clusterMonitorPartitionContext.addPendingMember(memberContext);
+
+// networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(), 1);
+ } else if (MemberStatus.Suspended.equals(member.getStatus())) {
+// partitionContext.addFaultyMember(memberId);
+ }
+ clusterMonitorPartitionContext.addMemberStatsContext(new MemberStatsContext(memberId));
+ if (log.isInfoEnabled()) {
+ log.info(String.format("Member stat context has been added: [member] %s", memberId));
+ }
+ }
+
+ }
+ clusterLevelNetworkPartitionContext.addPartitionContext(clusterMonitorPartitionContext);
+ if (log.isInfoEnabled()) {
+ log.info(String.format("Partition context has been added: [partition] %s",
+ clusterMonitorPartitionContext.getPartitionId()));
+ }
+ }
+
+ networkPartitionContextMap.put(networkPartitionId, clusterLevelNetworkPartitionContext);
+ if (log.isInfoEnabled()) {
+ log.info(String.format("Network partition context has been added: [network partition] %s",
+ clusterLevelNetworkPartitionContext.getId()));
+ }
+ }
+
+ return new VMServiceClusterContext(cluster.getClusterId(), cluster.getServiceName(), autoscalePolicy,
+ deploymentPolicy, networkPartitionContextMap);
+ }
+
+ public static VMClusterContext getVMLBClusterContext (Cluster cluster) throws PolicyValidationException {
+
+ // FIXME fix the following code to correctly update
+ // AutoscalerContext context = AutoscalerContext.getInstance();
+ if (null == cluster) {
+ return null;
+ }
+
+ String autoscalePolicyName = cluster.getAutoscalePolicyName();
+ String deploymentPolicyName = cluster.getDeploymentPolicyName();
+
+ if (log.isDebugEnabled()) {
+ log.debug("Deployment policy name: " + deploymentPolicyName);
+ log.debug("Autoscaler policy name: " + autoscalePolicyName);
+ }
+
+ AutoscalePolicy autoscalePolicy =
+ PolicyManager.getInstance()
+ .getAutoscalePolicy(autoscalePolicyName);
+ DeploymentPolicy deploymentPolicy =
+ PolicyManager.getInstance()
+ .getDeploymentPolicy(deploymentPolicyName);
+
+ if (deploymentPolicy == null) {
+ String msg = "Deployment Policy is null. Policy name: " + deploymentPolicyName;
+ log.error(msg);
+ throw new PolicyValidationException(msg);
+ }
+
+ String clusterId = cluster.getClusterId();
+
+ Map<String, ClusterLevelNetworkPartitionContext> networkPartitionContextMap = new HashMap<String, ClusterLevelNetworkPartitionContext>();
+
+ // partition group = network partition context
+ for (PartitionGroup partitionGroup : deploymentPolicy.getPartitionGroups()) {
+
+ String networkPartitionId = partitionGroup.getId();
+ NetworkPartitionLbHolder networkPartitionLbHolder =
+ PartitionManager.getInstance()
+ .getNetworkPartitionLbHolder(networkPartitionId);
+// PartitionManager.getInstance()
+// .getNetworkPartitionLbHolder(partitionGroup.getPartitionId());
+ // FIXME pick a random partition
+ Partition partition =
+ partitionGroup.getPartitions()[new Random().nextInt(partitionGroup.getPartitions().length)];
+ ClusterLevelPartitionContext clusterMonitorPartitionContext = new ClusterLevelPartitionContext(partition);
+ clusterMonitorPartitionContext.setServiceName(cluster.getServiceName());
+ clusterMonitorPartitionContext.setProperties(cluster.getProperties());
+ clusterMonitorPartitionContext.setNetworkPartitionId(networkPartitionId);
+ clusterMonitorPartitionContext.setMinimumMemberCount(1);//Here it hard codes the minimum value as one for LB cartridge partitions
+
+ ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext = new ClusterLevelNetworkPartitionContext(networkPartitionId,
+ partitionGroup.getPartitionAlgo(),
+ partitionGroup.getPartitions());
+ for (Member member : cluster.getMembers()) {
+ String memberId = member.getMemberId();
+ if (member.getNetworkPartitionId().equalsIgnoreCase(clusterLevelNetworkPartitionContext.getId())) {
+ MemberContext memberContext = new MemberContext();
+ memberContext.setClusterId(member.getClusterId());
+ memberContext.setMemberId(memberId);
+ memberContext.setPartition(partition);
+ memberContext.setInitTime(member.getInitTime());
+
+ if (MemberStatus.Activated.equals(member.getStatus())) {
+ if (log.isDebugEnabled()) {
+ String msg = String.format("Active member loaded from topology and added to active member list, %s", member.toString());
+ log.debug(msg);
+ }
+ clusterMonitorPartitionContext.addActiveMember(memberContext);
+// networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(), 1);
+// partitionContext.incrementCurrentActiveMemberCount(1);
+ } else if (MemberStatus.Created.equals(member.getStatus()) ||
+ MemberStatus.Starting.equals(member.getStatus())) {
+ if (log.isDebugEnabled()) {
+ String msg = String.format("Pending member loaded from topology and added to pending member list, %s", member.toString());
+ log.debug(msg);
+ }
+ clusterMonitorPartitionContext.addPendingMember(memberContext);
+// networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(), 1);
+ } else if (MemberStatus.Suspended.equals(member.getStatus())) {
+// partitionContext.addFaultyMember(memberId);
+ }
+
+ clusterMonitorPartitionContext.addMemberStatsContext(new MemberStatsContext(memberId));
+ if (log.isInfoEnabled()) {
+ log.info(String.format("Member stat context has been added: [member] %s", memberId));
+ }
+ }
+
+ }
+ clusterLevelNetworkPartitionContext.addPartitionContext(clusterMonitorPartitionContext);
+
+ // populate lb cluster id in network partition context.
+ java.util.Properties props = cluster.getProperties();
+
+ // get service type of load balanced cluster
+ String loadBalancedServiceType = props.getProperty(org.apache.stratos.messaging.util.Constants.LOAD_BALANCED_SERVICE_TYPE);
+
+ if (props.containsKey(org.apache.stratos.messaging.util.Constants.LOAD_BALANCER_REF)) {
+ String value = props.getProperty(org.apache.stratos.messaging.util.Constants.LOAD_BALANCER_REF);
+
+ if (value.equals(org.apache.stratos.messaging.util.Constants.DEFAULT_LOAD_BALANCER)) {
+ networkPartitionLbHolder.setDefaultLbClusterId(clusterId);
+
+ } else if (value.equals(org.apache.stratos.messaging.util.Constants.SERVICE_AWARE_LOAD_BALANCER)) {
+ String serviceName = cluster.getServiceName();
+ // TODO: check if this is correct
+ networkPartitionLbHolder.addServiceLB(serviceName, clusterId);
+
+ if (loadBalancedServiceType != null && !loadBalancedServiceType.isEmpty()) {
+ networkPartitionLbHolder.addServiceLB(loadBalancedServiceType, clusterId);
+ if (log.isDebugEnabled()) {
+ log.debug("Added cluster id " + clusterId + " as the LB cluster id for service type " + loadBalancedServiceType);
+ }
+ }
+ }
+ }
+
+ networkPartitionContextMap.put(networkPartitionId, clusterLevelNetworkPartitionContext);
+ }
+
+ return new VMClusterContext(clusterId, cluster.getServiceName(), autoscalePolicy,
+ deploymentPolicy, networkPartitionContextMap);
+ }
+
+ public static KubernetesClusterContext getKubernetesClusterContext (Cluster cluster) throws PolicyValidationException {
+
+ if (null == cluster) {
+ return null;
+ }
+
+ String autoscalePolicyName = cluster.getAutoscalePolicyName();
+
+ AutoscalePolicy autoscalePolicy =
+ PolicyManager.getInstance()
+ .getAutoscalePolicy(autoscalePolicyName);
+ if (log.isDebugEnabled()) {
+ log.debug("Autoscaling policy name: " + autoscalePolicyName);
+ }
+
+ AutoscalePolicy policy = PolicyManager.getInstance().getAutoscalePolicy(autoscalePolicyName);
+
+ if (policy == null) {
+ String msg = String.format("Autoscaling policy is null: [policy-name] %s", autoscalePolicyName);
+ log.error(msg);
+ throw new PolicyValidationException(msg);
+ }
+
+ java.util.Properties properties = cluster.getProperties();
+ if(properties == null) {
+ String message = String.format("Properties not found in kubernetes cluster: [cluster-id] %s",
+ cluster.getClusterId());
+ log.error(message);
+ throw new RuntimeException(message);
+ }
+ String minReplicasProperty = properties.getProperty(StratosConstants.KUBERNETES_MIN_REPLICAS);
+ int minReplicas = 0;
+ if (minReplicasProperty != null && !minReplicasProperty.isEmpty()) {
+ minReplicas = Integer.parseInt(minReplicasProperty);
+ }
+
+ int maxReplicas = 0;
+ String maxReplicasProperty = properties.getProperty(StratosConstants.KUBERNETES_MAX_REPLICAS);
+ if (maxReplicasProperty != null && !maxReplicasProperty.isEmpty()) {
+ maxReplicas = Integer.parseInt(maxReplicasProperty);
+ }
+
+ String kubernetesHostClusterID = properties.getProperty(StratosConstants.KUBERNETES_CLUSTER_ID);
+ KubernetesClusterContext kubernetesClusterCtxt = new KubernetesClusterContext(kubernetesHostClusterID,
+ cluster.getClusterId(), cluster.getServiceName(), autoscalePolicy, minReplicas, maxReplicas);
+
+ //populate the members after restarting
+ for (Member member : cluster.getMembers()) {
+ String memberId = member.getMemberId();
+ String clusterId = member.getClusterId();
+ MemberContext memberContext = new MemberContext();
+ memberContext.setMemberId(memberId);
+ memberContext.setClusterId(clusterId);
+ memberContext.setInitTime(member.getInitTime());
+
+ // if there is at least one member in the topology, that means service has been created already
+ // this is to avoid calling startContainer() method again
+ kubernetesClusterCtxt.setServiceClusterCreated(true);
+
+ if (MemberStatus.Activated.equals(member.getStatus())) {
+ if (log.isDebugEnabled()) {
+ String msg = String.format("Active member loaded from topology and added to active member list, %s", member.toString());
+ log.debug(msg);
+ }
+ //dockerClusterMonitor.getKubernetesClusterCtxt().addActiveMember(memberContext);
+ } else if (MemberStatus.Created.equals(member.getStatus())
+ || MemberStatus.Starting.equals(member.getStatus())) {
+ if (log.isDebugEnabled()) {
+ String msg = String.format("Pending member loaded from topology and added to pending member list, %s", member.toString());
+ log.debug(msg);
+ }
+ //dockerClusterMonitor.getKubernetesClusterCtxt().addPendingMember(memberContext);
+ }
+
+ kubernetesClusterCtxt.addMemberStatsContext(new MemberStatsContext(memberId));
+ if (log.isInfoEnabled()) {
+ log.info(String.format("Member stat context has been added: [member] %s", memberId));
+ }
+ }
+
+ // find lb reference type
+ if (properties.containsKey(org.apache.stratos.messaging.util.Constants.LOAD_BALANCER_REF)) {
+ String value = properties.getProperty(Constants.LOAD_BALANCER_REF);
+ //dockerClusterMonitor.setLbReferenceType(value);
+ if (log.isDebugEnabled()) {
+ log.debug("Set the lb reference type: " + value);
+ }
+ }
+
+ return kubernetesClusterCtxt;
+ }
+
+ private static Properties convertMemberPropsToMemberContextProps(
+ java.util.Properties properties) {
+ Properties props = new Properties();
+ for (Map.Entry<Object, Object> e : properties.entrySet()) {
+ Property property = new Property();
+ property.setName((String) e.getKey());
+ property.setValue((String) e.getValue());
+ props.addProperties(property);
+ }
+ return props;
+ }
+}
http://git-wip-us.apache.org/repos/asf/stratos/blob/c20d28c2/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterInstanceContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterInstanceContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterInstanceContext.java
new file mode 100644
index 0000000..1e5ad12
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterInstanceContext.java
@@ -0,0 +1,80 @@
+/*
+ * 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.autoscaler.context.cluster;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.context.partition.ClusterLevelPartitionContext;
+import org.apache.stratos.messaging.domain.topology.Member;
+
+import java.util.Map;
+
+/*
+ * It holds the runtime data of a VM cluster
+ */
+public class ClusterInstanceContext {
+
+ private static final Log log = LogFactory.getLog(ClusterInstanceContext.class);
+ private final String clusterInstanceId;
+
+ // Map<PartitionId, Partition Context>
+ protected Map<String, ClusterLevelPartitionContext> partitionCtxts;
+ public ClusterInstanceContext(String clusterInstanceId, String serviceId,
+ Map<String, ClusterLevelPartitionContext> partitionCtxts) {
+
+ this.clusterInstanceId = clusterInstanceId;
+
+ }
+
+ public Map<String, ClusterLevelPartitionContext> getPartitionCtxts(){
+ return partitionCtxts;
+ }
+
+ public ClusterLevelPartitionContext getNetworkPartitionCtxt(String PartitionId) {
+ return partitionCtxts.get(PartitionId);
+ }
+
+ public void setPartitionCtxt(Map<String, ClusterLevelPartitionContext> partitionCtxt) {
+ this.partitionCtxts = partitionCtxt;
+ }
+
+ public boolean partitionCtxtAvailable(String partitionId) {
+ return partitionCtxts.containsKey(partitionId);
+ }
+
+ public void addPartitionCtxt(ClusterLevelPartitionContext ctxt) {
+ this.partitionCtxts.put(ctxt.getPartitionId(), ctxt);
+ }
+
+ public ClusterLevelPartitionContext getPartitionCtxt(String id) {
+ return this.partitionCtxts.get(id);
+ }
+
+ public ClusterLevelPartitionContext getPartitionCtxt(Member member) {
+ log.info("Getting [Partition] " + member.getPartitionId());
+ String partitionId = member.getPartitionId();
+ if (partitionCtxts.containsKey(partitionId)) {
+ log.info("Returning partition context, of [partition] " + partitionCtxts.get(partitionId));
+ return partitionCtxts.get(partitionId);
+ }
+
+ return null;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/stratos/blob/c20d28c2/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/KubernetesClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/KubernetesClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/KubernetesClusterContext.java
new file mode 100644
index 0000000..43b8db9
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/KubernetesClusterContext.java
@@ -0,0 +1,761 @@
+/*
+ * 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.autoscaler.context.cluster;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.commons.configuration.XMLConfiguration;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.context.member.MemberStatsContext;
+import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
+import org.apache.stratos.autoscaler.policy.model.LoadAverage;
+import org.apache.stratos.autoscaler.policy.model.MemoryConsumption;
+import org.apache.stratos.autoscaler.policy.model.RequestsInFlight;
+import org.apache.stratos.autoscaler.util.ConfUtil;
+import org.apache.stratos.cloud.controller.stub.pojo.MemberContext;
+import org.apache.stratos.common.constants.StratosConstants;
+
+/*
+ * It holds the runtime data of a kubernetes service cluster
+ */
+public class KubernetesClusterContext extends AbstractClusterContext {
+
+ private static final long serialVersionUID = 808741789615481596L;
+ private static final Log log = LogFactory.getLog(KubernetesClusterContext.class);
+
+ private String kubernetesClusterId;
+ private String serviceName;
+
+ private int minReplicas;
+ private int maxReplicas;
+ private int currentReplicas;
+ private float RequiredReplicas;
+
+ private AutoscalePolicy autoscalePolicy;
+
+ // it will tell whether the startContainers() method succeed or not for the 1st time
+ // we should call startContainers() only once
+ private boolean isServiceClusterCreated = false;
+
+ // properties
+ private Properties properties;
+
+ // 15 mints as the default
+ private long pendingMemberExpiryTime;
+ // pending members
+ private List<MemberContext> pendingMembers;
+
+ // active members
+ private List<MemberContext> activeMembers;
+
+ // 1 day as default
+ private long obsoltedMemberExpiryTime = 1*24*60*60*1000;
+
+ // members to be terminated
+ private Map<String, MemberContext> obsoletedMembers;
+
+ // termination pending members, member is added to this when Autoscaler send grace fully shut down event
+ private List<MemberContext> terminationPendingMembers;
+
+ //Keep statistics come from CEP
+ private Map<String, MemberStatsContext> memberStatsContexts;
+
+ //Following information will keep events details
+ private RequestsInFlight requestsInFlight;
+ private MemoryConsumption memoryConsumption;
+ private LoadAverage loadAverage;
+
+ //boolean values to keep whether the requests in flight parameters are reset or not
+ private boolean rifReset = false, averageRifReset = false,
+ gradientRifReset = false, secondDerivativeRifRest = false;
+ //boolean values to keep whether the memory consumption parameters are reset or not
+ private boolean memoryConsumptionReset = false, averageMemoryConsumptionReset = false,
+ gradientMemoryConsumptionReset = false, secondDerivativeMemoryConsumptionRest = false;
+ //boolean values to keep whether the load average parameters are reset or not
+ private boolean loadAverageReset = false, averageLoadAverageReset = false,
+ gradientLoadAverageReset = false, secondDerivativeLoadAverageRest = false;
+
+ public KubernetesClusterContext(String kubernetesClusterId, String clusterId, String serviceId, AutoscalePolicy autoscalePolicy,
+ int minCount, int maxCount) {
+
+ super(clusterId, serviceId);
+ this.kubernetesClusterId = kubernetesClusterId;
+ this.minReplicas = minCount;
+ this.maxReplicas = maxCount;
+ this.pendingMembers = new ArrayList<MemberContext>();
+ this.activeMembers = new ArrayList<MemberContext>();
+ this.terminationPendingMembers = new ArrayList<MemberContext>();
+ this.obsoletedMembers = new ConcurrentHashMap<String, MemberContext>();
+ this.memberStatsContexts = new ConcurrentHashMap<String, MemberStatsContext>();
+ this.requestsInFlight = new RequestsInFlight();
+ this.loadAverage = new LoadAverage();
+ this.memoryConsumption = new MemoryConsumption();
+ this.autoscalePolicy = autoscalePolicy;
+
+ // check if a different value has been set for expiryTime
+ XMLConfiguration conf = ConfUtil.getInstance(null).getConfiguration();
+ pendingMemberExpiryTime = conf.getLong(StratosConstants.PENDING_CONTAINER_MEMBER_EXPIRY_TIMEOUT, 300000);
+ obsoltedMemberExpiryTime = conf.getLong(StratosConstants.OBSOLETED_CONTAINER_MEMBER_EXPIRY_TIMEOUT, 3600000);
+ if (log.isDebugEnabled()) {
+ log.debug("Member expiry time is set to: " + pendingMemberExpiryTime);
+ log.debug("Member obsoleted expiry time is set to: " + obsoltedMemberExpiryTime);
+ }
+
+ Thread th = new Thread(new PendingMemberWatcher(this));
+ th.start();
+ Thread th2 = new Thread(new ObsoletedMemberWatcher(this));
+ th2.start();
+ }
+
+ public String getKubernetesClusterID() {
+ return kubernetesClusterId;
+ }
+
+ public void setKubernetesClusterID(String kubernetesClusterId) {
+ this.kubernetesClusterId = kubernetesClusterId;
+ }
+
+ public List<MemberContext> getPendingMembers() {
+ return pendingMembers;
+ }
+
+ public void setPendingMembers(List<MemberContext> pendingMembers) {
+ this.pendingMembers = pendingMembers;
+ }
+
+ public int getActiveMemberCount() {
+ return activeMembers.size();
+ }
+
+ public void setActiveMembers(List<MemberContext> activeMembers) {
+ this.activeMembers = activeMembers;
+ }
+
+ public int getMinReplicas() {
+ return minReplicas;
+ }
+
+ public void setMinReplicas(int minReplicas) {
+ this.minReplicas = minReplicas;
+ }
+
+ public int getMaxReplicas() {
+ return maxReplicas;
+ }
+
+ public void setMaxReplicas(int maxReplicas) {
+ this.maxReplicas = maxReplicas;
+ }
+
+ public int getCurrentReplicas() {
+ return currentReplicas;
+ }
+
+ public void setCurrentReplicas(int currentReplicas) {
+ this.currentReplicas = currentReplicas;
+ }
+
+ public void addPendingMember(MemberContext ctxt) {
+ this.pendingMembers.add(ctxt);
+ }
+
+ public boolean removePendingMember(String id) {
+ if (id == null) {
+ return false;
+ }
+ for (Iterator<MemberContext> iterator = pendingMembers.iterator(); iterator.hasNext(); ) {
+ MemberContext pendingMember = (MemberContext) iterator.next();
+ if (id.equals(pendingMember.getMemberId())) {
+ iterator.remove();
+ return true;
+ }
+
+ }
+
+ return false;
+ }
+
+ public void movePendingMemberToActiveMembers(String memberId) {
+ if (memberId == null) {
+ return;
+ }
+ Iterator<MemberContext> iterator = pendingMembers.listIterator();
+ while (iterator.hasNext()) {
+ MemberContext pendingMember = iterator.next();
+ if (pendingMember == null) {
+ iterator.remove();
+ continue;
+ }
+ if (memberId.equals(pendingMember.getMemberId())) {
+ // member is activated
+ // remove from pending list
+ iterator.remove();
+ // add to the activated list
+ this.activeMembers.add(pendingMember);
+ if (log.isDebugEnabled()) {
+ log.debug(String.format(
+ "Pending member is removed and added to the "
+ + "activated member list. [Member Id] %s",
+ memberId));
+ }
+ break;
+ }
+ }
+ }
+
+ public void addActiveMember(MemberContext ctxt) {
+ this.activeMembers.add(ctxt);
+ }
+
+ public void removeActiveMember(MemberContext ctxt) {
+ this.activeMembers.remove(ctxt);
+ }
+
+ public long getPendingMemberExpiryTime() {
+ return pendingMemberExpiryTime;
+ }
+
+ public void setPendingMemberExpiryTime(long pendingMemberExpiryTime) {
+ this.pendingMemberExpiryTime = pendingMemberExpiryTime;
+ }
+
+ public Map<String, MemberStatsContext> getMemberStatsContexts() {
+ return memberStatsContexts;
+ }
+
+ public MemberStatsContext getMemberStatsContext(String memberId) {
+ return memberStatsContexts.get(memberId);
+ }
+
+ public void addMemberStatsContext(MemberStatsContext ctxt) {
+ this.memberStatsContexts.put(ctxt.getMemberId(), ctxt);
+ }
+
+ public void removeMemberStatsContext(String memberId) {
+ this.memberStatsContexts.remove(memberId);
+ }
+
+ public Properties getProperties() {
+ return properties;
+ }
+
+ public void setProperties(Properties properties) {
+ this.properties = properties;
+ }
+
+ public String getServiceName() {
+ return serviceName;
+ }
+
+ public void setServiceName(String serviceName) {
+ this.serviceName = serviceName;
+ }
+
+ public List<MemberContext> getActiveMembers() {
+ return activeMembers;
+ }
+
+ public boolean removeActiveMemberById(String memberId) {
+ boolean removeActiveMember = false;
+ synchronized (activeMembers) {
+ Iterator<MemberContext> iterator = activeMembers.listIterator();
+ while (iterator.hasNext()) {
+ MemberContext memberContext = iterator.next();
+ if (memberId.equals(memberContext.getMemberId())) {
+ iterator.remove();
+ removeActiveMember = true;
+
+ break;
+ }
+ }
+ }
+ return removeActiveMember;
+ }
+
+ public boolean activeMemberExist(String memberId) {
+
+ for (MemberContext memberContext : activeMembers) {
+ if (memberId.equals(memberContext.getMemberId())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public AutoscalePolicy getAutoscalePolicy() {
+ return autoscalePolicy;
+ }
+
+ public float getRequiredReplicas() {
+ return RequiredReplicas;
+ }
+
+ public void setRequiredReplicas(float requiredReplicas) {
+ RequiredReplicas = requiredReplicas;
+ }
+
+ /**
+ * Check the member lists for the provided member ID and move the member to the obsolete list
+ *
+ * @param memberId The member ID of the member to search
+ */
+ public void moveMemberToObsoleteList(String memberId) {
+ if (memberId == null) {
+ return;
+ }
+
+ // check active member list
+ Iterator<MemberContext> activeMemberIterator = activeMembers.listIterator();
+ MemberContext removedMember = this.removeMemberFrom(activeMemberIterator, memberId);
+ if (removedMember != null) {
+ this.addObsoleteMember(removedMember);
+ removedMember.setObsoleteInitTime(System.currentTimeMillis());
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Active member is removed and added to the " +
+ "obsolete member list. [Member Id] %s", memberId));
+ }
+
+ return;
+ }
+
+ // check pending member list
+ Iterator<MemberContext> pendingMemberIterator = pendingMembers.listIterator();
+ removedMember = this.removeMemberFrom(pendingMemberIterator, memberId);
+ if (removedMember != null) {
+ this.addObsoleteMember(removedMember);
+ removedMember.setObsoleteInitTime(System.currentTimeMillis());
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Pending member is removed and added to the " +
+ "obsolete member list. [Member Id] %s", memberId));
+ }
+
+ return;
+ }
+
+ // check termination pending member list
+ Iterator<MemberContext> terminationPendingMembersIterator = terminationPendingMembers.listIterator();
+ removedMember = this.removeMemberFrom(terminationPendingMembersIterator, memberId);
+ if (removedMember != null) {
+ this.addObsoleteMember(removedMember);
+ removedMember.setObsoleteInitTime(System.currentTimeMillis());
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Termination Pending member is removed and added to the " +
+ "obsolete member list. [Member Id] %s", memberId));
+ }
+ }
+ }
+
+ /**
+ * Removes the {@link org.apache.stratos.cloud.controller.stub.pojo.MemberContext} object mapping
+ * to the specified member id from the specified MemberContext collection
+ *
+ * @param iterator The {@link java.util.Iterator} for the collection containing {@link org.apache.stratos.cloud.controller.stub.pojo.MemberContext}
+ * objects
+ * @param memberId Member Id {@link String} for the {@link org.apache.stratos.cloud.controller.stub.pojo.MemberContext}
+ * to be removed
+ * @return {@link org.apache.stratos.cloud.controller.stub.pojo.MemberContext} object if
+ * object found and removed, null if otherwise.
+ */
+ private MemberContext removeMemberFrom(Iterator<MemberContext> iterator, String memberId) {
+ while (iterator.hasNext()) {
+ MemberContext activeMember = iterator.next();
+ if (activeMember == null) {
+ iterator.remove();
+ continue;
+ }
+ if (memberId.equals(activeMember.getMemberId())) {
+ iterator.remove();
+ return activeMember;
+ }
+ }
+
+ return null;
+ }
+
+ private class PendingMemberWatcher implements Runnable {
+ private KubernetesClusterContext ctxt;
+
+ public PendingMemberWatcher(KubernetesClusterContext ctxt) {
+ this.ctxt = ctxt;
+ }
+
+ @Override
+ public void run() {
+
+ while (true) {
+ long expiryTime = ctxt.getPendingMemberExpiryTime();
+ List<MemberContext> pendingMembers = ctxt.getPendingMembers();
+
+ synchronized (pendingMembers) {
+ Iterator<MemberContext> iterator = pendingMembers
+ .listIterator();
+ while (iterator.hasNext()) {
+ MemberContext pendingMember = iterator.next();
+
+ if (pendingMember == null) {
+ continue;
+ }
+ long pendingTime = System.currentTimeMillis()
+ - pendingMember.getInitTime();
+ if (pendingTime >= expiryTime) {
+ iterator.remove();
+ log.info("Pending state of member: " + pendingMember.getMemberId() +
+ " is expired. " + "Adding as an obsoleted member.");
+ ctxt.addObsoleteMember(pendingMember);
+ }
+ }
+ }
+ try {
+ // TODO find a constant
+ Thread.sleep(15000);
+ } catch (InterruptedException ignore) {
+ }
+ }
+ }
+
+ }
+
+ private class ObsoletedMemberWatcher implements Runnable {
+ private KubernetesClusterContext ctxt;
+
+ public ObsoletedMemberWatcher(KubernetesClusterContext ctxt) {
+ this.ctxt = ctxt;
+ }
+
+ @Override
+ public void run() {
+ while (true) {
+
+ long obsoltedMemberExpiryTime = ctxt.getObsoltedMemberExpiryTime();
+ Map<String, MemberContext> obsoletedMembers = ctxt.getObsoletedMembers();
+ Iterator<Entry<String, MemberContext>> iterator = obsoletedMembers.entrySet().iterator();
+
+ while (iterator.hasNext()) {
+ Map.Entry<String, MemberContext> pairs = iterator.next();
+ MemberContext obsoleteMember = (MemberContext) pairs.getValue();
+ if (obsoleteMember == null) {
+ continue;
+ }
+ long obsoleteTime = System.currentTimeMillis() - obsoleteMember.getInitTime();
+ if (obsoleteTime >= obsoltedMemberExpiryTime) {
+ iterator.remove();
+ log.info("Obsolete state of member: " + obsoleteMember.getMemberId() +
+ " is expired. " + "Removing from obsolete member list");
+ }
+ }
+ try {
+ // TODO find a constant
+ Thread.sleep(15000);
+ } catch (InterruptedException ignore) {
+ }
+ }
+ }
+ }
+
+ public float getAverageRequestsInFlight() {
+ return requestsInFlight.getAverage();
+ }
+
+ public void setAverageRequestsInFlight(float averageRequestsInFlight) {
+ requestsInFlight.setAverage(averageRequestsInFlight);
+ averageRifReset = true;
+ if (secondDerivativeRifRest && gradientRifReset) {
+ rifReset = true;
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Requests in flights stats are reset, "
+ + "ready to do scale check [kub cluster] %s", this.kubernetesClusterId));
+ }
+ }
+ }
+
+ public float getRequestsInFlightSecondDerivative() {
+ return requestsInFlight.getSecondDerivative();
+ }
+
+ public void setRequestsInFlightSecondDerivative(
+ float requestsInFlightSecondDerivative) {
+ requestsInFlight.setSecondDerivative(requestsInFlightSecondDerivative);
+ secondDerivativeRifRest = true;
+ if (averageRifReset && gradientRifReset) {
+ rifReset = true;
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Requests in flights stats are reset, ready to do scale check "
+ + "[kub cluster] %s", this.kubernetesClusterId));
+ }
+ }
+ }
+
+ public float getRequestsInFlightGradient() {
+ return requestsInFlight.getGradient();
+ }
+
+ public void setRequestsInFlightGradient(float requestsInFlightGradient) {
+ requestsInFlight.setGradient(requestsInFlightGradient);
+ gradientRifReset = true;
+ if (secondDerivativeRifRest && averageRifReset) {
+ rifReset = true;
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Requests in flights stats are reset, ready to do scale check "
+ + "[kub cluster] %s", this.kubernetesClusterId));
+ }
+ }
+ }
+
+ public boolean isRifReset() {
+ return rifReset;
+ }
+
+ public void setRifReset(boolean rifReset) {
+ this.rifReset = rifReset;
+ this.averageRifReset = rifReset;
+ this.gradientRifReset = rifReset;
+ this.secondDerivativeRifRest = rifReset;
+ }
+
+ public float getAverageMemoryConsumption() {
+ return memoryConsumption.getAverage();
+ }
+
+ public void setAverageMemoryConsumption(float averageMemoryConsumption) {
+ memoryConsumption.setAverage(averageMemoryConsumption);
+ averageMemoryConsumptionReset = true;
+ if (secondDerivativeMemoryConsumptionRest
+ && gradientMemoryConsumptionReset) {
+ memoryConsumptionReset = true;
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Memory consumption stats are reset, ready to do scale check "
+ + "[kub cluster] %s", this.kubernetesClusterId));
+ }
+ }
+ }
+
+ public float getMemoryConsumptionSecondDerivative() {
+ return memoryConsumption.getSecondDerivative();
+ }
+
+ public void setMemoryConsumptionSecondDerivative(
+ float memoryConsumptionSecondDerivative) {
+ memoryConsumption
+ .setSecondDerivative(memoryConsumptionSecondDerivative);
+ secondDerivativeMemoryConsumptionRest = true;
+ if (averageMemoryConsumptionReset && gradientMemoryConsumptionReset) {
+ memoryConsumptionReset = true;
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Memory consumption stats are reset, ready to do scale check "
+ + "[kub cluster] %s", this.kubernetesClusterId));
+ }
+ }
+ }
+
+ public float getMemoryConsumptionGradient() {
+ return memoryConsumption.getGradient();
+ }
+
+ public void setMemoryConsumptionGradient(float memoryConsumptionGradient) {
+ memoryConsumption.setGradient(memoryConsumptionGradient);
+ gradientMemoryConsumptionReset = true;
+ if (secondDerivativeMemoryConsumptionRest
+ && averageMemoryConsumptionReset) {
+ memoryConsumptionReset = true;
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Memory consumption stats are reset, ready to do scale check "
+ + "[kub cluster] %s", this.kubernetesClusterId));
+ }
+ }
+ }
+
+ public boolean isMemoryConsumptionReset() {
+ return memoryConsumptionReset;
+ }
+
+ public void setMemoryConsumptionReset(boolean memoryConsumptionReset) {
+ this.memoryConsumptionReset = memoryConsumptionReset;
+ this.averageMemoryConsumptionReset = memoryConsumptionReset;
+ this.gradientMemoryConsumptionReset = memoryConsumptionReset;
+ this.secondDerivativeMemoryConsumptionRest = memoryConsumptionReset;
+ }
+
+
+ public float getAverageLoadAverage() {
+ return loadAverage.getAverage();
+ }
+
+ public void setAverageLoadAverage(float averageLoadAverage) {
+ loadAverage.setAverage(averageLoadAverage);
+ averageLoadAverageReset = true;
+ if (secondDerivativeLoadAverageRest && gradientLoadAverageReset) {
+ loadAverageReset = true;
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Load average stats are reset, ready to do scale check "
+ + "[kub cluster] %s", this.kubernetesClusterId));
+ }
+ }
+ }
+
+ public float getLoadAverageSecondDerivative() {
+ return loadAverage.getSecondDerivative();
+ }
+
+ public void setLoadAverageSecondDerivative(float loadAverageSecondDerivative) {
+ loadAverage.setSecondDerivative(loadAverageSecondDerivative);
+ secondDerivativeLoadAverageRest = true;
+ if (averageLoadAverageReset && gradientLoadAverageReset) {
+ loadAverageReset = true;
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Load average stats are reset, ready to do scale check "
+ + "[kub cluster] %s", this.kubernetesClusterId));
+ }
+ }
+ }
+
+ public float getLoadAverageGradient() {
+ return loadAverage.getGradient();
+ }
+
+ public void setLoadAverageGradient(float loadAverageGradient) {
+ loadAverage.setGradient(loadAverageGradient);
+ gradientLoadAverageReset = true;
+ if (secondDerivativeLoadAverageRest && averageLoadAverageReset) {
+ loadAverageReset = true;
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Load average stats are reset, ready to do scale check "
+ + "[kub cluster] %s", this.kubernetesClusterId));
+ }
+ }
+ }
+
+ public boolean isLoadAverageReset() {
+ return loadAverageReset;
+ }
+
+ public void setLoadAverageReset(boolean loadAverageReset) {
+ this.loadAverageReset = loadAverageReset;
+ this.averageLoadAverageReset = loadAverageReset;
+ this.gradientLoadAverageReset = loadAverageReset;
+ this.secondDerivativeLoadAverageRest = loadAverageReset;
+ }
+
+ public void moveActiveMemberToTerminationPendingMembers(String memberId) {
+ if (memberId == null) {
+ return;
+ }
+ Iterator<MemberContext> iterator = activeMembers.listIterator();
+ while ( iterator.hasNext()) {
+ MemberContext activeMember = iterator.next();
+ if(activeMember == null) {
+ iterator.remove();
+ continue;
+ }
+ if(memberId.equals(activeMember.getMemberId())){
+ // member is activated
+ // remove from pending list
+ iterator.remove();
+ // add to the activated list
+ this.terminationPendingMembers.add(activeMember);
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Active member is removed and added to the " +
+ "termination pending member list. [Member Id] %s", memberId));
+ }
+ break;
+ }
+ }
+ }
+
+ public boolean removeTerminationPendingMember(String memberId) {
+ boolean terminationPendingMemberAvailable = false;
+ for (MemberContext memberContext: terminationPendingMembers){
+ if(memberContext.getMemberId().equals(memberId)){
+ terminationPendingMemberAvailable = true;
+ terminationPendingMembers.remove(memberContext);
+ break;
+ }
+ }
+ return terminationPendingMemberAvailable;
+ }
+
+ public long getObsoltedMemberExpiryTime() {
+ return obsoltedMemberExpiryTime;
+ }
+
+ public void setObsoltedMemberExpiryTime(long obsoltedMemberExpiryTime) {
+ this.obsoltedMemberExpiryTime = obsoltedMemberExpiryTime;
+ }
+
+ public void addObsoleteMember(MemberContext ctxt) {
+ this.obsoletedMembers.put(ctxt.getMemberId(), ctxt);
+ }
+
+ public boolean removeObsoleteMember(String memberId) {
+ if(this.obsoletedMembers.remove(memberId) == null) {
+ return false;
+ }
+ return true;
+ }
+
+ public Map<String, MemberContext> getObsoletedMembers() {
+ return obsoletedMembers;
+ }
+
+ public void setObsoletedMembers(Map<String, MemberContext> obsoletedMembers) {
+ this.obsoletedMembers = obsoletedMembers;
+ }
+
+ public MemberStatsContext getPartitionCtxt(String id) {
+ return this.memberStatsContexts.get(id);
+ }
+
+ public List<MemberContext> getTerminationPendingMembers() {
+ return terminationPendingMembers;
+ }
+
+ public void setTerminationPendingMembers(List<MemberContext> terminationPendingMembers) {
+ this.terminationPendingMembers = terminationPendingMembers;
+ }
+
+ public int getTotalMemberCount() {
+ return activeMembers.size() + pendingMembers.size() + terminationPendingMembers.size();
+ }
+
+ public int getNonTerminatedMemberCount() {
+ return activeMembers.size() + pendingMembers.size() + terminationPendingMembers.size();
+ }
+
+ public String getClusterId() {
+ return clusterId;
+ }
+
+ public void setClusterId(String clusterId) {
+ this.clusterId = clusterId;
+ }
+
+ public boolean isServiceClusterCreated() {
+ return isServiceClusterCreated;
+ }
+
+ public void setServiceClusterCreated(boolean isServiceClusterCreated) {
+ this.isServiceClusterCreated = isServiceClusterCreated;
+ }
+}
http://git-wip-us.apache.org/repos/asf/stratos/blob/c20d28c2/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
new file mode 100644
index 0000000..f5c3baa
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
@@ -0,0 +1,103 @@
+/*
+ * 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.autoscaler.context.cluster;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.context.partition.network.ClusterLevelNetworkPartitionContext;
+import org.apache.stratos.autoscaler.policy.model.*;
+import org.apache.stratos.messaging.domain.topology.Member;
+
+import java.util.*;
+
+/*
+ * It holds the runtime data of a VM cluster
+ */
+public class VMClusterContext extends AbstractClusterContext {
+
+ private static final Log log = LogFactory.getLog(VMClusterContext.class);
+
+ // Map<NetworkpartitionId, Network Partition Context>
+ protected Map<String, ClusterLevelNetworkPartitionContext> networkPartitionCtxts;
+ protected DeploymentPolicy deploymentPolicy;
+ protected AutoscalePolicy autoscalePolicy;
+
+ public VMClusterContext(String clusterId, String serviceId, AutoscalePolicy autoscalePolicy, DeploymentPolicy deploymentPolicy,
+ Map<String, ClusterLevelNetworkPartitionContext> networkPartitionCtxts) {
+
+ super(clusterId, serviceId);
+ this.deploymentPolicy = deploymentPolicy;
+ this.networkPartitionCtxts = networkPartitionCtxts;
+ this.autoscalePolicy = autoscalePolicy;
+
+ }
+
+ public Map<String, ClusterLevelNetworkPartitionContext> getNetworkPartitionCtxts(){
+ return networkPartitionCtxts;
+ }
+
+ public DeploymentPolicy getDeploymentPolicy() {
+ return deploymentPolicy;
+ }
+
+ public void setDeploymentPolicy(DeploymentPolicy deploymentPolicy) {
+ this.deploymentPolicy = deploymentPolicy;
+ }
+
+ public AutoscalePolicy getAutoscalePolicy() {
+ return autoscalePolicy;
+ }
+
+ public void setAutoscalePolicy(AutoscalePolicy autoscalePolicy) {
+ this.autoscalePolicy = autoscalePolicy;
+ }
+
+ public ClusterLevelNetworkPartitionContext getNetworkPartitionCtxt(String networkPartitionId) {
+ return networkPartitionCtxts.get(networkPartitionId);
+ }
+
+ public void setPartitionCtxt(Map<String, ClusterLevelNetworkPartitionContext> partitionCtxt) {
+ this.networkPartitionCtxts = partitionCtxt;
+ }
+
+ public boolean partitionCtxtAvailable(String partitionId) {
+ return networkPartitionCtxts.containsKey(partitionId);
+ }
+
+ public void addNetworkPartitionCtxt(ClusterLevelNetworkPartitionContext ctxt) {
+ this.networkPartitionCtxts.put(ctxt.getId(), ctxt);
+ }
+
+ public ClusterLevelNetworkPartitionContext getPartitionCtxt(String id) {
+ return this.networkPartitionCtxts.get(id);
+ }
+
+ public ClusterLevelNetworkPartitionContext getNetworkPartitionCtxt(Member member) {
+ log.info("***** getNetworkPartitionCtxt " + member.getNetworkPartitionId());
+ String networkPartitionId = member.getNetworkPartitionId();
+ if (networkPartitionCtxts.containsKey(networkPartitionId)) {
+ log.info("returnnig network partition context " + networkPartitionCtxts.get(networkPartitionId));
+ return networkPartitionCtxts.get(networkPartitionId);
+ }
+
+ log.info("returning null getNetworkPartitionCtxt");
+ return null;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/stratos/blob/c20d28c2/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMServiceClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMServiceClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMServiceClusterContext.java
new file mode 100644
index 0000000..69720c4
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMServiceClusterContext.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.autoscaler.context.cluster;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.context.partition.network.ClusterLevelNetworkPartitionContext;
+import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
+import org.apache.stratos.autoscaler.policy.model.DeploymentPolicy;
+
+import java.util.Map;
+
+/*
+ * It holds the runtime data of a VM service cluster
+ */
+public class VMServiceClusterContext extends VMClusterContext {
+
+ private static final Log log = LogFactory.getLog(VMServiceClusterContext.class);
+
+ protected AutoscalePolicy autoscalePolicy;
+
+ public VMServiceClusterContext(String clusterId, String serviceId, AutoscalePolicy autoscalePolicy, DeploymentPolicy deploymentPolicy,
+ Map<String, ClusterLevelNetworkPartitionContext> networkPartitionCtxts) {
+
+ super(clusterId, serviceId, autoscalePolicy, deploymentPolicy, networkPartitionCtxts);
+ this.autoscalePolicy = autoscalePolicy;
+
+ }
+
+ public AutoscalePolicy getAutoscalePolicy() {
+ return autoscalePolicy;
+ }
+
+ public void setAutoscalePolicy(AutoscalePolicy autoscalePolicy) {
+ this.autoscalePolicy = autoscalePolicy;
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/stratos/blob/c20d28c2/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/member/MemberStatsContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/member/MemberStatsContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/member/MemberStatsContext.java
new file mode 100644
index 0000000..9999770
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/member/MemberStatsContext.java
@@ -0,0 +1,112 @@
+/*
+ * 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.autoscaler.context.member;
+
+import org.apache.stratos.autoscaler.policy.model.LoadAverage;
+import org.apache.stratos.autoscaler.policy.model.MemoryConsumption;
+
+/**
+ * This class will keep additional parameters such as load average and memory consumption
+ */
+
+public class MemberStatsContext {
+ private LoadAverage loadAverage;
+ private MemoryConsumption memoryConsumption;
+ private String memberId;
+ private String instanceId;
+
+ public MemberStatsContext(String memberId) {
+ this.memberId = memberId;
+ memoryConsumption = new MemoryConsumption();
+ loadAverage = new LoadAverage();
+ }
+
+ public String getMemberId() {
+ return memberId;
+ }
+
+ public void setMemberId(String memberId) {
+ this.memberId = memberId;
+ }
+
+ public LoadAverage getLoadAverage() {
+ return loadAverage;
+ }
+
+ public MemoryConsumption getMemoryConsumption() {
+ return memoryConsumption;
+ }
+
+ public void setAverageLoadAverage(float value) {
+ loadAverage.setAverage(value);
+ }
+
+ public void setAverageMemoryConsumption(float value) {
+ memoryConsumption.setAverage(value);
+ }
+
+ public void setGradientOfLoadAverage(float value) {
+ loadAverage.setGradient(value);
+ }
+
+ public void setGradientOfMemoryConsumption(float value) {
+ memoryConsumption.setGradient(value);
+ }
+
+ public void setSecondDerivativeOfLoadAverage(float value) {
+ loadAverage.setSecondDerivative(value);
+ }
+
+ public void setSecondDerivativeOfMemoryConsumption(float value) {
+ memoryConsumption.setSecondDerivative(value);
+ }
+
+ public float getAverageLoadAverage() {
+ return loadAverage.getAverage();
+ }
+
+ public float getAverageMemoryConsumption() {
+ return memoryConsumption.getAverage();
+ }
+
+ public float getGradientOfLoadAverage() {
+ return loadAverage.getGradient();
+ }
+
+ public float getGradientOfMemoryConsumption() {
+ return memoryConsumption.getGradient();
+ }
+
+ public float getSecondDerivativeOfLoadAverage() {
+ return loadAverage.getSecondDerivative();
+ }
+
+ public float getSecondDerivativeOfMemoryConsumption() {
+ return memoryConsumption.getSecondDerivative();
+ }
+
+ public String getInstanceId() {
+ return instanceId;
+ }
+
+ public void setInstanceId(String instanceId) {
+ this.instanceId = instanceId;
+ }
+}