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