You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ni...@apache.org on 2013/12/10 15:54:03 UTC
[04/16] git commit: introducing network partition concept
introducing network partition concept
Project: http://git-wip-us.apache.org/repos/asf/incubator-stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-stratos/commit/d31f1408
Tree: http://git-wip-us.apache.org/repos/asf/incubator-stratos/tree/d31f1408
Diff: http://git-wip-us.apache.org/repos/asf/incubator-stratos/diff/d31f1408
Branch: refs/heads/master
Commit: d31f14080d1fbf2450ff78d759bbcef7b2f82c30
Parents: f86f954
Author: Nirmal Fernando <ni...@apache.org>
Authored: Tue Dec 10 18:29:24 2013 +0530
Committer: Nirmal Fernando <ni...@apache.org>
Committed: Tue Dec 10 19:16:13 2013 +0530
----------------------------------------------------------------------
.../apache/stratos/autoscaler/Constants.java | 3 +
.../autoscaler/NetworkPartitionContext.java | 171 +++++++++++++++++++
.../autoscaler/api/AutoScalerServiceImpl.java | 38 +++--
.../exception/NonExistingLBException.java | 43 +++++
.../interfaces/AutoScalerServiceInterface.java | 2 +-
.../autoscaler/partition/PartitionManager.java | 65 ++++++-
6 files changed, 307 insertions(+), 15 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/d31f1408/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/Constants.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/Constants.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/Constants.java
index 32e69e5..7d13eec 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/Constants.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/Constants.java
@@ -22,5 +22,8 @@ public class Constants {
public static final String CLOUD_CONTROLLER_SERVICE_SFX = "services/CloudControllerService";
public static final int CLOUD_CONTROLLER_DEFAULT_PORT = 9444;
+
+ // partition properties
+ public static final String REGION_PROPERTY = "region";
}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/d31f1408/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java
new file mode 100644
index 0000000..992c66b
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java
@@ -0,0 +1,171 @@
+/*
+ * 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;
+
+import java.util.*;
+
+/**
+ * Holds runtime data of a network partition.
+ * @author nirmal
+ *
+ */
+public class NetworkPartitionContext {
+
+ private String provider;
+
+ private String region;
+
+ private String defaultLbClusterId;
+
+ private Map<String, String> serviceNameToLBClusterIdMap;
+
+ private Map<String, String> clusterIdToLBClusterIdMap;
+
+ public NetworkPartitionContext(final String provider, final String region) {
+
+ super();
+ this.provider = provider;
+ this.region = region;
+ this.setServiceToLBClusterId(new HashMap<String, String>());
+ this.setClusterIdToLBClusterIdMap(new HashMap<String, String>());
+
+ }
+
+ public boolean isLBExist(final String clusterId) {
+
+ return clusterId != null &&
+ (clusterId.equals(this.defaultLbClusterId) ||
+ this.serviceNameToLBClusterIdMap.containsValue(clusterId) || this.clusterIdToLBClusterIdMap.containsValue(clusterId));
+
+ }
+
+ public String getProvider() {
+
+ return this.provider;
+
+ }
+
+ public void setProvider(final String provider) {
+
+ this.provider = provider;
+
+ }
+
+ public String getRegion() {
+
+ return this.region;
+
+ }
+
+ public void setRegion(final String region) {
+
+ this.region = region;
+
+ }
+
+ public String getDefaultLbClusterId() {
+
+ return this.defaultLbClusterId;
+
+ }
+
+ public void setDefaultLbClusterId(final String defaultLbClusterId) {
+
+ this.defaultLbClusterId = defaultLbClusterId;
+
+ }
+
+ public String getLBClusterIdOfService(final String serviceName) {
+
+ return (String) this.serviceNameToLBClusterIdMap.get(serviceName);
+
+ }
+
+ public Map<String, String> getServiceToLBClusterId() {
+
+ return this.serviceNameToLBClusterIdMap;
+
+ }
+
+ public void setServiceToLBClusterId(final Map<String, String> serviceToLBClusterId) {
+
+ this.serviceNameToLBClusterIdMap = serviceToLBClusterId;
+
+ }
+
+ public String getLBClusterIdOfCluster(final String clusterId) {
+
+ return (String) this.clusterIdToLBClusterIdMap.get(clusterId);
+
+ }
+
+ public Map<String, String> getClusterIdToLBClusterIdMap() {
+
+ return this.clusterIdToLBClusterIdMap;
+
+ }
+
+ public void setClusterIdToLBClusterIdMap(final Map<String, String> clusterIdToLBClusterIdMap) {
+
+ this.clusterIdToLBClusterIdMap = clusterIdToLBClusterIdMap;
+
+ }
+
+ public int hashCode() {
+
+ final int prime = 31;
+ int result = 1;
+ result = 31 * result + ((this.provider == null) ? 0 : this.provider.hashCode());
+ result = 31 * result + ((this.region == null) ? 0 : this.region.hashCode());
+ return result;
+
+ }
+
+ public boolean equals(final Object obj) {
+
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (!(obj instanceof NetworkPartitionContext)) {
+ return false;
+ }
+ final NetworkPartitionContext other = (NetworkPartitionContext) obj;
+ if (this.provider == null) {
+ if (other.provider != null) {
+ return false;
+ }
+ }
+ else if (!this.provider.equals(other.provider)) {
+ return false;
+ }
+ if (this.region == null) {
+ if (other.region != null) {
+ return false;
+ }
+ }
+ else if (!this.region.equals(other.region)) {
+ return false;
+ }
+ return true;
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/d31f1408/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
index 584a724..d41072b 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
@@ -19,22 +19,21 @@
package org.apache.stratos.autoscaler.api;
import java.util.ArrayList;
+import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.NetworkPartitionContext;
import org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
-import org.apache.stratos.autoscaler.exception.AutoScalerException;
+import org.apache.stratos.autoscaler.exception.NonExistingLBException;
import org.apache.stratos.autoscaler.exception.PartitionValidationException;
import org.apache.stratos.autoscaler.interfaces.AutoScalerServiceInterface;
import org.apache.stratos.autoscaler.partition.PartitionGroup;
import org.apache.stratos.autoscaler.partition.PartitionManager;
import org.apache.stratos.autoscaler.policy.PolicyManager;
import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
-import org.apache.stratos.autoscaler.registry.RegistryManager;
-import org.apache.stratos.autoscaler.util.AutoScalerConstants;
import org.apache.stratos.cloud.controller.deployment.partition.Partition;
-import org.wso2.carbon.registry.core.exceptions.RegistryException;
/**
* Auto Scaler Service API is responsible getting Partitions and Policies.
@@ -42,6 +41,7 @@ import org.wso2.carbon.registry.core.exceptions.RegistryException;
public class AutoScalerServiceImpl implements AutoScalerServiceInterface{
private static final Log log = LogFactory.getLog(AutoScalerServiceImpl.class);
+ PartitionManager partitionManager = PartitionManager.getInstance();
public Partition[] getAllAvailablePartitions(){
return PartitionManager.getInstance().getAllPartitions();
@@ -121,16 +121,30 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface{
}
@Override
- public Partition[] getPartitionsOfDeploymentPolicy(String depPolicy, String partitonGroupId) {
- DeploymentPolicy depPol = this.getDeploymentPolicy(depPolicy);
- if(null == depPol)
- return null;
-
- PartitionGroup partGrp = depPol.getPartitionGroup(partitonGroupId);
- if(null == partGrp)
+ public Partition[] getPartitionsOfDeploymentPolicy(String deploymentPolicyId) {
+ DeploymentPolicy depPol = this.getDeploymentPolicy(deploymentPolicyId);
+ if(null == depPol) {
return null;
+ }
- return partGrp.getPartitions();
+ return depPol.getAllPartitions();
+ }
+
+ public void checkLBExistence(String clusterId) throws NonExistingLBException {
+ List<NetworkPartitionContext> nwPartitions = partitionManager.getAllNetworkPartitions();
+ boolean exist = false;
+ for (NetworkPartitionContext networkPartition : nwPartitions) {
+ if(networkPartition.isLBExist(clusterId)) {
+ exist = true;
+ break;
+ }
+ }
+
+ if(!exist) {
+ String msg = "LB with [cluster id] "+clusterId+" does not exist.";
+ log.error(msg);
+ throw new NonExistingLBException(msg);
+ }
}
}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/d31f1408/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/exception/NonExistingLBException.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/exception/NonExistingLBException.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/exception/NonExistingLBException.java
new file mode 100644
index 0000000..45e50c4
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/exception/NonExistingLBException.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.stratos.autoscaler.exception;
+
+public class NonExistingLBException extends RuntimeException {
+
+ private static final long serialVersionUID = -9163807860189126883L;
+
+ public NonExistingLBException(final String message, final Exception exception) {
+
+ super(message, exception);
+
+ }
+
+ public NonExistingLBException(final Exception exception) {
+
+ super(exception);
+
+ }
+
+ public NonExistingLBException(final String msg) {
+
+ super(msg);
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/d31f1408/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/interfaces/AutoScalerServiceInterface.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/interfaces/AutoScalerServiceInterface.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/interfaces/AutoScalerServiceInterface.java
index 8a760b0..a7f4c10 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/interfaces/AutoScalerServiceInterface.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/interfaces/AutoScalerServiceInterface.java
@@ -24,7 +24,7 @@ public interface AutoScalerServiceInterface {
public DeploymentPolicy getDeploymentPolicy (String deploymentPolicyId);
public AutoscalePolicy getAutoscalingPolicy (String autoscalingPolicyId);
public PartitionGroup[] getPartitionGroups (String deploymentPolicyId);
- public Partition[] getPartitionsOfDeploymentPolicy(String depPolicy, String partitonGroupId);
+ public Partition[] getPartitionsOfDeploymentPolicy(String deploymentPolicyId);
public void checkLBExistence(String clusterId) throws NonExistingLBException;
}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/d31f1408/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/partition/PartitionManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/partition/PartitionManager.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/partition/PartitionManager.java
index 52fd8f7..4e1aeaf 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/partition/PartitionManager.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/partition/PartitionManager.java
@@ -19,17 +19,23 @@
package org.apache.stratos.autoscaler.partition;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.Constants;
+import org.apache.stratos.autoscaler.NetworkPartitionContext;
import org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
import org.apache.stratos.autoscaler.exception.AutoScalerException;
import org.apache.stratos.autoscaler.exception.PartitionValidationException;
import org.apache.stratos.autoscaler.registry.RegistryManager;
import org.apache.stratos.autoscaler.util.AutoScalerConstants;
import org.apache.stratos.cloud.controller.deployment.partition.Partition;
+import org.apache.stratos.cloud.controller.pojo.Properties;
+import org.apache.stratos.cloud.controller.pojo.Property;
import org.wso2.carbon.registry.core.exceptions.RegistryException;
/**
@@ -42,9 +48,20 @@ private static final Log log = LogFactory.getLog(PartitionManager.class);
// Partitions against partitionID
private static Map<String,Partition> partitionListMap = new HashMap<String, Partition>();
+ private List<NetworkPartitionContext> networkPartitions;
+
+ /*
+ * Key - partition id
+ * Value - reference to NetworkPartition
+ */
+ private Map<String, NetworkPartitionContext> partitionIdToNetworkPartition;
+
private static PartitionManager instance;
- private PartitionManager(){}
+ private PartitionManager(){
+ networkPartitions = new ArrayList<NetworkPartitionContext>();
+ partitionIdToNetworkPartition = new HashMap<String, NetworkPartitionContext>();
+ }
public static PartitionManager getInstance(){
if(null == instance)
@@ -71,6 +88,11 @@ private static final Log log = LogFactory.getLog(PartitionManager.class);
this.validatePartition(partition);
regManager.persist(partition, resourcePath);
partitionListMap.put(partitionId, partition);
+
+ // register network partition
+ NetworkPartitionContext nwPartition = getOrAddNetworkPartition(partition);
+ this.partitionIdToNetworkPartition.put(partitionId, nwPartition);
+
} catch (RegistryException e) {
throw new AutoScalerException(e);
} catch(PartitionValidationException e){
@@ -81,7 +103,46 @@ private static final Log log = LogFactory.getLog(PartitionManager.class);
return true;
}
- public Partition getPartitionById(String partitionId){
+ public NetworkPartitionContext getNetworkPartitionOfPartition(String partitionId) {
+ return this.partitionIdToNetworkPartition.get(partitionId);
+ }
+
+ public List<NetworkPartitionContext> getAllNetworkPartitions() {
+ return this.networkPartitions;
+ }
+
+ /**
+ * TODO make {@link NetworkPartitionContext}s extensible.
+ * @param partition
+ */
+ protected NetworkPartitionContext getOrAddNetworkPartition(Partition partition) {
+
+ if(partition == null) {
+ return null;
+ }
+ String provider = partition.getProvider();
+ String region = null;
+ Properties properties = partition.getProperties();
+ if (properties != null) {
+ for (Property prop : properties.getProperties()) {
+ if(Constants.REGION_PROPERTY.equals(prop.getName())) {
+ region = prop.getValue();
+ break;
+ }
+ }
+ }
+ NetworkPartitionContext networkPar = new NetworkPartitionContext(provider, region);
+ if(!this.networkPartitions.contains(networkPar)){
+ this.networkPartitions.add(networkPar);
+ } else {
+ int idx = this.networkPartitions.indexOf(networkPar);
+ networkPar = this.networkPartitions.get(idx);
+ }
+
+ return networkPar;
+ }
+
+ public Partition getPartitionById(String partitionId){
if(partitionExist(partitionId))
return partitionListMap.get(partitionId);
else