You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@stratos.apache.org by Lahiru Sandaruwan <la...@wso2.com> on 2014/10/01 17:25:29 UTC
Re: [2/4] cluster monitors hierarchy redesigned and docker cluster
monitor improved
Hi guys,
It seems we have lost all the Git history of Cluster Monitors with this
commit :(
We should have Git move in this kind of cases.
Thanks.
On Tue, Sep 23, 2014 at 2:49 PM, <ni...@apache.org> wrote:
>
> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
> ----------------------------------------------------------------------
> diff --git
> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
> index b8dcd73..6525eba 100644
> ---
> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
> +++
> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
> @@ -19,34 +19,54 @@
>
> package org.apache.stratos.autoscaler.message.receiver.topology;
>
> +import java.util.List;
> +
> import org.apache.commons.logging.Log;
> import org.apache.commons.logging.LogFactory;
> -import org.apache.stratos.autoscaler.*;
> +import org.apache.stratos.autoscaler.AutoscalerContext;
> +import org.apache.stratos.autoscaler.KubernetesClusterContext;
> +import org.apache.stratos.autoscaler.MemberStatsContext;
> +import org.apache.stratos.autoscaler.NetworkPartitionContext;
> +import org.apache.stratos.autoscaler.NetworkPartitionLbHolder;
> +import org.apache.stratos.autoscaler.PartitionContext;
> import
> org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
> import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
> import
> org.apache.stratos.autoscaler.exception.PartitionValidationException;
> import org.apache.stratos.autoscaler.exception.PolicyValidationException;
> import org.apache.stratos.autoscaler.exception.TerminationException;
> -import org.apache.stratos.autoscaler.monitor.AbstractMonitor;
> -import org.apache.stratos.autoscaler.monitor.ClusterMonitor;
> -import org.apache.stratos.autoscaler.monitor.KubernetesClusterMonitor;
> -import org.apache.stratos.autoscaler.monitor.LbClusterMonitor;
> +import org.apache.stratos.autoscaler.monitor.AbstractClusterMonitor;
> +import org.apache.stratos.autoscaler.monitor.ClusterMonitorFactory;
> +import org.apache.stratos.autoscaler.monitor.ContainerClusterMonitor;
> +import org.apache.stratos.autoscaler.monitor.VMClusterMonitor;
> import org.apache.stratos.autoscaler.partition.PartitionManager;
> import org.apache.stratos.autoscaler.policy.PolicyManager;
> import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
> -import org.apache.stratos.autoscaler.util.AutoscalerUtil;
> +import org.apache.stratos.common.enums.ClusterType;
> import org.apache.stratos.messaging.domain.topology.Cluster;
> import org.apache.stratos.messaging.domain.topology.Service;
> import org.apache.stratos.messaging.event.Event;
> -import org.apache.stratos.messaging.event.topology.*;
> -import org.apache.stratos.messaging.listener.topology.*;
> +import org.apache.stratos.messaging.event.topology.ClusterCreatedEvent;
> +import
> org.apache.stratos.messaging.event.topology.ClusterMaintenanceModeEvent;
> +import org.apache.stratos.messaging.event.topology.ClusterRemovedEvent;
> +import org.apache.stratos.messaging.event.topology.MemberActivatedEvent;
> +import
> org.apache.stratos.messaging.event.topology.MemberMaintenanceModeEvent;
> +import
> org.apache.stratos.messaging.event.topology.MemberReadyToShutdownEvent;
> +import org.apache.stratos.messaging.event.topology.MemberTerminatedEvent;
> +import
> org.apache.stratos.messaging.listener.topology.ClusterCreatedEventListener;
> +import
> org.apache.stratos.messaging.listener.topology.ClusterMaintenanceModeEventListener;
> +import
> org.apache.stratos.messaging.listener.topology.ClusterRemovedEventListener;
> +import
> org.apache.stratos.messaging.listener.topology.CompleteTopologyEventListener;
> +import
> org.apache.stratos.messaging.listener.topology.MemberActivatedEventListener;
> +import
> org.apache.stratos.messaging.listener.topology.MemberMaintenanceListener;
> +import
> org.apache.stratos.messaging.listener.topology.MemberReadyToShutdownEventListener;
> +import
> org.apache.stratos.messaging.listener.topology.MemberStartedEventListener;
> +import
> org.apache.stratos.messaging.listener.topology.MemberTerminatedEventListener;
> +import
> org.apache.stratos.messaging.listener.topology.ServiceRemovedEventListener;
> import
> org.apache.stratos.messaging.message.receiver.topology.TopologyEventReceiver;
> import
> org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
> import org.drools.runtime.StatefulKnowledgeSession;
> import org.drools.runtime.rule.FactHandle;
>
> -import java.util.List;
> -
> /**
> * Autoscaler topology receiver.
> */
> @@ -116,42 +136,60 @@ public class AutoscalerTopologyEventReceiver
> implements Runnable {
> try {
> MemberReadyToShutdownEvent memberReadyToShutdownEvent
> = (MemberReadyToShutdownEvent)event;
> AutoscalerContext asCtx =
> AutoscalerContext.getInstance();
> - AbstractMonitor monitor;
> + AbstractClusterMonitor monitor;
> String clusterId =
> memberReadyToShutdownEvent.getClusterId();
> String memberId =
> memberReadyToShutdownEvent.getMemberId();
>
> - if(asCtx.monitorExist(clusterId)){
> - monitor = asCtx.getMonitor(clusterId);
> - }else if(asCtx.lbMonitorExist(clusterId)){
> - monitor = asCtx.getLBMonitor(clusterId);
> - }else{
> + if(asCtx.clusterMonitorExist(clusterId)) {
> + monitor = asCtx.getClusterMonitor(clusterId);
> + } else {
> if(log.isDebugEnabled()){
> log.debug(String.format("A cluster monitor is
> not found in autoscaler context [cluster] %s", clusterId));
> }
> return;
> }
> -
> - NetworkPartitionContext nwPartitionCtxt;
> - nwPartitionCtxt =
> monitor.getNetworkPartitionCtxt(memberReadyToShutdownEvent.getNetworkPartitionId());
> -
> - // start a new member in the same Partition
> - String partitionId =
> monitor.getPartitionOfMember(memberId);
> - PartitionContext partitionCtxt =
> nwPartitionCtxt.getPartitionCtxt(partitionId);
> -
> -
> - // terminate the shutdown ready member
> - CloudControllerClient ccClient =
> CloudControllerClient.getInstance();
> - ccClient.terminate(memberId);
> -
> - // remove from active member list
> - partitionCtxt.removeActiveMemberById(memberId);
> -
> - if (log.isInfoEnabled()) {
> - log.info(String.format("Member is terminated and
> removed from the active members list: [member] %s [partition] %s [cluster]
> %s ",
> - memberId, partitionId,
> clusterId));
> +
> + TopologyManager.acquireReadLock();
> +
> + if(monitor.getClusterType() ==
> ClusterType.VMServiceCluster
> + || monitor.getClusterType() ==
> ClusterType.VMLbCluster) {
> +
> + NetworkPartitionContext nwPartitionCtxt;
> + nwPartitionCtxt = ((VMClusterMonitor)
> monitor).getNetworkPartitionCtxt(memberReadyToShutdownEvent.getNetworkPartitionId());
> +
> + // start a new member in the same Partition
> + String partitionId = ((VMClusterMonitor)
> monitor).getPartitionOfMember(memberId);
> + PartitionContext partitionCtxt =
> nwPartitionCtxt.getPartitionCtxt(partitionId);
> +
> +
> + // terminate the shutdown ready member
> + CloudControllerClient ccClient =
> CloudControllerClient.getInstance();
> + ccClient.terminate(memberId);
> +
> + // remove from active member list
> + partitionCtxt.removeActiveMemberById(memberId);
> +
> + if (log.isInfoEnabled()) {
> + log.info(String.format("Member is terminated
> and removed from the active members list: [member] %s [partition] %s
> [cluster] %s ",
> + memberId, partitionId,
> clusterId));
> + }
> + } else if(monitor.getClusterType() ==
> ClusterType.DockerServiceCluster) {
> + KubernetesClusterContext kubernetesClusterContext
> = ((ContainerClusterMonitor) monitor).getKubernetesClusterCtxt();
> + //terminate the shutdown ready container
> +
> CloudControllerClient.getInstance().terminateContainer(memberId);
> + //remove from active member list
> +
> kubernetesClusterContext.removeActiveMemberById(memberId);
> +
> + if (log.isInfoEnabled()) {
> + log.info(String.format("Member is terminated
> and removed from the active members list: [member] %s [kub cluster] %s
> [cluster] %s ",
> + memberId,
> kubernetesClusterContext.getKubernetesClusterID(), clusterId));
> + }
> }
> +
> } catch (TerminationException e) {
> log.error(e);
> + } finally {
> + TopologyManager.releaseReadLock();
> }
> }
>
> @@ -185,12 +223,8 @@ public class AutoscalerTopologyEventReceiver
> implements Runnable {
> TopologyManager.acquireReadLock();
> Service service =
> TopologyManager.getTopology().getService(e.getServiceName());
> Cluster cluster =
> service.getCluster(e.getClusterId());
> -
> if(AutoscalerContext.getInstance().kubernetesClusterMonitorExist(cluster.getClusterId()))
> {
> -
> AutoscalerContext.getInstance().getKubernetesClusterMonitor(e.getClusterId()).setStatus(e.getStatus());
> - } else
> if(AutoscalerContext.getInstance().monitorExist((cluster.getClusterId()))) {
> -
> AutoscalerContext.getInstance().getMonitor(e.getClusterId()).setStatus(e.getStatus());
> - } else if
> (AutoscalerContext.getInstance().lbMonitorExist((cluster.getClusterId()))) {
> -
> AutoscalerContext.getInstance().getLBMonitor(e.getClusterId()).setStatus(e.getStatus());
> +
> if(AutoscalerContext.getInstance().clusterMonitorExist(cluster.getClusterId()))
> {
> +
> AutoscalerContext.getInstance().getClusterMonitor(e.getClusterId()).setStatus(e.getStatus());
> } else {
> log.error("cluster monitor not exists for the
> cluster: " + cluster.toString());
> }
> @@ -213,8 +247,7 @@ public class AutoscalerTopologyEventReceiver
> implements Runnable {
> String clusterId = e.getClusterId();
> String deploymentPolicy = e.getDeploymentPolicy();
>
> - AbstractMonitor monitor = null;
> - KubernetesClusterMonitor kubernetesClusterMonitor =
> null;
> + AbstractClusterMonitor monitor = null;
>
> if (e.isLbCluster()) {
> DeploymentPolicy depPolicy =
> PolicyManager.getInstance().getDeploymentPolicy(deploymentPolicy);
> @@ -239,13 +272,9 @@ public class AutoscalerTopologyEventReceiver
> implements Runnable {
>
> }
> }
> - monitor = AutoscalerContext.getInstance()
> - .removeLbMonitor(clusterId);
> -
> - } else {
> - monitor = AutoscalerContext.getInstance()
> - .removeMonitor(clusterId);
> }
> +
> + monitor =
> AutoscalerContext.getInstance().removeClusterMonitor(clusterId);
>
> // runTerminateAllRule(monitor);
> if (monitor != null) {
> @@ -280,43 +309,73 @@ public class AutoscalerTopologyEventReceiver
> implements Runnable {
> String networkPartitionId = e.getNetworkPartitionId();
> String clusterId = e.getClusterId();
> String partitionId = e.getPartitionId();
> - AbstractMonitor monitor;
> + String memberId = e.getMemberId();
> + AbstractClusterMonitor monitor;
> +
> + AutoscalerContext asCtx =
> AutoscalerContext.getInstance();
>
> - if
> (AutoscalerContext.getInstance().monitorExist(clusterId)) {
> - monitor =
> AutoscalerContext.getInstance().getMonitor(clusterId);
> + if(asCtx.clusterMonitorExist(clusterId)) {
> + monitor = asCtx.getClusterMonitor(clusterId);
> } else {
> - //This is LB member
> - monitor =
> AutoscalerContext.getInstance().getLBMonitor(clusterId);
> + if(log.isDebugEnabled()){
> + log.debug(String.format("A cluster monitor is
> not found in autoscaler context [cluster] %s", clusterId));
> + }
> + return;
> }
> +
> + if(monitor.getClusterType() ==
> ClusterType.VMServiceCluster
> + || monitor.getClusterType() ==
> ClusterType.VMLbCluster) {
> +
> + NetworkPartitionContext networkPartitionContext =
> ((VMClusterMonitor) monitor).getNetworkPartitionCtxt(networkPartitionId);
> +
> + PartitionContext partitionContext =
> networkPartitionContext.getPartitionCtxt(partitionId);
> +
> partitionContext.removeMemberStatsContext(memberId);
> +
> + if
> (partitionContext.removeTerminationPendingMember(memberId)) {
> + if (log.isDebugEnabled()) {
> + log.debug(String.format("Member is
> removed from termination pending members list: [member] %s", memberId));
> + }
> + } else if
> (partitionContext.removePendingMember(memberId)) {
> + if (log.isDebugEnabled()) {
> + log.debug(String.format("Member is
> removed from pending members list: [member] %s", memberId));
> + }
> + } else if
> (partitionContext.removeActiveMemberById(memberId)) {
> + log.warn(String.format("Member is in the
> wrong list and it is removed from active members list", memberId));
> + } else if
> (partitionContext.removeObsoleteMember(memberId)){
> + log.warn(String.format("Member's obsolated
> timeout has been expired and it is removed from obsolated members list",
> memberId));
> + } else {
> + log.warn(String.format("Member is not
> available in any of the list active, pending and termination pending",
> memberId));
> + }
>
> - NetworkPartitionContext networkPartitionContext =
> monitor.getNetworkPartitionCtxt(networkPartitionId);
> -
> - PartitionContext partitionContext =
> networkPartitionContext.getPartitionCtxt(partitionId);
> - String memberId = e.getMemberId();
> - partitionContext.removeMemberStatsContext(memberId);
> -
> - if
> (partitionContext.removeTerminationPendingMember(memberId)) {
> - if (log.isDebugEnabled()) {
> - log.debug(String.format("Member is removed
> from termination pending members list: [member] %s", memberId));
> + if (log.isInfoEnabled()) {
> + log.info(String.format("Member stat context
> has been removed successfully: [member] %s", memberId));
> }
> - } else if
> (partitionContext.removePendingMember(memberId)) {
> - if (log.isDebugEnabled()) {
> - log.debug(String.format("Member is removed
> from pending members list: [member] %s", memberId));
> + } else if(monitor.getClusterType() ==
> ClusterType.DockerServiceCluster) {
> +
> + KubernetesClusterContext kubernetesClusterContext
> = ((ContainerClusterMonitor) monitor).getKubernetesClusterCtxt();
> +
> kubernetesClusterContext.removeMemberStatsContext(memberId);
> +
> + if
> (kubernetesClusterContext.removeTerminationPendingMember(memberId)) {
> + if (log.isDebugEnabled()) {
> + log.debug(String.format("Member is
> removed from termination pending members list: [member] %s", memberId));
> + }
> + } else if
> (kubernetesClusterContext.removePendingMember(memberId)) {
> + if (log.isDebugEnabled()) {
> + log.debug(String.format("Member is
> removed from pending members list: [member] %s", memberId));
> + }
> + } else if
> (kubernetesClusterContext.removeActiveMemberById(memberId)) {
> + log.warn(String.format("Member is in the
> wrong list and it is removed from active members list", memberId));
> + } else if
> (kubernetesClusterContext.removeObsoleteMember(memberId)){
> + log.warn(String.format("Member's obsolated
> timeout has been expired and it is removed from obsolated members list",
> memberId));
> + } else {
> + log.warn(String.format("Member is not
> available in any of the list active, pending and termination pending",
> memberId));
> }
> - } else if
> (partitionContext.removeActiveMemberById(memberId)) {
> - log.warn(String.format("Member is in the wrong
> list and it is removed from active members list", memberId));
> - } else if
> (partitionContext.removeObsoleteMember(memberId)){
> - log.warn(String.format("Member's obsolated timeout
> has been expired and it is removed from obsolated members list", memberId));
> - } else {
> - log.warn(String.format("Member is not available
> in any of the list active, pending and termination pending", memberId));
> - }
>
> - if (log.isInfoEnabled()) {
> - log.info(String.format("Member stat context has
> been removed successfully: [member] %s", memberId));
> + if (log.isInfoEnabled()) {
> + log.info(String.format("Member stat context
> has been removed successfully: [member] %s", memberId));
> + }
> }
> -// partitionContext.decrementCurrentActiveMemberCount(1);
> -
> -
> +
> } catch (Exception e) {
> log.error("Error processing event", e);
> } finally {
> @@ -338,24 +397,37 @@ public class AutoscalerTopologyEventReceiver
> implements Runnable {
> String partitionId = e.getPartitionId();
> String networkPartitionId = e.getNetworkPartitionId();
>
> - PartitionContext partitionContext;
> String clusterId = e.getClusterId();
> - AbstractMonitor monitor;
> -
> - if
> (AutoscalerContext.getInstance().monitorExist(clusterId)) {
> - monitor =
> AutoscalerContext.getInstance().getMonitor(clusterId);
> - partitionContext =
> monitor.getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
> + AbstractClusterMonitor monitor;
> +
> + AutoscalerContext asCtx =
> AutoscalerContext.getInstance();
> + if(asCtx.clusterMonitorExist(clusterId)) {
> + monitor = asCtx.getClusterMonitor(clusterId);
> } else {
> - monitor =
> AutoscalerContext.getInstance().getLBMonitor(clusterId);
> - partitionContext =
> monitor.getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
> - }
> - partitionContext.addMemberStatsContext(new
> MemberStatsContext(memberId));
> - if (log.isInfoEnabled()) {
> - log.info(String.format("Member stat context has
> been added successfully: [member] %s", memberId));
> + if(log.isDebugEnabled()){
> + log.debug(String.format("A cluster monitor is
> not found in autoscaler context [cluster] %s", clusterId));
> + }
> + return;
> }
> -// partitionContext.incrementCurrentActiveMemberCount(1);
> -
> partitionContext.movePendingMemberToActiveMembers(memberId);
> -
> +
> + if (monitor.getClusterType() ==
> ClusterType.VMServiceCluster) {
> + PartitionContext partitionContext;
> + partitionContext = ((VMClusterMonitor)
> monitor).getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
> + partitionContext.addMemberStatsContext(new
> MemberStatsContext(memberId));
> + if (log.isInfoEnabled()) {
> + log.info(String.format("Member stat context
> has been added successfully: [member] %s", memberId));
> + }
> +
> partitionContext.movePendingMemberToActiveMembers(memberId);
> + } else if(monitor.getClusterType()
> == ClusterType.DockerServiceCluster) {
> + KubernetesClusterContext
> kubernetesClusterContext;
> + kubernetesClusterContext =
> ((ContainerClusterMonitor) monitor).getKubernetesClusterCtxt();
> +
> kubernetesClusterContext.addMemberStatsContext(new
> MemberStatsContext(memberId));
> + if (log.isInfoEnabled()) {
> + log.info(String.format("Member stat context
> has been added successfully: [member] %s", memberId));
> + }
> +
> kubernetesClusterContext.movePendingMemberToActiveMembers(memberId);
> + }
> +
> } catch (Exception e) {
> log.error("Error processing event", e);
> } finally {
> @@ -368,42 +440,59 @@ public class AutoscalerTopologyEventReceiver
> implements Runnable {
> @Override
> protected void onEvent(Event event) {
> try {
> + TopologyManager.acquireReadLock();
> +
> MemberReadyToShutdownEvent memberReadyToShutdownEvent
> = (MemberReadyToShutdownEvent)event;
> AutoscalerContext asCtx =
> AutoscalerContext.getInstance();
> - AbstractMonitor monitor;
> + AbstractClusterMonitor monitor;
> String clusterId =
> memberReadyToShutdownEvent.getClusterId();
> String memberId =
> memberReadyToShutdownEvent.getMemberId();
>
> - if(asCtx.monitorExist(clusterId)){
> - monitor = asCtx.getMonitor(clusterId);
> - }else if(asCtx.lbMonitorExist(clusterId)){
> - monitor = asCtx.getLBMonitor(clusterId);
> - }else{
> + if(asCtx.clusterMonitorExist(clusterId)) {
> + monitor = asCtx.getClusterMonitor(clusterId);
> + } else {
> if(log.isDebugEnabled()){
> log.debug(String.format("A cluster monitor is
> not found in autoscaler context [cluster] %s", clusterId));
> }
> return;
> }
>
> - NetworkPartitionContext nwPartitionCtxt;
> - nwPartitionCtxt =
> monitor.getNetworkPartitionCtxt(memberReadyToShutdownEvent.getNetworkPartitionId());
> + if(monitor.getClusterType() ==
> ClusterType.VMServiceCluster
> + || monitor.getClusterType() ==
> ClusterType.VMLbCluster) {
> +
> + NetworkPartitionContext nwPartitionCtxt;
> + nwPartitionCtxt = ((VMClusterMonitor)
> monitor).getNetworkPartitionCtxt(memberReadyToShutdownEvent.getNetworkPartitionId());
>
> - // start a new member in the same Partition
> - String partitionId =
> monitor.getPartitionOfMember(memberId);
> - PartitionContext partitionCtxt =
> nwPartitionCtxt.getPartitionCtxt(partitionId);
> + // start a new member in the same Partition
> + String partitionId = ((VMClusterMonitor)
> monitor).getPartitionOfMember(memberId);
> + PartitionContext partitionCtxt =
> nwPartitionCtxt.getPartitionCtxt(partitionId);
>
>
> - // terminate the shutdown ready member
> - CloudControllerClient ccClient =
> CloudControllerClient.getInstance();
> - ccClient.terminate(memberId);
> + // terminate the shutdown ready member
> + CloudControllerClient ccClient =
> CloudControllerClient.getInstance();
> + ccClient.terminate(memberId);
>
> - // remove from active member list
> - partitionCtxt.removeActiveMemberById(memberId);
> + // remove from active member list
> + partitionCtxt.removeActiveMemberById(memberId);
>
> - if (log.isInfoEnabled()) {
> - log.info(String.format("Member is terminated and
> removed from the active members list: [member] %s [partition] %s [cluster]
> %s ",
> - memberId, partitionId,
> clusterId));
> + if (log.isInfoEnabled()) {
> + log.info(String.format("Member is terminated
> and removed from the active members list: [member] %s [partition] %s
> [cluster] %s ",
> + memberId, partitionId,
> clusterId));
> + }
> + } else if(monitor.getClusterType() ==
> ClusterType.DockerServiceCluster) {
> + KubernetesClusterContext
> kubernetesClusterContext;
> + kubernetesClusterContext =
> ((ContainerClusterMonitor) monitor).getKubernetesClusterCtxt();
> + // terminate the shutdown ready member
> +
> CloudControllerClient.getInstance().terminateContainer(memberId);
> + // remove from active member list
> +
> kubernetesClusterContext.removeActiveMemberById(memberId);
> +
> + if (log.isInfoEnabled()) {
> + log.info(String.format("Member is terminated
> and removed from the active members list: [member] %s [kub cluster] %s
> [cluster] %s ",
> + memberId,
> kubernetesClusterContext.getKubernetesClusterID(), clusterId));
> + }
> }
> +
> } catch (TerminationException e) {
> log.error(e);
> }
> @@ -424,22 +513,38 @@ public class AutoscalerTopologyEventReceiver
> implements Runnable {
> String partitionId = e.getPartitionId();
> String networkPartitionId = e.getNetworkPartitionId();
>
> - PartitionContext partitionContext;
> String clusterId = e.getClusterId();
> - AbstractMonitor monitor;
> -
> - if
> (AutoscalerContext.getInstance().monitorExist(clusterId)) {
> - monitor =
> AutoscalerContext.getInstance().getMonitor(clusterId);
> - partitionContext =
> monitor.getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
> + AbstractClusterMonitor monitor;
> +
> + AutoscalerContext asCtx =
> AutoscalerContext.getInstance();
> + if (asCtx.clusterMonitorExist(clusterId)) {
> + monitor =
> AutoscalerContext.getInstance().getClusterMonitor(clusterId);
> } else {
> - monitor =
> AutoscalerContext.getInstance().getLBMonitor(clusterId);
> - partitionContext =
> monitor.getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
> + if(log.isDebugEnabled()){
> + log.debug(String.format("A cluster monitor is
> not found in autoscaler context [cluster] %s", clusterId));
> + }
> + return;
> }
> - partitionContext.addMemberStatsContext(new
> MemberStatsContext(memberId));
> - if (log.isDebugEnabled()) {
> - log.debug(String.format("Member has been moved as
> pending termination: [member] %s", memberId));
> +
> + if(monitor.getClusterType() ==
> ClusterType.VMServiceCluster
> + || monitor.getClusterType() ==
> ClusterType.VMLbCluster) {
> +
> + PartitionContext partitionContext;
> + partitionContext = ((VMClusterMonitor)
> monitor).getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
> + partitionContext.addMemberStatsContext(new
> MemberStatsContext(memberId));
> + if (log.isDebugEnabled()) {
> + log.debug(String.format("Member has been
> moved as pending termination: [member] %s", memberId));
> + }
> +
> partitionContext.moveActiveMemberToTerminationPendingMembers(memberId);
> + } else if(monitor.getClusterType() ==
> ClusterType.DockerServiceCluster) {
> + KubernetesClusterContext kubernetesClusterContext;
> + kubernetesClusterContext =
> ((ContainerClusterMonitor) monitor).getKubernetesClusterCtxt();
> + kubernetesClusterContext.addMemberStatsContext(new
> MemberStatsContext(memberId));
> + if (log.isDebugEnabled()) {
> + log.debug(String.format("Member has been
> moved as pending termination: [member] %s", memberId));
> + }
> +
> kubernetesClusterContext.moveActiveMemberToTerminationPendingMembers(memberId);
> }
> -
> partitionContext.moveActiveMemberToTerminationPendingMembers(memberId);
>
> } catch (Exception e) {
> log.error("Error processing event", e);
> @@ -471,64 +576,15 @@ public class AutoscalerTopologyEventReceiver
> implements Runnable {
> });
> }
>
> - private class LBClusterMonitorAdder implements Runnable {
> - private Cluster cluster;
> -
> - public LBClusterMonitorAdder(Cluster cluster) {
> - this.cluster = cluster;
> - }
> -
> - public void run() {
> - LbClusterMonitor monitor = null;
> - int retries = 5;
> - boolean success = false;
> - do {
> - try {
> - Thread.sleep(5000);
> - } catch (InterruptedException e1) {
> - }
> - try {
> - monitor = AutoscalerUtil.getLBClusterMonitor(cluster);
> - success = true;
> -
> - } catch (PolicyValidationException e) {
> - String msg = "LB Cluster monitor creation failed for
> cluster: " + cluster.getClusterId();
> - log.debug(msg, e);
> - retries--;
> -
> - } catch (PartitionValidationException e) {
> - String msg = "LB Cluster monitor creation failed for
> cluster: " + cluster.getClusterId();
> - log.debug(msg, e);
> - retries--;
> - }
> - } while (!success && retries <= 0);
> -
> - if (monitor == null) {
> - String msg = "LB Cluster monitor creation failed, even
> after retrying for 5 times, "
> - + "for cluster: " + cluster.getClusterId();
> - log.error(msg);
> - throw new RuntimeException(msg);
> - }
> -
> - Thread th = new Thread(monitor);
> - th.start();
> - AutoscalerContext.getInstance().addLbMonitor(monitor);
> - if (log.isInfoEnabled()) {
> - log.info(String.format("LB Cluster monitor has been
> added successfully: [cluster] %s",
> - cluster.getClusterId()));
> - }
> - }
> - }
> -
> private class ClusterMonitorAdder implements Runnable {
> private Cluster cluster;
> -
> + private String clusterMonitorType;
> public ClusterMonitorAdder(Cluster cluster) {
> this.cluster = cluster;
> }
>
> public void run() {
> - ClusterMonitor monitor = null;
> + AbstractClusterMonitor monitor = null;
> int retries = 5;
> boolean success = false;
> do {
> @@ -538,68 +594,23 @@ public class AutoscalerTopologyEventReceiver
> implements Runnable {
> }
>
> try {
> - monitor = AutoscalerUtil.getClusterMonitor(cluster);
> + monitor = ClusterMonitorFactory.getMonitor(cluster);
> success = true;
> -
> + clusterMonitorType = monitor.getClusterType().name();
> } catch (PolicyValidationException e) {
> - String msg = "Cluster monitor creation failed for
> cluster: " + cluster.getClusterId();
> + String msg = clusterMonitorType +" monitor creation
> failed for cluster: " + cluster.getClusterId();
> log.debug(msg, e);
> retries--;
>
> } catch (PartitionValidationException e) {
> - String msg = "Cluster monitor creation failed for
> cluster: " + cluster.getClusterId();
> - log.debug(msg, e);
> - retries--;
> - }
> - } while (!success && retries != 0);
> -
> - if (monitor == null) {
> - String msg = "Cluster monitor creation failed, even after
> retrying for 5 times, "
> - + "for cluster: " + cluster.getClusterId();
> - log.error(msg);
> - throw new RuntimeException(msg);
> - }
> -
> - Thread th = new Thread(monitor);
> - th.start();
> - AutoscalerContext.getInstance().addMonitor(monitor);
> - if (log.isInfoEnabled()) {
> - log.info(String.format("Cluster monitor has been added
> successfully: [cluster] %s",
> - cluster.getClusterId()));
> - }
> - }
> - }
> -
> - private class KubernetesClusterMonitorAdder implements Runnable {
> - private Cluster cluster;
> -
> - public KubernetesClusterMonitorAdder(Cluster cluster) {
> - this.cluster = cluster;
> - }
> -
> - public void run() {
> - KubernetesClusterMonitor monitor = null;
> - int retries = 5;
> - boolean success = false;
> - do {
> - try {
> - Thread.sleep(5000);
> - } catch (InterruptedException e1) {
> - }
> -
> - try {
> - monitor =
> AutoscalerUtil.getKubernetesClusterMonitor(cluster);
> - success = true;
> -
> - } catch (Exception e) {
> - String msg = "Kubernetes cluster monitor creation
> failed for cluster: " + cluster.getClusterId();
> + String msg = clusterMonitorType +" monitor creation
> failed for cluster: " + cluster.getClusterId();
> log.debug(msg, e);
> retries--;
> }
> } while (!success && retries != 0);
>
> if (monitor == null) {
> - String msg = "Kubernetes cluster monitor creation failed,
> even after retrying for 5 times, "
> + String msg = clusterMonitorType +" monitor creation
> failed, even after retrying for 5 times, "
> + "for cluster: " + cluster.getClusterId();
> log.error(msg);
> throw new RuntimeException(msg);
> @@ -607,16 +618,16 @@ public class AutoscalerTopologyEventReceiver
> implements Runnable {
>
> Thread th = new Thread(monitor);
> th.start();
> -
> AutoscalerContext.getInstance().addKubernetesClusterMonitor(monitor);
> + AutoscalerContext.getInstance().addClusterMonitor(monitor);
> if (log.isInfoEnabled()) {
> - log.info(String.format("Kubernetes cluster monitor has
> been added successfully: [cluster] %s",
> - cluster.getClusterId()));
> + log.info(String.format("%s monitor has been added
> successfully: [cluster] %s",
> + clusterMonitorType, cluster.getClusterId()));
> }
> }
> }
> -
> +
> @SuppressWarnings("unused")
> - private void runTerminateAllRule(AbstractMonitor monitor) {
> + private void runTerminateAllRule(VMClusterMonitor monitor) {
>
> FactHandle terminateAllFactHandle = null;
>
> @@ -639,16 +650,9 @@ public class AutoscalerTopologyEventReceiver
> implements Runnable {
>
> protected synchronized void startClusterMonitor(Cluster cluster) {
> Thread th = null;
> - if (cluster.isKubernetesCluster()
> - &&
> !AutoscalerContext.getInstance().kubernetesClusterMonitorExist(cluster.getClusterId()))
> {
> - th = new Thread(new
> KubernetesClusterMonitorAdder(cluster));
> - } else if (cluster.isLbCluster()
> - &&
> !AutoscalerContext.getInstance().lbMonitorExist(cluster.getClusterId())) {
> - th = new Thread(new LBClusterMonitorAdder(cluster));
> - } else if (!cluster.isLbCluster() &&
> !cluster.isKubernetesCluster()
> - &&
> !AutoscalerContext.getInstance().monitorExist(cluster.getClusterId())) {
> - th = new Thread(new ClusterMonitorAdder(cluster));
> - }
> + if
> (!AutoscalerContext.getInstance().clusterMonitorExist(cluster.getClusterId()))
> {
> + th = new Thread(new ClusterMonitorAdder(cluster));
> + }
> if (th != null) {
> th.start();
> try {
>
>
> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
> ----------------------------------------------------------------------
> diff --git
> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
> new file mode 100644
> index 0000000..00796f1
> --- /dev/null
> +++
> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
> @@ -0,0 +1,127 @@
> +package org.apache.stratos.autoscaler.monitor;
> +
> +import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
> +import org.apache.stratos.common.enums.ClusterType;
> +import org.apache.stratos.messaging.domain.topology.ClusterStatus;
> +import org.drools.runtime.StatefulKnowledgeSession;
> +import org.drools.runtime.rule.FactHandle;
> +
> +public abstract class AbstractClusterMonitor implements Runnable{
> +
> + private String clusterId;
> + private String serviceId;
> + private ClusterType clusterType;
> + private ClusterStatus status;
> + private int monitorInterval;
> +
> + protected FactHandle minCheckFactHandle;
> + protected FactHandle scaleCheckFactHandle;
> + private StatefulKnowledgeSession minCheckKnowledgeSession;
> + private StatefulKnowledgeSession scaleCheckKnowledgeSession;
> + private boolean isDestroyed;
> +
> + private AutoscalerRuleEvaluator autoscalerRuleEvaluator;
> +
> + protected AbstractClusterMonitor(String clusterId, String
> serviceId, ClusterType clusterType,
> + AutoscalerRuleEvaluator autoscalerRuleEvaluator) {
> +
> + super();
> + this.clusterId = clusterId;
> + this.serviceId = serviceId;
> + this.clusterType = clusterType;
> + this.autoscalerRuleEvaluator = autoscalerRuleEvaluator;
> + this.scaleCheckKnowledgeSession =
> autoscalerRuleEvaluator.getScaleCheckStatefulSession();
> + this.minCheckKnowledgeSession =
> autoscalerRuleEvaluator.getMinCheckStatefulSession();
> + }
> +
> + protected abstract void readConfigurations();
> + protected abstract void monitor();
> + public abstract void destroy();
> +
> + public String getClusterId() {
> + return clusterId;
> + }
> +
> + public void setClusterId(String clusterId) {
> + this.clusterId = clusterId;
> + }
> +
> + public void setStatus(ClusterStatus status) {
> + this.status = status;
> + }
> +
> + public ClusterType getClusterType() {
> + return clusterType;
> + }
> +
> + public ClusterStatus getStatus() {
> + return status;
> + }
> +
> + public String getServiceId() {
> + return serviceId;
> + }
> +
> + public void setServiceId(String serviceId) {
> + this.serviceId = serviceId;
> + }
> +
> + public int getMonitorInterval() {
> + return monitorInterval;
> + }
> +
> + public void setMonitorInterval(int monitorInterval) {
> + this.monitorInterval = monitorInterval;
> + }
> +
> + public FactHandle getMinCheckFactHandle() {
> + return minCheckFactHandle;
> + }
> +
> + public void setMinCheckFactHandle(FactHandle minCheckFactHandle) {
> + this.minCheckFactHandle = minCheckFactHandle;
> + }
> +
> + public FactHandle getScaleCheckFactHandle() {
> + return scaleCheckFactHandle;
> + }
> +
> + public void setScaleCheckFactHandle(FactHandle
> scaleCheckFactHandle) {
> + this.scaleCheckFactHandle = scaleCheckFactHandle;
> + }
> +
> + public StatefulKnowledgeSession getMinCheckKnowledgeSession() {
> + return minCheckKnowledgeSession;
> + }
> +
> + public void setMinCheckKnowledgeSession(
> + StatefulKnowledgeSession minCheckKnowledgeSession)
> {
> + this.minCheckKnowledgeSession = minCheckKnowledgeSession;
> + }
> +
> + public StatefulKnowledgeSession getScaleCheckKnowledgeSession() {
> + return scaleCheckKnowledgeSession;
> + }
> +
> + public void setScaleCheckKnowledgeSession(
> + StatefulKnowledgeSession
> scaleCheckKnowledgeSession) {
> + this.scaleCheckKnowledgeSession =
> scaleCheckKnowledgeSession;
> + }
> +
> + public boolean isDestroyed() {
> + return isDestroyed;
> + }
> +
> + public void setDestroyed(boolean isDestroyed) {
> + this.isDestroyed = isDestroyed;
> + }
> +
> + public AutoscalerRuleEvaluator getAutoscalerRuleEvaluator() {
> + return autoscalerRuleEvaluator;
> + }
> +
> + public void setAutoscalerRuleEvaluator(
> + AutoscalerRuleEvaluator autoscalerRuleEvaluator) {
> + this.autoscalerRuleEvaluator = autoscalerRuleEvaluator;
> + }
> +}
>
>
> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractMonitor.java
> ----------------------------------------------------------------------
> diff --git
> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractMonitor.java
> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractMonitor.java
> deleted file mode 100644
> index c1441bb..0000000
> ---
> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractMonitor.java
> +++ /dev/null
> @@ -1,203 +0,0 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one
> - * or more contributor license agreements. See the NOTICE file
> - * distributed with this work for additional information
> - * regarding copyright ownership. The ASF licenses this file
> - * to you under the Apache License, Version 2.0 (the
> - * "License"); you may not use this file except in compliance
> - * with the License. You may obtain a copy of the License at
> - *
> - * http://www.apache.org/licenses/LICENSE-2.0
> - *
> - * Unless required by applicable law or agreed to in writing,
> - * software distributed under the License is distributed on an
> - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> - * KIND, either express or implied. See the License for the
> - * specific language governing permissions and limitations
> - * under the License.
> - */
> -package org.apache.stratos.autoscaler.monitor;
> -
> -import java.util.Map;
> -
> -import org.apache.commons.configuration.XMLConfiguration;
> -import org.apache.commons.logging.Log;
> -import org.apache.commons.logging.LogFactory;
> -import org.apache.stratos.autoscaler.NetworkPartitionContext;
> -import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
> -import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
> -import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
> -import org.apache.stratos.autoscaler.util.AutoScalerConstants;
> -import org.apache.stratos.autoscaler.util.ConfUtil;
> -import org.apache.stratos.messaging.domain.topology.Cluster;
> -import org.apache.stratos.messaging.domain.topology.Member;
> -import org.apache.stratos.messaging.domain.topology.Service;
> -import
> org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
> -import org.drools.runtime.StatefulKnowledgeSession;
> -import org.drools.runtime.rule.FactHandle;
> -
> -/**
> - * Is responsible for monitoring a service cluster. This runs periodically
> - * and perform minimum instance check and scaling check using the
> underlying
> - * rules engine.
> - *
> - */
> - abstract public class AbstractMonitor implements Runnable{
> -
> - private static final Log log =
> LogFactory.getLog(AbstractMonitor.class);
> - // Map<NetworkpartitionId, Network Partition Context>
> - protected Map<String, NetworkPartitionContext>
> networkPartitionCtxts;
> - protected DeploymentPolicy deploymentPolicy;
> - protected AutoscalePolicy autoscalePolicy;
> -
> -
> - protected FactHandle minCheckFactHandle;
> - protected FactHandle scaleCheckFactHandle;
> -
> - protected StatefulKnowledgeSession minCheckKnowledgeSession;
> - protected StatefulKnowledgeSession scaleCheckKnowledgeSession;
> - protected boolean isDestroyed;
> -
> - protected String clusterId;
> - protected String serviceId;
> -
> - protected AutoscalerRuleEvaluator autoscalerRuleEvaluator;
> -
> - // time intereval between two runs of the Monitor. Default is 90000ms.
> - protected int monitorInterval;
> -
> - public AbstractMonitor() {
> - readConfigurations();
> - }
> -
> - private void readConfigurations () {
> -
> - XMLConfiguration conf =
> ConfUtil.getInstance(null).getConfiguration();
> - monitorInterval =
> conf.getInt(AutoScalerConstants.AUTOSCALER_MONITOR_INTERVAL, 90000);
> - if (log.isDebugEnabled()) {
> - log.debug("Cluster Monitor task interval: " +
> getMonitorInterval());
> - }
> - }
> -
> - @Override
> - public void run() {
> - // TODO Auto-generated method stub
> -
> - }
> -
> -
> - public NetworkPartitionContext 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;
> - }
> -
> - public String getPartitionOfMember(String memberId){
> - for(Service service: TopologyManager.getTopology().getServices()){
> - for(Cluster cluster: service.getClusters()){
> - if(cluster.memberExists(memberId)){
> - return cluster.getMember(memberId).getPartitionId();
> - }
> - }
> - }
> - return null;
> - }
> -
> - public void destroy() {
> - minCheckKnowledgeSession.dispose();
> - scaleCheckKnowledgeSession.dispose();
> - setDestroyed(true);
> - if(log.isDebugEnabled()) {
> - log.debug("Cluster Monitor Drools session has been disposed.
> "+this.toString());
> - }
> - }
> -
> - public boolean isDestroyed() {
> - return isDestroyed;
> - }
> -
> - public void setDestroyed(boolean isDestroyed) {
> - this.isDestroyed = isDestroyed;
> - }
> -
> - public String getServiceId() {
> - return serviceId;
> - }
> -
> - public void setServiceId(String serviceId) {
> - this.serviceId = serviceId;
> - }
> -
> - 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 String getClusterId() {
> - return clusterId;
> - }
> -
> - public void setClusterId(String clusterId) {
> - this.clusterId = clusterId;
> - }
> -
> - public Map<String, NetworkPartitionContext>
> getNetworkPartitionCtxts() {
> - return networkPartitionCtxts;
> - }
> -
> - public NetworkPartitionContext getNetworkPartitionCtxt(String
> networkPartitionId) {
> - return networkPartitionCtxts.get(networkPartitionId);
> - }
> -
> - public void setPartitionCtxt(Map<String, NetworkPartitionContext>
> partitionCtxt) {
> - this.networkPartitionCtxts = partitionCtxt;
> - }
> -
> - public boolean partitionCtxtAvailable(String partitionId) {
> - return networkPartitionCtxts.containsKey(partitionId);
> - }
> -
> - public void addNetworkPartitionCtxt(NetworkPartitionContext ctxt) {
> - this.networkPartitionCtxts.put(ctxt.getId(), ctxt);
> - }
> -
> - public NetworkPartitionContext getPartitionCtxt(String id) {
> - return this.networkPartitionCtxts.get(id);
> - }
> -
> - public StatefulKnowledgeSession getMinCheckKnowledgeSession() {
> - return minCheckKnowledgeSession;
> - }
> -
> - public void setMinCheckKnowledgeSession(StatefulKnowledgeSession
> minCheckKnowledgeSession) {
> - this.minCheckKnowledgeSession = minCheckKnowledgeSession;
> - }
> -
> - public FactHandle getMinCheckFactHandle() {
> - return minCheckFactHandle;
> - }
> -
> - public void setMinCheckFactHandle(FactHandle minCheckFactHandle) {
> - this.minCheckFactHandle = minCheckFactHandle;
> - }
> -
> - public int getMonitorInterval() {
> - return monitorInterval;
> - }
> -}
> \ No newline at end of file
>
>
> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitor.java
> ----------------------------------------------------------------------
> diff --git
> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitor.java
> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitor.java
> deleted file mode 100644
> index 5bb478e..0000000
> ---
> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitor.java
> +++ /dev/null
> @@ -1,223 +0,0 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one
> - * or more contributor license agreements. See the NOTICE file
> - * distributed with this work for additional information
> - * regarding copyright ownership. The ASF licenses this file
> - * to you under the Apache License, Version 2.0 (the
> - * "License"); you may not use this file except in compliance
> - * with the License. You may obtain a copy of the License at
> - *
> - * http://www.apache.org/licenses/LICENSE-2.0
> - *
> - * Unless required by applicable law or agreed to in writing,
> - * software distributed under the License is distributed on an
> - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> - * KIND, either express or implied. See the License for the
> - * specific language governing permissions and limitations
> - * under the License.
> - */
> -package org.apache.stratos.autoscaler.monitor;
> -
> -import org.apache.commons.logging.Log;
> -import org.apache.commons.logging.LogFactory;
> -import org.apache.stratos.autoscaler.NetworkPartitionContext;
> -import org.apache.stratos.autoscaler.PartitionContext;
> -import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
> -import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
> -import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
> -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.messaging.domain.topology.ClusterStatus;
> -
> -import java.util.ArrayList;
> -import java.util.List;
> -import java.util.concurrent.ConcurrentHashMap;
> -
> -/**
> - * Is responsible for monitoring a service cluster. This runs periodically
> - * and perform minimum instance check and scaling check using the
> underlying
> - * rules engine.
> - *
> - */
> -public class ClusterMonitor extends AbstractMonitor {
> -
> - private static final Log log =
> LogFactory.getLog(ClusterMonitor.class);
> - private String lbReferenceType;
> - private boolean hasPrimary;
> - private ClusterStatus status;
> -
> - public ClusterMonitor(String clusterId, String serviceId,
> DeploymentPolicy deploymentPolicy,
> - AutoscalePolicy autoscalePolicy) {
> - this.clusterId = clusterId;
> - this.serviceId = serviceId;
> -
> - this.autoscalerRuleEvaluator = new AutoscalerRuleEvaluator();
> - this.scaleCheckKnowledgeSession =
> autoscalerRuleEvaluator.getScaleCheckStatefulSession();
> - this.minCheckKnowledgeSession =
> autoscalerRuleEvaluator.getMinCheckStatefulSession();
> -
> - this.deploymentPolicy = deploymentPolicy;
> - this.autoscalePolicy = autoscalePolicy;
> - networkPartitionCtxts = new ConcurrentHashMap<String,
> NetworkPartitionContext>();
> - }
> -
> -
> -
> - @Override
> - public void run() {
> -
> - try {
> - // TODO make this configurable,
> - // this is the delay the min check of normal cluster monitor
> to wait until LB monitor is added
> - Thread.sleep(60000);
> - } catch (InterruptedException ignore) {
> - }
> -
> - while (!isDestroyed()) {
> - if (log.isDebugEnabled()) {
> - log.debug("Cluster monitor is running.. " +
> this.toString());
> - }
> - try {
> - if(!ClusterStatus.In_Maintenance.equals(status)) {
> - monitor();
> - } else {
> - if (log.isDebugEnabled()) {
> - log.debug("Cluster monitor is suspended as the
> cluster is in " +
> - ClusterStatus.In_Maintenance + "
> mode......");
> - }
> - }
> - } catch (Exception e) {
> - log.error("Cluster monitor: Monitor failed." +
> this.toString(), e);
> - }
> - try {
> - Thread.sleep(monitorInterval);
> - } catch (InterruptedException ignore) {
> - }
> - }
> - }
> -
> - private boolean isPrimaryMember(MemberContext memberContext){
> - Properties props = memberContext.getProperties();
> - if (log.isDebugEnabled()) {
> - log.debug(" Properties [" + props + "] ");
> - }
> - if (props != null && props.getProperties() != null) {
> - for (Property prop : props.getProperties()) {
> - if (prop.getName().equals("PRIMARY")) {
> - if (Boolean.parseBoolean(prop.getValue())) {
> - log.debug("Adding member id [" +
> memberContext.getMemberId() + "] " +
> - "member instance id [" +
> memberContext.getInstanceId() + "] as a primary member");
> - return true;
> - }
> - }
> - }
> - }
> - return false;
> - }
> -
> - private void monitor() {
> -
> - //TODO make this concurrent
> - for (NetworkPartitionContext networkPartitionContext :
> networkPartitionCtxts.values()) {
> - // store primary members in the network partition context
> - List<String> primaryMemberListInNetworkPartition = new
> ArrayList<String>();
> -
> - //minimum check per partition
> - for (PartitionContext partitionContext :
> networkPartitionContext.getPartitionCtxts().values()) {
> - // store primary members in the partition context
> - List<String> primaryMemberListInPartition = new
> ArrayList<String>();
> - // get active primary members in this partition context
> - for (MemberContext memberContext :
> partitionContext.getActiveMembers()) {
> - if (isPrimaryMember(memberContext)){
> -
> primaryMemberListInPartition.add(memberContext.getMemberId());
> - }
> - }
> - // get pending primary members in this partition context
> - for (MemberContext memberContext :
> partitionContext.getPendingMembers()) {
> - if (isPrimaryMember(memberContext)){
> -
> primaryMemberListInPartition.add(memberContext.getMemberId());
> - }
> - }
> -
> primaryMemberListInNetworkPartition.addAll(primaryMemberListInPartition);
> - minCheckKnowledgeSession.setGlobal("clusterId",
> clusterId);
> - minCheckKnowledgeSession.setGlobal("lbRef",
> lbReferenceType);
> - minCheckKnowledgeSession.setGlobal("isPrimary",
> hasPrimary);
> - minCheckKnowledgeSession.setGlobal("primaryMemberCount",
> primaryMemberListInPartition.size());
> -
> - if (log.isDebugEnabled()) {
> - log.debug(String.format("Running minimum check for
> partition %s ", partitionContext.getPartitionId()));
> - }
> -
> - minCheckFactHandle =
> AutoscalerRuleEvaluator.evaluateMinCheck(minCheckKnowledgeSession
> - , minCheckFactHandle, partitionContext);
> -
> - }
> -
> - boolean rifReset = networkPartitionContext.isRifReset();
> - boolean memoryConsumptionReset =
> networkPartitionContext.isMemoryConsumptionReset();
> - boolean loadAverageReset =
> networkPartitionContext.isLoadAverageReset();
> - if (log.isDebugEnabled()) {
> - log.debug("flag of rifReset: " + rifReset + " flag of
> memoryConsumptionReset" + memoryConsumptionReset
> - + " flag of loadAverageReset" + loadAverageReset);
> - }
> - if (rifReset || memoryConsumptionReset || loadAverageReset) {
> - scaleCheckKnowledgeSession.setGlobal("clusterId",
> clusterId);
> -
> //scaleCheckKnowledgeSession.setGlobal("deploymentPolicy",
> deploymentPolicy);
> - scaleCheckKnowledgeSession.setGlobal("autoscalePolicy",
> autoscalePolicy);
> - scaleCheckKnowledgeSession.setGlobal("rifReset",
> rifReset);
> - scaleCheckKnowledgeSession.setGlobal("mcReset",
> memoryConsumptionReset);
> - scaleCheckKnowledgeSession.setGlobal("laReset",
> loadAverageReset);
> - scaleCheckKnowledgeSession.setGlobal("lbRef",
> lbReferenceType);
> - scaleCheckKnowledgeSession.setGlobal("isPrimary", false);
> - scaleCheckKnowledgeSession.setGlobal("primaryMembers",
> primaryMemberListInNetworkPartition);
> -
> - if (log.isDebugEnabled()) {
> - log.debug(String.format("Running scale check for
> network partition %s ", networkPartitionContext.getId()));
> - log.debug(" Primary members : " +
> primaryMemberListInNetworkPartition);
> - }
> -
> - scaleCheckFactHandle =
> AutoscalerRuleEvaluator.evaluateScaleCheck(scaleCheckKnowledgeSession
> - , scaleCheckFactHandle, networkPartitionContext);
> -
> - networkPartitionContext.setRifReset(false);
> - networkPartitionContext.setMemoryConsumptionReset(false);
> - networkPartitionContext.setLoadAverageReset(false);
> - } else if (log.isDebugEnabled()) {
> - log.debug(String.format("Scale rule will not run since
> the LB statistics have not received before this " +
> - "cycle for network partition %s",
> networkPartitionContext.getId()));
> - }
> - }
> - }
> -
> - @Override
> - public String toString() {
> - return "ClusterMonitor [clusterId=" + clusterId + ", serviceId="
> + serviceId +
> - ", deploymentPolicy=" + deploymentPolicy + ",
> autoscalePolicy=" + autoscalePolicy +
> - ", lbReferenceType=" + lbReferenceType +
> - ", hasPrimary=" + hasPrimary + " ]";
> - }
> -
> - public String getLbReferenceType() {
> - return lbReferenceType;
> - }
> -
> - public void setLbReferenceType(String lbReferenceType) {
> - this.lbReferenceType = lbReferenceType;
> - }
> -
> - public boolean isHasPrimary() {
> - return hasPrimary;
> - }
> -
> - public void setHasPrimary(boolean hasPrimary) {
> - this.hasPrimary = hasPrimary;
> - }
> -
> - public ClusterStatus getStatus() {
> - return status;
> - }
> -
> - public void setStatus(ClusterStatus status) {
> - this.status = status;
> - }
> -}
>
>
> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitorFactory.java
> ----------------------------------------------------------------------
> diff --git
> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitorFactory.java
> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitorFactory.java
> new file mode 100644
> index 0000000..489078e
> --- /dev/null
> +++
> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitorFactory.java
> @@ -0,0 +1,336 @@
> +package org.apache.stratos.autoscaler.monitor;
> +
> +import java.util.Map;
> +import java.util.Random;
> +
> +import org.apache.commons.logging.Log;
> +import org.apache.commons.logging.LogFactory;
> +import org.apache.stratos.autoscaler.KubernetesClusterContext;
> +import org.apache.stratos.autoscaler.MemberStatsContext;
> +import org.apache.stratos.autoscaler.NetworkPartitionContext;
> +import org.apache.stratos.autoscaler.NetworkPartitionLbHolder;
> +import org.apache.stratos.autoscaler.PartitionContext;
> +import
> org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
> +import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
> +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.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.ClusterStatus;
> +import org.apache.stratos.messaging.domain.topology.Member;
> +import org.apache.stratos.messaging.domain.topology.MemberStatus;
> +import org.apache.stratos.messaging.util.Constants;
> +
> +public class ClusterMonitorFactory {
> +
> + private static final Log log =
> LogFactory.getLog(ClusterMonitorFactory.class);
> +
> + public static AbstractClusterMonitor getMonitor(Cluster cluster)
> throws PolicyValidationException, PartitionValidationException {
> +
> + AbstractClusterMonitor clusterMonitor;
> + if(cluster.isKubernetesCluster()){
> + clusterMonitor =
> getDockerServiceClusterMonitor(cluster);
> + } else if (cluster.isLbCluster()){
> + clusterMonitor = getVMLbClusterMonitor(cluster);
> + } else {
> + clusterMonitor =
> getVMServiceClusterMonitor(cluster);
> + }
> +
> + return clusterMonitor;
> + }
> +
> + private static VMServiceClusterMonitor
> getVMServiceClusterMonitor(Cluster cluster) throws
> PolicyValidationException, PartitionValidationException {
> + // 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 policy =
> + 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 =
> + "Deployment Policy's Partitions are null. Policy
> name: " +
> + deploymentPolicyName;
> + log.error(msg);
> + throw new PolicyValidationException(msg);
> + }
> +
> +
> CloudControllerClient.getInstance().validateDeploymentPolicy(cluster.getServiceName(),
> deploymentPolicy);
> +
> + VMServiceClusterMonitor clusterMonitor =
> + new
> VMServiceClusterMonitor(cluster.getClusterId(),
> +
> cluster.getServiceName(),
> +
> deploymentPolicy, policy);
> + clusterMonitor.setStatus(ClusterStatus.Created);
> +
> + for (PartitionGroup partitionGroup:
> deploymentPolicy.getPartitionGroups()){
> +
> + NetworkPartitionContext networkPartitionContext = new
> NetworkPartitionContext(partitionGroup.getId(),
> + partitionGroup.getPartitionAlgo(),
> partitionGroup.getPartitions());
> +
> + for(Partition partition: partitionGroup.getPartitions()){
> + PartitionContext partitionContext = new
> PartitionContext(partition);
> + partitionContext.setServiceName(cluster.getServiceName());
> + partitionContext.setProperties(cluster.getProperties());
> +
> partitionContext.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.setPartition(partition);
> +
> memberContext.setProperties(convertMemberPropsToMemberContextProps(member.getProperties()));
> +
> +
> if(MemberStatus.Activated.equals(member.getStatus())){
> +
> partitionContext.addActiveMember(memberContext);
> +//
> networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(),
> 1);
> +//
> partitionContext.incrementCurrentActiveMemberCount(1);
> +
> + } else
> if(MemberStatus.Created.equals(member.getStatus()) ||
> MemberStatus.Starting.equals(member.getStatus())){
> +
> partitionContext.addPendingMember(memberContext);
> +
> +//
> networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(),
> 1);
> + } else
> if(MemberStatus.Suspended.equals(member.getStatus())){
> +// partitionContext.addFaultyMember(memberId);
> + }
> + partitionContext.addMemberStatsContext(new
> MemberStatsContext(memberId));
> + if(log.isInfoEnabled()){
> + log.info(String.format("Member stat context
> has been added: [member] %s", memberId));
> + }
> + }
> +
> + }
> +
> networkPartitionContext.addPartitionContext(partitionContext);
> + if(log.isInfoEnabled()){
> + log.info(String.format("Partition context has been
> added: [partition] %s",
> + partitionContext.getPartitionId()));
> + }
> + }
> +
> +
> clusterMonitor.addNetworkPartitionCtxt(networkPartitionContext);
> + if(log.isInfoEnabled()){
> + log.info(String.format("Network partition context has
> been added: [network partition] %s",
> + networkPartitionContext.getId()));
> + }
> + }
> +
> +
> + // find lb reference type
> + java.util.Properties props = cluster.getProperties();
> +
> + if(props.containsKey(Constants.LOAD_BALANCER_REF)) {
> + String value = props.getProperty(Constants.LOAD_BALANCER_REF);
> + clusterMonitor.setLbReferenceType(value);
> + if(log.isDebugEnabled()) {
> + log.debug("Set the lb reference type: "+value);
> + }
> + }
> +
> + // set hasPrimary property
> + // hasPrimary is true if there are primary members available in
> that cluster
> +
> clusterMonitor.setHasPrimary(Boolean.parseBoolean(cluster.getProperties().getProperty(Constants.IS_PRIMARY)));
> +
> + log.info("Cluster monitor created: "+clusterMonitor.toString());
> + return clusterMonitor;
> + }
> +
> + private static Properties convertMemberPropsToMemberContextProps(
> + java.util.Properties properties) {
> + Properties props = new Properties();
> + for (Map.Entry<Object, Object> e : properties.entrySet() ) {
> + Property prop = new Property();
> + prop.setName((String)e.getKey());
> + prop.setValue((String)e.getValue());
> + props.addProperties(prop);
> + }
> + return props;
> + }
> +
> +
> + private static VMLbClusterMonitor getVMLbClusterMonitor(Cluster
> cluster) throws PolicyValidationException, PartitionValidationException {
> + // 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 policy =
> + 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();
> + VMLbClusterMonitor clusterMonitor =
> + new VMLbClusterMonitor(clusterId,
> +
> cluster.getServiceName(),
> +
> deploymentPolicy, policy);
> + clusterMonitor.setStatus(ClusterStatus.Created);
> + // partition group = network partition context
> + for (PartitionGroup partitionGroup :
> deploymentPolicy.getPartitionGroups()) {
> +
> + NetworkPartitionLbHolder networkPartitionLbHolder =
> +
> PartitionManager.getInstance()
> +
> .getNetworkPartitionLbHolder(partitionGroup.getId());
> +//
> PartitionManager.getInstance()
> +//
> .getNetworkPartitionLbHolder(partitionGroup.getId());
> + // FIXME pick a random partition
> + Partition partition =
> + partitionGroup.getPartitions()[new
> Random().nextInt(partitionGroup.getPartitions().length)];
> + PartitionContext partitionContext = new
> PartitionContext(partition);
> + partitionContext.setServiceName(cluster.getServiceName());
> + partitionContext.setProperties(cluster.getProperties());
> +
> partitionContext.setNetworkPartitionId(partitionGroup.getId());
> + partitionContext.setMinimumMemberCount(1);//Here it hard
> codes the minimum value as one for LB cartridge partitions
> +
> + NetworkPartitionContext networkPartitionContext = new
> NetworkPartitionContext(partitionGroup.getId(),
> + partitionGroup.getPartitionAlgo(),
> partitionGroup.getPartitions()) ;
> + for (Member member : cluster.getMembers()) {
> + String memberId = member.getMemberId();
> + if
> (member.getNetworkPartitionId().equalsIgnoreCase(networkPartitionContext.getId()))
> {
> + MemberContext memberContext = new MemberContext();
> + memberContext.setClusterId(member.getClusterId());
> + memberContext.setMemberId(memberId);
> + memberContext.setPartition(partition);
> +
> + if
> (MemberStatus.Activated.equals(member.getStatus())) {
> + partitionContext.addActiveMember(memberContext);
> +//
> networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(),
> 1);
> +//
> partitionContext.incrementCurrentActiveMemberCount(1);
> + } else if
> (MemberStatus.Created.equals(member.getStatus()) ||
> +
> MemberStatus.Starting.equals(member.getStatus())) {
> + partitionContext.addPendingMember(memberContext);
> +//
> networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(),
> 1);
> + } else if
> (MemberStatus.Suspended.equals(member.getStatus())) {
> +// partitionContext.addFaultyMember(memberId);
> + }
> +
> + partitionContext.addMemberStatsContext(new
> MemberStatsContext(memberId));
> + if(log.isInfoEnabled()){
> + log.info(String.format("Member stat context has
> been added: [member] %s", memberId));
> + }
> + }
> +
> + }
> + networkPartitionContext.addPartitionContext(partitionContext);
> +
> + // 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(Constants.LOAD_BALANCED_SERVICE_TYPE);
> +
> + if(props.containsKey(Constants.LOAD_BALANCER_REF)) {
> + String value =
> props.getProperty(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);
> + }
> + }
> + }
> + }
> +
> +
> clusterMonitor.addNetworkPartitionCtxt(networkPartitionContext);
> + }
> +
> + log.info("LB Cluster monitor created:
> "+clusterMonitor.toString());
> + return clusterMonitor;
> + }
> +
> + private static DockerServiceClusterMonitor
> getDockerServiceClusterMonitor(Cluster cluster) {
> +
> + if (null == cluster) {
> + return null;
> + }
> +
> + String autoscalePolicyName = cluster.getAutoscalePolicyName();
> + if (log.isDebugEnabled()) {
> + log.debug("Autoscaler policy name: " + autoscalePolicyName);
> + }
> +
> + AutoscalePolicy policy =
> PolicyManager.getInstance().getAutoscalePolicy(autoscalePolicyName);
> + java.util.Properties props = cluster.getProperties();
> + String kubernetesHostClusterID =
> props.getProperty(StratosConstants.KUBERNETES_CLUSTER_ID);
> + KubernetesClusterContext kubernetesClusterCtxt = new
> KubernetesClusterContext(kubernetesHostClusterID);
> +
> + DockerServiceClusterMonitor dockerClusterMonitor = new
> DockerServiceClusterMonitor(
> + kubernetesClusterCtxt,
> + cluster.getClusterId(),
> + cluster.getServiceName(),
> + policy);
> +
> + dockerClusterMonitor.setStatus(ClusterStatus.Created);
> +
> + // find lb reference type
> + if(props.containsKey(Constants.LOAD_BALANCER_REF)) {
> + String value = props.getProperty(Constants.LOAD_BALANCER_REF);
> + dockerClusterMonitor.setLbReferenceType(value);
> + if(log.isDebugEnabled()) {
> + log.debug("Set the lb reference type: "+value);
> + }
> + }
> +
> +// // set hasPrimary property
> +// // hasPrimary is true if there are primary members available in
> that cluster
> +//
> dockerClusterMonitor.setHasPrimary(Boolean.parseBoolean(props.getProperty(Constants.IS_PRIMARY)));
> +
> + log.info("Docker cluster monitor created: "+
> dockerClusterMonitor.toString());
> + return dockerClusterMonitor;
> + }
> +}
>
>
> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ContainerClusterMonitor.java
> ----------------------------------------------------------------------
> diff --git
> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ContainerClusterMonitor.java
> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ContainerClusterMonitor.java
> new file mode 100644
> index 0000000..f9b9047
> --- /dev/null
> +++
> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ContainerClusterMonitor.java
> @@ -0,0 +1,38 @@
> +package org.apache.stratos.autoscaler.monitor;
> +
> +import org.apache.stratos.autoscaler.KubernetesClusterContext;
> +import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
> +import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
> +import org.apache.stratos.common.enums.ClusterType;
> +
> +public abstract class ContainerClusterMonitor extends
> AbstractClusterMonitor {
> +
> + private KubernetesClusterContext kubernetesClusterCtxt;
> + protected AutoscalePolicy autoscalePolicy;
> +
> + protected ContainerClusterMonitor(String clusterId, String
> serviceId, ClusterType clusterType,
> + KubernetesClusterContext kubernetesClusterContext,
> + AutoscalerRuleEvaluator autoscalerRuleEvaluator,
> AutoscalePolicy autoscalePolicy){
> +
> + super(clusterId, serviceId, clusterType,
> autoscalerRuleEvaluator);
> + this.kubernetesClusterCtxt = kubernetesClusterContext;
> + this.autoscalePolicy = autoscalePolicy;
> + }
> +
> + public KubernetesClusterContext getKubernetesClusterCtxt() {
> + return kubernetesClusterCtxt;
> + }
> +
> + public void setKubernetesClusterCtxt(
> + KubernetesClusterContext kubernetesClusterCtxt) {
> + this.kubernetesClusterCtxt = kubernetesClusterCtxt;
> + }
> +
> + public AutoscalePolicy getAutoscalePolicy() {
> + return autoscalePolicy;
> + }
> +
> + public void setAutoscalePolicy(AutoscalePolicy autoscalePolicy) {
> + this.autoscalePolicy = autoscalePolicy;
> + }
> +}
>
>
> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/DockerServiceClusterMonitor.java
> ----------------------------------------------------------------------
> diff --git
> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/DockerServiceClusterMonitor.java
> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/DockerServiceClusterMonitor.java
> new file mode 100644
> index 0000000..ca39b6a
> --- /dev/null
> +++
> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/DockerServiceClusterMonitor.java
> @@ -0,0 +1,156 @@
> +package org.apache.stratos.autoscaler.monitor;
> +
> +import java.util.Properties;
> +
> +import org.apache.commons.configuration.XMLConfiguration;
> +import org.apache.commons.logging.Log;
> +import org.apache.commons.logging.LogFactory;
> +import org.apache.stratos.autoscaler.KubernetesClusterContext;
> +import
> org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
> +import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
> +import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
> +import org.apache.stratos.autoscaler.util.AutoScalerConstants;
> +import org.apache.stratos.autoscaler.util.ConfUtil;
> +import org.apache.stratos.cloud.controller.stub.pojo.MemberContext;
> +import org.apache.stratos.common.constants.StratosConstants;
> +import org.apache.stratos.common.enums.ClusterType;
> +import org.apache.stratos.messaging.domain.topology.ClusterStatus;
> +import
> org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
> +
> +public final class DockerServiceClusterMonitor extends
> ContainerClusterMonitor{
> +
> + private static final Log log =
> LogFactory.getLog(DockerServiceClusterMonitor.class);
> +
> + private String lbReferenceType;
> + private int numberOfReplicasInServiceCluster = 0;
> + int retryInterval = 60000;
> +
> + public DockerServiceClusterMonitor(KubernetesClusterContext
> kubernetesClusterCtxt,
> + String serviceClusterID, String serviceId, AutoscalePolicy
> autoscalePolicy) {
> + super(serviceClusterID, serviceId,
> ClusterType.DockerServiceCluster, kubernetesClusterCtxt,
> + new AutoscalerRuleEvaluator(), autoscalePolicy);
> + readConfigurations();
> + }
> +
> + @Override
> + public void run() {
> + try {
> + // TODO make this configurable,
> + // this is the delay the min check of normal
> cluster monitor to wait
> + // until LB monitor is added
> + Thread.sleep(60000);
> + } catch (InterruptedException ignore) {
> + }
> +
> + while (!isDestroyed()) {
> + if (log.isDebugEnabled()) {
> + log.debug("Kubernetes cluster monitor is
> running.. " + this.toString());
> + }
> + try {
> + if
> (!ClusterStatus.In_Maintenance.equals(getStatus())) {
> + monitor();
> + } else {
> + if (log.isDebugEnabled()) {
> + log.debug("Kubernetes
> cluster monitor is suspended as the cluster is in "
> + +
> ClusterStatus.In_Maintenance + " mode......");
> + }
> + }
> + } catch (Exception e) {
> + log.error("Kubernetes cluster monitor:
> Monitor failed." + this.toString(),
> + e);
> + }
> + try {
> + Thread.sleep(getMonitorInterval());
> + } catch (InterruptedException ignore) {
> + }
> + }
> + }
> +
> + @Override
> + protected void monitor() {
> +
> + // is container created successfully?
> + boolean success = false;
> + String kubernetesClusterId =
> getKubernetesClusterCtxt().getKubernetesClusterID();
> +
> + try {
> + TopologyManager.acquireReadLock();
> + Properties props =
> TopologyManager.getTopology().getService(getServiceId()).getCluster(getClusterId()).getProperties();
> + int minReplicas =
> Integer.parseInt(props.getProperty(StratosConstants.KUBERNETES_MIN_REPLICAS));
> +
> + int nonTerminatedMembers =
> getKubernetesClusterCtxt().getActiveMembers().size() +
> getKubernetesClusterCtxt().getPendingMembers().size();
> +
> + if (nonTerminatedMembers == 0) {
> +
> + while (success) {
> + try {
> +
> + MemberContext
> memberContext =
> CloudControllerClient.getInstance().createContainer(kubernetesClusterId,
> getClusterId());
> + if(null != memberContext) {
> +
> getKubernetesClusterCtxt().addPendingMember(memberContext);
> + success = true;
> +
> numberOfReplicasInServiceCluster = minReplicas;
> +
> if(log.isDebugEnabled()){
> +
> log.debug(String.format("Pending member added, [member] %s [kub cluster]
> %s",
> +
> memberContext.getMemberId(),
> getKubernetesClusterCtxt().getKubernetesClusterID()));
> + }
> + } else {
> + if
> (log.isDebugEnabled()) {
> +
> log.debug("Returned member context is null, did not add to pending
> members");
> + }
> + }
> + } catch (Throwable e) {
> + if (log.isDebugEnabled()) {
> + String message =
> "Cannot create a container, will retry in "+(retryInterval/1000)+"s";
> + log.debug(message,
> e);
> + }
> + }
> +
> + try {
> + Thread.sleep(retryInterval);
> + } catch (InterruptedException e1) {
> + }
> + }
> + }
> + } finally {
> + TopologyManager.releaseReadLock();
> + }
> + }
> +
> + @Override
> + public void destroy() {
> + getMinCheckKnowledgeSession().dispose();
> + getScaleCheckKnowledgeSession().dispose();
> + setDestroyed(true);
> + if(log.isDebugEnabled()) {
> + log.debug("DockerClusterMonitor Drools session has been
> disposed. "+this.toString());
> + }
> + }
> +
> + @Override
> + protected void readConfigurations () {
> + // same as VM cluster monitor interval
> + XMLConfiguration conf =
> ConfUtil.getInstance(null).getConfiguration();
> + int monitorInterval =
> conf.getInt(AutoScalerConstants.AUTOSCALER_MONITOR_INTERVAL, 90000);
> + setMonitorInterval(monitorInterval);
> + if (log.isDebugEnabled()) {
> + log.debug("Kubernetes Cluster Monitor task interval: " +
> getMonitorInterval());
> + }
> + }
> +
> + @Override
> + public String toString() {
> + return "DockerClusterMonitor "
> + + "[ kubernetesHostClusterId=" +
> getKubernetesClusterCtxt().getKubernetesClusterID()
> + + ", clusterId=" + getClusterId()
> + + ", serviceId=" + getServiceId() + "]";
> + }
> +
> + public String getLbReferenceType() {
> + return lbReferenceType;
> + }
> +
> + public void setLbReferenceType(String lbReferenceType) {
> + this.lbReferenceType = lbReferenceType;
> + }
> +}
> \ No newline at end of file
>
>
--
--
Lahiru Sandaruwan
Committer and PMC member, Apache Stratos,
Senior Software Engineer,
WSO2 Inc., http://wso2.com
lean.enterprise.middleware
email: lahirus@wso2.com cell: (+94) 773 325 954
blog: http://lahiruwrites.blogspot.com/
twitter: http://twitter.com/lahirus
linked-in: http://lk.linkedin.com/pub/lahiru-sandaruwan/16/153/146
Re: [2/4] cluster monitors hierarchy redesigned and docker cluster
monitor improved
Posted by Nirmal Fernando <ni...@gmail.com>.
I think Raj refactored Cluster monitors with this fix. I am not sure
whether he could do anything to preserve the history of the original.
On Wed, Oct 1, 2014 at 9:25 PM, Lahiru Sandaruwan <la...@wso2.com> wrote:
> Yes. But someone should be able to easily see the history at[1], like [2].
>
> [1]
> https://github.com/apache/stratos/commits/master/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/VMServiceClusterMonitor.java
> [2]
> https://github.com/apache/stratos/commits/master/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitor.java
>
> On Wed, Oct 1, 2014 at 9:03 PM, Rajkumar Rajaratnam <ra...@wso2.com>
> wrote:
>
>> Hi,
>>
>> I guess we can see the history using blame.
>>
>>
>> https://github.com/apache/stratos/blame/master/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/VMServiceClusterMonitor.java
>>
>> Thanks.
>>
>> On Wed, Oct 1, 2014 at 8:55 PM, Lahiru Sandaruwan <la...@wso2.com>
>> wrote:
>>
>>> Hi guys,
>>>
>>> It seems we have lost all the Git history of Cluster Monitors with this
>>> commit :(
>>> We should have Git move in this kind of cases.
>>>
>>> Thanks.
>>>
>>> On Tue, Sep 23, 2014 at 2:49 PM, <ni...@apache.org> wrote:
>>>
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
>>>> ----------------------------------------------------------------------
>>>> diff --git
>>>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
>>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
>>>> index b8dcd73..6525eba 100644
>>>> ---
>>>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
>>>> +++
>>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
>>>> @@ -19,34 +19,54 @@
>>>>
>>>> package org.apache.stratos.autoscaler.message.receiver.topology;
>>>>
>>>> +import java.util.List;
>>>> +
>>>> import org.apache.commons.logging.Log;
>>>> import org.apache.commons.logging.LogFactory;
>>>> -import org.apache.stratos.autoscaler.*;
>>>> +import org.apache.stratos.autoscaler.AutoscalerContext;
>>>> +import org.apache.stratos.autoscaler.KubernetesClusterContext;
>>>> +import org.apache.stratos.autoscaler.MemberStatsContext;
>>>> +import org.apache.stratos.autoscaler.NetworkPartitionContext;
>>>> +import org.apache.stratos.autoscaler.NetworkPartitionLbHolder;
>>>> +import org.apache.stratos.autoscaler.PartitionContext;
>>>> import
>>>> org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
>>>> import
>>>> org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
>>>> import
>>>> org.apache.stratos.autoscaler.exception.PartitionValidationException;
>>>> import
>>>> org.apache.stratos.autoscaler.exception.PolicyValidationException;
>>>> import org.apache.stratos.autoscaler.exception.TerminationException;
>>>> -import org.apache.stratos.autoscaler.monitor.AbstractMonitor;
>>>> -import org.apache.stratos.autoscaler.monitor.ClusterMonitor;
>>>> -import org.apache.stratos.autoscaler.monitor.KubernetesClusterMonitor;
>>>> -import org.apache.stratos.autoscaler.monitor.LbClusterMonitor;
>>>> +import org.apache.stratos.autoscaler.monitor.AbstractClusterMonitor;
>>>> +import org.apache.stratos.autoscaler.monitor.ClusterMonitorFactory;
>>>> +import org.apache.stratos.autoscaler.monitor.ContainerClusterMonitor;
>>>> +import org.apache.stratos.autoscaler.monitor.VMClusterMonitor;
>>>> import org.apache.stratos.autoscaler.partition.PartitionManager;
>>>> import org.apache.stratos.autoscaler.policy.PolicyManager;
>>>> import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
>>>> -import org.apache.stratos.autoscaler.util.AutoscalerUtil;
>>>> +import org.apache.stratos.common.enums.ClusterType;
>>>> import org.apache.stratos.messaging.domain.topology.Cluster;
>>>> import org.apache.stratos.messaging.domain.topology.Service;
>>>> import org.apache.stratos.messaging.event.Event;
>>>> -import org.apache.stratos.messaging.event.topology.*;
>>>> -import org.apache.stratos.messaging.listener.topology.*;
>>>> +import org.apache.stratos.messaging.event.topology.ClusterCreatedEvent;
>>>> +import
>>>> org.apache.stratos.messaging.event.topology.ClusterMaintenanceModeEvent;
>>>> +import org.apache.stratos.messaging.event.topology.ClusterRemovedEvent;
>>>> +import
>>>> org.apache.stratos.messaging.event.topology.MemberActivatedEvent;
>>>> +import
>>>> org.apache.stratos.messaging.event.topology.MemberMaintenanceModeEvent;
>>>> +import
>>>> org.apache.stratos.messaging.event.topology.MemberReadyToShutdownEvent;
>>>> +import
>>>> org.apache.stratos.messaging.event.topology.MemberTerminatedEvent;
>>>> +import
>>>> org.apache.stratos.messaging.listener.topology.ClusterCreatedEventListener;
>>>> +import
>>>> org.apache.stratos.messaging.listener.topology.ClusterMaintenanceModeEventListener;
>>>> +import
>>>> org.apache.stratos.messaging.listener.topology.ClusterRemovedEventListener;
>>>> +import
>>>> org.apache.stratos.messaging.listener.topology.CompleteTopologyEventListener;
>>>> +import
>>>> org.apache.stratos.messaging.listener.topology.MemberActivatedEventListener;
>>>> +import
>>>> org.apache.stratos.messaging.listener.topology.MemberMaintenanceListener;
>>>> +import
>>>> org.apache.stratos.messaging.listener.topology.MemberReadyToShutdownEventListener;
>>>> +import
>>>> org.apache.stratos.messaging.listener.topology.MemberStartedEventListener;
>>>> +import
>>>> org.apache.stratos.messaging.listener.topology.MemberTerminatedEventListener;
>>>> +import
>>>> org.apache.stratos.messaging.listener.topology.ServiceRemovedEventListener;
>>>> import
>>>> org.apache.stratos.messaging.message.receiver.topology.TopologyEventReceiver;
>>>> import
>>>> org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
>>>> import org.drools.runtime.StatefulKnowledgeSession;
>>>> import org.drools.runtime.rule.FactHandle;
>>>>
>>>> -import java.util.List;
>>>> -
>>>> /**
>>>> * Autoscaler topology receiver.
>>>> */
>>>> @@ -116,42 +136,60 @@ public class AutoscalerTopologyEventReceiver
>>>> implements Runnable {
>>>> try {
>>>> MemberReadyToShutdownEvent
>>>> memberReadyToShutdownEvent = (MemberReadyToShutdownEvent)event;
>>>> AutoscalerContext asCtx =
>>>> AutoscalerContext.getInstance();
>>>> - AbstractMonitor monitor;
>>>> + AbstractClusterMonitor monitor;
>>>> String clusterId =
>>>> memberReadyToShutdownEvent.getClusterId();
>>>> String memberId =
>>>> memberReadyToShutdownEvent.getMemberId();
>>>>
>>>> - if(asCtx.monitorExist(clusterId)){
>>>> - monitor = asCtx.getMonitor(clusterId);
>>>> - }else if(asCtx.lbMonitorExist(clusterId)){
>>>> - monitor = asCtx.getLBMonitor(clusterId);
>>>> - }else{
>>>> + if(asCtx.clusterMonitorExist(clusterId)) {
>>>> + monitor = asCtx.getClusterMonitor(clusterId);
>>>> + } else {
>>>> if(log.isDebugEnabled()){
>>>> log.debug(String.format("A cluster monitor
>>>> is not found in autoscaler context [cluster] %s", clusterId));
>>>> }
>>>> return;
>>>> }
>>>> -
>>>> - NetworkPartitionContext nwPartitionCtxt;
>>>> - nwPartitionCtxt =
>>>> monitor.getNetworkPartitionCtxt(memberReadyToShutdownEvent.getNetworkPartitionId());
>>>> -
>>>> - // start a new member in the same Partition
>>>> - String partitionId =
>>>> monitor.getPartitionOfMember(memberId);
>>>> - PartitionContext partitionCtxt =
>>>> nwPartitionCtxt.getPartitionCtxt(partitionId);
>>>> -
>>>> -
>>>> - // terminate the shutdown ready member
>>>> - CloudControllerClient ccClient =
>>>> CloudControllerClient.getInstance();
>>>> - ccClient.terminate(memberId);
>>>> -
>>>> - // remove from active member list
>>>> - partitionCtxt.removeActiveMemberById(memberId);
>>>> -
>>>> - if (log.isInfoEnabled()) {
>>>> - log.info(String.format("Member is terminated
>>>> and removed from the active members list: [member] %s [partition] %s
>>>> [cluster] %s ",
>>>> - memberId, partitionId,
>>>> clusterId));
>>>> +
>>>> + TopologyManager.acquireReadLock();
>>>> +
>>>> + if(monitor.getClusterType() ==
>>>> ClusterType.VMServiceCluster
>>>> + || monitor.getClusterType() ==
>>>> ClusterType.VMLbCluster) {
>>>> +
>>>> + NetworkPartitionContext nwPartitionCtxt;
>>>> + nwPartitionCtxt = ((VMClusterMonitor)
>>>> monitor).getNetworkPartitionCtxt(memberReadyToShutdownEvent.getNetworkPartitionId());
>>>> +
>>>> + // start a new member in the same Partition
>>>> + String partitionId = ((VMClusterMonitor)
>>>> monitor).getPartitionOfMember(memberId);
>>>> + PartitionContext partitionCtxt =
>>>> nwPartitionCtxt.getPartitionCtxt(partitionId);
>>>> +
>>>> +
>>>> + // terminate the shutdown ready member
>>>> + CloudControllerClient ccClient =
>>>> CloudControllerClient.getInstance();
>>>> + ccClient.terminate(memberId);
>>>> +
>>>> + // remove from active member list
>>>> + partitionCtxt.removeActiveMemberById(memberId);
>>>> +
>>>> + if (log.isInfoEnabled()) {
>>>> + log.info(String.format("Member is
>>>> terminated and removed from the active members list: [member] %s
>>>> [partition] %s [cluster] %s ",
>>>> + memberId,
>>>> partitionId, clusterId));
>>>> + }
>>>> + } else if(monitor.getClusterType() ==
>>>> ClusterType.DockerServiceCluster) {
>>>> + KubernetesClusterContext
>>>> kubernetesClusterContext = ((ContainerClusterMonitor)
>>>> monitor).getKubernetesClusterCtxt();
>>>> + //terminate the shutdown ready container
>>>> +
>>>> CloudControllerClient.getInstance().terminateContainer(memberId);
>>>> + //remove from active member list
>>>> +
>>>> kubernetesClusterContext.removeActiveMemberById(memberId);
>>>> +
>>>> + if (log.isInfoEnabled()) {
>>>> + log.info(String.format("Member is
>>>> terminated and removed from the active members list: [member] %s [kub
>>>> cluster] %s [cluster] %s ",
>>>> + memberId,
>>>> kubernetesClusterContext.getKubernetesClusterID(), clusterId));
>>>> + }
>>>> }
>>>> +
>>>> } catch (TerminationException e) {
>>>> log.error(e);
>>>> + } finally {
>>>> + TopologyManager.releaseReadLock();
>>>> }
>>>> }
>>>>
>>>> @@ -185,12 +223,8 @@ public class AutoscalerTopologyEventReceiver
>>>> implements Runnable {
>>>> TopologyManager.acquireReadLock();
>>>> Service service =
>>>> TopologyManager.getTopology().getService(e.getServiceName());
>>>> Cluster cluster =
>>>> service.getCluster(e.getClusterId());
>>>> -
>>>> if(AutoscalerContext.getInstance().kubernetesClusterMonitorExist(cluster.getClusterId()))
>>>> {
>>>> -
>>>> AutoscalerContext.getInstance().getKubernetesClusterMonitor(e.getClusterId()).setStatus(e.getStatus());
>>>> - } else
>>>> if(AutoscalerContext.getInstance().monitorExist((cluster.getClusterId()))) {
>>>> -
>>>> AutoscalerContext.getInstance().getMonitor(e.getClusterId()).setStatus(e.getStatus());
>>>> - } else if
>>>> (AutoscalerContext.getInstance().lbMonitorExist((cluster.getClusterId()))) {
>>>> -
>>>> AutoscalerContext.getInstance().getLBMonitor(e.getClusterId()).setStatus(e.getStatus());
>>>> +
>>>> if(AutoscalerContext.getInstance().clusterMonitorExist(cluster.getClusterId()))
>>>> {
>>>> +
>>>> AutoscalerContext.getInstance().getClusterMonitor(e.getClusterId()).setStatus(e.getStatus());
>>>> } else {
>>>> log.error("cluster monitor not exists for the
>>>> cluster: " + cluster.toString());
>>>> }
>>>> @@ -213,8 +247,7 @@ public class AutoscalerTopologyEventReceiver
>>>> implements Runnable {
>>>> String clusterId = e.getClusterId();
>>>> String deploymentPolicy = e.getDeploymentPolicy();
>>>>
>>>> - AbstractMonitor monitor = null;
>>>> - KubernetesClusterMonitor kubernetesClusterMonitor
>>>> = null;
>>>> + AbstractClusterMonitor monitor = null;
>>>>
>>>> if (e.isLbCluster()) {
>>>> DeploymentPolicy depPolicy =
>>>> PolicyManager.getInstance().getDeploymentPolicy(deploymentPolicy);
>>>> @@ -239,13 +272,9 @@ public class AutoscalerTopologyEventReceiver
>>>> implements Runnable {
>>>>
>>>> }
>>>> }
>>>> - monitor = AutoscalerContext.getInstance()
>>>> - .removeLbMonitor(clusterId);
>>>> -
>>>> - } else {
>>>> - monitor = AutoscalerContext.getInstance()
>>>> - .removeMonitor(clusterId);
>>>> }
>>>> +
>>>> + monitor =
>>>> AutoscalerContext.getInstance().removeClusterMonitor(clusterId);
>>>>
>>>> // runTerminateAllRule(monitor);
>>>> if (monitor != null) {
>>>> @@ -280,43 +309,73 @@ public class AutoscalerTopologyEventReceiver
>>>> implements Runnable {
>>>> String networkPartitionId =
>>>> e.getNetworkPartitionId();
>>>> String clusterId = e.getClusterId();
>>>> String partitionId = e.getPartitionId();
>>>> - AbstractMonitor monitor;
>>>> + String memberId = e.getMemberId();
>>>> + AbstractClusterMonitor monitor;
>>>> +
>>>> + AutoscalerContext asCtx =
>>>> AutoscalerContext.getInstance();
>>>>
>>>> - if
>>>> (AutoscalerContext.getInstance().monitorExist(clusterId)) {
>>>> - monitor =
>>>> AutoscalerContext.getInstance().getMonitor(clusterId);
>>>> + if(asCtx.clusterMonitorExist(clusterId)) {
>>>> + monitor = asCtx.getClusterMonitor(clusterId);
>>>> } else {
>>>> - //This is LB member
>>>> - monitor =
>>>> AutoscalerContext.getInstance().getLBMonitor(clusterId);
>>>> + if(log.isDebugEnabled()){
>>>> + log.debug(String.format("A cluster monitor
>>>> is not found in autoscaler context [cluster] %s", clusterId));
>>>> + }
>>>> + return;
>>>> }
>>>> +
>>>> + if(monitor.getClusterType() ==
>>>> ClusterType.VMServiceCluster
>>>> + || monitor.getClusterType() ==
>>>> ClusterType.VMLbCluster) {
>>>> +
>>>> + NetworkPartitionContext
>>>> networkPartitionContext = ((VMClusterMonitor)
>>>> monitor).getNetworkPartitionCtxt(networkPartitionId);
>>>> +
>>>> + PartitionContext partitionContext =
>>>> networkPartitionContext.getPartitionCtxt(partitionId);
>>>> +
>>>> partitionContext.removeMemberStatsContext(memberId);
>>>> +
>>>> + if
>>>> (partitionContext.removeTerminationPendingMember(memberId)) {
>>>> + if (log.isDebugEnabled()) {
>>>> + log.debug(String.format("Member is
>>>> removed from termination pending members list: [member] %s", memberId));
>>>> + }
>>>> + } else if
>>>> (partitionContext.removePendingMember(memberId)) {
>>>> + if (log.isDebugEnabled()) {
>>>> + log.debug(String.format("Member is
>>>> removed from pending members list: [member] %s", memberId));
>>>> + }
>>>> + } else if
>>>> (partitionContext.removeActiveMemberById(memberId)) {
>>>> + log.warn(String.format("Member is in the
>>>> wrong list and it is removed from active members list", memberId));
>>>> + } else if
>>>> (partitionContext.removeObsoleteMember(memberId)){
>>>> + log.warn(String.format("Member's
>>>> obsolated timeout has been expired and it is removed from obsolated members
>>>> list", memberId));
>>>> + } else {
>>>> + log.warn(String.format("Member is not
>>>> available in any of the list active, pending and termination pending",
>>>> memberId));
>>>> + }
>>>>
>>>> - NetworkPartitionContext networkPartitionContext =
>>>> monitor.getNetworkPartitionCtxt(networkPartitionId);
>>>> -
>>>> - PartitionContext partitionContext =
>>>> networkPartitionContext.getPartitionCtxt(partitionId);
>>>> - String memberId = e.getMemberId();
>>>> -
>>>> partitionContext.removeMemberStatsContext(memberId);
>>>> -
>>>> - if
>>>> (partitionContext.removeTerminationPendingMember(memberId)) {
>>>> - if (log.isDebugEnabled()) {
>>>> - log.debug(String.format("Member is removed
>>>> from termination pending members list: [member] %s", memberId));
>>>> + if (log.isInfoEnabled()) {
>>>> + log.info(String.format("Member stat
>>>> context has been removed successfully: [member] %s", memberId));
>>>> }
>>>> - } else if
>>>> (partitionContext.removePendingMember(memberId)) {
>>>> - if (log.isDebugEnabled()) {
>>>> - log.debug(String.format("Member is removed
>>>> from pending members list: [member] %s", memberId));
>>>> + } else if(monitor.getClusterType() ==
>>>> ClusterType.DockerServiceCluster) {
>>>> +
>>>> + KubernetesClusterContext
>>>> kubernetesClusterContext = ((ContainerClusterMonitor)
>>>> monitor).getKubernetesClusterCtxt();
>>>> +
>>>> kubernetesClusterContext.removeMemberStatsContext(memberId);
>>>> +
>>>> + if
>>>> (kubernetesClusterContext.removeTerminationPendingMember(memberId)) {
>>>> + if (log.isDebugEnabled()) {
>>>> + log.debug(String.format("Member is
>>>> removed from termination pending members list: [member] %s", memberId));
>>>> + }
>>>> + } else if
>>>> (kubernetesClusterContext.removePendingMember(memberId)) {
>>>> + if (log.isDebugEnabled()) {
>>>> + log.debug(String.format("Member is
>>>> removed from pending members list: [member] %s", memberId));
>>>> + }
>>>> + } else if
>>>> (kubernetesClusterContext.removeActiveMemberById(memberId)) {
>>>> + log.warn(String.format("Member is in the
>>>> wrong list and it is removed from active members list", memberId));
>>>> + } else if
>>>> (kubernetesClusterContext.removeObsoleteMember(memberId)){
>>>> + log.warn(String.format("Member's
>>>> obsolated timeout has been expired and it is removed from obsolated members
>>>> list", memberId));
>>>> + } else {
>>>> + log.warn(String.format("Member is not
>>>> available in any of the list active, pending and termination pending",
>>>> memberId));
>>>> }
>>>> - } else if
>>>> (partitionContext.removeActiveMemberById(memberId)) {
>>>> - log.warn(String.format("Member is in the wrong
>>>> list and it is removed from active members list", memberId));
>>>> - } else if
>>>> (partitionContext.removeObsoleteMember(memberId)){
>>>> - log.warn(String.format("Member's obsolated
>>>> timeout has been expired and it is removed from obsolated members list",
>>>> memberId));
>>>> - } else {
>>>> - log.warn(String.format("Member is not
>>>> available in any of the list active, pending and termination pending",
>>>> memberId));
>>>> - }
>>>>
>>>> - if (log.isInfoEnabled()) {
>>>> - log.info(String.format("Member stat context
>>>> has been removed successfully: [member] %s", memberId));
>>>> + if (log.isInfoEnabled()) {
>>>> + log.info(String.format("Member stat
>>>> context has been removed successfully: [member] %s", memberId));
>>>> + }
>>>> }
>>>> -//
>>>> partitionContext.decrementCurrentActiveMemberCount(1);
>>>> -
>>>> -
>>>> +
>>>> } catch (Exception e) {
>>>> log.error("Error processing event", e);
>>>> } finally {
>>>> @@ -338,24 +397,37 @@ public class AutoscalerTopologyEventReceiver
>>>> implements Runnable {
>>>> String partitionId = e.getPartitionId();
>>>> String networkPartitionId =
>>>> e.getNetworkPartitionId();
>>>>
>>>> - PartitionContext partitionContext;
>>>> String clusterId = e.getClusterId();
>>>> - AbstractMonitor monitor;
>>>> -
>>>> - if
>>>> (AutoscalerContext.getInstance().monitorExist(clusterId)) {
>>>> - monitor =
>>>> AutoscalerContext.getInstance().getMonitor(clusterId);
>>>> - partitionContext =
>>>> monitor.getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
>>>> + AbstractClusterMonitor monitor;
>>>> +
>>>> + AutoscalerContext asCtx =
>>>> AutoscalerContext.getInstance();
>>>> + if(asCtx.clusterMonitorExist(clusterId)) {
>>>> + monitor = asCtx.getClusterMonitor(clusterId);
>>>> } else {
>>>> - monitor =
>>>> AutoscalerContext.getInstance().getLBMonitor(clusterId);
>>>> - partitionContext =
>>>> monitor.getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
>>>> - }
>>>> - partitionContext.addMemberStatsContext(new
>>>> MemberStatsContext(memberId));
>>>> - if (log.isInfoEnabled()) {
>>>> - log.info(String.format("Member stat context
>>>> has been added successfully: [member] %s", memberId));
>>>> + if(log.isDebugEnabled()){
>>>> + log.debug(String.format("A cluster monitor
>>>> is not found in autoscaler context [cluster] %s", clusterId));
>>>> + }
>>>> + return;
>>>> }
>>>> -//
>>>> partitionContext.incrementCurrentActiveMemberCount(1);
>>>> -
>>>> partitionContext.movePendingMemberToActiveMembers(memberId);
>>>> -
>>>> +
>>>> + if (monitor.getClusterType() ==
>>>> ClusterType.VMServiceCluster) {
>>>> + PartitionContext partitionContext;
>>>> + partitionContext = ((VMClusterMonitor)
>>>> monitor).getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
>>>> + partitionContext.addMemberStatsContext(new
>>>> MemberStatsContext(memberId));
>>>> + if (log.isInfoEnabled()) {
>>>> + log.info(String.format("Member stat
>>>> context has been added successfully: [member] %s", memberId));
>>>> + }
>>>> +
>>>> partitionContext.movePendingMemberToActiveMembers(memberId);
>>>> + } else
>>>> if(monitor.getClusterType() == ClusterType.DockerServiceCluster) {
>>>> +
>>>> KubernetesClusterContext kubernetesClusterContext;
>>>> +
>>>> kubernetesClusterContext = ((ContainerClusterMonitor)
>>>> monitor).getKubernetesClusterCtxt();
>>>> +
>>>> kubernetesClusterContext.addMemberStatsContext(new
>>>> MemberStatsContext(memberId));
>>>> + if (log.isInfoEnabled()) {
>>>> + log.info(String.format("Member stat
>>>> context has been added successfully: [member] %s", memberId));
>>>> + }
>>>> +
>>>> kubernetesClusterContext.movePendingMemberToActiveMembers(memberId);
>>>> + }
>>>> +
>>>> } catch (Exception e) {
>>>> log.error("Error processing event", e);
>>>> } finally {
>>>> @@ -368,42 +440,59 @@ public class AutoscalerTopologyEventReceiver
>>>> implements Runnable {
>>>> @Override
>>>> protected void onEvent(Event event) {
>>>> try {
>>>> + TopologyManager.acquireReadLock();
>>>> +
>>>> MemberReadyToShutdownEvent
>>>> memberReadyToShutdownEvent = (MemberReadyToShutdownEvent)event;
>>>> AutoscalerContext asCtx =
>>>> AutoscalerContext.getInstance();
>>>> - AbstractMonitor monitor;
>>>> + AbstractClusterMonitor monitor;
>>>> String clusterId =
>>>> memberReadyToShutdownEvent.getClusterId();
>>>> String memberId =
>>>> memberReadyToShutdownEvent.getMemberId();
>>>>
>>>> - if(asCtx.monitorExist(clusterId)){
>>>> - monitor = asCtx.getMonitor(clusterId);
>>>> - }else if(asCtx.lbMonitorExist(clusterId)){
>>>> - monitor = asCtx.getLBMonitor(clusterId);
>>>> - }else{
>>>> + if(asCtx.clusterMonitorExist(clusterId)) {
>>>> + monitor = asCtx.getClusterMonitor(clusterId);
>>>> + } else {
>>>> if(log.isDebugEnabled()){
>>>> log.debug(String.format("A cluster monitor
>>>> is not found in autoscaler context [cluster] %s", clusterId));
>>>> }
>>>> return;
>>>> }
>>>>
>>>> - NetworkPartitionContext nwPartitionCtxt;
>>>> - nwPartitionCtxt =
>>>> monitor.getNetworkPartitionCtxt(memberReadyToShutdownEvent.getNetworkPartitionId());
>>>> + if(monitor.getClusterType() ==
>>>> ClusterType.VMServiceCluster
>>>> + || monitor.getClusterType() ==
>>>> ClusterType.VMLbCluster) {
>>>> +
>>>> + NetworkPartitionContext nwPartitionCtxt;
>>>> + nwPartitionCtxt = ((VMClusterMonitor)
>>>> monitor).getNetworkPartitionCtxt(memberReadyToShutdownEvent.getNetworkPartitionId());
>>>>
>>>> - // start a new member in the same Partition
>>>> - String partitionId =
>>>> monitor.getPartitionOfMember(memberId);
>>>> - PartitionContext partitionCtxt =
>>>> nwPartitionCtxt.getPartitionCtxt(partitionId);
>>>> + // start a new member in the same Partition
>>>> + String partitionId = ((VMClusterMonitor)
>>>> monitor).getPartitionOfMember(memberId);
>>>> + PartitionContext partitionCtxt =
>>>> nwPartitionCtxt.getPartitionCtxt(partitionId);
>>>>
>>>>
>>>> - // terminate the shutdown ready member
>>>> - CloudControllerClient ccClient =
>>>> CloudControllerClient.getInstance();
>>>> - ccClient.terminate(memberId);
>>>> + // terminate the shutdown ready member
>>>> + CloudControllerClient ccClient =
>>>> CloudControllerClient.getInstance();
>>>> + ccClient.terminate(memberId);
>>>>
>>>> - // remove from active member list
>>>> - partitionCtxt.removeActiveMemberById(memberId);
>>>> + // remove from active member list
>>>> + partitionCtxt.removeActiveMemberById(memberId);
>>>>
>>>> - if (log.isInfoEnabled()) {
>>>> - log.info(String.format("Member is terminated
>>>> and removed from the active members list: [member] %s [partition] %s
>>>> [cluster] %s ",
>>>> - memberId, partitionId,
>>>> clusterId));
>>>> + if (log.isInfoEnabled()) {
>>>> + log.info(String.format("Member is
>>>> terminated and removed from the active members list: [member] %s
>>>> [partition] %s [cluster] %s ",
>>>> + memberId,
>>>> partitionId, clusterId));
>>>> + }
>>>> + } else if(monitor.getClusterType() ==
>>>> ClusterType.DockerServiceCluster) {
>>>> + KubernetesClusterContext
>>>> kubernetesClusterContext;
>>>> + kubernetesClusterContext =
>>>> ((ContainerClusterMonitor) monitor).getKubernetesClusterCtxt();
>>>> + // terminate the shutdown ready member
>>>> +
>>>> CloudControllerClient.getInstance().terminateContainer(memberId);
>>>> + // remove from active member list
>>>> +
>>>> kubernetesClusterContext.removeActiveMemberById(memberId);
>>>> +
>>>> + if (log.isInfoEnabled()) {
>>>> + log.info(String.format("Member is
>>>> terminated and removed from the active members list: [member] %s [kub
>>>> cluster] %s [cluster] %s ",
>>>> + memberId,
>>>> kubernetesClusterContext.getKubernetesClusterID(), clusterId));
>>>> + }
>>>> }
>>>> +
>>>> } catch (TerminationException e) {
>>>> log.error(e);
>>>> }
>>>> @@ -424,22 +513,38 @@ public class AutoscalerTopologyEventReceiver
>>>> implements Runnable {
>>>> String partitionId = e.getPartitionId();
>>>> String networkPartitionId =
>>>> e.getNetworkPartitionId();
>>>>
>>>> - PartitionContext partitionContext;
>>>> String clusterId = e.getClusterId();
>>>> - AbstractMonitor monitor;
>>>> -
>>>> - if
>>>> (AutoscalerContext.getInstance().monitorExist(clusterId)) {
>>>> - monitor =
>>>> AutoscalerContext.getInstance().getMonitor(clusterId);
>>>> - partitionContext =
>>>> monitor.getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
>>>> + AbstractClusterMonitor monitor;
>>>> +
>>>> + AutoscalerContext asCtx =
>>>> AutoscalerContext.getInstance();
>>>> + if (asCtx.clusterMonitorExist(clusterId)) {
>>>> + monitor =
>>>> AutoscalerContext.getInstance().getClusterMonitor(clusterId);
>>>> } else {
>>>> - monitor =
>>>> AutoscalerContext.getInstance().getLBMonitor(clusterId);
>>>> - partitionContext =
>>>> monitor.getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
>>>> + if(log.isDebugEnabled()){
>>>> + log.debug(String.format("A cluster monitor
>>>> is not found in autoscaler context [cluster] %s", clusterId));
>>>> + }
>>>> + return;
>>>> }
>>>> - partitionContext.addMemberStatsContext(new
>>>> MemberStatsContext(memberId));
>>>> - if (log.isDebugEnabled()) {
>>>> - log.debug(String.format("Member has been moved
>>>> as pending termination: [member] %s", memberId));
>>>> +
>>>> + if(monitor.getClusterType() ==
>>>> ClusterType.VMServiceCluster
>>>> + || monitor.getClusterType() ==
>>>> ClusterType.VMLbCluster) {
>>>> +
>>>> + PartitionContext partitionContext;
>>>> + partitionContext = ((VMClusterMonitor)
>>>> monitor).getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
>>>> + partitionContext.addMemberStatsContext(new
>>>> MemberStatsContext(memberId));
>>>> + if (log.isDebugEnabled()) {
>>>> + log.debug(String.format("Member has been
>>>> moved as pending termination: [member] %s", memberId));
>>>> + }
>>>> +
>>>> partitionContext.moveActiveMemberToTerminationPendingMembers(memberId);
>>>> + } else if(monitor.getClusterType() ==
>>>> ClusterType.DockerServiceCluster) {
>>>> + KubernetesClusterContext
>>>> kubernetesClusterContext;
>>>> + kubernetesClusterContext =
>>>> ((ContainerClusterMonitor) monitor).getKubernetesClusterCtxt();
>>>> +
>>>> kubernetesClusterContext.addMemberStatsContext(new
>>>> MemberStatsContext(memberId));
>>>> + if (log.isDebugEnabled()) {
>>>> + log.debug(String.format("Member has been
>>>> moved as pending termination: [member] %s", memberId));
>>>> + }
>>>> +
>>>> kubernetesClusterContext.moveActiveMemberToTerminationPendingMembers(memberId);
>>>> }
>>>> -
>>>> partitionContext.moveActiveMemberToTerminationPendingMembers(memberId);
>>>>
>>>> } catch (Exception e) {
>>>> log.error("Error processing event", e);
>>>> @@ -471,64 +576,15 @@ public class AutoscalerTopologyEventReceiver
>>>> implements Runnable {
>>>> });
>>>> }
>>>>
>>>> - private class LBClusterMonitorAdder implements Runnable {
>>>> - private Cluster cluster;
>>>> -
>>>> - public LBClusterMonitorAdder(Cluster cluster) {
>>>> - this.cluster = cluster;
>>>> - }
>>>> -
>>>> - public void run() {
>>>> - LbClusterMonitor monitor = null;
>>>> - int retries = 5;
>>>> - boolean success = false;
>>>> - do {
>>>> - try {
>>>> - Thread.sleep(5000);
>>>> - } catch (InterruptedException e1) {
>>>> - }
>>>> - try {
>>>> - monitor =
>>>> AutoscalerUtil.getLBClusterMonitor(cluster);
>>>> - success = true;
>>>> -
>>>> - } catch (PolicyValidationException e) {
>>>> - String msg = "LB Cluster monitor creation failed
>>>> for cluster: " + cluster.getClusterId();
>>>> - log.debug(msg, e);
>>>> - retries--;
>>>> -
>>>> - } catch (PartitionValidationException e) {
>>>> - String msg = "LB Cluster monitor creation failed
>>>> for cluster: " + cluster.getClusterId();
>>>> - log.debug(msg, e);
>>>> - retries--;
>>>> - }
>>>> - } while (!success && retries <= 0);
>>>> -
>>>> - if (monitor == null) {
>>>> - String msg = "LB Cluster monitor creation failed, even
>>>> after retrying for 5 times, "
>>>> - + "for cluster: " + cluster.getClusterId();
>>>> - log.error(msg);
>>>> - throw new RuntimeException(msg);
>>>> - }
>>>> -
>>>> - Thread th = new Thread(monitor);
>>>> - th.start();
>>>> - AutoscalerContext.getInstance().addLbMonitor(monitor);
>>>> - if (log.isInfoEnabled()) {
>>>> - log.info(String.format("LB Cluster monitor has been
>>>> added successfully: [cluster] %s",
>>>> - cluster.getClusterId()));
>>>> - }
>>>> - }
>>>> - }
>>>> -
>>>> private class ClusterMonitorAdder implements Runnable {
>>>> private Cluster cluster;
>>>> -
>>>> + private String clusterMonitorType;
>>>> public ClusterMonitorAdder(Cluster cluster) {
>>>> this.cluster = cluster;
>>>> }
>>>>
>>>> public void run() {
>>>> - ClusterMonitor monitor = null;
>>>> + AbstractClusterMonitor monitor = null;
>>>> int retries = 5;
>>>> boolean success = false;
>>>> do {
>>>> @@ -538,68 +594,23 @@ public class AutoscalerTopologyEventReceiver
>>>> implements Runnable {
>>>> }
>>>>
>>>> try {
>>>> - monitor =
>>>> AutoscalerUtil.getClusterMonitor(cluster);
>>>> + monitor =
>>>> ClusterMonitorFactory.getMonitor(cluster);
>>>> success = true;
>>>> -
>>>> + clusterMonitorType =
>>>> monitor.getClusterType().name();
>>>> } catch (PolicyValidationException e) {
>>>> - String msg = "Cluster monitor creation failed for
>>>> cluster: " + cluster.getClusterId();
>>>> + String msg = clusterMonitorType +" monitor
>>>> creation failed for cluster: " + cluster.getClusterId();
>>>> log.debug(msg, e);
>>>> retries--;
>>>>
>>>> } catch (PartitionValidationException e) {
>>>> - String msg = "Cluster monitor creation failed for
>>>> cluster: " + cluster.getClusterId();
>>>> - log.debug(msg, e);
>>>> - retries--;
>>>> - }
>>>> - } while (!success && retries != 0);
>>>> -
>>>> - if (monitor == null) {
>>>> - String msg = "Cluster monitor creation failed, even
>>>> after retrying for 5 times, "
>>>> - + "for cluster: " + cluster.getClusterId();
>>>> - log.error(msg);
>>>> - throw new RuntimeException(msg);
>>>> - }
>>>> -
>>>> - Thread th = new Thread(monitor);
>>>> - th.start();
>>>> - AutoscalerContext.getInstance().addMonitor(monitor);
>>>> - if (log.isInfoEnabled()) {
>>>> - log.info(String.format("Cluster monitor has been
>>>> added successfully: [cluster] %s",
>>>> - cluster.getClusterId()));
>>>> - }
>>>> - }
>>>> - }
>>>> -
>>>> - private class KubernetesClusterMonitorAdder implements Runnable {
>>>> - private Cluster cluster;
>>>> -
>>>> - public KubernetesClusterMonitorAdder(Cluster cluster) {
>>>> - this.cluster = cluster;
>>>> - }
>>>> -
>>>> - public void run() {
>>>> - KubernetesClusterMonitor monitor = null;
>>>> - int retries = 5;
>>>> - boolean success = false;
>>>> - do {
>>>> - try {
>>>> - Thread.sleep(5000);
>>>> - } catch (InterruptedException e1) {
>>>> - }
>>>> -
>>>> - try {
>>>> - monitor =
>>>> AutoscalerUtil.getKubernetesClusterMonitor(cluster);
>>>> - success = true;
>>>> -
>>>> - } catch (Exception e) {
>>>> - String msg = "Kubernetes cluster monitor creation
>>>> failed for cluster: " + cluster.getClusterId();
>>>> + String msg = clusterMonitorType +" monitor
>>>> creation failed for cluster: " + cluster.getClusterId();
>>>> log.debug(msg, e);
>>>> retries--;
>>>> }
>>>> } while (!success && retries != 0);
>>>>
>>>> if (monitor == null) {
>>>> - String msg = "Kubernetes cluster monitor creation
>>>> failed, even after retrying for 5 times, "
>>>> + String msg = clusterMonitorType +" monitor creation
>>>> failed, even after retrying for 5 times, "
>>>> + "for cluster: " + cluster.getClusterId();
>>>> log.error(msg);
>>>> throw new RuntimeException(msg);
>>>> @@ -607,16 +618,16 @@ public class AutoscalerTopologyEventReceiver
>>>> implements Runnable {
>>>>
>>>> Thread th = new Thread(monitor);
>>>> th.start();
>>>> -
>>>> AutoscalerContext.getInstance().addKubernetesClusterMonitor(monitor);
>>>> + AutoscalerContext.getInstance().addClusterMonitor(monitor);
>>>> if (log.isInfoEnabled()) {
>>>> - log.info(String.format("Kubernetes cluster monitor
>>>> has been added successfully: [cluster] %s",
>>>> - cluster.getClusterId()));
>>>> + log.info(String.format("%s monitor has been added
>>>> successfully: [cluster] %s",
>>>> + clusterMonitorType, cluster.getClusterId()));
>>>> }
>>>> }
>>>> }
>>>> -
>>>> +
>>>> @SuppressWarnings("unused")
>>>> - private void runTerminateAllRule(AbstractMonitor monitor) {
>>>> + private void runTerminateAllRule(VMClusterMonitor monitor) {
>>>>
>>>> FactHandle terminateAllFactHandle = null;
>>>>
>>>> @@ -639,16 +650,9 @@ public class AutoscalerTopologyEventReceiver
>>>> implements Runnable {
>>>>
>>>> protected synchronized void startClusterMonitor(Cluster cluster) {
>>>> Thread th = null;
>>>> - if (cluster.isKubernetesCluster()
>>>> - &&
>>>> !AutoscalerContext.getInstance().kubernetesClusterMonitorExist(cluster.getClusterId()))
>>>> {
>>>> - th = new Thread(new
>>>> KubernetesClusterMonitorAdder(cluster));
>>>> - } else if (cluster.isLbCluster()
>>>> - &&
>>>> !AutoscalerContext.getInstance().lbMonitorExist(cluster.getClusterId())) {
>>>> - th = new Thread(new LBClusterMonitorAdder(cluster));
>>>> - } else if (!cluster.isLbCluster() &&
>>>> !cluster.isKubernetesCluster()
>>>> - &&
>>>> !AutoscalerContext.getInstance().monitorExist(cluster.getClusterId())) {
>>>> - th = new Thread(new ClusterMonitorAdder(cluster));
>>>> - }
>>>> + if
>>>> (!AutoscalerContext.getInstance().clusterMonitorExist(cluster.getClusterId()))
>>>> {
>>>> + th = new Thread(new ClusterMonitorAdder(cluster));
>>>> + }
>>>> if (th != null) {
>>>> th.start();
>>>> try {
>>>>
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
>>>> ----------------------------------------------------------------------
>>>> diff --git
>>>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
>>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
>>>> new file mode 100644
>>>> index 0000000..00796f1
>>>> --- /dev/null
>>>> +++
>>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
>>>> @@ -0,0 +1,127 @@
>>>> +package org.apache.stratos.autoscaler.monitor;
>>>> +
>>>> +import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
>>>> +import org.apache.stratos.common.enums.ClusterType;
>>>> +import org.apache.stratos.messaging.domain.topology.ClusterStatus;
>>>> +import org.drools.runtime.StatefulKnowledgeSession;
>>>> +import org.drools.runtime.rule.FactHandle;
>>>> +
>>>> +public abstract class AbstractClusterMonitor implements Runnable{
>>>> +
>>>> + private String clusterId;
>>>> + private String serviceId;
>>>> + private ClusterType clusterType;
>>>> + private ClusterStatus status;
>>>> + private int monitorInterval;
>>>> +
>>>> + protected FactHandle minCheckFactHandle;
>>>> + protected FactHandle scaleCheckFactHandle;
>>>> + private StatefulKnowledgeSession minCheckKnowledgeSession;
>>>> + private StatefulKnowledgeSession scaleCheckKnowledgeSession;
>>>> + private boolean isDestroyed;
>>>> +
>>>> + private AutoscalerRuleEvaluator autoscalerRuleEvaluator;
>>>> +
>>>> + protected AbstractClusterMonitor(String clusterId, String
>>>> serviceId, ClusterType clusterType,
>>>> + AutoscalerRuleEvaluator
>>>> autoscalerRuleEvaluator) {
>>>> +
>>>> + super();
>>>> + this.clusterId = clusterId;
>>>> + this.serviceId = serviceId;
>>>> + this.clusterType = clusterType;
>>>> + this.autoscalerRuleEvaluator = autoscalerRuleEvaluator;
>>>> + this.scaleCheckKnowledgeSession =
>>>> autoscalerRuleEvaluator.getScaleCheckStatefulSession();
>>>> + this.minCheckKnowledgeSession =
>>>> autoscalerRuleEvaluator.getMinCheckStatefulSession();
>>>> + }
>>>> +
>>>> + protected abstract void readConfigurations();
>>>> + protected abstract void monitor();
>>>> + public abstract void destroy();
>>>> +
>>>> + public String getClusterId() {
>>>> + return clusterId;
>>>> + }
>>>> +
>>>> + public void setClusterId(String clusterId) {
>>>> + this.clusterId = clusterId;
>>>> + }
>>>> +
>>>> + public void setStatus(ClusterStatus status) {
>>>> + this.status = status;
>>>> + }
>>>> +
>>>> + public ClusterType getClusterType() {
>>>> + return clusterType;
>>>> + }
>>>> +
>>>> + public ClusterStatus getStatus() {
>>>> + return status;
>>>> + }
>>>> +
>>>> + public String getServiceId() {
>>>> + return serviceId;
>>>> + }
>>>> +
>>>> + public void setServiceId(String serviceId) {
>>>> + this.serviceId = serviceId;
>>>> + }
>>>> +
>>>> + public int getMonitorInterval() {
>>>> + return monitorInterval;
>>>> + }
>>>> +
>>>> + public void setMonitorInterval(int monitorInterval) {
>>>> + this.monitorInterval = monitorInterval;
>>>> + }
>>>> +
>>>> + public FactHandle getMinCheckFactHandle() {
>>>> + return minCheckFactHandle;
>>>> + }
>>>> +
>>>> + public void setMinCheckFactHandle(FactHandle
>>>> minCheckFactHandle) {
>>>> + this.minCheckFactHandle = minCheckFactHandle;
>>>> + }
>>>> +
>>>> + public FactHandle getScaleCheckFactHandle() {
>>>> + return scaleCheckFactHandle;
>>>> + }
>>>> +
>>>> + public void setScaleCheckFactHandle(FactHandle
>>>> scaleCheckFactHandle) {
>>>> + this.scaleCheckFactHandle = scaleCheckFactHandle;
>>>> + }
>>>> +
>>>> + public StatefulKnowledgeSession getMinCheckKnowledgeSession() {
>>>> + return minCheckKnowledgeSession;
>>>> + }
>>>> +
>>>> + public void setMinCheckKnowledgeSession(
>>>> + StatefulKnowledgeSession
>>>> minCheckKnowledgeSession) {
>>>> + this.minCheckKnowledgeSession =
>>>> minCheckKnowledgeSession;
>>>> + }
>>>> +
>>>> + public StatefulKnowledgeSession getScaleCheckKnowledgeSession()
>>>> {
>>>> + return scaleCheckKnowledgeSession;
>>>> + }
>>>> +
>>>> + public void setScaleCheckKnowledgeSession(
>>>> + StatefulKnowledgeSession
>>>> scaleCheckKnowledgeSession) {
>>>> + this.scaleCheckKnowledgeSession =
>>>> scaleCheckKnowledgeSession;
>>>> + }
>>>> +
>>>> + public boolean isDestroyed() {
>>>> + return isDestroyed;
>>>> + }
>>>> +
>>>> + public void setDestroyed(boolean isDestroyed) {
>>>> + this.isDestroyed = isDestroyed;
>>>> + }
>>>> +
>>>> + public AutoscalerRuleEvaluator getAutoscalerRuleEvaluator() {
>>>> + return autoscalerRuleEvaluator;
>>>> + }
>>>> +
>>>> + public void setAutoscalerRuleEvaluator(
>>>> + AutoscalerRuleEvaluator
>>>> autoscalerRuleEvaluator) {
>>>> + this.autoscalerRuleEvaluator = autoscalerRuleEvaluator;
>>>> + }
>>>> +}
>>>>
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractMonitor.java
>>>> ----------------------------------------------------------------------
>>>> diff --git
>>>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractMonitor.java
>>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractMonitor.java
>>>> deleted file mode 100644
>>>> index c1441bb..0000000
>>>> ---
>>>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractMonitor.java
>>>> +++ /dev/null
>>>> @@ -1,203 +0,0 @@
>>>> -/*
>>>> - * Licensed to the Apache Software Foundation (ASF) under one
>>>> - * or more contributor license agreements. See the NOTICE file
>>>> - * distributed with this work for additional information
>>>> - * regarding copyright ownership. The ASF licenses this file
>>>> - * to you under the Apache License, Version 2.0 (the
>>>> - * "License"); you may not use this file except in compliance
>>>> - * with the License. You may obtain a copy of the License at
>>>> - *
>>>> - * http://www.apache.org/licenses/LICENSE-2.0
>>>> - *
>>>> - * Unless required by applicable law or agreed to in writing,
>>>> - * software distributed under the License is distributed on an
>>>> - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>>> - * KIND, either express or implied. See the License for the
>>>> - * specific language governing permissions and limitations
>>>> - * under the License.
>>>> - */
>>>> -package org.apache.stratos.autoscaler.monitor;
>>>> -
>>>> -import java.util.Map;
>>>> -
>>>> -import org.apache.commons.configuration.XMLConfiguration;
>>>> -import org.apache.commons.logging.Log;
>>>> -import org.apache.commons.logging.LogFactory;
>>>> -import org.apache.stratos.autoscaler.NetworkPartitionContext;
>>>> -import
>>>> org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
>>>> -import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
>>>> -import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
>>>> -import org.apache.stratos.autoscaler.util.AutoScalerConstants;
>>>> -import org.apache.stratos.autoscaler.util.ConfUtil;
>>>> -import org.apache.stratos.messaging.domain.topology.Cluster;
>>>> -import org.apache.stratos.messaging.domain.topology.Member;
>>>> -import org.apache.stratos.messaging.domain.topology.Service;
>>>> -import
>>>> org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
>>>> -import org.drools.runtime.StatefulKnowledgeSession;
>>>> -import org.drools.runtime.rule.FactHandle;
>>>> -
>>>> -/**
>>>> - * Is responsible for monitoring a service cluster. This runs
>>>> periodically
>>>> - * and perform minimum instance check and scaling check using the
>>>> underlying
>>>> - * rules engine.
>>>> - *
>>>> - */
>>>> - abstract public class AbstractMonitor implements Runnable{
>>>> -
>>>> - private static final Log log =
>>>> LogFactory.getLog(AbstractMonitor.class);
>>>> - // Map<NetworkpartitionId, Network Partition Context>
>>>> - protected Map<String, NetworkPartitionContext>
>>>> networkPartitionCtxts;
>>>> - protected DeploymentPolicy deploymentPolicy;
>>>> - protected AutoscalePolicy autoscalePolicy;
>>>> -
>>>> -
>>>> - protected FactHandle minCheckFactHandle;
>>>> - protected FactHandle scaleCheckFactHandle;
>>>> -
>>>> - protected StatefulKnowledgeSession minCheckKnowledgeSession;
>>>> - protected StatefulKnowledgeSession scaleCheckKnowledgeSession;
>>>> - protected boolean isDestroyed;
>>>> -
>>>> - protected String clusterId;
>>>> - protected String serviceId;
>>>> -
>>>> - protected AutoscalerRuleEvaluator autoscalerRuleEvaluator;
>>>> -
>>>> - // time intereval between two runs of the Monitor. Default is
>>>> 90000ms.
>>>> - protected int monitorInterval;
>>>> -
>>>> - public AbstractMonitor() {
>>>> - readConfigurations();
>>>> - }
>>>> -
>>>> - private void readConfigurations () {
>>>> -
>>>> - XMLConfiguration conf =
>>>> ConfUtil.getInstance(null).getConfiguration();
>>>> - monitorInterval =
>>>> conf.getInt(AutoScalerConstants.AUTOSCALER_MONITOR_INTERVAL, 90000);
>>>> - if (log.isDebugEnabled()) {
>>>> - log.debug("Cluster Monitor task interval: " +
>>>> getMonitorInterval());
>>>> - }
>>>> - }
>>>> -
>>>> - @Override
>>>> - public void run() {
>>>> - // TODO Auto-generated method stub
>>>> -
>>>> - }
>>>> -
>>>> -
>>>> - public NetworkPartitionContext 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;
>>>> - }
>>>> -
>>>> - public String getPartitionOfMember(String memberId){
>>>> - for(Service service:
>>>> TopologyManager.getTopology().getServices()){
>>>> - for(Cluster cluster: service.getClusters()){
>>>> - if(cluster.memberExists(memberId)){
>>>> - return
>>>> cluster.getMember(memberId).getPartitionId();
>>>> - }
>>>> - }
>>>> - }
>>>> - return null;
>>>> - }
>>>> -
>>>> - public void destroy() {
>>>> - minCheckKnowledgeSession.dispose();
>>>> - scaleCheckKnowledgeSession.dispose();
>>>> - setDestroyed(true);
>>>> - if(log.isDebugEnabled()) {
>>>> - log.debug("Cluster Monitor Drools session has been
>>>> disposed. "+this.toString());
>>>> - }
>>>> - }
>>>> -
>>>> - public boolean isDestroyed() {
>>>> - return isDestroyed;
>>>> - }
>>>> -
>>>> - public void setDestroyed(boolean isDestroyed) {
>>>> - this.isDestroyed = isDestroyed;
>>>> - }
>>>> -
>>>> - public String getServiceId() {
>>>> - return serviceId;
>>>> - }
>>>> -
>>>> - public void setServiceId(String serviceId) {
>>>> - this.serviceId = serviceId;
>>>> - }
>>>> -
>>>> - 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 String getClusterId() {
>>>> - return clusterId;
>>>> - }
>>>> -
>>>> - public void setClusterId(String clusterId) {
>>>> - this.clusterId = clusterId;
>>>> - }
>>>> -
>>>> - public Map<String, NetworkPartitionContext>
>>>> getNetworkPartitionCtxts() {
>>>> - return networkPartitionCtxts;
>>>> - }
>>>> -
>>>> - public NetworkPartitionContext getNetworkPartitionCtxt(String
>>>> networkPartitionId) {
>>>> - return networkPartitionCtxts.get(networkPartitionId);
>>>> - }
>>>> -
>>>> - public void setPartitionCtxt(Map<String, NetworkPartitionContext>
>>>> partitionCtxt) {
>>>> - this.networkPartitionCtxts = partitionCtxt;
>>>> - }
>>>> -
>>>> - public boolean partitionCtxtAvailable(String partitionId) {
>>>> - return networkPartitionCtxts.containsKey(partitionId);
>>>> - }
>>>> -
>>>> - public void addNetworkPartitionCtxt(NetworkPartitionContext ctxt) {
>>>> - this.networkPartitionCtxts.put(ctxt.getId(), ctxt);
>>>> - }
>>>> -
>>>> - public NetworkPartitionContext getPartitionCtxt(String id) {
>>>> - return this.networkPartitionCtxts.get(id);
>>>> - }
>>>> -
>>>> - public StatefulKnowledgeSession getMinCheckKnowledgeSession() {
>>>> - return minCheckKnowledgeSession;
>>>> - }
>>>> -
>>>> - public void setMinCheckKnowledgeSession(StatefulKnowledgeSession
>>>> minCheckKnowledgeSession) {
>>>> - this.minCheckKnowledgeSession = minCheckKnowledgeSession;
>>>> - }
>>>> -
>>>> - public FactHandle getMinCheckFactHandle() {
>>>> - return minCheckFactHandle;
>>>> - }
>>>> -
>>>> - public void setMinCheckFactHandle(FactHandle minCheckFactHandle) {
>>>> - this.minCheckFactHandle = minCheckFactHandle;
>>>> - }
>>>> -
>>>> - public int getMonitorInterval() {
>>>> - return monitorInterval;
>>>> - }
>>>> -}
>>>> \ No newline at end of file
>>>>
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitor.java
>>>> ----------------------------------------------------------------------
>>>> diff --git
>>>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitor.java
>>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitor.java
>>>> deleted file mode 100644
>>>> index 5bb478e..0000000
>>>> ---
>>>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitor.java
>>>> +++ /dev/null
>>>> @@ -1,223 +0,0 @@
>>>> -/*
>>>> - * Licensed to the Apache Software Foundation (ASF) under one
>>>> - * or more contributor license agreements. See the NOTICE file
>>>> - * distributed with this work for additional information
>>>> - * regarding copyright ownership. The ASF licenses this file
>>>> - * to you under the Apache License, Version 2.0 (the
>>>> - * "License"); you may not use this file except in compliance
>>>> - * with the License. You may obtain a copy of the License at
>>>> - *
>>>> - * http://www.apache.org/licenses/LICENSE-2.0
>>>> - *
>>>> - * Unless required by applicable law or agreed to in writing,
>>>> - * software distributed under the License is distributed on an
>>>> - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>>> - * KIND, either express or implied. See the License for the
>>>> - * specific language governing permissions and limitations
>>>> - * under the License.
>>>> - */
>>>> -package org.apache.stratos.autoscaler.monitor;
>>>> -
>>>> -import org.apache.commons.logging.Log;
>>>> -import org.apache.commons.logging.LogFactory;
>>>> -import org.apache.stratos.autoscaler.NetworkPartitionContext;
>>>> -import org.apache.stratos.autoscaler.PartitionContext;
>>>> -import
>>>> org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
>>>> -import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
>>>> -import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
>>>> -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.messaging.domain.topology.ClusterStatus;
>>>> -
>>>> -import java.util.ArrayList;
>>>> -import java.util.List;
>>>> -import java.util.concurrent.ConcurrentHashMap;
>>>> -
>>>> -/**
>>>> - * Is responsible for monitoring a service cluster. This runs
>>>> periodically
>>>> - * and perform minimum instance check and scaling check using the
>>>> underlying
>>>> - * rules engine.
>>>> - *
>>>> - */
>>>> -public class ClusterMonitor extends AbstractMonitor {
>>>> -
>>>> - private static final Log log =
>>>> LogFactory.getLog(ClusterMonitor.class);
>>>> - private String lbReferenceType;
>>>> - private boolean hasPrimary;
>>>> - private ClusterStatus status;
>>>> -
>>>> - public ClusterMonitor(String clusterId, String serviceId,
>>>> DeploymentPolicy deploymentPolicy,
>>>> - AutoscalePolicy autoscalePolicy) {
>>>> - this.clusterId = clusterId;
>>>> - this.serviceId = serviceId;
>>>> -
>>>> - this.autoscalerRuleEvaluator = new AutoscalerRuleEvaluator();
>>>> - this.scaleCheckKnowledgeSession =
>>>> autoscalerRuleEvaluator.getScaleCheckStatefulSession();
>>>> - this.minCheckKnowledgeSession =
>>>> autoscalerRuleEvaluator.getMinCheckStatefulSession();
>>>> -
>>>> - this.deploymentPolicy = deploymentPolicy;
>>>> - this.autoscalePolicy = autoscalePolicy;
>>>> - networkPartitionCtxts = new ConcurrentHashMap<String,
>>>> NetworkPartitionContext>();
>>>> - }
>>>> -
>>>> -
>>>> -
>>>> - @Override
>>>> - public void run() {
>>>> -
>>>> - try {
>>>> - // TODO make this configurable,
>>>> - // this is the delay the min check of normal cluster
>>>> monitor to wait until LB monitor is added
>>>> - Thread.sleep(60000);
>>>> - } catch (InterruptedException ignore) {
>>>> - }
>>>> -
>>>> - while (!isDestroyed()) {
>>>> - if (log.isDebugEnabled()) {
>>>> - log.debug("Cluster monitor is running.. " +
>>>> this.toString());
>>>> - }
>>>> - try {
>>>> - if(!ClusterStatus.In_Maintenance.equals(status)) {
>>>> - monitor();
>>>> - } else {
>>>> - if (log.isDebugEnabled()) {
>>>> - log.debug("Cluster monitor is suspended as the
>>>> cluster is in " +
>>>> - ClusterStatus.In_Maintenance + "
>>>> mode......");
>>>> - }
>>>> - }
>>>> - } catch (Exception e) {
>>>> - log.error("Cluster monitor: Monitor failed." +
>>>> this.toString(), e);
>>>> - }
>>>> - try {
>>>> - Thread.sleep(monitorInterval);
>>>> - } catch (InterruptedException ignore) {
>>>> - }
>>>> - }
>>>> - }
>>>> -
>>>> - private boolean isPrimaryMember(MemberContext memberContext){
>>>> - Properties props = memberContext.getProperties();
>>>> - if (log.isDebugEnabled()) {
>>>> - log.debug(" Properties [" + props + "] ");
>>>> - }
>>>> - if (props != null && props.getProperties() != null) {
>>>> - for (Property prop : props.getProperties()) {
>>>> - if (prop.getName().equals("PRIMARY")) {
>>>> - if (Boolean.parseBoolean(prop.getValue())) {
>>>> - log.debug("Adding member id [" +
>>>> memberContext.getMemberId() + "] " +
>>>> - "member instance id [" +
>>>> memberContext.getInstanceId() + "] as a primary member");
>>>> - return true;
>>>> - }
>>>> - }
>>>> - }
>>>> - }
>>>> - return false;
>>>> - }
>>>> -
>>>> - private void monitor() {
>>>> -
>>>> - //TODO make this concurrent
>>>> - for (NetworkPartitionContext networkPartitionContext :
>>>> networkPartitionCtxts.values()) {
>>>> - // store primary members in the network partition context
>>>> - List<String> primaryMemberListInNetworkPartition = new
>>>> ArrayList<String>();
>>>> -
>>>> - //minimum check per partition
>>>> - for (PartitionContext partitionContext :
>>>> networkPartitionContext.getPartitionCtxts().values()) {
>>>> - // store primary members in the partition context
>>>> - List<String> primaryMemberListInPartition = new
>>>> ArrayList<String>();
>>>> - // get active primary members in this partition context
>>>> - for (MemberContext memberContext :
>>>> partitionContext.getActiveMembers()) {
>>>> - if (isPrimaryMember(memberContext)){
>>>> -
>>>> primaryMemberListInPartition.add(memberContext.getMemberId());
>>>> - }
>>>> - }
>>>> - // get pending primary members in this partition
>>>> context
>>>> - for (MemberContext memberContext :
>>>> partitionContext.getPendingMembers()) {
>>>> - if (isPrimaryMember(memberContext)){
>>>> -
>>>> primaryMemberListInPartition.add(memberContext.getMemberId());
>>>> - }
>>>> - }
>>>> -
>>>> primaryMemberListInNetworkPartition.addAll(primaryMemberListInPartition);
>>>> - minCheckKnowledgeSession.setGlobal("clusterId",
>>>> clusterId);
>>>> - minCheckKnowledgeSession.setGlobal("lbRef",
>>>> lbReferenceType);
>>>> - minCheckKnowledgeSession.setGlobal("isPrimary",
>>>> hasPrimary);
>>>> -
>>>> minCheckKnowledgeSession.setGlobal("primaryMemberCount",
>>>> primaryMemberListInPartition.size());
>>>> -
>>>> - if (log.isDebugEnabled()) {
>>>> - log.debug(String.format("Running minimum check for
>>>> partition %s ", partitionContext.getPartitionId()));
>>>> - }
>>>> -
>>>> - minCheckFactHandle =
>>>> AutoscalerRuleEvaluator.evaluateMinCheck(minCheckKnowledgeSession
>>>> - , minCheckFactHandle, partitionContext);
>>>> -
>>>> - }
>>>> -
>>>> - boolean rifReset = networkPartitionContext.isRifReset();
>>>> - boolean memoryConsumptionReset =
>>>> networkPartitionContext.isMemoryConsumptionReset();
>>>> - boolean loadAverageReset =
>>>> networkPartitionContext.isLoadAverageReset();
>>>> - if (log.isDebugEnabled()) {
>>>> - log.debug("flag of rifReset: " + rifReset + " flag of
>>>> memoryConsumptionReset" + memoryConsumptionReset
>>>> - + " flag of loadAverageReset" +
>>>> loadAverageReset);
>>>> - }
>>>> - if (rifReset || memoryConsumptionReset ||
>>>> loadAverageReset) {
>>>> - scaleCheckKnowledgeSession.setGlobal("clusterId",
>>>> clusterId);
>>>> -
>>>> //scaleCheckKnowledgeSession.setGlobal("deploymentPolicy",
>>>> deploymentPolicy);
>>>> -
>>>> scaleCheckKnowledgeSession.setGlobal("autoscalePolicy", autoscalePolicy);
>>>> - scaleCheckKnowledgeSession.setGlobal("rifReset",
>>>> rifReset);
>>>> - scaleCheckKnowledgeSession.setGlobal("mcReset",
>>>> memoryConsumptionReset);
>>>> - scaleCheckKnowledgeSession.setGlobal("laReset",
>>>> loadAverageReset);
>>>> - scaleCheckKnowledgeSession.setGlobal("lbRef",
>>>> lbReferenceType);
>>>> - scaleCheckKnowledgeSession.setGlobal("isPrimary",
>>>> false);
>>>> - scaleCheckKnowledgeSession.setGlobal("primaryMembers",
>>>> primaryMemberListInNetworkPartition);
>>>> -
>>>> - if (log.isDebugEnabled()) {
>>>> - log.debug(String.format("Running scale check for
>>>> network partition %s ", networkPartitionContext.getId()));
>>>> - log.debug(" Primary members : " +
>>>> primaryMemberListInNetworkPartition);
>>>> - }
>>>> -
>>>> - scaleCheckFactHandle =
>>>> AutoscalerRuleEvaluator.evaluateScaleCheck(scaleCheckKnowledgeSession
>>>> - , scaleCheckFactHandle,
>>>> networkPartitionContext);
>>>> -
>>>> - networkPartitionContext.setRifReset(false);
>>>> -
>>>> networkPartitionContext.setMemoryConsumptionReset(false);
>>>> - networkPartitionContext.setLoadAverageReset(false);
>>>> - } else if (log.isDebugEnabled()) {
>>>> - log.debug(String.format("Scale rule will not run since
>>>> the LB statistics have not received before this " +
>>>> - "cycle for network partition %s",
>>>> networkPartitionContext.getId()));
>>>> - }
>>>> - }
>>>> - }
>>>> -
>>>> - @Override
>>>> - public String toString() {
>>>> - return "ClusterMonitor [clusterId=" + clusterId + ",
>>>> serviceId=" + serviceId +
>>>> - ", deploymentPolicy=" + deploymentPolicy + ",
>>>> autoscalePolicy=" + autoscalePolicy +
>>>> - ", lbReferenceType=" + lbReferenceType +
>>>> - ", hasPrimary=" + hasPrimary + " ]";
>>>> - }
>>>> -
>>>> - public String getLbReferenceType() {
>>>> - return lbReferenceType;
>>>> - }
>>>> -
>>>> - public void setLbReferenceType(String lbReferenceType) {
>>>> - this.lbReferenceType = lbReferenceType;
>>>> - }
>>>> -
>>>> - public boolean isHasPrimary() {
>>>> - return hasPrimary;
>>>> - }
>>>> -
>>>> - public void setHasPrimary(boolean hasPrimary) {
>>>> - this.hasPrimary = hasPrimary;
>>>> - }
>>>> -
>>>> - public ClusterStatus getStatus() {
>>>> - return status;
>>>> - }
>>>> -
>>>> - public void setStatus(ClusterStatus status) {
>>>> - this.status = status;
>>>> - }
>>>> -}
>>>>
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitorFactory.java
>>>> ----------------------------------------------------------------------
>>>> diff --git
>>>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitorFactory.java
>>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitorFactory.java
>>>> new file mode 100644
>>>> index 0000000..489078e
>>>> --- /dev/null
>>>> +++
>>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitorFactory.java
>>>> @@ -0,0 +1,336 @@
>>>> +package org.apache.stratos.autoscaler.monitor;
>>>> +
>>>> +import java.util.Map;
>>>> +import java.util.Random;
>>>> +
>>>> +import org.apache.commons.logging.Log;
>>>> +import org.apache.commons.logging.LogFactory;
>>>> +import org.apache.stratos.autoscaler.KubernetesClusterContext;
>>>> +import org.apache.stratos.autoscaler.MemberStatsContext;
>>>> +import org.apache.stratos.autoscaler.NetworkPartitionContext;
>>>> +import org.apache.stratos.autoscaler.NetworkPartitionLbHolder;
>>>> +import org.apache.stratos.autoscaler.PartitionContext;
>>>> +import
>>>> org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
>>>> +import
>>>> org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
>>>> +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.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.ClusterStatus;
>>>> +import org.apache.stratos.messaging.domain.topology.Member;
>>>> +import org.apache.stratos.messaging.domain.topology.MemberStatus;
>>>> +import org.apache.stratos.messaging.util.Constants;
>>>> +
>>>> +public class ClusterMonitorFactory {
>>>> +
>>>> + private static final Log log =
>>>> LogFactory.getLog(ClusterMonitorFactory.class);
>>>> +
>>>> + public static AbstractClusterMonitor getMonitor(Cluster
>>>> cluster) throws PolicyValidationException, PartitionValidationException {
>>>> +
>>>> + AbstractClusterMonitor clusterMonitor;
>>>> + if(cluster.isKubernetesCluster()){
>>>> + clusterMonitor =
>>>> getDockerServiceClusterMonitor(cluster);
>>>> + } else if (cluster.isLbCluster()){
>>>> + clusterMonitor = getVMLbClusterMonitor(cluster);
>>>> + } else {
>>>> + clusterMonitor =
>>>> getVMServiceClusterMonitor(cluster);
>>>> + }
>>>> +
>>>> + return clusterMonitor;
>>>> + }
>>>> +
>>>> + private static VMServiceClusterMonitor
>>>> getVMServiceClusterMonitor(Cluster cluster) throws
>>>> PolicyValidationException, PartitionValidationException {
>>>> + // 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 policy =
>>>> + 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 =
>>>> + "Deployment Policy's Partitions are null.
>>>> Policy name: " +
>>>> + deploymentPolicyName;
>>>> + log.error(msg);
>>>> + throw new PolicyValidationException(msg);
>>>> + }
>>>> +
>>>> +
>>>> CloudControllerClient.getInstance().validateDeploymentPolicy(cluster.getServiceName(),
>>>> deploymentPolicy);
>>>> +
>>>> + VMServiceClusterMonitor clusterMonitor =
>>>> + new
>>>> VMServiceClusterMonitor(cluster.getClusterId(),
>>>> +
>>>> cluster.getServiceName(),
>>>> +
>>>> deploymentPolicy, policy);
>>>> + clusterMonitor.setStatus(ClusterStatus.Created);
>>>> +
>>>> + for (PartitionGroup partitionGroup:
>>>> deploymentPolicy.getPartitionGroups()){
>>>> +
>>>> + NetworkPartitionContext networkPartitionContext = new
>>>> NetworkPartitionContext(partitionGroup.getId(),
>>>> + partitionGroup.getPartitionAlgo(),
>>>> partitionGroup.getPartitions());
>>>> +
>>>> + for(Partition partition: partitionGroup.getPartitions()){
>>>> + PartitionContext partitionContext = new
>>>> PartitionContext(partition);
>>>> +
>>>> partitionContext.setServiceName(cluster.getServiceName());
>>>> +
>>>> partitionContext.setProperties(cluster.getProperties());
>>>> +
>>>> partitionContext.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.setPartition(partition);
>>>> +
>>>> memberContext.setProperties(convertMemberPropsToMemberContextProps(member.getProperties()));
>>>> +
>>>> +
>>>> if(MemberStatus.Activated.equals(member.getStatus())){
>>>> +
>>>> partitionContext.addActiveMember(memberContext);
>>>> +//
>>>> networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(),
>>>> 1);
>>>> +//
>>>> partitionContext.incrementCurrentActiveMemberCount(1);
>>>> +
>>>> + } else
>>>> if(MemberStatus.Created.equals(member.getStatus()) ||
>>>> MemberStatus.Starting.equals(member.getStatus())){
>>>> +
>>>> partitionContext.addPendingMember(memberContext);
>>>> +
>>>> +//
>>>> networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(),
>>>> 1);
>>>> + } else
>>>> if(MemberStatus.Suspended.equals(member.getStatus())){
>>>> +//
>>>> partitionContext.addFaultyMember(memberId);
>>>> + }
>>>> + partitionContext.addMemberStatsContext(new
>>>> MemberStatsContext(memberId));
>>>> + if(log.isInfoEnabled()){
>>>> + log.info(String.format("Member stat
>>>> context has been added: [member] %s", memberId));
>>>> + }
>>>> + }
>>>> +
>>>> + }
>>>> +
>>>> networkPartitionContext.addPartitionContext(partitionContext);
>>>> + if(log.isInfoEnabled()){
>>>> + log.info(String.format("Partition context has
>>>> been added: [partition] %s",
>>>> + partitionContext.getPartitionId()));
>>>> + }
>>>> + }
>>>> +
>>>> +
>>>> clusterMonitor.addNetworkPartitionCtxt(networkPartitionContext);
>>>> + if(log.isInfoEnabled()){
>>>> + log.info(String.format("Network partition context has
>>>> been added: [network partition] %s",
>>>> + networkPartitionContext.getId()));
>>>> + }
>>>> + }
>>>> +
>>>> +
>>>> + // find lb reference type
>>>> + java.util.Properties props = cluster.getProperties();
>>>> +
>>>> + if(props.containsKey(Constants.LOAD_BALANCER_REF)) {
>>>> + String value =
>>>> props.getProperty(Constants.LOAD_BALANCER_REF);
>>>> + clusterMonitor.setLbReferenceType(value);
>>>> + if(log.isDebugEnabled()) {
>>>> + log.debug("Set the lb reference type: "+value);
>>>> + }
>>>> + }
>>>> +
>>>> + // set hasPrimary property
>>>> + // hasPrimary is true if there are primary members available
>>>> in that cluster
>>>> +
>>>> clusterMonitor.setHasPrimary(Boolean.parseBoolean(cluster.getProperties().getProperty(Constants.IS_PRIMARY)));
>>>> +
>>>> + log.info("Cluster monitor created:
>>>> "+clusterMonitor.toString());
>>>> + return clusterMonitor;
>>>> + }
>>>> +
>>>> + private static Properties convertMemberPropsToMemberContextProps(
>>>> + java.util.Properties properties) {
>>>> + Properties props = new Properties();
>>>> + for (Map.Entry<Object, Object> e : properties.entrySet()
>>>> ) {
>>>> + Property prop = new Property();
>>>> + prop.setName((String)e.getKey());
>>>> + prop.setValue((String)e.getValue());
>>>> + props.addProperties(prop);
>>>> + }
>>>> + return props;
>>>> + }
>>>> +
>>>> +
>>>> + private static VMLbClusterMonitor getVMLbClusterMonitor(Cluster
>>>> cluster) throws PolicyValidationException, PartitionValidationException {
>>>> + // 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 policy =
>>>> + 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();
>>>> + VMLbClusterMonitor clusterMonitor =
>>>> + new
>>>> VMLbClusterMonitor(clusterId,
>>>> +
>>>> cluster.getServiceName(),
>>>> +
>>>> deploymentPolicy, policy);
>>>> + clusterMonitor.setStatus(ClusterStatus.Created);
>>>> + // partition group = network partition context
>>>> + for (PartitionGroup partitionGroup :
>>>> deploymentPolicy.getPartitionGroups()) {
>>>> +
>>>> + NetworkPartitionLbHolder networkPartitionLbHolder =
>>>> +
>>>> PartitionManager.getInstance()
>>>> +
>>>> .getNetworkPartitionLbHolder(partitionGroup.getId());
>>>> +//
>>>> PartitionManager.getInstance()
>>>> +//
>>>> .getNetworkPartitionLbHolder(partitionGroup.getId());
>>>> + // FIXME pick a random partition
>>>> + Partition partition =
>>>> + partitionGroup.getPartitions()[new
>>>> Random().nextInt(partitionGroup.getPartitions().length)];
>>>> + PartitionContext partitionContext = new
>>>> PartitionContext(partition);
>>>> + partitionContext.setServiceName(cluster.getServiceName());
>>>> + partitionContext.setProperties(cluster.getProperties());
>>>> +
>>>> partitionContext.setNetworkPartitionId(partitionGroup.getId());
>>>> + partitionContext.setMinimumMemberCount(1);//Here it hard
>>>> codes the minimum value as one for LB cartridge partitions
>>>> +
>>>> + NetworkPartitionContext networkPartitionContext = new
>>>> NetworkPartitionContext(partitionGroup.getId(),
>>>> + partitionGroup.getPartitionAlgo(),
>>>> partitionGroup.getPartitions()) ;
>>>> + for (Member member : cluster.getMembers()) {
>>>> + String memberId = member.getMemberId();
>>>> + if
>>>> (member.getNetworkPartitionId().equalsIgnoreCase(networkPartitionContext.getId()))
>>>> {
>>>> + MemberContext memberContext = new MemberContext();
>>>> + memberContext.setClusterId(member.getClusterId());
>>>> + memberContext.setMemberId(memberId);
>>>> + memberContext.setPartition(partition);
>>>> +
>>>> + if
>>>> (MemberStatus.Activated.equals(member.getStatus())) {
>>>> +
>>>> partitionContext.addActiveMember(memberContext);
>>>> +//
>>>> networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(),
>>>> 1);
>>>> +//
>>>> partitionContext.incrementCurrentActiveMemberCount(1);
>>>> + } else if
>>>> (MemberStatus.Created.equals(member.getStatus()) ||
>>>> +
>>>> MemberStatus.Starting.equals(member.getStatus())) {
>>>> +
>>>> partitionContext.addPendingMember(memberContext);
>>>> +//
>>>> networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(),
>>>> 1);
>>>> + } else if
>>>> (MemberStatus.Suspended.equals(member.getStatus())) {
>>>> +// partitionContext.addFaultyMember(memberId);
>>>> + }
>>>> +
>>>> + partitionContext.addMemberStatsContext(new
>>>> MemberStatsContext(memberId));
>>>> + if(log.isInfoEnabled()){
>>>> + log.info(String.format("Member stat context
>>>> has been added: [member] %s", memberId));
>>>> + }
>>>> + }
>>>> +
>>>> + }
>>>> +
>>>> networkPartitionContext.addPartitionContext(partitionContext);
>>>> +
>>>> + // 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(Constants.LOAD_BALANCED_SERVICE_TYPE);
>>>> +
>>>> + if(props.containsKey(Constants.LOAD_BALANCER_REF)) {
>>>> + String value =
>>>> props.getProperty(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);
>>>> + }
>>>> + }
>>>> + }
>>>> + }
>>>> +
>>>> +
>>>> clusterMonitor.addNetworkPartitionCtxt(networkPartitionContext);
>>>> + }
>>>> +
>>>> + log.info("LB Cluster monitor created:
>>>> "+clusterMonitor.toString());
>>>> + return clusterMonitor;
>>>> + }
>>>> +
>>>> + private static DockerServiceClusterMonitor
>>>> getDockerServiceClusterMonitor(Cluster cluster) {
>>>> +
>>>> + if (null == cluster) {
>>>> + return null;
>>>> + }
>>>> +
>>>> + String autoscalePolicyName = cluster.getAutoscalePolicyName();
>>>> + if (log.isDebugEnabled()) {
>>>> + log.debug("Autoscaler policy name: " +
>>>> autoscalePolicyName);
>>>> + }
>>>> +
>>>> + AutoscalePolicy policy =
>>>> PolicyManager.getInstance().getAutoscalePolicy(autoscalePolicyName);
>>>> + java.util.Properties props = cluster.getProperties();
>>>> + String kubernetesHostClusterID =
>>>> props.getProperty(StratosConstants.KUBERNETES_CLUSTER_ID);
>>>> + KubernetesClusterContext kubernetesClusterCtxt = new
>>>> KubernetesClusterContext(kubernetesHostClusterID);
>>>> +
>>>> + DockerServiceClusterMonitor dockerClusterMonitor = new
>>>> DockerServiceClusterMonitor(
>>>> + kubernetesClusterCtxt,
>>>> + cluster.getClusterId(),
>>>> + cluster.getServiceName(),
>>>> + policy);
>>>> +
>>>> + dockerClusterMonitor.setStatus(ClusterStatus.Created);
>>>> +
>>>> + // find lb reference type
>>>> + if(props.containsKey(Constants.LOAD_BALANCER_REF)) {
>>>> + String value =
>>>> props.getProperty(Constants.LOAD_BALANCER_REF);
>>>> + dockerClusterMonitor.setLbReferenceType(value);
>>>> + if(log.isDebugEnabled()) {
>>>> + log.debug("Set the lb reference type: "+value);
>>>> + }
>>>> + }
>>>> +
>>>> +// // set hasPrimary property
>>>> +// // hasPrimary is true if there are primary members available
>>>> in that cluster
>>>> +//
>>>> dockerClusterMonitor.setHasPrimary(Boolean.parseBoolean(props.getProperty(Constants.IS_PRIMARY)));
>>>> +
>>>> + log.info("Docker cluster monitor created: "+
>>>> dockerClusterMonitor.toString());
>>>> + return dockerClusterMonitor;
>>>> + }
>>>> +}
>>>>
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ContainerClusterMonitor.java
>>>> ----------------------------------------------------------------------
>>>> diff --git
>>>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ContainerClusterMonitor.java
>>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ContainerClusterMonitor.java
>>>> new file mode 100644
>>>> index 0000000..f9b9047
>>>> --- /dev/null
>>>> +++
>>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ContainerClusterMonitor.java
>>>> @@ -0,0 +1,38 @@
>>>> +package org.apache.stratos.autoscaler.monitor;
>>>> +
>>>> +import org.apache.stratos.autoscaler.KubernetesClusterContext;
>>>> +import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
>>>> +import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
>>>> +import org.apache.stratos.common.enums.ClusterType;
>>>> +
>>>> +public abstract class ContainerClusterMonitor extends
>>>> AbstractClusterMonitor {
>>>> +
>>>> + private KubernetesClusterContext kubernetesClusterCtxt;
>>>> + protected AutoscalePolicy autoscalePolicy;
>>>> +
>>>> + protected ContainerClusterMonitor(String clusterId, String
>>>> serviceId, ClusterType clusterType,
>>>> + KubernetesClusterContext
>>>> kubernetesClusterContext,
>>>> + AutoscalerRuleEvaluator
>>>> autoscalerRuleEvaluator, AutoscalePolicy autoscalePolicy){
>>>> +
>>>> + super(clusterId, serviceId, clusterType,
>>>> autoscalerRuleEvaluator);
>>>> + this.kubernetesClusterCtxt = kubernetesClusterContext;
>>>> + this.autoscalePolicy = autoscalePolicy;
>>>> + }
>>>> +
>>>> + public KubernetesClusterContext getKubernetesClusterCtxt() {
>>>> + return kubernetesClusterCtxt;
>>>> + }
>>>> +
>>>> + public void setKubernetesClusterCtxt(
>>>> + KubernetesClusterContext kubernetesClusterCtxt)
>>>> {
>>>> + this.kubernetesClusterCtxt = kubernetesClusterCtxt;
>>>> + }
>>>> +
>>>> + public AutoscalePolicy getAutoscalePolicy() {
>>>> + return autoscalePolicy;
>>>> + }
>>>> +
>>>> + public void setAutoscalePolicy(AutoscalePolicy autoscalePolicy)
>>>> {
>>>> + this.autoscalePolicy = autoscalePolicy;
>>>> + }
>>>> +}
>>>>
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/DockerServiceClusterMonitor.java
>>>> ----------------------------------------------------------------------
>>>> diff --git
>>>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/DockerServiceClusterMonitor.java
>>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/DockerServiceClusterMonitor.java
>>>> new file mode 100644
>>>> index 0000000..ca39b6a
>>>> --- /dev/null
>>>> +++
>>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/DockerServiceClusterMonitor.java
>>>> @@ -0,0 +1,156 @@
>>>> +package org.apache.stratos.autoscaler.monitor;
>>>> +
>>>> +import java.util.Properties;
>>>> +
>>>> +import org.apache.commons.configuration.XMLConfiguration;
>>>> +import org.apache.commons.logging.Log;
>>>> +import org.apache.commons.logging.LogFactory;
>>>> +import org.apache.stratos.autoscaler.KubernetesClusterContext;
>>>> +import
>>>> org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
>>>> +import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
>>>> +import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
>>>> +import org.apache.stratos.autoscaler.util.AutoScalerConstants;
>>>> +import org.apache.stratos.autoscaler.util.ConfUtil;
>>>> +import org.apache.stratos.cloud.controller.stub.pojo.MemberContext;
>>>> +import org.apache.stratos.common.constants.StratosConstants;
>>>> +import org.apache.stratos.common.enums.ClusterType;
>>>> +import org.apache.stratos.messaging.domain.topology.ClusterStatus;
>>>> +import
>>>> org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
>>>> +
>>>> +public final class DockerServiceClusterMonitor extends
>>>> ContainerClusterMonitor{
>>>> +
>>>> + private static final Log log =
>>>> LogFactory.getLog(DockerServiceClusterMonitor.class);
>>>> +
>>>> + private String lbReferenceType;
>>>> + private int numberOfReplicasInServiceCluster = 0;
>>>> + int retryInterval = 60000;
>>>> +
>>>> + public DockerServiceClusterMonitor(KubernetesClusterContext
>>>> kubernetesClusterCtxt,
>>>> + String serviceClusterID, String serviceId,
>>>> AutoscalePolicy autoscalePolicy) {
>>>> + super(serviceClusterID, serviceId,
>>>> ClusterType.DockerServiceCluster, kubernetesClusterCtxt,
>>>> + new AutoscalerRuleEvaluator(), autoscalePolicy);
>>>> + readConfigurations();
>>>> + }
>>>> +
>>>> + @Override
>>>> + public void run() {
>>>> + try {
>>>> + // TODO make this configurable,
>>>> + // this is the delay the min check of normal
>>>> cluster monitor to wait
>>>> + // until LB monitor is added
>>>> + Thread.sleep(60000);
>>>> + } catch (InterruptedException ignore) {
>>>> + }
>>>> +
>>>> + while (!isDestroyed()) {
>>>> + if (log.isDebugEnabled()) {
>>>> + log.debug("Kubernetes cluster monitor
>>>> is running.. " + this.toString());
>>>> + }
>>>> + try {
>>>> + if
>>>> (!ClusterStatus.In_Maintenance.equals(getStatus())) {
>>>> + monitor();
>>>> + } else {
>>>> + if (log.isDebugEnabled()) {
>>>> + log.debug("Kubernetes
>>>> cluster monitor is suspended as the cluster is in "
>>>> + +
>>>> ClusterStatus.In_Maintenance + " mode......");
>>>> + }
>>>> + }
>>>> + } catch (Exception e) {
>>>> + log.error("Kubernetes cluster monitor:
>>>> Monitor failed." + this.toString(),
>>>> + e);
>>>> + }
>>>> + try {
>>>> + Thread.sleep(getMonitorInterval());
>>>> + } catch (InterruptedException ignore) {
>>>> + }
>>>> + }
>>>> + }
>>>> +
>>>> + @Override
>>>> + protected void monitor() {
>>>> +
>>>> + // is container created successfully?
>>>> + boolean success = false;
>>>> + String kubernetesClusterId =
>>>> getKubernetesClusterCtxt().getKubernetesClusterID();
>>>> +
>>>> + try {
>>>> + TopologyManager.acquireReadLock();
>>>> + Properties props =
>>>> TopologyManager.getTopology().getService(getServiceId()).getCluster(getClusterId()).getProperties();
>>>> + int minReplicas =
>>>> Integer.parseInt(props.getProperty(StratosConstants.KUBERNETES_MIN_REPLICAS));
>>>> +
>>>> + int nonTerminatedMembers =
>>>> getKubernetesClusterCtxt().getActiveMembers().size() +
>>>> getKubernetesClusterCtxt().getPendingMembers().size();
>>>> +
>>>> + if (nonTerminatedMembers == 0) {
>>>> +
>>>> + while (success) {
>>>> + try {
>>>> +
>>>> + MemberContext
>>>> memberContext =
>>>> CloudControllerClient.getInstance().createContainer(kubernetesClusterId,
>>>> getClusterId());
>>>> + if(null !=
>>>> memberContext) {
>>>> +
>>>> getKubernetesClusterCtxt().addPendingMember(memberContext);
>>>> + success = true;
>>>> +
>>>> numberOfReplicasInServiceCluster = minReplicas;
>>>> +
>>>> if(log.isDebugEnabled()){
>>>> +
>>>> log.debug(String.format("Pending member added, [member] %s [kub cluster]
>>>> %s",
>>>> +
>>>> memberContext.getMemberId(),
>>>> getKubernetesClusterCtxt().getKubernetesClusterID()));
>>>> + }
>>>> + } else {
>>>> + if
>>>> (log.isDebugEnabled()) {
>>>> +
>>>> log.debug("Returned member context is null, did not add to pending
>>>> members");
>>>> + }
>>>> + }
>>>> + } catch (Throwable e) {
>>>> + if
>>>> (log.isDebugEnabled()) {
>>>> + String message
>>>> = "Cannot create a container, will retry in "+(retryInterval/1000)+"s";
>>>> +
>>>> log.debug(message, e);
>>>> + }
>>>> + }
>>>> +
>>>> + try {
>>>> + Thread.sleep(retryInterval);
>>>> + } catch (InterruptedException e1) {
>>>> + }
>>>> + }
>>>> + }
>>>> + } finally {
>>>> + TopologyManager.releaseReadLock();
>>>> + }
>>>> + }
>>>> +
>>>> + @Override
>>>> + public void destroy() {
>>>> + getMinCheckKnowledgeSession().dispose();
>>>> + getScaleCheckKnowledgeSession().dispose();
>>>> + setDestroyed(true);
>>>> + if(log.isDebugEnabled()) {
>>>> + log.debug("DockerClusterMonitor Drools session has been
>>>> disposed. "+this.toString());
>>>> + }
>>>> + }
>>>> +
>>>> + @Override
>>>> + protected void readConfigurations () {
>>>> + // same as VM cluster monitor interval
>>>> + XMLConfiguration conf =
>>>> ConfUtil.getInstance(null).getConfiguration();
>>>> + int monitorInterval =
>>>> conf.getInt(AutoScalerConstants.AUTOSCALER_MONITOR_INTERVAL, 90000);
>>>> + setMonitorInterval(monitorInterval);
>>>> + if (log.isDebugEnabled()) {
>>>> + log.debug("Kubernetes Cluster Monitor task interval: " +
>>>> getMonitorInterval());
>>>> + }
>>>> + }
>>>> +
>>>> + @Override
>>>> + public String toString() {
>>>> + return "DockerClusterMonitor "
>>>> + + "[ kubernetesHostClusterId=" +
>>>> getKubernetesClusterCtxt().getKubernetesClusterID()
>>>> + + ", clusterId=" + getClusterId()
>>>> + + ", serviceId=" + getServiceId() + "]";
>>>> + }
>>>> +
>>>> + public String getLbReferenceType() {
>>>> + return lbReferenceType;
>>>> + }
>>>> +
>>>> + public void setLbReferenceType(String lbReferenceType) {
>>>> + this.lbReferenceType = lbReferenceType;
>>>> + }
>>>> +}
>>>> \ No newline at end of file
>>>>
>>>>
>>>
>>>
>>> --
>>> --
>>> Lahiru Sandaruwan
>>> Committer and PMC member, Apache Stratos,
>>> Senior Software Engineer,
>>> WSO2 Inc., http://wso2.com
>>> lean.enterprise.middleware
>>>
>>> email: lahirus@wso2.com cell: (+94) 773 325 954
>>> blog: http://lahiruwrites.blogspot.com/
>>> twitter: http://twitter.com/lahirus
>>> linked-in: http://lk.linkedin.com/pub/lahiru-sandaruwan/16/153/146
>>>
>>>
>>
>>
>> --
>> Rajkumar Rajaratnam
>> Software Engineer | WSO2, Inc.
>> Mobile +94777568639 | +94783498120
>>
>
>
>
> --
> --
> Lahiru Sandaruwan
> Committer and PMC member, Apache Stratos,
> Senior Software Engineer,
> WSO2 Inc., http://wso2.com
> lean.enterprise.middleware
>
> email: lahirus@wso2.com cell: (+94) 773 325 954
> blog: http://lahiruwrites.blogspot.com/
> twitter: http://twitter.com/lahirus
> linked-in: http://lk.linkedin.com/pub/lahiru-sandaruwan/16/153/146
>
>
--
Best Regards,
Nirmal
Nirmal Fernando.
PPMC Member & Committer of Apache Stratos,
Senior Software Engineer, WSO2 Inc.
Blog: http://nirmalfdo.blogspot.com/
Re: [2/4] cluster monitors hierarchy redesigned and docker cluster
monitor improved
Posted by Lahiru Sandaruwan <la...@wso2.com>.
Yes. But someone should be able to easily see the history at[1], like [2].
[1]
https://github.com/apache/stratos/commits/master/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/VMServiceClusterMonitor.java
[2]
https://github.com/apache/stratos/commits/master/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitor.java
On Wed, Oct 1, 2014 at 9:03 PM, Rajkumar Rajaratnam <ra...@wso2.com>
wrote:
> Hi,
>
> I guess we can see the history using blame.
>
>
> https://github.com/apache/stratos/blame/master/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/VMServiceClusterMonitor.java
>
> Thanks.
>
> On Wed, Oct 1, 2014 at 8:55 PM, Lahiru Sandaruwan <la...@wso2.com>
> wrote:
>
>> Hi guys,
>>
>> It seems we have lost all the Git history of Cluster Monitors with this
>> commit :(
>> We should have Git move in this kind of cases.
>>
>> Thanks.
>>
>> On Tue, Sep 23, 2014 at 2:49 PM, <ni...@apache.org> wrote:
>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
>>> ----------------------------------------------------------------------
>>> diff --git
>>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
>>> index b8dcd73..6525eba 100644
>>> ---
>>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
>>> +++
>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
>>> @@ -19,34 +19,54 @@
>>>
>>> package org.apache.stratos.autoscaler.message.receiver.topology;
>>>
>>> +import java.util.List;
>>> +
>>> import org.apache.commons.logging.Log;
>>> import org.apache.commons.logging.LogFactory;
>>> -import org.apache.stratos.autoscaler.*;
>>> +import org.apache.stratos.autoscaler.AutoscalerContext;
>>> +import org.apache.stratos.autoscaler.KubernetesClusterContext;
>>> +import org.apache.stratos.autoscaler.MemberStatsContext;
>>> +import org.apache.stratos.autoscaler.NetworkPartitionContext;
>>> +import org.apache.stratos.autoscaler.NetworkPartitionLbHolder;
>>> +import org.apache.stratos.autoscaler.PartitionContext;
>>> import
>>> org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
>>> import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
>>> import
>>> org.apache.stratos.autoscaler.exception.PartitionValidationException;
>>> import
>>> org.apache.stratos.autoscaler.exception.PolicyValidationException;
>>> import org.apache.stratos.autoscaler.exception.TerminationException;
>>> -import org.apache.stratos.autoscaler.monitor.AbstractMonitor;
>>> -import org.apache.stratos.autoscaler.monitor.ClusterMonitor;
>>> -import org.apache.stratos.autoscaler.monitor.KubernetesClusterMonitor;
>>> -import org.apache.stratos.autoscaler.monitor.LbClusterMonitor;
>>> +import org.apache.stratos.autoscaler.monitor.AbstractClusterMonitor;
>>> +import org.apache.stratos.autoscaler.monitor.ClusterMonitorFactory;
>>> +import org.apache.stratos.autoscaler.monitor.ContainerClusterMonitor;
>>> +import org.apache.stratos.autoscaler.monitor.VMClusterMonitor;
>>> import org.apache.stratos.autoscaler.partition.PartitionManager;
>>> import org.apache.stratos.autoscaler.policy.PolicyManager;
>>> import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
>>> -import org.apache.stratos.autoscaler.util.AutoscalerUtil;
>>> +import org.apache.stratos.common.enums.ClusterType;
>>> import org.apache.stratos.messaging.domain.topology.Cluster;
>>> import org.apache.stratos.messaging.domain.topology.Service;
>>> import org.apache.stratos.messaging.event.Event;
>>> -import org.apache.stratos.messaging.event.topology.*;
>>> -import org.apache.stratos.messaging.listener.topology.*;
>>> +import org.apache.stratos.messaging.event.topology.ClusterCreatedEvent;
>>> +import
>>> org.apache.stratos.messaging.event.topology.ClusterMaintenanceModeEvent;
>>> +import org.apache.stratos.messaging.event.topology.ClusterRemovedEvent;
>>> +import org.apache.stratos.messaging.event.topology.MemberActivatedEvent;
>>> +import
>>> org.apache.stratos.messaging.event.topology.MemberMaintenanceModeEvent;
>>> +import
>>> org.apache.stratos.messaging.event.topology.MemberReadyToShutdownEvent;
>>> +import
>>> org.apache.stratos.messaging.event.topology.MemberTerminatedEvent;
>>> +import
>>> org.apache.stratos.messaging.listener.topology.ClusterCreatedEventListener;
>>> +import
>>> org.apache.stratos.messaging.listener.topology.ClusterMaintenanceModeEventListener;
>>> +import
>>> org.apache.stratos.messaging.listener.topology.ClusterRemovedEventListener;
>>> +import
>>> org.apache.stratos.messaging.listener.topology.CompleteTopologyEventListener;
>>> +import
>>> org.apache.stratos.messaging.listener.topology.MemberActivatedEventListener;
>>> +import
>>> org.apache.stratos.messaging.listener.topology.MemberMaintenanceListener;
>>> +import
>>> org.apache.stratos.messaging.listener.topology.MemberReadyToShutdownEventListener;
>>> +import
>>> org.apache.stratos.messaging.listener.topology.MemberStartedEventListener;
>>> +import
>>> org.apache.stratos.messaging.listener.topology.MemberTerminatedEventListener;
>>> +import
>>> org.apache.stratos.messaging.listener.topology.ServiceRemovedEventListener;
>>> import
>>> org.apache.stratos.messaging.message.receiver.topology.TopologyEventReceiver;
>>> import
>>> org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
>>> import org.drools.runtime.StatefulKnowledgeSession;
>>> import org.drools.runtime.rule.FactHandle;
>>>
>>> -import java.util.List;
>>> -
>>> /**
>>> * Autoscaler topology receiver.
>>> */
>>> @@ -116,42 +136,60 @@ public class AutoscalerTopologyEventReceiver
>>> implements Runnable {
>>> try {
>>> MemberReadyToShutdownEvent
>>> memberReadyToShutdownEvent = (MemberReadyToShutdownEvent)event;
>>> AutoscalerContext asCtx =
>>> AutoscalerContext.getInstance();
>>> - AbstractMonitor monitor;
>>> + AbstractClusterMonitor monitor;
>>> String clusterId =
>>> memberReadyToShutdownEvent.getClusterId();
>>> String memberId =
>>> memberReadyToShutdownEvent.getMemberId();
>>>
>>> - if(asCtx.monitorExist(clusterId)){
>>> - monitor = asCtx.getMonitor(clusterId);
>>> - }else if(asCtx.lbMonitorExist(clusterId)){
>>> - monitor = asCtx.getLBMonitor(clusterId);
>>> - }else{
>>> + if(asCtx.clusterMonitorExist(clusterId)) {
>>> + monitor = asCtx.getClusterMonitor(clusterId);
>>> + } else {
>>> if(log.isDebugEnabled()){
>>> log.debug(String.format("A cluster monitor
>>> is not found in autoscaler context [cluster] %s", clusterId));
>>> }
>>> return;
>>> }
>>> -
>>> - NetworkPartitionContext nwPartitionCtxt;
>>> - nwPartitionCtxt =
>>> monitor.getNetworkPartitionCtxt(memberReadyToShutdownEvent.getNetworkPartitionId());
>>> -
>>> - // start a new member in the same Partition
>>> - String partitionId =
>>> monitor.getPartitionOfMember(memberId);
>>> - PartitionContext partitionCtxt =
>>> nwPartitionCtxt.getPartitionCtxt(partitionId);
>>> -
>>> -
>>> - // terminate the shutdown ready member
>>> - CloudControllerClient ccClient =
>>> CloudControllerClient.getInstance();
>>> - ccClient.terminate(memberId);
>>> -
>>> - // remove from active member list
>>> - partitionCtxt.removeActiveMemberById(memberId);
>>> -
>>> - if (log.isInfoEnabled()) {
>>> - log.info(String.format("Member is terminated
>>> and removed from the active members list: [member] %s [partition] %s
>>> [cluster] %s ",
>>> - memberId, partitionId,
>>> clusterId));
>>> +
>>> + TopologyManager.acquireReadLock();
>>> +
>>> + if(monitor.getClusterType() ==
>>> ClusterType.VMServiceCluster
>>> + || monitor.getClusterType() ==
>>> ClusterType.VMLbCluster) {
>>> +
>>> + NetworkPartitionContext nwPartitionCtxt;
>>> + nwPartitionCtxt = ((VMClusterMonitor)
>>> monitor).getNetworkPartitionCtxt(memberReadyToShutdownEvent.getNetworkPartitionId());
>>> +
>>> + // start a new member in the same Partition
>>> + String partitionId = ((VMClusterMonitor)
>>> monitor).getPartitionOfMember(memberId);
>>> + PartitionContext partitionCtxt =
>>> nwPartitionCtxt.getPartitionCtxt(partitionId);
>>> +
>>> +
>>> + // terminate the shutdown ready member
>>> + CloudControllerClient ccClient =
>>> CloudControllerClient.getInstance();
>>> + ccClient.terminate(memberId);
>>> +
>>> + // remove from active member list
>>> + partitionCtxt.removeActiveMemberById(memberId);
>>> +
>>> + if (log.isInfoEnabled()) {
>>> + log.info(String.format("Member is
>>> terminated and removed from the active members list: [member] %s
>>> [partition] %s [cluster] %s ",
>>> + memberId,
>>> partitionId, clusterId));
>>> + }
>>> + } else if(monitor.getClusterType() ==
>>> ClusterType.DockerServiceCluster) {
>>> + KubernetesClusterContext
>>> kubernetesClusterContext = ((ContainerClusterMonitor)
>>> monitor).getKubernetesClusterCtxt();
>>> + //terminate the shutdown ready container
>>> +
>>> CloudControllerClient.getInstance().terminateContainer(memberId);
>>> + //remove from active member list
>>> +
>>> kubernetesClusterContext.removeActiveMemberById(memberId);
>>> +
>>> + if (log.isInfoEnabled()) {
>>> + log.info(String.format("Member is
>>> terminated and removed from the active members list: [member] %s [kub
>>> cluster] %s [cluster] %s ",
>>> + memberId,
>>> kubernetesClusterContext.getKubernetesClusterID(), clusterId));
>>> + }
>>> }
>>> +
>>> } catch (TerminationException e) {
>>> log.error(e);
>>> + } finally {
>>> + TopologyManager.releaseReadLock();
>>> }
>>> }
>>>
>>> @@ -185,12 +223,8 @@ public class AutoscalerTopologyEventReceiver
>>> implements Runnable {
>>> TopologyManager.acquireReadLock();
>>> Service service =
>>> TopologyManager.getTopology().getService(e.getServiceName());
>>> Cluster cluster =
>>> service.getCluster(e.getClusterId());
>>> -
>>> if(AutoscalerContext.getInstance().kubernetesClusterMonitorExist(cluster.getClusterId()))
>>> {
>>> -
>>> AutoscalerContext.getInstance().getKubernetesClusterMonitor(e.getClusterId()).setStatus(e.getStatus());
>>> - } else
>>> if(AutoscalerContext.getInstance().monitorExist((cluster.getClusterId()))) {
>>> -
>>> AutoscalerContext.getInstance().getMonitor(e.getClusterId()).setStatus(e.getStatus());
>>> - } else if
>>> (AutoscalerContext.getInstance().lbMonitorExist((cluster.getClusterId()))) {
>>> -
>>> AutoscalerContext.getInstance().getLBMonitor(e.getClusterId()).setStatus(e.getStatus());
>>> +
>>> if(AutoscalerContext.getInstance().clusterMonitorExist(cluster.getClusterId()))
>>> {
>>> +
>>> AutoscalerContext.getInstance().getClusterMonitor(e.getClusterId()).setStatus(e.getStatus());
>>> } else {
>>> log.error("cluster monitor not exists for the
>>> cluster: " + cluster.toString());
>>> }
>>> @@ -213,8 +247,7 @@ public class AutoscalerTopologyEventReceiver
>>> implements Runnable {
>>> String clusterId = e.getClusterId();
>>> String deploymentPolicy = e.getDeploymentPolicy();
>>>
>>> - AbstractMonitor monitor = null;
>>> - KubernetesClusterMonitor kubernetesClusterMonitor =
>>> null;
>>> + AbstractClusterMonitor monitor = null;
>>>
>>> if (e.isLbCluster()) {
>>> DeploymentPolicy depPolicy =
>>> PolicyManager.getInstance().getDeploymentPolicy(deploymentPolicy);
>>> @@ -239,13 +272,9 @@ public class AutoscalerTopologyEventReceiver
>>> implements Runnable {
>>>
>>> }
>>> }
>>> - monitor = AutoscalerContext.getInstance()
>>> - .removeLbMonitor(clusterId);
>>> -
>>> - } else {
>>> - monitor = AutoscalerContext.getInstance()
>>> - .removeMonitor(clusterId);
>>> }
>>> +
>>> + monitor =
>>> AutoscalerContext.getInstance().removeClusterMonitor(clusterId);
>>>
>>> // runTerminateAllRule(monitor);
>>> if (monitor != null) {
>>> @@ -280,43 +309,73 @@ public class AutoscalerTopologyEventReceiver
>>> implements Runnable {
>>> String networkPartitionId =
>>> e.getNetworkPartitionId();
>>> String clusterId = e.getClusterId();
>>> String partitionId = e.getPartitionId();
>>> - AbstractMonitor monitor;
>>> + String memberId = e.getMemberId();
>>> + AbstractClusterMonitor monitor;
>>> +
>>> + AutoscalerContext asCtx =
>>> AutoscalerContext.getInstance();
>>>
>>> - if
>>> (AutoscalerContext.getInstance().monitorExist(clusterId)) {
>>> - monitor =
>>> AutoscalerContext.getInstance().getMonitor(clusterId);
>>> + if(asCtx.clusterMonitorExist(clusterId)) {
>>> + monitor = asCtx.getClusterMonitor(clusterId);
>>> } else {
>>> - //This is LB member
>>> - monitor =
>>> AutoscalerContext.getInstance().getLBMonitor(clusterId);
>>> + if(log.isDebugEnabled()){
>>> + log.debug(String.format("A cluster monitor
>>> is not found in autoscaler context [cluster] %s", clusterId));
>>> + }
>>> + return;
>>> }
>>> +
>>> + if(monitor.getClusterType() ==
>>> ClusterType.VMServiceCluster
>>> + || monitor.getClusterType() ==
>>> ClusterType.VMLbCluster) {
>>> +
>>> + NetworkPartitionContext networkPartitionContext
>>> = ((VMClusterMonitor) monitor).getNetworkPartitionCtxt(networkPartitionId);
>>> +
>>> + PartitionContext partitionContext =
>>> networkPartitionContext.getPartitionCtxt(partitionId);
>>> +
>>> partitionContext.removeMemberStatsContext(memberId);
>>> +
>>> + if
>>> (partitionContext.removeTerminationPendingMember(memberId)) {
>>> + if (log.isDebugEnabled()) {
>>> + log.debug(String.format("Member is
>>> removed from termination pending members list: [member] %s", memberId));
>>> + }
>>> + } else if
>>> (partitionContext.removePendingMember(memberId)) {
>>> + if (log.isDebugEnabled()) {
>>> + log.debug(String.format("Member is
>>> removed from pending members list: [member] %s", memberId));
>>> + }
>>> + } else if
>>> (partitionContext.removeActiveMemberById(memberId)) {
>>> + log.warn(String.format("Member is in the
>>> wrong list and it is removed from active members list", memberId));
>>> + } else if
>>> (partitionContext.removeObsoleteMember(memberId)){
>>> + log.warn(String.format("Member's
>>> obsolated timeout has been expired and it is removed from obsolated members
>>> list", memberId));
>>> + } else {
>>> + log.warn(String.format("Member is not
>>> available in any of the list active, pending and termination pending",
>>> memberId));
>>> + }
>>>
>>> - NetworkPartitionContext networkPartitionContext =
>>> monitor.getNetworkPartitionCtxt(networkPartitionId);
>>> -
>>> - PartitionContext partitionContext =
>>> networkPartitionContext.getPartitionCtxt(partitionId);
>>> - String memberId = e.getMemberId();
>>> - partitionContext.removeMemberStatsContext(memberId);
>>> -
>>> - if
>>> (partitionContext.removeTerminationPendingMember(memberId)) {
>>> - if (log.isDebugEnabled()) {
>>> - log.debug(String.format("Member is removed
>>> from termination pending members list: [member] %s", memberId));
>>> + if (log.isInfoEnabled()) {
>>> + log.info(String.format("Member stat
>>> context has been removed successfully: [member] %s", memberId));
>>> }
>>> - } else if
>>> (partitionContext.removePendingMember(memberId)) {
>>> - if (log.isDebugEnabled()) {
>>> - log.debug(String.format("Member is removed
>>> from pending members list: [member] %s", memberId));
>>> + } else if(monitor.getClusterType() ==
>>> ClusterType.DockerServiceCluster) {
>>> +
>>> + KubernetesClusterContext
>>> kubernetesClusterContext = ((ContainerClusterMonitor)
>>> monitor).getKubernetesClusterCtxt();
>>> +
>>> kubernetesClusterContext.removeMemberStatsContext(memberId);
>>> +
>>> + if
>>> (kubernetesClusterContext.removeTerminationPendingMember(memberId)) {
>>> + if (log.isDebugEnabled()) {
>>> + log.debug(String.format("Member is
>>> removed from termination pending members list: [member] %s", memberId));
>>> + }
>>> + } else if
>>> (kubernetesClusterContext.removePendingMember(memberId)) {
>>> + if (log.isDebugEnabled()) {
>>> + log.debug(String.format("Member is
>>> removed from pending members list: [member] %s", memberId));
>>> + }
>>> + } else if
>>> (kubernetesClusterContext.removeActiveMemberById(memberId)) {
>>> + log.warn(String.format("Member is in the
>>> wrong list and it is removed from active members list", memberId));
>>> + } else if
>>> (kubernetesClusterContext.removeObsoleteMember(memberId)){
>>> + log.warn(String.format("Member's
>>> obsolated timeout has been expired and it is removed from obsolated members
>>> list", memberId));
>>> + } else {
>>> + log.warn(String.format("Member is not
>>> available in any of the list active, pending and termination pending",
>>> memberId));
>>> }
>>> - } else if
>>> (partitionContext.removeActiveMemberById(memberId)) {
>>> - log.warn(String.format("Member is in the wrong
>>> list and it is removed from active members list", memberId));
>>> - } else if
>>> (partitionContext.removeObsoleteMember(memberId)){
>>> - log.warn(String.format("Member's obsolated
>>> timeout has been expired and it is removed from obsolated members list",
>>> memberId));
>>> - } else {
>>> - log.warn(String.format("Member is not available
>>> in any of the list active, pending and termination pending", memberId));
>>> - }
>>>
>>> - if (log.isInfoEnabled()) {
>>> - log.info(String.format("Member stat context
>>> has been removed successfully: [member] %s", memberId));
>>> + if (log.isInfoEnabled()) {
>>> + log.info(String.format("Member stat
>>> context has been removed successfully: [member] %s", memberId));
>>> + }
>>> }
>>> -// partitionContext.decrementCurrentActiveMemberCount(1);
>>> -
>>> -
>>> +
>>> } catch (Exception e) {
>>> log.error("Error processing event", e);
>>> } finally {
>>> @@ -338,24 +397,37 @@ public class AutoscalerTopologyEventReceiver
>>> implements Runnable {
>>> String partitionId = e.getPartitionId();
>>> String networkPartitionId =
>>> e.getNetworkPartitionId();
>>>
>>> - PartitionContext partitionContext;
>>> String clusterId = e.getClusterId();
>>> - AbstractMonitor monitor;
>>> -
>>> - if
>>> (AutoscalerContext.getInstance().monitorExist(clusterId)) {
>>> - monitor =
>>> AutoscalerContext.getInstance().getMonitor(clusterId);
>>> - partitionContext =
>>> monitor.getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
>>> + AbstractClusterMonitor monitor;
>>> +
>>> + AutoscalerContext asCtx =
>>> AutoscalerContext.getInstance();
>>> + if(asCtx.clusterMonitorExist(clusterId)) {
>>> + monitor = asCtx.getClusterMonitor(clusterId);
>>> } else {
>>> - monitor =
>>> AutoscalerContext.getInstance().getLBMonitor(clusterId);
>>> - partitionContext =
>>> monitor.getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
>>> - }
>>> - partitionContext.addMemberStatsContext(new
>>> MemberStatsContext(memberId));
>>> - if (log.isInfoEnabled()) {
>>> - log.info(String.format("Member stat context
>>> has been added successfully: [member] %s", memberId));
>>> + if(log.isDebugEnabled()){
>>> + log.debug(String.format("A cluster monitor
>>> is not found in autoscaler context [cluster] %s", clusterId));
>>> + }
>>> + return;
>>> }
>>> -// partitionContext.incrementCurrentActiveMemberCount(1);
>>> -
>>> partitionContext.movePendingMemberToActiveMembers(memberId);
>>> -
>>> +
>>> + if (monitor.getClusterType() ==
>>> ClusterType.VMServiceCluster) {
>>> + PartitionContext partitionContext;
>>> + partitionContext = ((VMClusterMonitor)
>>> monitor).getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
>>> + partitionContext.addMemberStatsContext(new
>>> MemberStatsContext(memberId));
>>> + if (log.isInfoEnabled()) {
>>> + log.info(String.format("Member stat
>>> context has been added successfully: [member] %s", memberId));
>>> + }
>>> +
>>> partitionContext.movePendingMemberToActiveMembers(memberId);
>>> + } else
>>> if(monitor.getClusterType() == ClusterType.DockerServiceCluster) {
>>> + KubernetesClusterContext
>>> kubernetesClusterContext;
>>> + kubernetesClusterContext
>>> = ((ContainerClusterMonitor) monitor).getKubernetesClusterCtxt();
>>> +
>>> kubernetesClusterContext.addMemberStatsContext(new
>>> MemberStatsContext(memberId));
>>> + if (log.isInfoEnabled()) {
>>> + log.info(String.format("Member stat
>>> context has been added successfully: [member] %s", memberId));
>>> + }
>>> +
>>> kubernetesClusterContext.movePendingMemberToActiveMembers(memberId);
>>> + }
>>> +
>>> } catch (Exception e) {
>>> log.error("Error processing event", e);
>>> } finally {
>>> @@ -368,42 +440,59 @@ public class AutoscalerTopologyEventReceiver
>>> implements Runnable {
>>> @Override
>>> protected void onEvent(Event event) {
>>> try {
>>> + TopologyManager.acquireReadLock();
>>> +
>>> MemberReadyToShutdownEvent
>>> memberReadyToShutdownEvent = (MemberReadyToShutdownEvent)event;
>>> AutoscalerContext asCtx =
>>> AutoscalerContext.getInstance();
>>> - AbstractMonitor monitor;
>>> + AbstractClusterMonitor monitor;
>>> String clusterId =
>>> memberReadyToShutdownEvent.getClusterId();
>>> String memberId =
>>> memberReadyToShutdownEvent.getMemberId();
>>>
>>> - if(asCtx.monitorExist(clusterId)){
>>> - monitor = asCtx.getMonitor(clusterId);
>>> - }else if(asCtx.lbMonitorExist(clusterId)){
>>> - monitor = asCtx.getLBMonitor(clusterId);
>>> - }else{
>>> + if(asCtx.clusterMonitorExist(clusterId)) {
>>> + monitor = asCtx.getClusterMonitor(clusterId);
>>> + } else {
>>> if(log.isDebugEnabled()){
>>> log.debug(String.format("A cluster monitor
>>> is not found in autoscaler context [cluster] %s", clusterId));
>>> }
>>> return;
>>> }
>>>
>>> - NetworkPartitionContext nwPartitionCtxt;
>>> - nwPartitionCtxt =
>>> monitor.getNetworkPartitionCtxt(memberReadyToShutdownEvent.getNetworkPartitionId());
>>> + if(monitor.getClusterType() ==
>>> ClusterType.VMServiceCluster
>>> + || monitor.getClusterType() ==
>>> ClusterType.VMLbCluster) {
>>> +
>>> + NetworkPartitionContext nwPartitionCtxt;
>>> + nwPartitionCtxt = ((VMClusterMonitor)
>>> monitor).getNetworkPartitionCtxt(memberReadyToShutdownEvent.getNetworkPartitionId());
>>>
>>> - // start a new member in the same Partition
>>> - String partitionId =
>>> monitor.getPartitionOfMember(memberId);
>>> - PartitionContext partitionCtxt =
>>> nwPartitionCtxt.getPartitionCtxt(partitionId);
>>> + // start a new member in the same Partition
>>> + String partitionId = ((VMClusterMonitor)
>>> monitor).getPartitionOfMember(memberId);
>>> + PartitionContext partitionCtxt =
>>> nwPartitionCtxt.getPartitionCtxt(partitionId);
>>>
>>>
>>> - // terminate the shutdown ready member
>>> - CloudControllerClient ccClient =
>>> CloudControllerClient.getInstance();
>>> - ccClient.terminate(memberId);
>>> + // terminate the shutdown ready member
>>> + CloudControllerClient ccClient =
>>> CloudControllerClient.getInstance();
>>> + ccClient.terminate(memberId);
>>>
>>> - // remove from active member list
>>> - partitionCtxt.removeActiveMemberById(memberId);
>>> + // remove from active member list
>>> + partitionCtxt.removeActiveMemberById(memberId);
>>>
>>> - if (log.isInfoEnabled()) {
>>> - log.info(String.format("Member is terminated
>>> and removed from the active members list: [member] %s [partition] %s
>>> [cluster] %s ",
>>> - memberId, partitionId,
>>> clusterId));
>>> + if (log.isInfoEnabled()) {
>>> + log.info(String.format("Member is
>>> terminated and removed from the active members list: [member] %s
>>> [partition] %s [cluster] %s ",
>>> + memberId,
>>> partitionId, clusterId));
>>> + }
>>> + } else if(monitor.getClusterType() ==
>>> ClusterType.DockerServiceCluster) {
>>> + KubernetesClusterContext
>>> kubernetesClusterContext;
>>> + kubernetesClusterContext =
>>> ((ContainerClusterMonitor) monitor).getKubernetesClusterCtxt();
>>> + // terminate the shutdown ready member
>>> +
>>> CloudControllerClient.getInstance().terminateContainer(memberId);
>>> + // remove from active member list
>>> +
>>> kubernetesClusterContext.removeActiveMemberById(memberId);
>>> +
>>> + if (log.isInfoEnabled()) {
>>> + log.info(String.format("Member is
>>> terminated and removed from the active members list: [member] %s [kub
>>> cluster] %s [cluster] %s ",
>>> + memberId,
>>> kubernetesClusterContext.getKubernetesClusterID(), clusterId));
>>> + }
>>> }
>>> +
>>> } catch (TerminationException e) {
>>> log.error(e);
>>> }
>>> @@ -424,22 +513,38 @@ public class AutoscalerTopologyEventReceiver
>>> implements Runnable {
>>> String partitionId = e.getPartitionId();
>>> String networkPartitionId =
>>> e.getNetworkPartitionId();
>>>
>>> - PartitionContext partitionContext;
>>> String clusterId = e.getClusterId();
>>> - AbstractMonitor monitor;
>>> -
>>> - if
>>> (AutoscalerContext.getInstance().monitorExist(clusterId)) {
>>> - monitor =
>>> AutoscalerContext.getInstance().getMonitor(clusterId);
>>> - partitionContext =
>>> monitor.getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
>>> + AbstractClusterMonitor monitor;
>>> +
>>> + AutoscalerContext asCtx =
>>> AutoscalerContext.getInstance();
>>> + if (asCtx.clusterMonitorExist(clusterId)) {
>>> + monitor =
>>> AutoscalerContext.getInstance().getClusterMonitor(clusterId);
>>> } else {
>>> - monitor =
>>> AutoscalerContext.getInstance().getLBMonitor(clusterId);
>>> - partitionContext =
>>> monitor.getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
>>> + if(log.isDebugEnabled()){
>>> + log.debug(String.format("A cluster monitor
>>> is not found in autoscaler context [cluster] %s", clusterId));
>>> + }
>>> + return;
>>> }
>>> - partitionContext.addMemberStatsContext(new
>>> MemberStatsContext(memberId));
>>> - if (log.isDebugEnabled()) {
>>> - log.debug(String.format("Member has been moved
>>> as pending termination: [member] %s", memberId));
>>> +
>>> + if(monitor.getClusterType() ==
>>> ClusterType.VMServiceCluster
>>> + || monitor.getClusterType() ==
>>> ClusterType.VMLbCluster) {
>>> +
>>> + PartitionContext partitionContext;
>>> + partitionContext = ((VMClusterMonitor)
>>> monitor).getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
>>> + partitionContext.addMemberStatsContext(new
>>> MemberStatsContext(memberId));
>>> + if (log.isDebugEnabled()) {
>>> + log.debug(String.format("Member has been
>>> moved as pending termination: [member] %s", memberId));
>>> + }
>>> +
>>> partitionContext.moveActiveMemberToTerminationPendingMembers(memberId);
>>> + } else if(monitor.getClusterType() ==
>>> ClusterType.DockerServiceCluster) {
>>> + KubernetesClusterContext
>>> kubernetesClusterContext;
>>> + kubernetesClusterContext =
>>> ((ContainerClusterMonitor) monitor).getKubernetesClusterCtxt();
>>> +
>>> kubernetesClusterContext.addMemberStatsContext(new
>>> MemberStatsContext(memberId));
>>> + if (log.isDebugEnabled()) {
>>> + log.debug(String.format("Member has been
>>> moved as pending termination: [member] %s", memberId));
>>> + }
>>> +
>>> kubernetesClusterContext.moveActiveMemberToTerminationPendingMembers(memberId);
>>> }
>>> -
>>> partitionContext.moveActiveMemberToTerminationPendingMembers(memberId);
>>>
>>> } catch (Exception e) {
>>> log.error("Error processing event", e);
>>> @@ -471,64 +576,15 @@ public class AutoscalerTopologyEventReceiver
>>> implements Runnable {
>>> });
>>> }
>>>
>>> - private class LBClusterMonitorAdder implements Runnable {
>>> - private Cluster cluster;
>>> -
>>> - public LBClusterMonitorAdder(Cluster cluster) {
>>> - this.cluster = cluster;
>>> - }
>>> -
>>> - public void run() {
>>> - LbClusterMonitor monitor = null;
>>> - int retries = 5;
>>> - boolean success = false;
>>> - do {
>>> - try {
>>> - Thread.sleep(5000);
>>> - } catch (InterruptedException e1) {
>>> - }
>>> - try {
>>> - monitor =
>>> AutoscalerUtil.getLBClusterMonitor(cluster);
>>> - success = true;
>>> -
>>> - } catch (PolicyValidationException e) {
>>> - String msg = "LB Cluster monitor creation failed
>>> for cluster: " + cluster.getClusterId();
>>> - log.debug(msg, e);
>>> - retries--;
>>> -
>>> - } catch (PartitionValidationException e) {
>>> - String msg = "LB Cluster monitor creation failed
>>> for cluster: " + cluster.getClusterId();
>>> - log.debug(msg, e);
>>> - retries--;
>>> - }
>>> - } while (!success && retries <= 0);
>>> -
>>> - if (monitor == null) {
>>> - String msg = "LB Cluster monitor creation failed, even
>>> after retrying for 5 times, "
>>> - + "for cluster: " + cluster.getClusterId();
>>> - log.error(msg);
>>> - throw new RuntimeException(msg);
>>> - }
>>> -
>>> - Thread th = new Thread(monitor);
>>> - th.start();
>>> - AutoscalerContext.getInstance().addLbMonitor(monitor);
>>> - if (log.isInfoEnabled()) {
>>> - log.info(String.format("LB Cluster monitor has been
>>> added successfully: [cluster] %s",
>>> - cluster.getClusterId()));
>>> - }
>>> - }
>>> - }
>>> -
>>> private class ClusterMonitorAdder implements Runnable {
>>> private Cluster cluster;
>>> -
>>> + private String clusterMonitorType;
>>> public ClusterMonitorAdder(Cluster cluster) {
>>> this.cluster = cluster;
>>> }
>>>
>>> public void run() {
>>> - ClusterMonitor monitor = null;
>>> + AbstractClusterMonitor monitor = null;
>>> int retries = 5;
>>> boolean success = false;
>>> do {
>>> @@ -538,68 +594,23 @@ public class AutoscalerTopologyEventReceiver
>>> implements Runnable {
>>> }
>>>
>>> try {
>>> - monitor = AutoscalerUtil.getClusterMonitor(cluster);
>>> + monitor = ClusterMonitorFactory.getMonitor(cluster);
>>> success = true;
>>> -
>>> + clusterMonitorType =
>>> monitor.getClusterType().name();
>>> } catch (PolicyValidationException e) {
>>> - String msg = "Cluster monitor creation failed for
>>> cluster: " + cluster.getClusterId();
>>> + String msg = clusterMonitorType +" monitor creation
>>> failed for cluster: " + cluster.getClusterId();
>>> log.debug(msg, e);
>>> retries--;
>>>
>>> } catch (PartitionValidationException e) {
>>> - String msg = "Cluster monitor creation failed for
>>> cluster: " + cluster.getClusterId();
>>> - log.debug(msg, e);
>>> - retries--;
>>> - }
>>> - } while (!success && retries != 0);
>>> -
>>> - if (monitor == null) {
>>> - String msg = "Cluster monitor creation failed, even
>>> after retrying for 5 times, "
>>> - + "for cluster: " + cluster.getClusterId();
>>> - log.error(msg);
>>> - throw new RuntimeException(msg);
>>> - }
>>> -
>>> - Thread th = new Thread(monitor);
>>> - th.start();
>>> - AutoscalerContext.getInstance().addMonitor(monitor);
>>> - if (log.isInfoEnabled()) {
>>> - log.info(String.format("Cluster monitor has been added
>>> successfully: [cluster] %s",
>>> - cluster.getClusterId()));
>>> - }
>>> - }
>>> - }
>>> -
>>> - private class KubernetesClusterMonitorAdder implements Runnable {
>>> - private Cluster cluster;
>>> -
>>> - public KubernetesClusterMonitorAdder(Cluster cluster) {
>>> - this.cluster = cluster;
>>> - }
>>> -
>>> - public void run() {
>>> - KubernetesClusterMonitor monitor = null;
>>> - int retries = 5;
>>> - boolean success = false;
>>> - do {
>>> - try {
>>> - Thread.sleep(5000);
>>> - } catch (InterruptedException e1) {
>>> - }
>>> -
>>> - try {
>>> - monitor =
>>> AutoscalerUtil.getKubernetesClusterMonitor(cluster);
>>> - success = true;
>>> -
>>> - } catch (Exception e) {
>>> - String msg = "Kubernetes cluster monitor creation
>>> failed for cluster: " + cluster.getClusterId();
>>> + String msg = clusterMonitorType +" monitor creation
>>> failed for cluster: " + cluster.getClusterId();
>>> log.debug(msg, e);
>>> retries--;
>>> }
>>> } while (!success && retries != 0);
>>>
>>> if (monitor == null) {
>>> - String msg = "Kubernetes cluster monitor creation
>>> failed, even after retrying for 5 times, "
>>> + String msg = clusterMonitorType +" monitor creation
>>> failed, even after retrying for 5 times, "
>>> + "for cluster: " + cluster.getClusterId();
>>> log.error(msg);
>>> throw new RuntimeException(msg);
>>> @@ -607,16 +618,16 @@ public class AutoscalerTopologyEventReceiver
>>> implements Runnable {
>>>
>>> Thread th = new Thread(monitor);
>>> th.start();
>>> -
>>> AutoscalerContext.getInstance().addKubernetesClusterMonitor(monitor);
>>> + AutoscalerContext.getInstance().addClusterMonitor(monitor);
>>> if (log.isInfoEnabled()) {
>>> - log.info(String.format("Kubernetes cluster monitor has
>>> been added successfully: [cluster] %s",
>>> - cluster.getClusterId()));
>>> + log.info(String.format("%s monitor has been added
>>> successfully: [cluster] %s",
>>> + clusterMonitorType, cluster.getClusterId()));
>>> }
>>> }
>>> }
>>> -
>>> +
>>> @SuppressWarnings("unused")
>>> - private void runTerminateAllRule(AbstractMonitor monitor) {
>>> + private void runTerminateAllRule(VMClusterMonitor monitor) {
>>>
>>> FactHandle terminateAllFactHandle = null;
>>>
>>> @@ -639,16 +650,9 @@ public class AutoscalerTopologyEventReceiver
>>> implements Runnable {
>>>
>>> protected synchronized void startClusterMonitor(Cluster cluster) {
>>> Thread th = null;
>>> - if (cluster.isKubernetesCluster()
>>> - &&
>>> !AutoscalerContext.getInstance().kubernetesClusterMonitorExist(cluster.getClusterId()))
>>> {
>>> - th = new Thread(new
>>> KubernetesClusterMonitorAdder(cluster));
>>> - } else if (cluster.isLbCluster()
>>> - &&
>>> !AutoscalerContext.getInstance().lbMonitorExist(cluster.getClusterId())) {
>>> - th = new Thread(new LBClusterMonitorAdder(cluster));
>>> - } else if (!cluster.isLbCluster() &&
>>> !cluster.isKubernetesCluster()
>>> - &&
>>> !AutoscalerContext.getInstance().monitorExist(cluster.getClusterId())) {
>>> - th = new Thread(new ClusterMonitorAdder(cluster));
>>> - }
>>> + if
>>> (!AutoscalerContext.getInstance().clusterMonitorExist(cluster.getClusterId()))
>>> {
>>> + th = new Thread(new ClusterMonitorAdder(cluster));
>>> + }
>>> if (th != null) {
>>> th.start();
>>> try {
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
>>> ----------------------------------------------------------------------
>>> diff --git
>>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
>>> new file mode 100644
>>> index 0000000..00796f1
>>> --- /dev/null
>>> +++
>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
>>> @@ -0,0 +1,127 @@
>>> +package org.apache.stratos.autoscaler.monitor;
>>> +
>>> +import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
>>> +import org.apache.stratos.common.enums.ClusterType;
>>> +import org.apache.stratos.messaging.domain.topology.ClusterStatus;
>>> +import org.drools.runtime.StatefulKnowledgeSession;
>>> +import org.drools.runtime.rule.FactHandle;
>>> +
>>> +public abstract class AbstractClusterMonitor implements Runnable{
>>> +
>>> + private String clusterId;
>>> + private String serviceId;
>>> + private ClusterType clusterType;
>>> + private ClusterStatus status;
>>> + private int monitorInterval;
>>> +
>>> + protected FactHandle minCheckFactHandle;
>>> + protected FactHandle scaleCheckFactHandle;
>>> + private StatefulKnowledgeSession minCheckKnowledgeSession;
>>> + private StatefulKnowledgeSession scaleCheckKnowledgeSession;
>>> + private boolean isDestroyed;
>>> +
>>> + private AutoscalerRuleEvaluator autoscalerRuleEvaluator;
>>> +
>>> + protected AbstractClusterMonitor(String clusterId, String
>>> serviceId, ClusterType clusterType,
>>> + AutoscalerRuleEvaluator autoscalerRuleEvaluator)
>>> {
>>> +
>>> + super();
>>> + this.clusterId = clusterId;
>>> + this.serviceId = serviceId;
>>> + this.clusterType = clusterType;
>>> + this.autoscalerRuleEvaluator = autoscalerRuleEvaluator;
>>> + this.scaleCheckKnowledgeSession =
>>> autoscalerRuleEvaluator.getScaleCheckStatefulSession();
>>> + this.minCheckKnowledgeSession =
>>> autoscalerRuleEvaluator.getMinCheckStatefulSession();
>>> + }
>>> +
>>> + protected abstract void readConfigurations();
>>> + protected abstract void monitor();
>>> + public abstract void destroy();
>>> +
>>> + public String getClusterId() {
>>> + return clusterId;
>>> + }
>>> +
>>> + public void setClusterId(String clusterId) {
>>> + this.clusterId = clusterId;
>>> + }
>>> +
>>> + public void setStatus(ClusterStatus status) {
>>> + this.status = status;
>>> + }
>>> +
>>> + public ClusterType getClusterType() {
>>> + return clusterType;
>>> + }
>>> +
>>> + public ClusterStatus getStatus() {
>>> + return status;
>>> + }
>>> +
>>> + public String getServiceId() {
>>> + return serviceId;
>>> + }
>>> +
>>> + public void setServiceId(String serviceId) {
>>> + this.serviceId = serviceId;
>>> + }
>>> +
>>> + public int getMonitorInterval() {
>>> + return monitorInterval;
>>> + }
>>> +
>>> + public void setMonitorInterval(int monitorInterval) {
>>> + this.monitorInterval = monitorInterval;
>>> + }
>>> +
>>> + public FactHandle getMinCheckFactHandle() {
>>> + return minCheckFactHandle;
>>> + }
>>> +
>>> + public void setMinCheckFactHandle(FactHandle minCheckFactHandle)
>>> {
>>> + this.minCheckFactHandle = minCheckFactHandle;
>>> + }
>>> +
>>> + public FactHandle getScaleCheckFactHandle() {
>>> + return scaleCheckFactHandle;
>>> + }
>>> +
>>> + public void setScaleCheckFactHandle(FactHandle
>>> scaleCheckFactHandle) {
>>> + this.scaleCheckFactHandle = scaleCheckFactHandle;
>>> + }
>>> +
>>> + public StatefulKnowledgeSession getMinCheckKnowledgeSession() {
>>> + return minCheckKnowledgeSession;
>>> + }
>>> +
>>> + public void setMinCheckKnowledgeSession(
>>> + StatefulKnowledgeSession
>>> minCheckKnowledgeSession) {
>>> + this.minCheckKnowledgeSession = minCheckKnowledgeSession;
>>> + }
>>> +
>>> + public StatefulKnowledgeSession getScaleCheckKnowledgeSession() {
>>> + return scaleCheckKnowledgeSession;
>>> + }
>>> +
>>> + public void setScaleCheckKnowledgeSession(
>>> + StatefulKnowledgeSession
>>> scaleCheckKnowledgeSession) {
>>> + this.scaleCheckKnowledgeSession =
>>> scaleCheckKnowledgeSession;
>>> + }
>>> +
>>> + public boolean isDestroyed() {
>>> + return isDestroyed;
>>> + }
>>> +
>>> + public void setDestroyed(boolean isDestroyed) {
>>> + this.isDestroyed = isDestroyed;
>>> + }
>>> +
>>> + public AutoscalerRuleEvaluator getAutoscalerRuleEvaluator() {
>>> + return autoscalerRuleEvaluator;
>>> + }
>>> +
>>> + public void setAutoscalerRuleEvaluator(
>>> + AutoscalerRuleEvaluator autoscalerRuleEvaluator)
>>> {
>>> + this.autoscalerRuleEvaluator = autoscalerRuleEvaluator;
>>> + }
>>> +}
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractMonitor.java
>>> ----------------------------------------------------------------------
>>> diff --git
>>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractMonitor.java
>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractMonitor.java
>>> deleted file mode 100644
>>> index c1441bb..0000000
>>> ---
>>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractMonitor.java
>>> +++ /dev/null
>>> @@ -1,203 +0,0 @@
>>> -/*
>>> - * Licensed to the Apache Software Foundation (ASF) under one
>>> - * or more contributor license agreements. See the NOTICE file
>>> - * distributed with this work for additional information
>>> - * regarding copyright ownership. The ASF licenses this file
>>> - * to you under the Apache License, Version 2.0 (the
>>> - * "License"); you may not use this file except in compliance
>>> - * with the License. You may obtain a copy of the License at
>>> - *
>>> - * http://www.apache.org/licenses/LICENSE-2.0
>>> - *
>>> - * Unless required by applicable law or agreed to in writing,
>>> - * software distributed under the License is distributed on an
>>> - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>> - * KIND, either express or implied. See the License for the
>>> - * specific language governing permissions and limitations
>>> - * under the License.
>>> - */
>>> -package org.apache.stratos.autoscaler.monitor;
>>> -
>>> -import java.util.Map;
>>> -
>>> -import org.apache.commons.configuration.XMLConfiguration;
>>> -import org.apache.commons.logging.Log;
>>> -import org.apache.commons.logging.LogFactory;
>>> -import org.apache.stratos.autoscaler.NetworkPartitionContext;
>>> -import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
>>> -import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
>>> -import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
>>> -import org.apache.stratos.autoscaler.util.AutoScalerConstants;
>>> -import org.apache.stratos.autoscaler.util.ConfUtil;
>>> -import org.apache.stratos.messaging.domain.topology.Cluster;
>>> -import org.apache.stratos.messaging.domain.topology.Member;
>>> -import org.apache.stratos.messaging.domain.topology.Service;
>>> -import
>>> org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
>>> -import org.drools.runtime.StatefulKnowledgeSession;
>>> -import org.drools.runtime.rule.FactHandle;
>>> -
>>> -/**
>>> - * Is responsible for monitoring a service cluster. This runs
>>> periodically
>>> - * and perform minimum instance check and scaling check using the
>>> underlying
>>> - * rules engine.
>>> - *
>>> - */
>>> - abstract public class AbstractMonitor implements Runnable{
>>> -
>>> - private static final Log log =
>>> LogFactory.getLog(AbstractMonitor.class);
>>> - // Map<NetworkpartitionId, Network Partition Context>
>>> - protected Map<String, NetworkPartitionContext>
>>> networkPartitionCtxts;
>>> - protected DeploymentPolicy deploymentPolicy;
>>> - protected AutoscalePolicy autoscalePolicy;
>>> -
>>> -
>>> - protected FactHandle minCheckFactHandle;
>>> - protected FactHandle scaleCheckFactHandle;
>>> -
>>> - protected StatefulKnowledgeSession minCheckKnowledgeSession;
>>> - protected StatefulKnowledgeSession scaleCheckKnowledgeSession;
>>> - protected boolean isDestroyed;
>>> -
>>> - protected String clusterId;
>>> - protected String serviceId;
>>> -
>>> - protected AutoscalerRuleEvaluator autoscalerRuleEvaluator;
>>> -
>>> - // time intereval between two runs of the Monitor. Default is
>>> 90000ms.
>>> - protected int monitorInterval;
>>> -
>>> - public AbstractMonitor() {
>>> - readConfigurations();
>>> - }
>>> -
>>> - private void readConfigurations () {
>>> -
>>> - XMLConfiguration conf =
>>> ConfUtil.getInstance(null).getConfiguration();
>>> - monitorInterval =
>>> conf.getInt(AutoScalerConstants.AUTOSCALER_MONITOR_INTERVAL, 90000);
>>> - if (log.isDebugEnabled()) {
>>> - log.debug("Cluster Monitor task interval: " +
>>> getMonitorInterval());
>>> - }
>>> - }
>>> -
>>> - @Override
>>> - public void run() {
>>> - // TODO Auto-generated method stub
>>> -
>>> - }
>>> -
>>> -
>>> - public NetworkPartitionContext 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;
>>> - }
>>> -
>>> - public String getPartitionOfMember(String memberId){
>>> - for(Service service:
>>> TopologyManager.getTopology().getServices()){
>>> - for(Cluster cluster: service.getClusters()){
>>> - if(cluster.memberExists(memberId)){
>>> - return cluster.getMember(memberId).getPartitionId();
>>> - }
>>> - }
>>> - }
>>> - return null;
>>> - }
>>> -
>>> - public void destroy() {
>>> - minCheckKnowledgeSession.dispose();
>>> - scaleCheckKnowledgeSession.dispose();
>>> - setDestroyed(true);
>>> - if(log.isDebugEnabled()) {
>>> - log.debug("Cluster Monitor Drools session has been
>>> disposed. "+this.toString());
>>> - }
>>> - }
>>> -
>>> - public boolean isDestroyed() {
>>> - return isDestroyed;
>>> - }
>>> -
>>> - public void setDestroyed(boolean isDestroyed) {
>>> - this.isDestroyed = isDestroyed;
>>> - }
>>> -
>>> - public String getServiceId() {
>>> - return serviceId;
>>> - }
>>> -
>>> - public void setServiceId(String serviceId) {
>>> - this.serviceId = serviceId;
>>> - }
>>> -
>>> - 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 String getClusterId() {
>>> - return clusterId;
>>> - }
>>> -
>>> - public void setClusterId(String clusterId) {
>>> - this.clusterId = clusterId;
>>> - }
>>> -
>>> - public Map<String, NetworkPartitionContext>
>>> getNetworkPartitionCtxts() {
>>> - return networkPartitionCtxts;
>>> - }
>>> -
>>> - public NetworkPartitionContext getNetworkPartitionCtxt(String
>>> networkPartitionId) {
>>> - return networkPartitionCtxts.get(networkPartitionId);
>>> - }
>>> -
>>> - public void setPartitionCtxt(Map<String, NetworkPartitionContext>
>>> partitionCtxt) {
>>> - this.networkPartitionCtxts = partitionCtxt;
>>> - }
>>> -
>>> - public boolean partitionCtxtAvailable(String partitionId) {
>>> - return networkPartitionCtxts.containsKey(partitionId);
>>> - }
>>> -
>>> - public void addNetworkPartitionCtxt(NetworkPartitionContext ctxt) {
>>> - this.networkPartitionCtxts.put(ctxt.getId(), ctxt);
>>> - }
>>> -
>>> - public NetworkPartitionContext getPartitionCtxt(String id) {
>>> - return this.networkPartitionCtxts.get(id);
>>> - }
>>> -
>>> - public StatefulKnowledgeSession getMinCheckKnowledgeSession() {
>>> - return minCheckKnowledgeSession;
>>> - }
>>> -
>>> - public void setMinCheckKnowledgeSession(StatefulKnowledgeSession
>>> minCheckKnowledgeSession) {
>>> - this.minCheckKnowledgeSession = minCheckKnowledgeSession;
>>> - }
>>> -
>>> - public FactHandle getMinCheckFactHandle() {
>>> - return minCheckFactHandle;
>>> - }
>>> -
>>> - public void setMinCheckFactHandle(FactHandle minCheckFactHandle) {
>>> - this.minCheckFactHandle = minCheckFactHandle;
>>> - }
>>> -
>>> - public int getMonitorInterval() {
>>> - return monitorInterval;
>>> - }
>>> -}
>>> \ No newline at end of file
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitor.java
>>> ----------------------------------------------------------------------
>>> diff --git
>>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitor.java
>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitor.java
>>> deleted file mode 100644
>>> index 5bb478e..0000000
>>> ---
>>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitor.java
>>> +++ /dev/null
>>> @@ -1,223 +0,0 @@
>>> -/*
>>> - * Licensed to the Apache Software Foundation (ASF) under one
>>> - * or more contributor license agreements. See the NOTICE file
>>> - * distributed with this work for additional information
>>> - * regarding copyright ownership. The ASF licenses this file
>>> - * to you under the Apache License, Version 2.0 (the
>>> - * "License"); you may not use this file except in compliance
>>> - * with the License. You may obtain a copy of the License at
>>> - *
>>> - * http://www.apache.org/licenses/LICENSE-2.0
>>> - *
>>> - * Unless required by applicable law or agreed to in writing,
>>> - * software distributed under the License is distributed on an
>>> - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>> - * KIND, either express or implied. See the License for the
>>> - * specific language governing permissions and limitations
>>> - * under the License.
>>> - */
>>> -package org.apache.stratos.autoscaler.monitor;
>>> -
>>> -import org.apache.commons.logging.Log;
>>> -import org.apache.commons.logging.LogFactory;
>>> -import org.apache.stratos.autoscaler.NetworkPartitionContext;
>>> -import org.apache.stratos.autoscaler.PartitionContext;
>>> -import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
>>> -import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
>>> -import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
>>> -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.messaging.domain.topology.ClusterStatus;
>>> -
>>> -import java.util.ArrayList;
>>> -import java.util.List;
>>> -import java.util.concurrent.ConcurrentHashMap;
>>> -
>>> -/**
>>> - * Is responsible for monitoring a service cluster. This runs
>>> periodically
>>> - * and perform minimum instance check and scaling check using the
>>> underlying
>>> - * rules engine.
>>> - *
>>> - */
>>> -public class ClusterMonitor extends AbstractMonitor {
>>> -
>>> - private static final Log log =
>>> LogFactory.getLog(ClusterMonitor.class);
>>> - private String lbReferenceType;
>>> - private boolean hasPrimary;
>>> - private ClusterStatus status;
>>> -
>>> - public ClusterMonitor(String clusterId, String serviceId,
>>> DeploymentPolicy deploymentPolicy,
>>> - AutoscalePolicy autoscalePolicy) {
>>> - this.clusterId = clusterId;
>>> - this.serviceId = serviceId;
>>> -
>>> - this.autoscalerRuleEvaluator = new AutoscalerRuleEvaluator();
>>> - this.scaleCheckKnowledgeSession =
>>> autoscalerRuleEvaluator.getScaleCheckStatefulSession();
>>> - this.minCheckKnowledgeSession =
>>> autoscalerRuleEvaluator.getMinCheckStatefulSession();
>>> -
>>> - this.deploymentPolicy = deploymentPolicy;
>>> - this.autoscalePolicy = autoscalePolicy;
>>> - networkPartitionCtxts = new ConcurrentHashMap<String,
>>> NetworkPartitionContext>();
>>> - }
>>> -
>>> -
>>> -
>>> - @Override
>>> - public void run() {
>>> -
>>> - try {
>>> - // TODO make this configurable,
>>> - // this is the delay the min check of normal cluster
>>> monitor to wait until LB monitor is added
>>> - Thread.sleep(60000);
>>> - } catch (InterruptedException ignore) {
>>> - }
>>> -
>>> - while (!isDestroyed()) {
>>> - if (log.isDebugEnabled()) {
>>> - log.debug("Cluster monitor is running.. " +
>>> this.toString());
>>> - }
>>> - try {
>>> - if(!ClusterStatus.In_Maintenance.equals(status)) {
>>> - monitor();
>>> - } else {
>>> - if (log.isDebugEnabled()) {
>>> - log.debug("Cluster monitor is suspended as the
>>> cluster is in " +
>>> - ClusterStatus.In_Maintenance + "
>>> mode......");
>>> - }
>>> - }
>>> - } catch (Exception e) {
>>> - log.error("Cluster monitor: Monitor failed." +
>>> this.toString(), e);
>>> - }
>>> - try {
>>> - Thread.sleep(monitorInterval);
>>> - } catch (InterruptedException ignore) {
>>> - }
>>> - }
>>> - }
>>> -
>>> - private boolean isPrimaryMember(MemberContext memberContext){
>>> - Properties props = memberContext.getProperties();
>>> - if (log.isDebugEnabled()) {
>>> - log.debug(" Properties [" + props + "] ");
>>> - }
>>> - if (props != null && props.getProperties() != null) {
>>> - for (Property prop : props.getProperties()) {
>>> - if (prop.getName().equals("PRIMARY")) {
>>> - if (Boolean.parseBoolean(prop.getValue())) {
>>> - log.debug("Adding member id [" +
>>> memberContext.getMemberId() + "] " +
>>> - "member instance id [" +
>>> memberContext.getInstanceId() + "] as a primary member");
>>> - return true;
>>> - }
>>> - }
>>> - }
>>> - }
>>> - return false;
>>> - }
>>> -
>>> - private void monitor() {
>>> -
>>> - //TODO make this concurrent
>>> - for (NetworkPartitionContext networkPartitionContext :
>>> networkPartitionCtxts.values()) {
>>> - // store primary members in the network partition context
>>> - List<String> primaryMemberListInNetworkPartition = new
>>> ArrayList<String>();
>>> -
>>> - //minimum check per partition
>>> - for (PartitionContext partitionContext :
>>> networkPartitionContext.getPartitionCtxts().values()) {
>>> - // store primary members in the partition context
>>> - List<String> primaryMemberListInPartition = new
>>> ArrayList<String>();
>>> - // get active primary members in this partition context
>>> - for (MemberContext memberContext :
>>> partitionContext.getActiveMembers()) {
>>> - if (isPrimaryMember(memberContext)){
>>> -
>>> primaryMemberListInPartition.add(memberContext.getMemberId());
>>> - }
>>> - }
>>> - // get pending primary members in this partition context
>>> - for (MemberContext memberContext :
>>> partitionContext.getPendingMembers()) {
>>> - if (isPrimaryMember(memberContext)){
>>> -
>>> primaryMemberListInPartition.add(memberContext.getMemberId());
>>> - }
>>> - }
>>> -
>>> primaryMemberListInNetworkPartition.addAll(primaryMemberListInPartition);
>>> - minCheckKnowledgeSession.setGlobal("clusterId",
>>> clusterId);
>>> - minCheckKnowledgeSession.setGlobal("lbRef",
>>> lbReferenceType);
>>> - minCheckKnowledgeSession.setGlobal("isPrimary",
>>> hasPrimary);
>>> -
>>> minCheckKnowledgeSession.setGlobal("primaryMemberCount",
>>> primaryMemberListInPartition.size());
>>> -
>>> - if (log.isDebugEnabled()) {
>>> - log.debug(String.format("Running minimum check for
>>> partition %s ", partitionContext.getPartitionId()));
>>> - }
>>> -
>>> - minCheckFactHandle =
>>> AutoscalerRuleEvaluator.evaluateMinCheck(minCheckKnowledgeSession
>>> - , minCheckFactHandle, partitionContext);
>>> -
>>> - }
>>> -
>>> - boolean rifReset = networkPartitionContext.isRifReset();
>>> - boolean memoryConsumptionReset =
>>> networkPartitionContext.isMemoryConsumptionReset();
>>> - boolean loadAverageReset =
>>> networkPartitionContext.isLoadAverageReset();
>>> - if (log.isDebugEnabled()) {
>>> - log.debug("flag of rifReset: " + rifReset + " flag of
>>> memoryConsumptionReset" + memoryConsumptionReset
>>> - + " flag of loadAverageReset" +
>>> loadAverageReset);
>>> - }
>>> - if (rifReset || memoryConsumptionReset || loadAverageReset)
>>> {
>>> - scaleCheckKnowledgeSession.setGlobal("clusterId",
>>> clusterId);
>>> -
>>> //scaleCheckKnowledgeSession.setGlobal("deploymentPolicy",
>>> deploymentPolicy);
>>> - scaleCheckKnowledgeSession.setGlobal("autoscalePolicy",
>>> autoscalePolicy);
>>> - scaleCheckKnowledgeSession.setGlobal("rifReset",
>>> rifReset);
>>> - scaleCheckKnowledgeSession.setGlobal("mcReset",
>>> memoryConsumptionReset);
>>> - scaleCheckKnowledgeSession.setGlobal("laReset",
>>> loadAverageReset);
>>> - scaleCheckKnowledgeSession.setGlobal("lbRef",
>>> lbReferenceType);
>>> - scaleCheckKnowledgeSession.setGlobal("isPrimary",
>>> false);
>>> - scaleCheckKnowledgeSession.setGlobal("primaryMembers",
>>> primaryMemberListInNetworkPartition);
>>> -
>>> - if (log.isDebugEnabled()) {
>>> - log.debug(String.format("Running scale check for
>>> network partition %s ", networkPartitionContext.getId()));
>>> - log.debug(" Primary members : " +
>>> primaryMemberListInNetworkPartition);
>>> - }
>>> -
>>> - scaleCheckFactHandle =
>>> AutoscalerRuleEvaluator.evaluateScaleCheck(scaleCheckKnowledgeSession
>>> - , scaleCheckFactHandle,
>>> networkPartitionContext);
>>> -
>>> - networkPartitionContext.setRifReset(false);
>>> -
>>> networkPartitionContext.setMemoryConsumptionReset(false);
>>> - networkPartitionContext.setLoadAverageReset(false);
>>> - } else if (log.isDebugEnabled()) {
>>> - log.debug(String.format("Scale rule will not run since
>>> the LB statistics have not received before this " +
>>> - "cycle for network partition %s",
>>> networkPartitionContext.getId()));
>>> - }
>>> - }
>>> - }
>>> -
>>> - @Override
>>> - public String toString() {
>>> - return "ClusterMonitor [clusterId=" + clusterId + ",
>>> serviceId=" + serviceId +
>>> - ", deploymentPolicy=" + deploymentPolicy + ",
>>> autoscalePolicy=" + autoscalePolicy +
>>> - ", lbReferenceType=" + lbReferenceType +
>>> - ", hasPrimary=" + hasPrimary + " ]";
>>> - }
>>> -
>>> - public String getLbReferenceType() {
>>> - return lbReferenceType;
>>> - }
>>> -
>>> - public void setLbReferenceType(String lbReferenceType) {
>>> - this.lbReferenceType = lbReferenceType;
>>> - }
>>> -
>>> - public boolean isHasPrimary() {
>>> - return hasPrimary;
>>> - }
>>> -
>>> - public void setHasPrimary(boolean hasPrimary) {
>>> - this.hasPrimary = hasPrimary;
>>> - }
>>> -
>>> - public ClusterStatus getStatus() {
>>> - return status;
>>> - }
>>> -
>>> - public void setStatus(ClusterStatus status) {
>>> - this.status = status;
>>> - }
>>> -}
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitorFactory.java
>>> ----------------------------------------------------------------------
>>> diff --git
>>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitorFactory.java
>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitorFactory.java
>>> new file mode 100644
>>> index 0000000..489078e
>>> --- /dev/null
>>> +++
>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitorFactory.java
>>> @@ -0,0 +1,336 @@
>>> +package org.apache.stratos.autoscaler.monitor;
>>> +
>>> +import java.util.Map;
>>> +import java.util.Random;
>>> +
>>> +import org.apache.commons.logging.Log;
>>> +import org.apache.commons.logging.LogFactory;
>>> +import org.apache.stratos.autoscaler.KubernetesClusterContext;
>>> +import org.apache.stratos.autoscaler.MemberStatsContext;
>>> +import org.apache.stratos.autoscaler.NetworkPartitionContext;
>>> +import org.apache.stratos.autoscaler.NetworkPartitionLbHolder;
>>> +import org.apache.stratos.autoscaler.PartitionContext;
>>> +import
>>> org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
>>> +import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
>>> +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.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.ClusterStatus;
>>> +import org.apache.stratos.messaging.domain.topology.Member;
>>> +import org.apache.stratos.messaging.domain.topology.MemberStatus;
>>> +import org.apache.stratos.messaging.util.Constants;
>>> +
>>> +public class ClusterMonitorFactory {
>>> +
>>> + private static final Log log =
>>> LogFactory.getLog(ClusterMonitorFactory.class);
>>> +
>>> + public static AbstractClusterMonitor getMonitor(Cluster cluster)
>>> throws PolicyValidationException, PartitionValidationException {
>>> +
>>> + AbstractClusterMonitor clusterMonitor;
>>> + if(cluster.isKubernetesCluster()){
>>> + clusterMonitor =
>>> getDockerServiceClusterMonitor(cluster);
>>> + } else if (cluster.isLbCluster()){
>>> + clusterMonitor = getVMLbClusterMonitor(cluster);
>>> + } else {
>>> + clusterMonitor =
>>> getVMServiceClusterMonitor(cluster);
>>> + }
>>> +
>>> + return clusterMonitor;
>>> + }
>>> +
>>> + private static VMServiceClusterMonitor
>>> getVMServiceClusterMonitor(Cluster cluster) throws
>>> PolicyValidationException, PartitionValidationException {
>>> + // 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 policy =
>>> + 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 =
>>> + "Deployment Policy's Partitions are null.
>>> Policy name: " +
>>> + deploymentPolicyName;
>>> + log.error(msg);
>>> + throw new PolicyValidationException(msg);
>>> + }
>>> +
>>> +
>>> CloudControllerClient.getInstance().validateDeploymentPolicy(cluster.getServiceName(),
>>> deploymentPolicy);
>>> +
>>> + VMServiceClusterMonitor clusterMonitor =
>>> + new
>>> VMServiceClusterMonitor(cluster.getClusterId(),
>>> +
>>> cluster.getServiceName(),
>>> +
>>> deploymentPolicy, policy);
>>> + clusterMonitor.setStatus(ClusterStatus.Created);
>>> +
>>> + for (PartitionGroup partitionGroup:
>>> deploymentPolicy.getPartitionGroups()){
>>> +
>>> + NetworkPartitionContext networkPartitionContext = new
>>> NetworkPartitionContext(partitionGroup.getId(),
>>> + partitionGroup.getPartitionAlgo(),
>>> partitionGroup.getPartitions());
>>> +
>>> + for(Partition partition: partitionGroup.getPartitions()){
>>> + PartitionContext partitionContext = new
>>> PartitionContext(partition);
>>> +
>>> partitionContext.setServiceName(cluster.getServiceName());
>>> + partitionContext.setProperties(cluster.getProperties());
>>> +
>>> partitionContext.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.setPartition(partition);
>>> +
>>> memberContext.setProperties(convertMemberPropsToMemberContextProps(member.getProperties()));
>>> +
>>> +
>>> if(MemberStatus.Activated.equals(member.getStatus())){
>>> +
>>> partitionContext.addActiveMember(memberContext);
>>> +//
>>> networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(),
>>> 1);
>>> +//
>>> partitionContext.incrementCurrentActiveMemberCount(1);
>>> +
>>> + } else
>>> if(MemberStatus.Created.equals(member.getStatus()) ||
>>> MemberStatus.Starting.equals(member.getStatus())){
>>> +
>>> partitionContext.addPendingMember(memberContext);
>>> +
>>> +//
>>> networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(),
>>> 1);
>>> + } else
>>> if(MemberStatus.Suspended.equals(member.getStatus())){
>>> +//
>>> partitionContext.addFaultyMember(memberId);
>>> + }
>>> + partitionContext.addMemberStatsContext(new
>>> MemberStatsContext(memberId));
>>> + if(log.isInfoEnabled()){
>>> + log.info(String.format("Member stat
>>> context has been added: [member] %s", memberId));
>>> + }
>>> + }
>>> +
>>> + }
>>> +
>>> networkPartitionContext.addPartitionContext(partitionContext);
>>> + if(log.isInfoEnabled()){
>>> + log.info(String.format("Partition context has been
>>> added: [partition] %s",
>>> + partitionContext.getPartitionId()));
>>> + }
>>> + }
>>> +
>>> +
>>> clusterMonitor.addNetworkPartitionCtxt(networkPartitionContext);
>>> + if(log.isInfoEnabled()){
>>> + log.info(String.format("Network partition context has
>>> been added: [network partition] %s",
>>> + networkPartitionContext.getId()));
>>> + }
>>> + }
>>> +
>>> +
>>> + // find lb reference type
>>> + java.util.Properties props = cluster.getProperties();
>>> +
>>> + if(props.containsKey(Constants.LOAD_BALANCER_REF)) {
>>> + String value =
>>> props.getProperty(Constants.LOAD_BALANCER_REF);
>>> + clusterMonitor.setLbReferenceType(value);
>>> + if(log.isDebugEnabled()) {
>>> + log.debug("Set the lb reference type: "+value);
>>> + }
>>> + }
>>> +
>>> + // set hasPrimary property
>>> + // hasPrimary is true if there are primary members available in
>>> that cluster
>>> +
>>> clusterMonitor.setHasPrimary(Boolean.parseBoolean(cluster.getProperties().getProperty(Constants.IS_PRIMARY)));
>>> +
>>> + log.info("Cluster monitor created:
>>> "+clusterMonitor.toString());
>>> + return clusterMonitor;
>>> + }
>>> +
>>> + private static Properties convertMemberPropsToMemberContextProps(
>>> + java.util.Properties properties) {
>>> + Properties props = new Properties();
>>> + for (Map.Entry<Object, Object> e : properties.entrySet()
>>> ) {
>>> + Property prop = new Property();
>>> + prop.setName((String)e.getKey());
>>> + prop.setValue((String)e.getValue());
>>> + props.addProperties(prop);
>>> + }
>>> + return props;
>>> + }
>>> +
>>> +
>>> + private static VMLbClusterMonitor getVMLbClusterMonitor(Cluster
>>> cluster) throws PolicyValidationException, PartitionValidationException {
>>> + // 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 policy =
>>> + 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();
>>> + VMLbClusterMonitor clusterMonitor =
>>> + new
>>> VMLbClusterMonitor(clusterId,
>>> +
>>> cluster.getServiceName(),
>>> +
>>> deploymentPolicy, policy);
>>> + clusterMonitor.setStatus(ClusterStatus.Created);
>>> + // partition group = network partition context
>>> + for (PartitionGroup partitionGroup :
>>> deploymentPolicy.getPartitionGroups()) {
>>> +
>>> + NetworkPartitionLbHolder networkPartitionLbHolder =
>>> +
>>> PartitionManager.getInstance()
>>> +
>>> .getNetworkPartitionLbHolder(partitionGroup.getId());
>>> +//
>>> PartitionManager.getInstance()
>>> +//
>>> .getNetworkPartitionLbHolder(partitionGroup.getId());
>>> + // FIXME pick a random partition
>>> + Partition partition =
>>> + partitionGroup.getPartitions()[new
>>> Random().nextInt(partitionGroup.getPartitions().length)];
>>> + PartitionContext partitionContext = new
>>> PartitionContext(partition);
>>> + partitionContext.setServiceName(cluster.getServiceName());
>>> + partitionContext.setProperties(cluster.getProperties());
>>> +
>>> partitionContext.setNetworkPartitionId(partitionGroup.getId());
>>> + partitionContext.setMinimumMemberCount(1);//Here it hard
>>> codes the minimum value as one for LB cartridge partitions
>>> +
>>> + NetworkPartitionContext networkPartitionContext = new
>>> NetworkPartitionContext(partitionGroup.getId(),
>>> + partitionGroup.getPartitionAlgo(),
>>> partitionGroup.getPartitions()) ;
>>> + for (Member member : cluster.getMembers()) {
>>> + String memberId = member.getMemberId();
>>> + if
>>> (member.getNetworkPartitionId().equalsIgnoreCase(networkPartitionContext.getId()))
>>> {
>>> + MemberContext memberContext = new MemberContext();
>>> + memberContext.setClusterId(member.getClusterId());
>>> + memberContext.setMemberId(memberId);
>>> + memberContext.setPartition(partition);
>>> +
>>> + if
>>> (MemberStatus.Activated.equals(member.getStatus())) {
>>> + partitionContext.addActiveMember(memberContext);
>>> +//
>>> networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(),
>>> 1);
>>> +//
>>> partitionContext.incrementCurrentActiveMemberCount(1);
>>> + } else if
>>> (MemberStatus.Created.equals(member.getStatus()) ||
>>> +
>>> MemberStatus.Starting.equals(member.getStatus())) {
>>> +
>>> partitionContext.addPendingMember(memberContext);
>>> +//
>>> networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(),
>>> 1);
>>> + } else if
>>> (MemberStatus.Suspended.equals(member.getStatus())) {
>>> +// partitionContext.addFaultyMember(memberId);
>>> + }
>>> +
>>> + partitionContext.addMemberStatsContext(new
>>> MemberStatsContext(memberId));
>>> + if(log.isInfoEnabled()){
>>> + log.info(String.format("Member stat context
>>> has been added: [member] %s", memberId));
>>> + }
>>> + }
>>> +
>>> + }
>>> +
>>> networkPartitionContext.addPartitionContext(partitionContext);
>>> +
>>> + // 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(Constants.LOAD_BALANCED_SERVICE_TYPE);
>>> +
>>> + if(props.containsKey(Constants.LOAD_BALANCER_REF)) {
>>> + String value =
>>> props.getProperty(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);
>>> + }
>>> + }
>>> + }
>>> + }
>>> +
>>> +
>>> clusterMonitor.addNetworkPartitionCtxt(networkPartitionContext);
>>> + }
>>> +
>>> + log.info("LB Cluster monitor created:
>>> "+clusterMonitor.toString());
>>> + return clusterMonitor;
>>> + }
>>> +
>>> + private static DockerServiceClusterMonitor
>>> getDockerServiceClusterMonitor(Cluster cluster) {
>>> +
>>> + if (null == cluster) {
>>> + return null;
>>> + }
>>> +
>>> + String autoscalePolicyName = cluster.getAutoscalePolicyName();
>>> + if (log.isDebugEnabled()) {
>>> + log.debug("Autoscaler policy name: " + autoscalePolicyName);
>>> + }
>>> +
>>> + AutoscalePolicy policy =
>>> PolicyManager.getInstance().getAutoscalePolicy(autoscalePolicyName);
>>> + java.util.Properties props = cluster.getProperties();
>>> + String kubernetesHostClusterID =
>>> props.getProperty(StratosConstants.KUBERNETES_CLUSTER_ID);
>>> + KubernetesClusterContext kubernetesClusterCtxt = new
>>> KubernetesClusterContext(kubernetesHostClusterID);
>>> +
>>> + DockerServiceClusterMonitor dockerClusterMonitor = new
>>> DockerServiceClusterMonitor(
>>> + kubernetesClusterCtxt,
>>> + cluster.getClusterId(),
>>> + cluster.getServiceName(),
>>> + policy);
>>> +
>>> + dockerClusterMonitor.setStatus(ClusterStatus.Created);
>>> +
>>> + // find lb reference type
>>> + if(props.containsKey(Constants.LOAD_BALANCER_REF)) {
>>> + String value =
>>> props.getProperty(Constants.LOAD_BALANCER_REF);
>>> + dockerClusterMonitor.setLbReferenceType(value);
>>> + if(log.isDebugEnabled()) {
>>> + log.debug("Set the lb reference type: "+value);
>>> + }
>>> + }
>>> +
>>> +// // set hasPrimary property
>>> +// // hasPrimary is true if there are primary members available
>>> in that cluster
>>> +//
>>> dockerClusterMonitor.setHasPrimary(Boolean.parseBoolean(props.getProperty(Constants.IS_PRIMARY)));
>>> +
>>> + log.info("Docker cluster monitor created: "+
>>> dockerClusterMonitor.toString());
>>> + return dockerClusterMonitor;
>>> + }
>>> +}
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ContainerClusterMonitor.java
>>> ----------------------------------------------------------------------
>>> diff --git
>>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ContainerClusterMonitor.java
>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ContainerClusterMonitor.java
>>> new file mode 100644
>>> index 0000000..f9b9047
>>> --- /dev/null
>>> +++
>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ContainerClusterMonitor.java
>>> @@ -0,0 +1,38 @@
>>> +package org.apache.stratos.autoscaler.monitor;
>>> +
>>> +import org.apache.stratos.autoscaler.KubernetesClusterContext;
>>> +import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
>>> +import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
>>> +import org.apache.stratos.common.enums.ClusterType;
>>> +
>>> +public abstract class ContainerClusterMonitor extends
>>> AbstractClusterMonitor {
>>> +
>>> + private KubernetesClusterContext kubernetesClusterCtxt;
>>> + protected AutoscalePolicy autoscalePolicy;
>>> +
>>> + protected ContainerClusterMonitor(String clusterId, String
>>> serviceId, ClusterType clusterType,
>>> + KubernetesClusterContext
>>> kubernetesClusterContext,
>>> + AutoscalerRuleEvaluator autoscalerRuleEvaluator,
>>> AutoscalePolicy autoscalePolicy){
>>> +
>>> + super(clusterId, serviceId, clusterType,
>>> autoscalerRuleEvaluator);
>>> + this.kubernetesClusterCtxt = kubernetesClusterContext;
>>> + this.autoscalePolicy = autoscalePolicy;
>>> + }
>>> +
>>> + public KubernetesClusterContext getKubernetesClusterCtxt() {
>>> + return kubernetesClusterCtxt;
>>> + }
>>> +
>>> + public void setKubernetesClusterCtxt(
>>> + KubernetesClusterContext kubernetesClusterCtxt) {
>>> + this.kubernetesClusterCtxt = kubernetesClusterCtxt;
>>> + }
>>> +
>>> + public AutoscalePolicy getAutoscalePolicy() {
>>> + return autoscalePolicy;
>>> + }
>>> +
>>> + public void setAutoscalePolicy(AutoscalePolicy autoscalePolicy) {
>>> + this.autoscalePolicy = autoscalePolicy;
>>> + }
>>> +}
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/DockerServiceClusterMonitor.java
>>> ----------------------------------------------------------------------
>>> diff --git
>>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/DockerServiceClusterMonitor.java
>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/DockerServiceClusterMonitor.java
>>> new file mode 100644
>>> index 0000000..ca39b6a
>>> --- /dev/null
>>> +++
>>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/DockerServiceClusterMonitor.java
>>> @@ -0,0 +1,156 @@
>>> +package org.apache.stratos.autoscaler.monitor;
>>> +
>>> +import java.util.Properties;
>>> +
>>> +import org.apache.commons.configuration.XMLConfiguration;
>>> +import org.apache.commons.logging.Log;
>>> +import org.apache.commons.logging.LogFactory;
>>> +import org.apache.stratos.autoscaler.KubernetesClusterContext;
>>> +import
>>> org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
>>> +import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
>>> +import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
>>> +import org.apache.stratos.autoscaler.util.AutoScalerConstants;
>>> +import org.apache.stratos.autoscaler.util.ConfUtil;
>>> +import org.apache.stratos.cloud.controller.stub.pojo.MemberContext;
>>> +import org.apache.stratos.common.constants.StratosConstants;
>>> +import org.apache.stratos.common.enums.ClusterType;
>>> +import org.apache.stratos.messaging.domain.topology.ClusterStatus;
>>> +import
>>> org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
>>> +
>>> +public final class DockerServiceClusterMonitor extends
>>> ContainerClusterMonitor{
>>> +
>>> + private static final Log log =
>>> LogFactory.getLog(DockerServiceClusterMonitor.class);
>>> +
>>> + private String lbReferenceType;
>>> + private int numberOfReplicasInServiceCluster = 0;
>>> + int retryInterval = 60000;
>>> +
>>> + public DockerServiceClusterMonitor(KubernetesClusterContext
>>> kubernetesClusterCtxt,
>>> + String serviceClusterID, String serviceId,
>>> AutoscalePolicy autoscalePolicy) {
>>> + super(serviceClusterID, serviceId,
>>> ClusterType.DockerServiceCluster, kubernetesClusterCtxt,
>>> + new AutoscalerRuleEvaluator(), autoscalePolicy);
>>> + readConfigurations();
>>> + }
>>> +
>>> + @Override
>>> + public void run() {
>>> + try {
>>> + // TODO make this configurable,
>>> + // this is the delay the min check of normal
>>> cluster monitor to wait
>>> + // until LB monitor is added
>>> + Thread.sleep(60000);
>>> + } catch (InterruptedException ignore) {
>>> + }
>>> +
>>> + while (!isDestroyed()) {
>>> + if (log.isDebugEnabled()) {
>>> + log.debug("Kubernetes cluster monitor is
>>> running.. " + this.toString());
>>> + }
>>> + try {
>>> + if
>>> (!ClusterStatus.In_Maintenance.equals(getStatus())) {
>>> + monitor();
>>> + } else {
>>> + if (log.isDebugEnabled()) {
>>> + log.debug("Kubernetes
>>> cluster monitor is suspended as the cluster is in "
>>> + +
>>> ClusterStatus.In_Maintenance + " mode......");
>>> + }
>>> + }
>>> + } catch (Exception e) {
>>> + log.error("Kubernetes cluster monitor:
>>> Monitor failed." + this.toString(),
>>> + e);
>>> + }
>>> + try {
>>> + Thread.sleep(getMonitorInterval());
>>> + } catch (InterruptedException ignore) {
>>> + }
>>> + }
>>> + }
>>> +
>>> + @Override
>>> + protected void monitor() {
>>> +
>>> + // is container created successfully?
>>> + boolean success = false;
>>> + String kubernetesClusterId =
>>> getKubernetesClusterCtxt().getKubernetesClusterID();
>>> +
>>> + try {
>>> + TopologyManager.acquireReadLock();
>>> + Properties props =
>>> TopologyManager.getTopology().getService(getServiceId()).getCluster(getClusterId()).getProperties();
>>> + int minReplicas =
>>> Integer.parseInt(props.getProperty(StratosConstants.KUBERNETES_MIN_REPLICAS));
>>> +
>>> + int nonTerminatedMembers =
>>> getKubernetesClusterCtxt().getActiveMembers().size() +
>>> getKubernetesClusterCtxt().getPendingMembers().size();
>>> +
>>> + if (nonTerminatedMembers == 0) {
>>> +
>>> + while (success) {
>>> + try {
>>> +
>>> + MemberContext
>>> memberContext =
>>> CloudControllerClient.getInstance().createContainer(kubernetesClusterId,
>>> getClusterId());
>>> + if(null !=
>>> memberContext) {
>>> +
>>> getKubernetesClusterCtxt().addPendingMember(memberContext);
>>> + success = true;
>>> +
>>> numberOfReplicasInServiceCluster = minReplicas;
>>> +
>>> if(log.isDebugEnabled()){
>>> +
>>> log.debug(String.format("Pending member added, [member] %s [kub cluster]
>>> %s",
>>> +
>>> memberContext.getMemberId(),
>>> getKubernetesClusterCtxt().getKubernetesClusterID()));
>>> + }
>>> + } else {
>>> + if
>>> (log.isDebugEnabled()) {
>>> +
>>> log.debug("Returned member context is null, did not add to pending
>>> members");
>>> + }
>>> + }
>>> + } catch (Throwable e) {
>>> + if
>>> (log.isDebugEnabled()) {
>>> + String message =
>>> "Cannot create a container, will retry in "+(retryInterval/1000)+"s";
>>> +
>>> log.debug(message, e);
>>> + }
>>> + }
>>> +
>>> + try {
>>> + Thread.sleep(retryInterval);
>>> + } catch (InterruptedException e1) {
>>> + }
>>> + }
>>> + }
>>> + } finally {
>>> + TopologyManager.releaseReadLock();
>>> + }
>>> + }
>>> +
>>> + @Override
>>> + public void destroy() {
>>> + getMinCheckKnowledgeSession().dispose();
>>> + getScaleCheckKnowledgeSession().dispose();
>>> + setDestroyed(true);
>>> + if(log.isDebugEnabled()) {
>>> + log.debug("DockerClusterMonitor Drools session has been
>>> disposed. "+this.toString());
>>> + }
>>> + }
>>> +
>>> + @Override
>>> + protected void readConfigurations () {
>>> + // same as VM cluster monitor interval
>>> + XMLConfiguration conf =
>>> ConfUtil.getInstance(null).getConfiguration();
>>> + int monitorInterval =
>>> conf.getInt(AutoScalerConstants.AUTOSCALER_MONITOR_INTERVAL, 90000);
>>> + setMonitorInterval(monitorInterval);
>>> + if (log.isDebugEnabled()) {
>>> + log.debug("Kubernetes Cluster Monitor task interval: " +
>>> getMonitorInterval());
>>> + }
>>> + }
>>> +
>>> + @Override
>>> + public String toString() {
>>> + return "DockerClusterMonitor "
>>> + + "[ kubernetesHostClusterId=" +
>>> getKubernetesClusterCtxt().getKubernetesClusterID()
>>> + + ", clusterId=" + getClusterId()
>>> + + ", serviceId=" + getServiceId() + "]";
>>> + }
>>> +
>>> + public String getLbReferenceType() {
>>> + return lbReferenceType;
>>> + }
>>> +
>>> + public void setLbReferenceType(String lbReferenceType) {
>>> + this.lbReferenceType = lbReferenceType;
>>> + }
>>> +}
>>> \ No newline at end of file
>>>
>>>
>>
>>
>> --
>> --
>> Lahiru Sandaruwan
>> Committer and PMC member, Apache Stratos,
>> Senior Software Engineer,
>> WSO2 Inc., http://wso2.com
>> lean.enterprise.middleware
>>
>> email: lahirus@wso2.com cell: (+94) 773 325 954
>> blog: http://lahiruwrites.blogspot.com/
>> twitter: http://twitter.com/lahirus
>> linked-in: http://lk.linkedin.com/pub/lahiru-sandaruwan/16/153/146
>>
>>
>
>
> --
> Rajkumar Rajaratnam
> Software Engineer | WSO2, Inc.
> Mobile +94777568639 | +94783498120
>
--
--
Lahiru Sandaruwan
Committer and PMC member, Apache Stratos,
Senior Software Engineer,
WSO2 Inc., http://wso2.com
lean.enterprise.middleware
email: lahirus@wso2.com cell: (+94) 773 325 954
blog: http://lahiruwrites.blogspot.com/
twitter: http://twitter.com/lahirus
linked-in: http://lk.linkedin.com/pub/lahiru-sandaruwan/16/153/146
Re: [2/4] cluster monitors hierarchy redesigned and docker cluster
monitor improved
Posted by Rajkumar Rajaratnam <ra...@wso2.com>.
Hi,
I guess we can see the history using blame.
https://github.com/apache/stratos/blame/master/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/VMServiceClusterMonitor.java
Thanks.
On Wed, Oct 1, 2014 at 8:55 PM, Lahiru Sandaruwan <la...@wso2.com> wrote:
> Hi guys,
>
> It seems we have lost all the Git history of Cluster Monitors with this
> commit :(
> We should have Git move in this kind of cases.
>
> Thanks.
>
> On Tue, Sep 23, 2014 at 2:49 PM, <ni...@apache.org> wrote:
>
>>
>> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
>> ----------------------------------------------------------------------
>> diff --git
>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
>> index b8dcd73..6525eba 100644
>> ---
>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
>> +++
>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
>> @@ -19,34 +19,54 @@
>>
>> package org.apache.stratos.autoscaler.message.receiver.topology;
>>
>> +import java.util.List;
>> +
>> import org.apache.commons.logging.Log;
>> import org.apache.commons.logging.LogFactory;
>> -import org.apache.stratos.autoscaler.*;
>> +import org.apache.stratos.autoscaler.AutoscalerContext;
>> +import org.apache.stratos.autoscaler.KubernetesClusterContext;
>> +import org.apache.stratos.autoscaler.MemberStatsContext;
>> +import org.apache.stratos.autoscaler.NetworkPartitionContext;
>> +import org.apache.stratos.autoscaler.NetworkPartitionLbHolder;
>> +import org.apache.stratos.autoscaler.PartitionContext;
>> import
>> org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
>> import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
>> import
>> org.apache.stratos.autoscaler.exception.PartitionValidationException;
>> import org.apache.stratos.autoscaler.exception.PolicyValidationException;
>> import org.apache.stratos.autoscaler.exception.TerminationException;
>> -import org.apache.stratos.autoscaler.monitor.AbstractMonitor;
>> -import org.apache.stratos.autoscaler.monitor.ClusterMonitor;
>> -import org.apache.stratos.autoscaler.monitor.KubernetesClusterMonitor;
>> -import org.apache.stratos.autoscaler.monitor.LbClusterMonitor;
>> +import org.apache.stratos.autoscaler.monitor.AbstractClusterMonitor;
>> +import org.apache.stratos.autoscaler.monitor.ClusterMonitorFactory;
>> +import org.apache.stratos.autoscaler.monitor.ContainerClusterMonitor;
>> +import org.apache.stratos.autoscaler.monitor.VMClusterMonitor;
>> import org.apache.stratos.autoscaler.partition.PartitionManager;
>> import org.apache.stratos.autoscaler.policy.PolicyManager;
>> import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
>> -import org.apache.stratos.autoscaler.util.AutoscalerUtil;
>> +import org.apache.stratos.common.enums.ClusterType;
>> import org.apache.stratos.messaging.domain.topology.Cluster;
>> import org.apache.stratos.messaging.domain.topology.Service;
>> import org.apache.stratos.messaging.event.Event;
>> -import org.apache.stratos.messaging.event.topology.*;
>> -import org.apache.stratos.messaging.listener.topology.*;
>> +import org.apache.stratos.messaging.event.topology.ClusterCreatedEvent;
>> +import
>> org.apache.stratos.messaging.event.topology.ClusterMaintenanceModeEvent;
>> +import org.apache.stratos.messaging.event.topology.ClusterRemovedEvent;
>> +import org.apache.stratos.messaging.event.topology.MemberActivatedEvent;
>> +import
>> org.apache.stratos.messaging.event.topology.MemberMaintenanceModeEvent;
>> +import
>> org.apache.stratos.messaging.event.topology.MemberReadyToShutdownEvent;
>> +import org.apache.stratos.messaging.event.topology.MemberTerminatedEvent;
>> +import
>> org.apache.stratos.messaging.listener.topology.ClusterCreatedEventListener;
>> +import
>> org.apache.stratos.messaging.listener.topology.ClusterMaintenanceModeEventListener;
>> +import
>> org.apache.stratos.messaging.listener.topology.ClusterRemovedEventListener;
>> +import
>> org.apache.stratos.messaging.listener.topology.CompleteTopologyEventListener;
>> +import
>> org.apache.stratos.messaging.listener.topology.MemberActivatedEventListener;
>> +import
>> org.apache.stratos.messaging.listener.topology.MemberMaintenanceListener;
>> +import
>> org.apache.stratos.messaging.listener.topology.MemberReadyToShutdownEventListener;
>> +import
>> org.apache.stratos.messaging.listener.topology.MemberStartedEventListener;
>> +import
>> org.apache.stratos.messaging.listener.topology.MemberTerminatedEventListener;
>> +import
>> org.apache.stratos.messaging.listener.topology.ServiceRemovedEventListener;
>> import
>> org.apache.stratos.messaging.message.receiver.topology.TopologyEventReceiver;
>> import
>> org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
>> import org.drools.runtime.StatefulKnowledgeSession;
>> import org.drools.runtime.rule.FactHandle;
>>
>> -import java.util.List;
>> -
>> /**
>> * Autoscaler topology receiver.
>> */
>> @@ -116,42 +136,60 @@ public class AutoscalerTopologyEventReceiver
>> implements Runnable {
>> try {
>> MemberReadyToShutdownEvent
>> memberReadyToShutdownEvent = (MemberReadyToShutdownEvent)event;
>> AutoscalerContext asCtx =
>> AutoscalerContext.getInstance();
>> - AbstractMonitor monitor;
>> + AbstractClusterMonitor monitor;
>> String clusterId =
>> memberReadyToShutdownEvent.getClusterId();
>> String memberId =
>> memberReadyToShutdownEvent.getMemberId();
>>
>> - if(asCtx.monitorExist(clusterId)){
>> - monitor = asCtx.getMonitor(clusterId);
>> - }else if(asCtx.lbMonitorExist(clusterId)){
>> - monitor = asCtx.getLBMonitor(clusterId);
>> - }else{
>> + if(asCtx.clusterMonitorExist(clusterId)) {
>> + monitor = asCtx.getClusterMonitor(clusterId);
>> + } else {
>> if(log.isDebugEnabled()){
>> log.debug(String.format("A cluster monitor
>> is not found in autoscaler context [cluster] %s", clusterId));
>> }
>> return;
>> }
>> -
>> - NetworkPartitionContext nwPartitionCtxt;
>> - nwPartitionCtxt =
>> monitor.getNetworkPartitionCtxt(memberReadyToShutdownEvent.getNetworkPartitionId());
>> -
>> - // start a new member in the same Partition
>> - String partitionId =
>> monitor.getPartitionOfMember(memberId);
>> - PartitionContext partitionCtxt =
>> nwPartitionCtxt.getPartitionCtxt(partitionId);
>> -
>> -
>> - // terminate the shutdown ready member
>> - CloudControllerClient ccClient =
>> CloudControllerClient.getInstance();
>> - ccClient.terminate(memberId);
>> -
>> - // remove from active member list
>> - partitionCtxt.removeActiveMemberById(memberId);
>> -
>> - if (log.isInfoEnabled()) {
>> - log.info(String.format("Member is terminated
>> and removed from the active members list: [member] %s [partition] %s
>> [cluster] %s ",
>> - memberId, partitionId,
>> clusterId));
>> +
>> + TopologyManager.acquireReadLock();
>> +
>> + if(monitor.getClusterType() ==
>> ClusterType.VMServiceCluster
>> + || monitor.getClusterType() ==
>> ClusterType.VMLbCluster) {
>> +
>> + NetworkPartitionContext nwPartitionCtxt;
>> + nwPartitionCtxt = ((VMClusterMonitor)
>> monitor).getNetworkPartitionCtxt(memberReadyToShutdownEvent.getNetworkPartitionId());
>> +
>> + // start a new member in the same Partition
>> + String partitionId = ((VMClusterMonitor)
>> monitor).getPartitionOfMember(memberId);
>> + PartitionContext partitionCtxt =
>> nwPartitionCtxt.getPartitionCtxt(partitionId);
>> +
>> +
>> + // terminate the shutdown ready member
>> + CloudControllerClient ccClient =
>> CloudControllerClient.getInstance();
>> + ccClient.terminate(memberId);
>> +
>> + // remove from active member list
>> + partitionCtxt.removeActiveMemberById(memberId);
>> +
>> + if (log.isInfoEnabled()) {
>> + log.info(String.format("Member is
>> terminated and removed from the active members list: [member] %s
>> [partition] %s [cluster] %s ",
>> + memberId,
>> partitionId, clusterId));
>> + }
>> + } else if(monitor.getClusterType() ==
>> ClusterType.DockerServiceCluster) {
>> + KubernetesClusterContext kubernetesClusterContext
>> = ((ContainerClusterMonitor) monitor).getKubernetesClusterCtxt();
>> + //terminate the shutdown ready container
>> +
>> CloudControllerClient.getInstance().terminateContainer(memberId);
>> + //remove from active member list
>> +
>> kubernetesClusterContext.removeActiveMemberById(memberId);
>> +
>> + if (log.isInfoEnabled()) {
>> + log.info(String.format("Member is
>> terminated and removed from the active members list: [member] %s [kub
>> cluster] %s [cluster] %s ",
>> + memberId,
>> kubernetesClusterContext.getKubernetesClusterID(), clusterId));
>> + }
>> }
>> +
>> } catch (TerminationException e) {
>> log.error(e);
>> + } finally {
>> + TopologyManager.releaseReadLock();
>> }
>> }
>>
>> @@ -185,12 +223,8 @@ public class AutoscalerTopologyEventReceiver
>> implements Runnable {
>> TopologyManager.acquireReadLock();
>> Service service =
>> TopologyManager.getTopology().getService(e.getServiceName());
>> Cluster cluster =
>> service.getCluster(e.getClusterId());
>> -
>> if(AutoscalerContext.getInstance().kubernetesClusterMonitorExist(cluster.getClusterId()))
>> {
>> -
>> AutoscalerContext.getInstance().getKubernetesClusterMonitor(e.getClusterId()).setStatus(e.getStatus());
>> - } else
>> if(AutoscalerContext.getInstance().monitorExist((cluster.getClusterId()))) {
>> -
>> AutoscalerContext.getInstance().getMonitor(e.getClusterId()).setStatus(e.getStatus());
>> - } else if
>> (AutoscalerContext.getInstance().lbMonitorExist((cluster.getClusterId()))) {
>> -
>> AutoscalerContext.getInstance().getLBMonitor(e.getClusterId()).setStatus(e.getStatus());
>> +
>> if(AutoscalerContext.getInstance().clusterMonitorExist(cluster.getClusterId()))
>> {
>> +
>> AutoscalerContext.getInstance().getClusterMonitor(e.getClusterId()).setStatus(e.getStatus());
>> } else {
>> log.error("cluster monitor not exists for the
>> cluster: " + cluster.toString());
>> }
>> @@ -213,8 +247,7 @@ public class AutoscalerTopologyEventReceiver
>> implements Runnable {
>> String clusterId = e.getClusterId();
>> String deploymentPolicy = e.getDeploymentPolicy();
>>
>> - AbstractMonitor monitor = null;
>> - KubernetesClusterMonitor kubernetesClusterMonitor =
>> null;
>> + AbstractClusterMonitor monitor = null;
>>
>> if (e.isLbCluster()) {
>> DeploymentPolicy depPolicy =
>> PolicyManager.getInstance().getDeploymentPolicy(deploymentPolicy);
>> @@ -239,13 +272,9 @@ public class AutoscalerTopologyEventReceiver
>> implements Runnable {
>>
>> }
>> }
>> - monitor = AutoscalerContext.getInstance()
>> - .removeLbMonitor(clusterId);
>> -
>> - } else {
>> - monitor = AutoscalerContext.getInstance()
>> - .removeMonitor(clusterId);
>> }
>> +
>> + monitor =
>> AutoscalerContext.getInstance().removeClusterMonitor(clusterId);
>>
>> // runTerminateAllRule(monitor);
>> if (monitor != null) {
>> @@ -280,43 +309,73 @@ public class AutoscalerTopologyEventReceiver
>> implements Runnable {
>> String networkPartitionId =
>> e.getNetworkPartitionId();
>> String clusterId = e.getClusterId();
>> String partitionId = e.getPartitionId();
>> - AbstractMonitor monitor;
>> + String memberId = e.getMemberId();
>> + AbstractClusterMonitor monitor;
>> +
>> + AutoscalerContext asCtx =
>> AutoscalerContext.getInstance();
>>
>> - if
>> (AutoscalerContext.getInstance().monitorExist(clusterId)) {
>> - monitor =
>> AutoscalerContext.getInstance().getMonitor(clusterId);
>> + if(asCtx.clusterMonitorExist(clusterId)) {
>> + monitor = asCtx.getClusterMonitor(clusterId);
>> } else {
>> - //This is LB member
>> - monitor =
>> AutoscalerContext.getInstance().getLBMonitor(clusterId);
>> + if(log.isDebugEnabled()){
>> + log.debug(String.format("A cluster monitor
>> is not found in autoscaler context [cluster] %s", clusterId));
>> + }
>> + return;
>> }
>> +
>> + if(monitor.getClusterType() ==
>> ClusterType.VMServiceCluster
>> + || monitor.getClusterType() ==
>> ClusterType.VMLbCluster) {
>> +
>> + NetworkPartitionContext networkPartitionContext
>> = ((VMClusterMonitor) monitor).getNetworkPartitionCtxt(networkPartitionId);
>> +
>> + PartitionContext partitionContext =
>> networkPartitionContext.getPartitionCtxt(partitionId);
>> +
>> partitionContext.removeMemberStatsContext(memberId);
>> +
>> + if
>> (partitionContext.removeTerminationPendingMember(memberId)) {
>> + if (log.isDebugEnabled()) {
>> + log.debug(String.format("Member is
>> removed from termination pending members list: [member] %s", memberId));
>> + }
>> + } else if
>> (partitionContext.removePendingMember(memberId)) {
>> + if (log.isDebugEnabled()) {
>> + log.debug(String.format("Member is
>> removed from pending members list: [member] %s", memberId));
>> + }
>> + } else if
>> (partitionContext.removeActiveMemberById(memberId)) {
>> + log.warn(String.format("Member is in the
>> wrong list and it is removed from active members list", memberId));
>> + } else if
>> (partitionContext.removeObsoleteMember(memberId)){
>> + log.warn(String.format("Member's
>> obsolated timeout has been expired and it is removed from obsolated members
>> list", memberId));
>> + } else {
>> + log.warn(String.format("Member is not
>> available in any of the list active, pending and termination pending",
>> memberId));
>> + }
>>
>> - NetworkPartitionContext networkPartitionContext =
>> monitor.getNetworkPartitionCtxt(networkPartitionId);
>> -
>> - PartitionContext partitionContext =
>> networkPartitionContext.getPartitionCtxt(partitionId);
>> - String memberId = e.getMemberId();
>> - partitionContext.removeMemberStatsContext(memberId);
>> -
>> - if
>> (partitionContext.removeTerminationPendingMember(memberId)) {
>> - if (log.isDebugEnabled()) {
>> - log.debug(String.format("Member is removed
>> from termination pending members list: [member] %s", memberId));
>> + if (log.isInfoEnabled()) {
>> + log.info(String.format("Member stat context
>> has been removed successfully: [member] %s", memberId));
>> }
>> - } else if
>> (partitionContext.removePendingMember(memberId)) {
>> - if (log.isDebugEnabled()) {
>> - log.debug(String.format("Member is removed
>> from pending members list: [member] %s", memberId));
>> + } else if(monitor.getClusterType() ==
>> ClusterType.DockerServiceCluster) {
>> +
>> + KubernetesClusterContext kubernetesClusterContext
>> = ((ContainerClusterMonitor) monitor).getKubernetesClusterCtxt();
>> +
>> kubernetesClusterContext.removeMemberStatsContext(memberId);
>> +
>> + if
>> (kubernetesClusterContext.removeTerminationPendingMember(memberId)) {
>> + if (log.isDebugEnabled()) {
>> + log.debug(String.format("Member is
>> removed from termination pending members list: [member] %s", memberId));
>> + }
>> + } else if
>> (kubernetesClusterContext.removePendingMember(memberId)) {
>> + if (log.isDebugEnabled()) {
>> + log.debug(String.format("Member is
>> removed from pending members list: [member] %s", memberId));
>> + }
>> + } else if
>> (kubernetesClusterContext.removeActiveMemberById(memberId)) {
>> + log.warn(String.format("Member is in the
>> wrong list and it is removed from active members list", memberId));
>> + } else if
>> (kubernetesClusterContext.removeObsoleteMember(memberId)){
>> + log.warn(String.format("Member's
>> obsolated timeout has been expired and it is removed from obsolated members
>> list", memberId));
>> + } else {
>> + log.warn(String.format("Member is not
>> available in any of the list active, pending and termination pending",
>> memberId));
>> }
>> - } else if
>> (partitionContext.removeActiveMemberById(memberId)) {
>> - log.warn(String.format("Member is in the wrong
>> list and it is removed from active members list", memberId));
>> - } else if
>> (partitionContext.removeObsoleteMember(memberId)){
>> - log.warn(String.format("Member's obsolated
>> timeout has been expired and it is removed from obsolated members list",
>> memberId));
>> - } else {
>> - log.warn(String.format("Member is not available
>> in any of the list active, pending and termination pending", memberId));
>> - }
>>
>> - if (log.isInfoEnabled()) {
>> - log.info(String.format("Member stat context has
>> been removed successfully: [member] %s", memberId));
>> + if (log.isInfoEnabled()) {
>> + log.info(String.format("Member stat context
>> has been removed successfully: [member] %s", memberId));
>> + }
>> }
>> -// partitionContext.decrementCurrentActiveMemberCount(1);
>> -
>> -
>> +
>> } catch (Exception e) {
>> log.error("Error processing event", e);
>> } finally {
>> @@ -338,24 +397,37 @@ public class AutoscalerTopologyEventReceiver
>> implements Runnable {
>> String partitionId = e.getPartitionId();
>> String networkPartitionId =
>> e.getNetworkPartitionId();
>>
>> - PartitionContext partitionContext;
>> String clusterId = e.getClusterId();
>> - AbstractMonitor monitor;
>> -
>> - if
>> (AutoscalerContext.getInstance().monitorExist(clusterId)) {
>> - monitor =
>> AutoscalerContext.getInstance().getMonitor(clusterId);
>> - partitionContext =
>> monitor.getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
>> + AbstractClusterMonitor monitor;
>> +
>> + AutoscalerContext asCtx =
>> AutoscalerContext.getInstance();
>> + if(asCtx.clusterMonitorExist(clusterId)) {
>> + monitor = asCtx.getClusterMonitor(clusterId);
>> } else {
>> - monitor =
>> AutoscalerContext.getInstance().getLBMonitor(clusterId);
>> - partitionContext =
>> monitor.getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
>> - }
>> - partitionContext.addMemberStatsContext(new
>> MemberStatsContext(memberId));
>> - if (log.isInfoEnabled()) {
>> - log.info(String.format("Member stat context has
>> been added successfully: [member] %s", memberId));
>> + if(log.isDebugEnabled()){
>> + log.debug(String.format("A cluster monitor
>> is not found in autoscaler context [cluster] %s", clusterId));
>> + }
>> + return;
>> }
>> -// partitionContext.incrementCurrentActiveMemberCount(1);
>> -
>> partitionContext.movePendingMemberToActiveMembers(memberId);
>> -
>> +
>> + if (monitor.getClusterType() ==
>> ClusterType.VMServiceCluster) {
>> + PartitionContext partitionContext;
>> + partitionContext = ((VMClusterMonitor)
>> monitor).getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
>> + partitionContext.addMemberStatsContext(new
>> MemberStatsContext(memberId));
>> + if (log.isInfoEnabled()) {
>> + log.info(String.format("Member stat context
>> has been added successfully: [member] %s", memberId));
>> + }
>> +
>> partitionContext.movePendingMemberToActiveMembers(memberId);
>> + } else
>> if(monitor.getClusterType() == ClusterType.DockerServiceCluster) {
>> + KubernetesClusterContext
>> kubernetesClusterContext;
>> + kubernetesClusterContext
>> = ((ContainerClusterMonitor) monitor).getKubernetesClusterCtxt();
>> +
>> kubernetesClusterContext.addMemberStatsContext(new
>> MemberStatsContext(memberId));
>> + if (log.isInfoEnabled()) {
>> + log.info(String.format("Member stat context
>> has been added successfully: [member] %s", memberId));
>> + }
>> +
>> kubernetesClusterContext.movePendingMemberToActiveMembers(memberId);
>> + }
>> +
>> } catch (Exception e) {
>> log.error("Error processing event", e);
>> } finally {
>> @@ -368,42 +440,59 @@ public class AutoscalerTopologyEventReceiver
>> implements Runnable {
>> @Override
>> protected void onEvent(Event event) {
>> try {
>> + TopologyManager.acquireReadLock();
>> +
>> MemberReadyToShutdownEvent memberReadyToShutdownEvent
>> = (MemberReadyToShutdownEvent)event;
>> AutoscalerContext asCtx =
>> AutoscalerContext.getInstance();
>> - AbstractMonitor monitor;
>> + AbstractClusterMonitor monitor;
>> String clusterId =
>> memberReadyToShutdownEvent.getClusterId();
>> String memberId =
>> memberReadyToShutdownEvent.getMemberId();
>>
>> - if(asCtx.monitorExist(clusterId)){
>> - monitor = asCtx.getMonitor(clusterId);
>> - }else if(asCtx.lbMonitorExist(clusterId)){
>> - monitor = asCtx.getLBMonitor(clusterId);
>> - }else{
>> + if(asCtx.clusterMonitorExist(clusterId)) {
>> + monitor = asCtx.getClusterMonitor(clusterId);
>> + } else {
>> if(log.isDebugEnabled()){
>> log.debug(String.format("A cluster monitor is
>> not found in autoscaler context [cluster] %s", clusterId));
>> }
>> return;
>> }
>>
>> - NetworkPartitionContext nwPartitionCtxt;
>> - nwPartitionCtxt =
>> monitor.getNetworkPartitionCtxt(memberReadyToShutdownEvent.getNetworkPartitionId());
>> + if(monitor.getClusterType() ==
>> ClusterType.VMServiceCluster
>> + || monitor.getClusterType() ==
>> ClusterType.VMLbCluster) {
>> +
>> + NetworkPartitionContext nwPartitionCtxt;
>> + nwPartitionCtxt = ((VMClusterMonitor)
>> monitor).getNetworkPartitionCtxt(memberReadyToShutdownEvent.getNetworkPartitionId());
>>
>> - // start a new member in the same Partition
>> - String partitionId =
>> monitor.getPartitionOfMember(memberId);
>> - PartitionContext partitionCtxt =
>> nwPartitionCtxt.getPartitionCtxt(partitionId);
>> + // start a new member in the same Partition
>> + String partitionId = ((VMClusterMonitor)
>> monitor).getPartitionOfMember(memberId);
>> + PartitionContext partitionCtxt =
>> nwPartitionCtxt.getPartitionCtxt(partitionId);
>>
>>
>> - // terminate the shutdown ready member
>> - CloudControllerClient ccClient =
>> CloudControllerClient.getInstance();
>> - ccClient.terminate(memberId);
>> + // terminate the shutdown ready member
>> + CloudControllerClient ccClient =
>> CloudControllerClient.getInstance();
>> + ccClient.terminate(memberId);
>>
>> - // remove from active member list
>> - partitionCtxt.removeActiveMemberById(memberId);
>> + // remove from active member list
>> + partitionCtxt.removeActiveMemberById(memberId);
>>
>> - if (log.isInfoEnabled()) {
>> - log.info(String.format("Member is terminated and
>> removed from the active members list: [member] %s [partition] %s [cluster]
>> %s ",
>> - memberId, partitionId,
>> clusterId));
>> + if (log.isInfoEnabled()) {
>> + log.info(String.format("Member is terminated
>> and removed from the active members list: [member] %s [partition] %s
>> [cluster] %s ",
>> + memberId, partitionId,
>> clusterId));
>> + }
>> + } else if(monitor.getClusterType() ==
>> ClusterType.DockerServiceCluster) {
>> + KubernetesClusterContext
>> kubernetesClusterContext;
>> + kubernetesClusterContext =
>> ((ContainerClusterMonitor) monitor).getKubernetesClusterCtxt();
>> + // terminate the shutdown ready member
>> +
>> CloudControllerClient.getInstance().terminateContainer(memberId);
>> + // remove from active member list
>> +
>> kubernetesClusterContext.removeActiveMemberById(memberId);
>> +
>> + if (log.isInfoEnabled()) {
>> + log.info(String.format("Member is terminated
>> and removed from the active members list: [member] %s [kub cluster] %s
>> [cluster] %s ",
>> + memberId,
>> kubernetesClusterContext.getKubernetesClusterID(), clusterId));
>> + }
>> }
>> +
>> } catch (TerminationException e) {
>> log.error(e);
>> }
>> @@ -424,22 +513,38 @@ public class AutoscalerTopologyEventReceiver
>> implements Runnable {
>> String partitionId = e.getPartitionId();
>> String networkPartitionId =
>> e.getNetworkPartitionId();
>>
>> - PartitionContext partitionContext;
>> String clusterId = e.getClusterId();
>> - AbstractMonitor monitor;
>> -
>> - if
>> (AutoscalerContext.getInstance().monitorExist(clusterId)) {
>> - monitor =
>> AutoscalerContext.getInstance().getMonitor(clusterId);
>> - partitionContext =
>> monitor.getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
>> + AbstractClusterMonitor monitor;
>> +
>> + AutoscalerContext asCtx =
>> AutoscalerContext.getInstance();
>> + if (asCtx.clusterMonitorExist(clusterId)) {
>> + monitor =
>> AutoscalerContext.getInstance().getClusterMonitor(clusterId);
>> } else {
>> - monitor =
>> AutoscalerContext.getInstance().getLBMonitor(clusterId);
>> - partitionContext =
>> monitor.getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
>> + if(log.isDebugEnabled()){
>> + log.debug(String.format("A cluster monitor
>> is not found in autoscaler context [cluster] %s", clusterId));
>> + }
>> + return;
>> }
>> - partitionContext.addMemberStatsContext(new
>> MemberStatsContext(memberId));
>> - if (log.isDebugEnabled()) {
>> - log.debug(String.format("Member has been moved
>> as pending termination: [member] %s", memberId));
>> +
>> + if(monitor.getClusterType() ==
>> ClusterType.VMServiceCluster
>> + || monitor.getClusterType() ==
>> ClusterType.VMLbCluster) {
>> +
>> + PartitionContext partitionContext;
>> + partitionContext = ((VMClusterMonitor)
>> monitor).getNetworkPartitionCtxt(networkPartitionId).getPartitionCtxt(partitionId);
>> + partitionContext.addMemberStatsContext(new
>> MemberStatsContext(memberId));
>> + if (log.isDebugEnabled()) {
>> + log.debug(String.format("Member has been
>> moved as pending termination: [member] %s", memberId));
>> + }
>> +
>> partitionContext.moveActiveMemberToTerminationPendingMembers(memberId);
>> + } else if(monitor.getClusterType() ==
>> ClusterType.DockerServiceCluster) {
>> + KubernetesClusterContext kubernetesClusterContext;
>> + kubernetesClusterContext =
>> ((ContainerClusterMonitor) monitor).getKubernetesClusterCtxt();
>> +
>> kubernetesClusterContext.addMemberStatsContext(new
>> MemberStatsContext(memberId));
>> + if (log.isDebugEnabled()) {
>> + log.debug(String.format("Member has been
>> moved as pending termination: [member] %s", memberId));
>> + }
>> +
>> kubernetesClusterContext.moveActiveMemberToTerminationPendingMembers(memberId);
>> }
>> -
>> partitionContext.moveActiveMemberToTerminationPendingMembers(memberId);
>>
>> } catch (Exception e) {
>> log.error("Error processing event", e);
>> @@ -471,64 +576,15 @@ public class AutoscalerTopologyEventReceiver
>> implements Runnable {
>> });
>> }
>>
>> - private class LBClusterMonitorAdder implements Runnable {
>> - private Cluster cluster;
>> -
>> - public LBClusterMonitorAdder(Cluster cluster) {
>> - this.cluster = cluster;
>> - }
>> -
>> - public void run() {
>> - LbClusterMonitor monitor = null;
>> - int retries = 5;
>> - boolean success = false;
>> - do {
>> - try {
>> - Thread.sleep(5000);
>> - } catch (InterruptedException e1) {
>> - }
>> - try {
>> - monitor =
>> AutoscalerUtil.getLBClusterMonitor(cluster);
>> - success = true;
>> -
>> - } catch (PolicyValidationException e) {
>> - String msg = "LB Cluster monitor creation failed for
>> cluster: " + cluster.getClusterId();
>> - log.debug(msg, e);
>> - retries--;
>> -
>> - } catch (PartitionValidationException e) {
>> - String msg = "LB Cluster monitor creation failed for
>> cluster: " + cluster.getClusterId();
>> - log.debug(msg, e);
>> - retries--;
>> - }
>> - } while (!success && retries <= 0);
>> -
>> - if (monitor == null) {
>> - String msg = "LB Cluster monitor creation failed, even
>> after retrying for 5 times, "
>> - + "for cluster: " + cluster.getClusterId();
>> - log.error(msg);
>> - throw new RuntimeException(msg);
>> - }
>> -
>> - Thread th = new Thread(monitor);
>> - th.start();
>> - AutoscalerContext.getInstance().addLbMonitor(monitor);
>> - if (log.isInfoEnabled()) {
>> - log.info(String.format("LB Cluster monitor has been
>> added successfully: [cluster] %s",
>> - cluster.getClusterId()));
>> - }
>> - }
>> - }
>> -
>> private class ClusterMonitorAdder implements Runnable {
>> private Cluster cluster;
>> -
>> + private String clusterMonitorType;
>> public ClusterMonitorAdder(Cluster cluster) {
>> this.cluster = cluster;
>> }
>>
>> public void run() {
>> - ClusterMonitor monitor = null;
>> + AbstractClusterMonitor monitor = null;
>> int retries = 5;
>> boolean success = false;
>> do {
>> @@ -538,68 +594,23 @@ public class AutoscalerTopologyEventReceiver
>> implements Runnable {
>> }
>>
>> try {
>> - monitor = AutoscalerUtil.getClusterMonitor(cluster);
>> + monitor = ClusterMonitorFactory.getMonitor(cluster);
>> success = true;
>> -
>> + clusterMonitorType = monitor.getClusterType().name();
>> } catch (PolicyValidationException e) {
>> - String msg = "Cluster monitor creation failed for
>> cluster: " + cluster.getClusterId();
>> + String msg = clusterMonitorType +" monitor creation
>> failed for cluster: " + cluster.getClusterId();
>> log.debug(msg, e);
>> retries--;
>>
>> } catch (PartitionValidationException e) {
>> - String msg = "Cluster monitor creation failed for
>> cluster: " + cluster.getClusterId();
>> - log.debug(msg, e);
>> - retries--;
>> - }
>> - } while (!success && retries != 0);
>> -
>> - if (monitor == null) {
>> - String msg = "Cluster monitor creation failed, even
>> after retrying for 5 times, "
>> - + "for cluster: " + cluster.getClusterId();
>> - log.error(msg);
>> - throw new RuntimeException(msg);
>> - }
>> -
>> - Thread th = new Thread(monitor);
>> - th.start();
>> - AutoscalerContext.getInstance().addMonitor(monitor);
>> - if (log.isInfoEnabled()) {
>> - log.info(String.format("Cluster monitor has been added
>> successfully: [cluster] %s",
>> - cluster.getClusterId()));
>> - }
>> - }
>> - }
>> -
>> - private class KubernetesClusterMonitorAdder implements Runnable {
>> - private Cluster cluster;
>> -
>> - public KubernetesClusterMonitorAdder(Cluster cluster) {
>> - this.cluster = cluster;
>> - }
>> -
>> - public void run() {
>> - KubernetesClusterMonitor monitor = null;
>> - int retries = 5;
>> - boolean success = false;
>> - do {
>> - try {
>> - Thread.sleep(5000);
>> - } catch (InterruptedException e1) {
>> - }
>> -
>> - try {
>> - monitor =
>> AutoscalerUtil.getKubernetesClusterMonitor(cluster);
>> - success = true;
>> -
>> - } catch (Exception e) {
>> - String msg = "Kubernetes cluster monitor creation
>> failed for cluster: " + cluster.getClusterId();
>> + String msg = clusterMonitorType +" monitor creation
>> failed for cluster: " + cluster.getClusterId();
>> log.debug(msg, e);
>> retries--;
>> }
>> } while (!success && retries != 0);
>>
>> if (monitor == null) {
>> - String msg = "Kubernetes cluster monitor creation
>> failed, even after retrying for 5 times, "
>> + String msg = clusterMonitorType +" monitor creation
>> failed, even after retrying for 5 times, "
>> + "for cluster: " + cluster.getClusterId();
>> log.error(msg);
>> throw new RuntimeException(msg);
>> @@ -607,16 +618,16 @@ public class AutoscalerTopologyEventReceiver
>> implements Runnable {
>>
>> Thread th = new Thread(monitor);
>> th.start();
>> -
>> AutoscalerContext.getInstance().addKubernetesClusterMonitor(monitor);
>> + AutoscalerContext.getInstance().addClusterMonitor(monitor);
>> if (log.isInfoEnabled()) {
>> - log.info(String.format("Kubernetes cluster monitor has
>> been added successfully: [cluster] %s",
>> - cluster.getClusterId()));
>> + log.info(String.format("%s monitor has been added
>> successfully: [cluster] %s",
>> + clusterMonitorType, cluster.getClusterId()));
>> }
>> }
>> }
>> -
>> +
>> @SuppressWarnings("unused")
>> - private void runTerminateAllRule(AbstractMonitor monitor) {
>> + private void runTerminateAllRule(VMClusterMonitor monitor) {
>>
>> FactHandle terminateAllFactHandle = null;
>>
>> @@ -639,16 +650,9 @@ public class AutoscalerTopologyEventReceiver
>> implements Runnable {
>>
>> protected synchronized void startClusterMonitor(Cluster cluster) {
>> Thread th = null;
>> - if (cluster.isKubernetesCluster()
>> - &&
>> !AutoscalerContext.getInstance().kubernetesClusterMonitorExist(cluster.getClusterId()))
>> {
>> - th = new Thread(new
>> KubernetesClusterMonitorAdder(cluster));
>> - } else if (cluster.isLbCluster()
>> - &&
>> !AutoscalerContext.getInstance().lbMonitorExist(cluster.getClusterId())) {
>> - th = new Thread(new LBClusterMonitorAdder(cluster));
>> - } else if (!cluster.isLbCluster() &&
>> !cluster.isKubernetesCluster()
>> - &&
>> !AutoscalerContext.getInstance().monitorExist(cluster.getClusterId())) {
>> - th = new Thread(new ClusterMonitorAdder(cluster));
>> - }
>> + if
>> (!AutoscalerContext.getInstance().clusterMonitorExist(cluster.getClusterId()))
>> {
>> + th = new Thread(new ClusterMonitorAdder(cluster));
>> + }
>> if (th != null) {
>> th.start();
>> try {
>>
>>
>> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
>> ----------------------------------------------------------------------
>> diff --git
>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
>> new file mode 100644
>> index 0000000..00796f1
>> --- /dev/null
>> +++
>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
>> @@ -0,0 +1,127 @@
>> +package org.apache.stratos.autoscaler.monitor;
>> +
>> +import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
>> +import org.apache.stratos.common.enums.ClusterType;
>> +import org.apache.stratos.messaging.domain.topology.ClusterStatus;
>> +import org.drools.runtime.StatefulKnowledgeSession;
>> +import org.drools.runtime.rule.FactHandle;
>> +
>> +public abstract class AbstractClusterMonitor implements Runnable{
>> +
>> + private String clusterId;
>> + private String serviceId;
>> + private ClusterType clusterType;
>> + private ClusterStatus status;
>> + private int monitorInterval;
>> +
>> + protected FactHandle minCheckFactHandle;
>> + protected FactHandle scaleCheckFactHandle;
>> + private StatefulKnowledgeSession minCheckKnowledgeSession;
>> + private StatefulKnowledgeSession scaleCheckKnowledgeSession;
>> + private boolean isDestroyed;
>> +
>> + private AutoscalerRuleEvaluator autoscalerRuleEvaluator;
>> +
>> + protected AbstractClusterMonitor(String clusterId, String
>> serviceId, ClusterType clusterType,
>> + AutoscalerRuleEvaluator autoscalerRuleEvaluator) {
>> +
>> + super();
>> + this.clusterId = clusterId;
>> + this.serviceId = serviceId;
>> + this.clusterType = clusterType;
>> + this.autoscalerRuleEvaluator = autoscalerRuleEvaluator;
>> + this.scaleCheckKnowledgeSession =
>> autoscalerRuleEvaluator.getScaleCheckStatefulSession();
>> + this.minCheckKnowledgeSession =
>> autoscalerRuleEvaluator.getMinCheckStatefulSession();
>> + }
>> +
>> + protected abstract void readConfigurations();
>> + protected abstract void monitor();
>> + public abstract void destroy();
>> +
>> + public String getClusterId() {
>> + return clusterId;
>> + }
>> +
>> + public void setClusterId(String clusterId) {
>> + this.clusterId = clusterId;
>> + }
>> +
>> + public void setStatus(ClusterStatus status) {
>> + this.status = status;
>> + }
>> +
>> + public ClusterType getClusterType() {
>> + return clusterType;
>> + }
>> +
>> + public ClusterStatus getStatus() {
>> + return status;
>> + }
>> +
>> + public String getServiceId() {
>> + return serviceId;
>> + }
>> +
>> + public void setServiceId(String serviceId) {
>> + this.serviceId = serviceId;
>> + }
>> +
>> + public int getMonitorInterval() {
>> + return monitorInterval;
>> + }
>> +
>> + public void setMonitorInterval(int monitorInterval) {
>> + this.monitorInterval = monitorInterval;
>> + }
>> +
>> + public FactHandle getMinCheckFactHandle() {
>> + return minCheckFactHandle;
>> + }
>> +
>> + public void setMinCheckFactHandle(FactHandle minCheckFactHandle) {
>> + this.minCheckFactHandle = minCheckFactHandle;
>> + }
>> +
>> + public FactHandle getScaleCheckFactHandle() {
>> + return scaleCheckFactHandle;
>> + }
>> +
>> + public void setScaleCheckFactHandle(FactHandle
>> scaleCheckFactHandle) {
>> + this.scaleCheckFactHandle = scaleCheckFactHandle;
>> + }
>> +
>> + public StatefulKnowledgeSession getMinCheckKnowledgeSession() {
>> + return minCheckKnowledgeSession;
>> + }
>> +
>> + public void setMinCheckKnowledgeSession(
>> + StatefulKnowledgeSession
>> minCheckKnowledgeSession) {
>> + this.minCheckKnowledgeSession = minCheckKnowledgeSession;
>> + }
>> +
>> + public StatefulKnowledgeSession getScaleCheckKnowledgeSession() {
>> + return scaleCheckKnowledgeSession;
>> + }
>> +
>> + public void setScaleCheckKnowledgeSession(
>> + StatefulKnowledgeSession
>> scaleCheckKnowledgeSession) {
>> + this.scaleCheckKnowledgeSession =
>> scaleCheckKnowledgeSession;
>> + }
>> +
>> + public boolean isDestroyed() {
>> + return isDestroyed;
>> + }
>> +
>> + public void setDestroyed(boolean isDestroyed) {
>> + this.isDestroyed = isDestroyed;
>> + }
>> +
>> + public AutoscalerRuleEvaluator getAutoscalerRuleEvaluator() {
>> + return autoscalerRuleEvaluator;
>> + }
>> +
>> + public void setAutoscalerRuleEvaluator(
>> + AutoscalerRuleEvaluator autoscalerRuleEvaluator) {
>> + this.autoscalerRuleEvaluator = autoscalerRuleEvaluator;
>> + }
>> +}
>>
>>
>> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractMonitor.java
>> ----------------------------------------------------------------------
>> diff --git
>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractMonitor.java
>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractMonitor.java
>> deleted file mode 100644
>> index c1441bb..0000000
>> ---
>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractMonitor.java
>> +++ /dev/null
>> @@ -1,203 +0,0 @@
>> -/*
>> - * Licensed to the Apache Software Foundation (ASF) under one
>> - * or more contributor license agreements. See the NOTICE file
>> - * distributed with this work for additional information
>> - * regarding copyright ownership. The ASF licenses this file
>> - * to you under the Apache License, Version 2.0 (the
>> - * "License"); you may not use this file except in compliance
>> - * with the License. You may obtain a copy of the License at
>> - *
>> - * http://www.apache.org/licenses/LICENSE-2.0
>> - *
>> - * Unless required by applicable law or agreed to in writing,
>> - * software distributed under the License is distributed on an
>> - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> - * KIND, either express or implied. See the License for the
>> - * specific language governing permissions and limitations
>> - * under the License.
>> - */
>> -package org.apache.stratos.autoscaler.monitor;
>> -
>> -import java.util.Map;
>> -
>> -import org.apache.commons.configuration.XMLConfiguration;
>> -import org.apache.commons.logging.Log;
>> -import org.apache.commons.logging.LogFactory;
>> -import org.apache.stratos.autoscaler.NetworkPartitionContext;
>> -import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
>> -import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
>> -import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
>> -import org.apache.stratos.autoscaler.util.AutoScalerConstants;
>> -import org.apache.stratos.autoscaler.util.ConfUtil;
>> -import org.apache.stratos.messaging.domain.topology.Cluster;
>> -import org.apache.stratos.messaging.domain.topology.Member;
>> -import org.apache.stratos.messaging.domain.topology.Service;
>> -import
>> org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
>> -import org.drools.runtime.StatefulKnowledgeSession;
>> -import org.drools.runtime.rule.FactHandle;
>> -
>> -/**
>> - * Is responsible for monitoring a service cluster. This runs
>> periodically
>> - * and perform minimum instance check and scaling check using the
>> underlying
>> - * rules engine.
>> - *
>> - */
>> - abstract public class AbstractMonitor implements Runnable{
>> -
>> - private static final Log log =
>> LogFactory.getLog(AbstractMonitor.class);
>> - // Map<NetworkpartitionId, Network Partition Context>
>> - protected Map<String, NetworkPartitionContext>
>> networkPartitionCtxts;
>> - protected DeploymentPolicy deploymentPolicy;
>> - protected AutoscalePolicy autoscalePolicy;
>> -
>> -
>> - protected FactHandle minCheckFactHandle;
>> - protected FactHandle scaleCheckFactHandle;
>> -
>> - protected StatefulKnowledgeSession minCheckKnowledgeSession;
>> - protected StatefulKnowledgeSession scaleCheckKnowledgeSession;
>> - protected boolean isDestroyed;
>> -
>> - protected String clusterId;
>> - protected String serviceId;
>> -
>> - protected AutoscalerRuleEvaluator autoscalerRuleEvaluator;
>> -
>> - // time intereval between two runs of the Monitor. Default is
>> 90000ms.
>> - protected int monitorInterval;
>> -
>> - public AbstractMonitor() {
>> - readConfigurations();
>> - }
>> -
>> - private void readConfigurations () {
>> -
>> - XMLConfiguration conf =
>> ConfUtil.getInstance(null).getConfiguration();
>> - monitorInterval =
>> conf.getInt(AutoScalerConstants.AUTOSCALER_MONITOR_INTERVAL, 90000);
>> - if (log.isDebugEnabled()) {
>> - log.debug("Cluster Monitor task interval: " +
>> getMonitorInterval());
>> - }
>> - }
>> -
>> - @Override
>> - public void run() {
>> - // TODO Auto-generated method stub
>> -
>> - }
>> -
>> -
>> - public NetworkPartitionContext 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;
>> - }
>> -
>> - public String getPartitionOfMember(String memberId){
>> - for(Service service:
>> TopologyManager.getTopology().getServices()){
>> - for(Cluster cluster: service.getClusters()){
>> - if(cluster.memberExists(memberId)){
>> - return cluster.getMember(memberId).getPartitionId();
>> - }
>> - }
>> - }
>> - return null;
>> - }
>> -
>> - public void destroy() {
>> - minCheckKnowledgeSession.dispose();
>> - scaleCheckKnowledgeSession.dispose();
>> - setDestroyed(true);
>> - if(log.isDebugEnabled()) {
>> - log.debug("Cluster Monitor Drools session has been disposed.
>> "+this.toString());
>> - }
>> - }
>> -
>> - public boolean isDestroyed() {
>> - return isDestroyed;
>> - }
>> -
>> - public void setDestroyed(boolean isDestroyed) {
>> - this.isDestroyed = isDestroyed;
>> - }
>> -
>> - public String getServiceId() {
>> - return serviceId;
>> - }
>> -
>> - public void setServiceId(String serviceId) {
>> - this.serviceId = serviceId;
>> - }
>> -
>> - 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 String getClusterId() {
>> - return clusterId;
>> - }
>> -
>> - public void setClusterId(String clusterId) {
>> - this.clusterId = clusterId;
>> - }
>> -
>> - public Map<String, NetworkPartitionContext>
>> getNetworkPartitionCtxts() {
>> - return networkPartitionCtxts;
>> - }
>> -
>> - public NetworkPartitionContext getNetworkPartitionCtxt(String
>> networkPartitionId) {
>> - return networkPartitionCtxts.get(networkPartitionId);
>> - }
>> -
>> - public void setPartitionCtxt(Map<String, NetworkPartitionContext>
>> partitionCtxt) {
>> - this.networkPartitionCtxts = partitionCtxt;
>> - }
>> -
>> - public boolean partitionCtxtAvailable(String partitionId) {
>> - return networkPartitionCtxts.containsKey(partitionId);
>> - }
>> -
>> - public void addNetworkPartitionCtxt(NetworkPartitionContext ctxt) {
>> - this.networkPartitionCtxts.put(ctxt.getId(), ctxt);
>> - }
>> -
>> - public NetworkPartitionContext getPartitionCtxt(String id) {
>> - return this.networkPartitionCtxts.get(id);
>> - }
>> -
>> - public StatefulKnowledgeSession getMinCheckKnowledgeSession() {
>> - return minCheckKnowledgeSession;
>> - }
>> -
>> - public void setMinCheckKnowledgeSession(StatefulKnowledgeSession
>> minCheckKnowledgeSession) {
>> - this.minCheckKnowledgeSession = minCheckKnowledgeSession;
>> - }
>> -
>> - public FactHandle getMinCheckFactHandle() {
>> - return minCheckFactHandle;
>> - }
>> -
>> - public void setMinCheckFactHandle(FactHandle minCheckFactHandle) {
>> - this.minCheckFactHandle = minCheckFactHandle;
>> - }
>> -
>> - public int getMonitorInterval() {
>> - return monitorInterval;
>> - }
>> -}
>> \ No newline at end of file
>>
>>
>> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitor.java
>> ----------------------------------------------------------------------
>> diff --git
>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitor.java
>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitor.java
>> deleted file mode 100644
>> index 5bb478e..0000000
>> ---
>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitor.java
>> +++ /dev/null
>> @@ -1,223 +0,0 @@
>> -/*
>> - * Licensed to the Apache Software Foundation (ASF) under one
>> - * or more contributor license agreements. See the NOTICE file
>> - * distributed with this work for additional information
>> - * regarding copyright ownership. The ASF licenses this file
>> - * to you under the Apache License, Version 2.0 (the
>> - * "License"); you may not use this file except in compliance
>> - * with the License. You may obtain a copy of the License at
>> - *
>> - * http://www.apache.org/licenses/LICENSE-2.0
>> - *
>> - * Unless required by applicable law or agreed to in writing,
>> - * software distributed under the License is distributed on an
>> - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> - * KIND, either express or implied. See the License for the
>> - * specific language governing permissions and limitations
>> - * under the License.
>> - */
>> -package org.apache.stratos.autoscaler.monitor;
>> -
>> -import org.apache.commons.logging.Log;
>> -import org.apache.commons.logging.LogFactory;
>> -import org.apache.stratos.autoscaler.NetworkPartitionContext;
>> -import org.apache.stratos.autoscaler.PartitionContext;
>> -import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
>> -import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
>> -import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
>> -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.messaging.domain.topology.ClusterStatus;
>> -
>> -import java.util.ArrayList;
>> -import java.util.List;
>> -import java.util.concurrent.ConcurrentHashMap;
>> -
>> -/**
>> - * Is responsible for monitoring a service cluster. This runs
>> periodically
>> - * and perform minimum instance check and scaling check using the
>> underlying
>> - * rules engine.
>> - *
>> - */
>> -public class ClusterMonitor extends AbstractMonitor {
>> -
>> - private static final Log log =
>> LogFactory.getLog(ClusterMonitor.class);
>> - private String lbReferenceType;
>> - private boolean hasPrimary;
>> - private ClusterStatus status;
>> -
>> - public ClusterMonitor(String clusterId, String serviceId,
>> DeploymentPolicy deploymentPolicy,
>> - AutoscalePolicy autoscalePolicy) {
>> - this.clusterId = clusterId;
>> - this.serviceId = serviceId;
>> -
>> - this.autoscalerRuleEvaluator = new AutoscalerRuleEvaluator();
>> - this.scaleCheckKnowledgeSession =
>> autoscalerRuleEvaluator.getScaleCheckStatefulSession();
>> - this.minCheckKnowledgeSession =
>> autoscalerRuleEvaluator.getMinCheckStatefulSession();
>> -
>> - this.deploymentPolicy = deploymentPolicy;
>> - this.autoscalePolicy = autoscalePolicy;
>> - networkPartitionCtxts = new ConcurrentHashMap<String,
>> NetworkPartitionContext>();
>> - }
>> -
>> -
>> -
>> - @Override
>> - public void run() {
>> -
>> - try {
>> - // TODO make this configurable,
>> - // this is the delay the min check of normal cluster monitor
>> to wait until LB monitor is added
>> - Thread.sleep(60000);
>> - } catch (InterruptedException ignore) {
>> - }
>> -
>> - while (!isDestroyed()) {
>> - if (log.isDebugEnabled()) {
>> - log.debug("Cluster monitor is running.. " +
>> this.toString());
>> - }
>> - try {
>> - if(!ClusterStatus.In_Maintenance.equals(status)) {
>> - monitor();
>> - } else {
>> - if (log.isDebugEnabled()) {
>> - log.debug("Cluster monitor is suspended as the
>> cluster is in " +
>> - ClusterStatus.In_Maintenance + "
>> mode......");
>> - }
>> - }
>> - } catch (Exception e) {
>> - log.error("Cluster monitor: Monitor failed." +
>> this.toString(), e);
>> - }
>> - try {
>> - Thread.sleep(monitorInterval);
>> - } catch (InterruptedException ignore) {
>> - }
>> - }
>> - }
>> -
>> - private boolean isPrimaryMember(MemberContext memberContext){
>> - Properties props = memberContext.getProperties();
>> - if (log.isDebugEnabled()) {
>> - log.debug(" Properties [" + props + "] ");
>> - }
>> - if (props != null && props.getProperties() != null) {
>> - for (Property prop : props.getProperties()) {
>> - if (prop.getName().equals("PRIMARY")) {
>> - if (Boolean.parseBoolean(prop.getValue())) {
>> - log.debug("Adding member id [" +
>> memberContext.getMemberId() + "] " +
>> - "member instance id [" +
>> memberContext.getInstanceId() + "] as a primary member");
>> - return true;
>> - }
>> - }
>> - }
>> - }
>> - return false;
>> - }
>> -
>> - private void monitor() {
>> -
>> - //TODO make this concurrent
>> - for (NetworkPartitionContext networkPartitionContext :
>> networkPartitionCtxts.values()) {
>> - // store primary members in the network partition context
>> - List<String> primaryMemberListInNetworkPartition = new
>> ArrayList<String>();
>> -
>> - //minimum check per partition
>> - for (PartitionContext partitionContext :
>> networkPartitionContext.getPartitionCtxts().values()) {
>> - // store primary members in the partition context
>> - List<String> primaryMemberListInPartition = new
>> ArrayList<String>();
>> - // get active primary members in this partition context
>> - for (MemberContext memberContext :
>> partitionContext.getActiveMembers()) {
>> - if (isPrimaryMember(memberContext)){
>> -
>> primaryMemberListInPartition.add(memberContext.getMemberId());
>> - }
>> - }
>> - // get pending primary members in this partition context
>> - for (MemberContext memberContext :
>> partitionContext.getPendingMembers()) {
>> - if (isPrimaryMember(memberContext)){
>> -
>> primaryMemberListInPartition.add(memberContext.getMemberId());
>> - }
>> - }
>> -
>> primaryMemberListInNetworkPartition.addAll(primaryMemberListInPartition);
>> - minCheckKnowledgeSession.setGlobal("clusterId",
>> clusterId);
>> - minCheckKnowledgeSession.setGlobal("lbRef",
>> lbReferenceType);
>> - minCheckKnowledgeSession.setGlobal("isPrimary",
>> hasPrimary);
>> - minCheckKnowledgeSession.setGlobal("primaryMemberCount",
>> primaryMemberListInPartition.size());
>> -
>> - if (log.isDebugEnabled()) {
>> - log.debug(String.format("Running minimum check for
>> partition %s ", partitionContext.getPartitionId()));
>> - }
>> -
>> - minCheckFactHandle =
>> AutoscalerRuleEvaluator.evaluateMinCheck(minCheckKnowledgeSession
>> - , minCheckFactHandle, partitionContext);
>> -
>> - }
>> -
>> - boolean rifReset = networkPartitionContext.isRifReset();
>> - boolean memoryConsumptionReset =
>> networkPartitionContext.isMemoryConsumptionReset();
>> - boolean loadAverageReset =
>> networkPartitionContext.isLoadAverageReset();
>> - if (log.isDebugEnabled()) {
>> - log.debug("flag of rifReset: " + rifReset + " flag of
>> memoryConsumptionReset" + memoryConsumptionReset
>> - + " flag of loadAverageReset" +
>> loadAverageReset);
>> - }
>> - if (rifReset || memoryConsumptionReset || loadAverageReset) {
>> - scaleCheckKnowledgeSession.setGlobal("clusterId",
>> clusterId);
>> -
>> //scaleCheckKnowledgeSession.setGlobal("deploymentPolicy",
>> deploymentPolicy);
>> - scaleCheckKnowledgeSession.setGlobal("autoscalePolicy",
>> autoscalePolicy);
>> - scaleCheckKnowledgeSession.setGlobal("rifReset",
>> rifReset);
>> - scaleCheckKnowledgeSession.setGlobal("mcReset",
>> memoryConsumptionReset);
>> - scaleCheckKnowledgeSession.setGlobal("laReset",
>> loadAverageReset);
>> - scaleCheckKnowledgeSession.setGlobal("lbRef",
>> lbReferenceType);
>> - scaleCheckKnowledgeSession.setGlobal("isPrimary", false);
>> - scaleCheckKnowledgeSession.setGlobal("primaryMembers",
>> primaryMemberListInNetworkPartition);
>> -
>> - if (log.isDebugEnabled()) {
>> - log.debug(String.format("Running scale check for
>> network partition %s ", networkPartitionContext.getId()));
>> - log.debug(" Primary members : " +
>> primaryMemberListInNetworkPartition);
>> - }
>> -
>> - scaleCheckFactHandle =
>> AutoscalerRuleEvaluator.evaluateScaleCheck(scaleCheckKnowledgeSession
>> - , scaleCheckFactHandle, networkPartitionContext);
>> -
>> - networkPartitionContext.setRifReset(false);
>> - networkPartitionContext.setMemoryConsumptionReset(false);
>> - networkPartitionContext.setLoadAverageReset(false);
>> - } else if (log.isDebugEnabled()) {
>> - log.debug(String.format("Scale rule will not run since
>> the LB statistics have not received before this " +
>> - "cycle for network partition %s",
>> networkPartitionContext.getId()));
>> - }
>> - }
>> - }
>> -
>> - @Override
>> - public String toString() {
>> - return "ClusterMonitor [clusterId=" + clusterId + ", serviceId="
>> + serviceId +
>> - ", deploymentPolicy=" + deploymentPolicy + ",
>> autoscalePolicy=" + autoscalePolicy +
>> - ", lbReferenceType=" + lbReferenceType +
>> - ", hasPrimary=" + hasPrimary + " ]";
>> - }
>> -
>> - public String getLbReferenceType() {
>> - return lbReferenceType;
>> - }
>> -
>> - public void setLbReferenceType(String lbReferenceType) {
>> - this.lbReferenceType = lbReferenceType;
>> - }
>> -
>> - public boolean isHasPrimary() {
>> - return hasPrimary;
>> - }
>> -
>> - public void setHasPrimary(boolean hasPrimary) {
>> - this.hasPrimary = hasPrimary;
>> - }
>> -
>> - public ClusterStatus getStatus() {
>> - return status;
>> - }
>> -
>> - public void setStatus(ClusterStatus status) {
>> - this.status = status;
>> - }
>> -}
>>
>>
>> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitorFactory.java
>> ----------------------------------------------------------------------
>> diff --git
>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitorFactory.java
>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitorFactory.java
>> new file mode 100644
>> index 0000000..489078e
>> --- /dev/null
>> +++
>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitorFactory.java
>> @@ -0,0 +1,336 @@
>> +package org.apache.stratos.autoscaler.monitor;
>> +
>> +import java.util.Map;
>> +import java.util.Random;
>> +
>> +import org.apache.commons.logging.Log;
>> +import org.apache.commons.logging.LogFactory;
>> +import org.apache.stratos.autoscaler.KubernetesClusterContext;
>> +import org.apache.stratos.autoscaler.MemberStatsContext;
>> +import org.apache.stratos.autoscaler.NetworkPartitionContext;
>> +import org.apache.stratos.autoscaler.NetworkPartitionLbHolder;
>> +import org.apache.stratos.autoscaler.PartitionContext;
>> +import
>> org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
>> +import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
>> +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.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.ClusterStatus;
>> +import org.apache.stratos.messaging.domain.topology.Member;
>> +import org.apache.stratos.messaging.domain.topology.MemberStatus;
>> +import org.apache.stratos.messaging.util.Constants;
>> +
>> +public class ClusterMonitorFactory {
>> +
>> + private static final Log log =
>> LogFactory.getLog(ClusterMonitorFactory.class);
>> +
>> + public static AbstractClusterMonitor getMonitor(Cluster cluster)
>> throws PolicyValidationException, PartitionValidationException {
>> +
>> + AbstractClusterMonitor clusterMonitor;
>> + if(cluster.isKubernetesCluster()){
>> + clusterMonitor =
>> getDockerServiceClusterMonitor(cluster);
>> + } else if (cluster.isLbCluster()){
>> + clusterMonitor = getVMLbClusterMonitor(cluster);
>> + } else {
>> + clusterMonitor =
>> getVMServiceClusterMonitor(cluster);
>> + }
>> +
>> + return clusterMonitor;
>> + }
>> +
>> + private static VMServiceClusterMonitor
>> getVMServiceClusterMonitor(Cluster cluster) throws
>> PolicyValidationException, PartitionValidationException {
>> + // 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 policy =
>> + 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 =
>> + "Deployment Policy's Partitions are null.
>> Policy name: " +
>> + deploymentPolicyName;
>> + log.error(msg);
>> + throw new PolicyValidationException(msg);
>> + }
>> +
>> +
>> CloudControllerClient.getInstance().validateDeploymentPolicy(cluster.getServiceName(),
>> deploymentPolicy);
>> +
>> + VMServiceClusterMonitor clusterMonitor =
>> + new
>> VMServiceClusterMonitor(cluster.getClusterId(),
>> +
>> cluster.getServiceName(),
>> +
>> deploymentPolicy, policy);
>> + clusterMonitor.setStatus(ClusterStatus.Created);
>> +
>> + for (PartitionGroup partitionGroup:
>> deploymentPolicy.getPartitionGroups()){
>> +
>> + NetworkPartitionContext networkPartitionContext = new
>> NetworkPartitionContext(partitionGroup.getId(),
>> + partitionGroup.getPartitionAlgo(),
>> partitionGroup.getPartitions());
>> +
>> + for(Partition partition: partitionGroup.getPartitions()){
>> + PartitionContext partitionContext = new
>> PartitionContext(partition);
>> +
>> partitionContext.setServiceName(cluster.getServiceName());
>> + partitionContext.setProperties(cluster.getProperties());
>> +
>> partitionContext.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.setPartition(partition);
>> +
>> memberContext.setProperties(convertMemberPropsToMemberContextProps(member.getProperties()));
>> +
>> +
>> if(MemberStatus.Activated.equals(member.getStatus())){
>> +
>> partitionContext.addActiveMember(memberContext);
>> +//
>> networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(),
>> 1);
>> +//
>> partitionContext.incrementCurrentActiveMemberCount(1);
>> +
>> + } else
>> if(MemberStatus.Created.equals(member.getStatus()) ||
>> MemberStatus.Starting.equals(member.getStatus())){
>> +
>> partitionContext.addPendingMember(memberContext);
>> +
>> +//
>> networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(),
>> 1);
>> + } else
>> if(MemberStatus.Suspended.equals(member.getStatus())){
>> +// partitionContext.addFaultyMember(memberId);
>> + }
>> + partitionContext.addMemberStatsContext(new
>> MemberStatsContext(memberId));
>> + if(log.isInfoEnabled()){
>> + log.info(String.format("Member stat context
>> has been added: [member] %s", memberId));
>> + }
>> + }
>> +
>> + }
>> +
>> networkPartitionContext.addPartitionContext(partitionContext);
>> + if(log.isInfoEnabled()){
>> + log.info(String.format("Partition context has been
>> added: [partition] %s",
>> + partitionContext.getPartitionId()));
>> + }
>> + }
>> +
>> +
>> clusterMonitor.addNetworkPartitionCtxt(networkPartitionContext);
>> + if(log.isInfoEnabled()){
>> + log.info(String.format("Network partition context has
>> been added: [network partition] %s",
>> + networkPartitionContext.getId()));
>> + }
>> + }
>> +
>> +
>> + // find lb reference type
>> + java.util.Properties props = cluster.getProperties();
>> +
>> + if(props.containsKey(Constants.LOAD_BALANCER_REF)) {
>> + String value =
>> props.getProperty(Constants.LOAD_BALANCER_REF);
>> + clusterMonitor.setLbReferenceType(value);
>> + if(log.isDebugEnabled()) {
>> + log.debug("Set the lb reference type: "+value);
>> + }
>> + }
>> +
>> + // set hasPrimary property
>> + // hasPrimary is true if there are primary members available in
>> that cluster
>> +
>> clusterMonitor.setHasPrimary(Boolean.parseBoolean(cluster.getProperties().getProperty(Constants.IS_PRIMARY)));
>> +
>> + log.info("Cluster monitor created: "+clusterMonitor.toString());
>> + return clusterMonitor;
>> + }
>> +
>> + private static Properties convertMemberPropsToMemberContextProps(
>> + java.util.Properties properties) {
>> + Properties props = new Properties();
>> + for (Map.Entry<Object, Object> e : properties.entrySet() )
>> {
>> + Property prop = new Property();
>> + prop.setName((String)e.getKey());
>> + prop.setValue((String)e.getValue());
>> + props.addProperties(prop);
>> + }
>> + return props;
>> + }
>> +
>> +
>> + private static VMLbClusterMonitor getVMLbClusterMonitor(Cluster
>> cluster) throws PolicyValidationException, PartitionValidationException {
>> + // 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 policy =
>> + 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();
>> + VMLbClusterMonitor clusterMonitor =
>> + new VMLbClusterMonitor(clusterId,
>> +
>> cluster.getServiceName(),
>> +
>> deploymentPolicy, policy);
>> + clusterMonitor.setStatus(ClusterStatus.Created);
>> + // partition group = network partition context
>> + for (PartitionGroup partitionGroup :
>> deploymentPolicy.getPartitionGroups()) {
>> +
>> + NetworkPartitionLbHolder networkPartitionLbHolder =
>> +
>> PartitionManager.getInstance()
>> +
>> .getNetworkPartitionLbHolder(partitionGroup.getId());
>> +//
>> PartitionManager.getInstance()
>> +//
>> .getNetworkPartitionLbHolder(partitionGroup.getId());
>> + // FIXME pick a random partition
>> + Partition partition =
>> + partitionGroup.getPartitions()[new
>> Random().nextInt(partitionGroup.getPartitions().length)];
>> + PartitionContext partitionContext = new
>> PartitionContext(partition);
>> + partitionContext.setServiceName(cluster.getServiceName());
>> + partitionContext.setProperties(cluster.getProperties());
>> +
>> partitionContext.setNetworkPartitionId(partitionGroup.getId());
>> + partitionContext.setMinimumMemberCount(1);//Here it hard
>> codes the minimum value as one for LB cartridge partitions
>> +
>> + NetworkPartitionContext networkPartitionContext = new
>> NetworkPartitionContext(partitionGroup.getId(),
>> + partitionGroup.getPartitionAlgo(),
>> partitionGroup.getPartitions()) ;
>> + for (Member member : cluster.getMembers()) {
>> + String memberId = member.getMemberId();
>> + if
>> (member.getNetworkPartitionId().equalsIgnoreCase(networkPartitionContext.getId()))
>> {
>> + MemberContext memberContext = new MemberContext();
>> + memberContext.setClusterId(member.getClusterId());
>> + memberContext.setMemberId(memberId);
>> + memberContext.setPartition(partition);
>> +
>> + if
>> (MemberStatus.Activated.equals(member.getStatus())) {
>> + partitionContext.addActiveMember(memberContext);
>> +//
>> networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(),
>> 1);
>> +//
>> partitionContext.incrementCurrentActiveMemberCount(1);
>> + } else if
>> (MemberStatus.Created.equals(member.getStatus()) ||
>> +
>> MemberStatus.Starting.equals(member.getStatus())) {
>> + partitionContext.addPendingMember(memberContext);
>> +//
>> networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(),
>> 1);
>> + } else if
>> (MemberStatus.Suspended.equals(member.getStatus())) {
>> +// partitionContext.addFaultyMember(memberId);
>> + }
>> +
>> + partitionContext.addMemberStatsContext(new
>> MemberStatsContext(memberId));
>> + if(log.isInfoEnabled()){
>> + log.info(String.format("Member stat context has
>> been added: [member] %s", memberId));
>> + }
>> + }
>> +
>> + }
>> +
>> networkPartitionContext.addPartitionContext(partitionContext);
>> +
>> + // 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(Constants.LOAD_BALANCED_SERVICE_TYPE);
>> +
>> + if(props.containsKey(Constants.LOAD_BALANCER_REF)) {
>> + String value =
>> props.getProperty(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);
>> + }
>> + }
>> + }
>> + }
>> +
>> +
>> clusterMonitor.addNetworkPartitionCtxt(networkPartitionContext);
>> + }
>> +
>> + log.info("LB Cluster monitor created:
>> "+clusterMonitor.toString());
>> + return clusterMonitor;
>> + }
>> +
>> + private static DockerServiceClusterMonitor
>> getDockerServiceClusterMonitor(Cluster cluster) {
>> +
>> + if (null == cluster) {
>> + return null;
>> + }
>> +
>> + String autoscalePolicyName = cluster.getAutoscalePolicyName();
>> + if (log.isDebugEnabled()) {
>> + log.debug("Autoscaler policy name: " + autoscalePolicyName);
>> + }
>> +
>> + AutoscalePolicy policy =
>> PolicyManager.getInstance().getAutoscalePolicy(autoscalePolicyName);
>> + java.util.Properties props = cluster.getProperties();
>> + String kubernetesHostClusterID =
>> props.getProperty(StratosConstants.KUBERNETES_CLUSTER_ID);
>> + KubernetesClusterContext kubernetesClusterCtxt = new
>> KubernetesClusterContext(kubernetesHostClusterID);
>> +
>> + DockerServiceClusterMonitor dockerClusterMonitor = new
>> DockerServiceClusterMonitor(
>> + kubernetesClusterCtxt,
>> + cluster.getClusterId(),
>> + cluster.getServiceName(),
>> + policy);
>> +
>> + dockerClusterMonitor.setStatus(ClusterStatus.Created);
>> +
>> + // find lb reference type
>> + if(props.containsKey(Constants.LOAD_BALANCER_REF)) {
>> + String value =
>> props.getProperty(Constants.LOAD_BALANCER_REF);
>> + dockerClusterMonitor.setLbReferenceType(value);
>> + if(log.isDebugEnabled()) {
>> + log.debug("Set the lb reference type: "+value);
>> + }
>> + }
>> +
>> +// // set hasPrimary property
>> +// // hasPrimary is true if there are primary members available
>> in that cluster
>> +//
>> dockerClusterMonitor.setHasPrimary(Boolean.parseBoolean(props.getProperty(Constants.IS_PRIMARY)));
>> +
>> + log.info("Docker cluster monitor created: "+
>> dockerClusterMonitor.toString());
>> + return dockerClusterMonitor;
>> + }
>> +}
>>
>>
>> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ContainerClusterMonitor.java
>> ----------------------------------------------------------------------
>> diff --git
>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ContainerClusterMonitor.java
>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ContainerClusterMonitor.java
>> new file mode 100644
>> index 0000000..f9b9047
>> --- /dev/null
>> +++
>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ContainerClusterMonitor.java
>> @@ -0,0 +1,38 @@
>> +package org.apache.stratos.autoscaler.monitor;
>> +
>> +import org.apache.stratos.autoscaler.KubernetesClusterContext;
>> +import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
>> +import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
>> +import org.apache.stratos.common.enums.ClusterType;
>> +
>> +public abstract class ContainerClusterMonitor extends
>> AbstractClusterMonitor {
>> +
>> + private KubernetesClusterContext kubernetesClusterCtxt;
>> + protected AutoscalePolicy autoscalePolicy;
>> +
>> + protected ContainerClusterMonitor(String clusterId, String
>> serviceId, ClusterType clusterType,
>> + KubernetesClusterContext kubernetesClusterContext,
>> + AutoscalerRuleEvaluator autoscalerRuleEvaluator,
>> AutoscalePolicy autoscalePolicy){
>> +
>> + super(clusterId, serviceId, clusterType,
>> autoscalerRuleEvaluator);
>> + this.kubernetesClusterCtxt = kubernetesClusterContext;
>> + this.autoscalePolicy = autoscalePolicy;
>> + }
>> +
>> + public KubernetesClusterContext getKubernetesClusterCtxt() {
>> + return kubernetesClusterCtxt;
>> + }
>> +
>> + public void setKubernetesClusterCtxt(
>> + KubernetesClusterContext kubernetesClusterCtxt) {
>> + this.kubernetesClusterCtxt = kubernetesClusterCtxt;
>> + }
>> +
>> + public AutoscalePolicy getAutoscalePolicy() {
>> + return autoscalePolicy;
>> + }
>> +
>> + public void setAutoscalePolicy(AutoscalePolicy autoscalePolicy) {
>> + this.autoscalePolicy = autoscalePolicy;
>> + }
>> +}
>>
>>
>> http://git-wip-us.apache.org/repos/asf/stratos/blob/d6f49d37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/DockerServiceClusterMonitor.java
>> ----------------------------------------------------------------------
>> diff --git
>> a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/DockerServiceClusterMonitor.java
>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/DockerServiceClusterMonitor.java
>> new file mode 100644
>> index 0000000..ca39b6a
>> --- /dev/null
>> +++
>> b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/DockerServiceClusterMonitor.java
>> @@ -0,0 +1,156 @@
>> +package org.apache.stratos.autoscaler.monitor;
>> +
>> +import java.util.Properties;
>> +
>> +import org.apache.commons.configuration.XMLConfiguration;
>> +import org.apache.commons.logging.Log;
>> +import org.apache.commons.logging.LogFactory;
>> +import org.apache.stratos.autoscaler.KubernetesClusterContext;
>> +import
>> org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
>> +import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
>> +import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
>> +import org.apache.stratos.autoscaler.util.AutoScalerConstants;
>> +import org.apache.stratos.autoscaler.util.ConfUtil;
>> +import org.apache.stratos.cloud.controller.stub.pojo.MemberContext;
>> +import org.apache.stratos.common.constants.StratosConstants;
>> +import org.apache.stratos.common.enums.ClusterType;
>> +import org.apache.stratos.messaging.domain.topology.ClusterStatus;
>> +import
>> org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
>> +
>> +public final class DockerServiceClusterMonitor extends
>> ContainerClusterMonitor{
>> +
>> + private static final Log log =
>> LogFactory.getLog(DockerServiceClusterMonitor.class);
>> +
>> + private String lbReferenceType;
>> + private int numberOfReplicasInServiceCluster = 0;
>> + int retryInterval = 60000;
>> +
>> + public DockerServiceClusterMonitor(KubernetesClusterContext
>> kubernetesClusterCtxt,
>> + String serviceClusterID, String serviceId,
>> AutoscalePolicy autoscalePolicy) {
>> + super(serviceClusterID, serviceId,
>> ClusterType.DockerServiceCluster, kubernetesClusterCtxt,
>> + new AutoscalerRuleEvaluator(), autoscalePolicy);
>> + readConfigurations();
>> + }
>> +
>> + @Override
>> + public void run() {
>> + try {
>> + // TODO make this configurable,
>> + // this is the delay the min check of normal
>> cluster monitor to wait
>> + // until LB monitor is added
>> + Thread.sleep(60000);
>> + } catch (InterruptedException ignore) {
>> + }
>> +
>> + while (!isDestroyed()) {
>> + if (log.isDebugEnabled()) {
>> + log.debug("Kubernetes cluster monitor is
>> running.. " + this.toString());
>> + }
>> + try {
>> + if
>> (!ClusterStatus.In_Maintenance.equals(getStatus())) {
>> + monitor();
>> + } else {
>> + if (log.isDebugEnabled()) {
>> + log.debug("Kubernetes
>> cluster monitor is suspended as the cluster is in "
>> + +
>> ClusterStatus.In_Maintenance + " mode......");
>> + }
>> + }
>> + } catch (Exception e) {
>> + log.error("Kubernetes cluster monitor:
>> Monitor failed." + this.toString(),
>> + e);
>> + }
>> + try {
>> + Thread.sleep(getMonitorInterval());
>> + } catch (InterruptedException ignore) {
>> + }
>> + }
>> + }
>> +
>> + @Override
>> + protected void monitor() {
>> +
>> + // is container created successfully?
>> + boolean success = false;
>> + String kubernetesClusterId =
>> getKubernetesClusterCtxt().getKubernetesClusterID();
>> +
>> + try {
>> + TopologyManager.acquireReadLock();
>> + Properties props =
>> TopologyManager.getTopology().getService(getServiceId()).getCluster(getClusterId()).getProperties();
>> + int minReplicas =
>> Integer.parseInt(props.getProperty(StratosConstants.KUBERNETES_MIN_REPLICAS));
>> +
>> + int nonTerminatedMembers =
>> getKubernetesClusterCtxt().getActiveMembers().size() +
>> getKubernetesClusterCtxt().getPendingMembers().size();
>> +
>> + if (nonTerminatedMembers == 0) {
>> +
>> + while (success) {
>> + try {
>> +
>> + MemberContext
>> memberContext =
>> CloudControllerClient.getInstance().createContainer(kubernetesClusterId,
>> getClusterId());
>> + if(null != memberContext)
>> {
>> +
>> getKubernetesClusterCtxt().addPendingMember(memberContext);
>> + success = true;
>> +
>> numberOfReplicasInServiceCluster = minReplicas;
>> +
>> if(log.isDebugEnabled()){
>> +
>> log.debug(String.format("Pending member added, [member] %s [kub cluster]
>> %s",
>> +
>> memberContext.getMemberId(),
>> getKubernetesClusterCtxt().getKubernetesClusterID()));
>> + }
>> + } else {
>> + if
>> (log.isDebugEnabled()) {
>> +
>> log.debug("Returned member context is null, did not add to pending
>> members");
>> + }
>> + }
>> + } catch (Throwable e) {
>> + if (log.isDebugEnabled())
>> {
>> + String message =
>> "Cannot create a container, will retry in "+(retryInterval/1000)+"s";
>> +
>> log.debug(message, e);
>> + }
>> + }
>> +
>> + try {
>> + Thread.sleep(retryInterval);
>> + } catch (InterruptedException e1) {
>> + }
>> + }
>> + }
>> + } finally {
>> + TopologyManager.releaseReadLock();
>> + }
>> + }
>> +
>> + @Override
>> + public void destroy() {
>> + getMinCheckKnowledgeSession().dispose();
>> + getScaleCheckKnowledgeSession().dispose();
>> + setDestroyed(true);
>> + if(log.isDebugEnabled()) {
>> + log.debug("DockerClusterMonitor Drools session has been
>> disposed. "+this.toString());
>> + }
>> + }
>> +
>> + @Override
>> + protected void readConfigurations () {
>> + // same as VM cluster monitor interval
>> + XMLConfiguration conf =
>> ConfUtil.getInstance(null).getConfiguration();
>> + int monitorInterval =
>> conf.getInt(AutoScalerConstants.AUTOSCALER_MONITOR_INTERVAL, 90000);
>> + setMonitorInterval(monitorInterval);
>> + if (log.isDebugEnabled()) {
>> + log.debug("Kubernetes Cluster Monitor task interval: " +
>> getMonitorInterval());
>> + }
>> + }
>> +
>> + @Override
>> + public String toString() {
>> + return "DockerClusterMonitor "
>> + + "[ kubernetesHostClusterId=" +
>> getKubernetesClusterCtxt().getKubernetesClusterID()
>> + + ", clusterId=" + getClusterId()
>> + + ", serviceId=" + getServiceId() + "]";
>> + }
>> +
>> + public String getLbReferenceType() {
>> + return lbReferenceType;
>> + }
>> +
>> + public void setLbReferenceType(String lbReferenceType) {
>> + this.lbReferenceType = lbReferenceType;
>> + }
>> +}
>> \ No newline at end of file
>>
>>
>
>
> --
> --
> Lahiru Sandaruwan
> Committer and PMC member, Apache Stratos,
> Senior Software Engineer,
> WSO2 Inc., http://wso2.com
> lean.enterprise.middleware
>
> email: lahirus@wso2.com cell: (+94) 773 325 954
> blog: http://lahiruwrites.blogspot.com/
> twitter: http://twitter.com/lahirus
> linked-in: http://lk.linkedin.com/pub/lahiru-sandaruwan/16/153/146
>
>
--
Rajkumar Rajaratnam
Software Engineer | WSO2, Inc.
Mobile +94777568639 | +94783498120