You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by re...@apache.org on 2014/12/04 14:34:32 UTC

[1/2] stratos git commit: adding deployment policy validation support

Repository: stratos
Updated Branches:
  refs/heads/master 86530242c -> 0b554d378


adding deployment policy validation support


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/17f20b37
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/17f20b37
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/17f20b37

Branch: refs/heads/master
Commit: 17f20b37a3bfaa4f597a5abf7db1f881da70b47a
Parents: 8653024
Author: reka <rt...@gmail.com>
Authored: Thu Dec 4 18:42:39 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Thu Dec 4 18:43:07 2014 +0530

----------------------------------------------------------------------
 .../autoscaler/api/AutoScalerServiceImpl.java   | 57 ++++++++++++++++++--
 .../client/CloudControllerClient.java           |  7 ++-
 .../messaging/domain/applications/Group.java    | 17 ++++++
 .../domain/applications/ParentComponent.java    | 32 +++++++++--
 4 files changed, 103 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/17f20b37/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 37059fe..daa439f 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
@@ -41,8 +41,11 @@ import org.apache.stratos.autoscaler.pojo.Dependencies;
 import org.apache.stratos.autoscaler.pojo.ServiceGroup;
 import org.apache.stratos.autoscaler.pojo.policy.PolicyManager;
 import org.apache.stratos.autoscaler.pojo.policy.autoscale.AutoscalePolicy;
+import org.apache.stratos.autoscaler.pojo.policy.deployment.ChildPolicy;
 import org.apache.stratos.autoscaler.pojo.policy.deployment.DeploymentPolicy;
 import org.apache.stratos.autoscaler.pojo.policy.deployment.partition.network.ApplicationLevelNetworkPartition;
+import org.apache.stratos.autoscaler.pojo.policy.deployment.partition.network.ChildLevelNetworkPartition;
+import org.apache.stratos.autoscaler.pojo.policy.deployment.partition.network.ChildLevelPartition;
 import org.apache.stratos.autoscaler.pojo.policy.deployment.partition.network.Partition;
 import org.apache.stratos.autoscaler.registry.RegistryManager;
 import org.apache.stratos.autoscaler.util.AutoscalerUtil;
@@ -52,6 +55,8 @@ import org.apache.stratos.common.kubernetes.KubernetesGroup;
 import org.apache.stratos.common.kubernetes.KubernetesHost;
 import org.apache.stratos.common.kubernetes.KubernetesMaster;
 import org.apache.stratos.messaging.domain.applications.Application;
+import org.apache.stratos.messaging.domain.applications.ClusterDataHolder;
+import org.apache.stratos.messaging.domain.applications.Group;
 import org.apache.stratos.metadata.client.defaults.DefaultMetaDataServiceClient;
 import org.apache.stratos.metadata.client.defaults.MetaDataServiceClient;
 import org.apache.stratos.metadata.client.exception.MetaDataServiceClientException;
@@ -59,7 +64,9 @@ import org.wso2.carbon.registry.api.RegistryException;
 
 import java.text.MessageFormat;
 import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 //import org.apache.stratos.autoscaler.NetworkPartitionLbHolder;
 //import org.apache.stratos.autoscaler.pojo.policy.deployment.partition.PartitionManager;
@@ -90,9 +97,9 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface {
         ArrayList<DeploymentPolicy> validPolicies = new ArrayList<DeploymentPolicy>();
 
         for (DeploymentPolicy deploymentPolicy : this.getAllDeploymentPolicies()) {
-            try {
+            /*try {
                 // call CC API
-                CloudControllerClient.getInstance().validateDeploymentPolicy(cartridgeType, deploymentPolicy);
+                //CloudControllerClient.getInstance().validateDeploymentPolicy(cartridgeType, deploymentPolicy);
                 // if this deployment policy is valid for this cartridge, add it.
                 validPolicies.add(deploymentPolicy);
             } catch (PartitionValidationException ignoredException) {
@@ -101,7 +108,7 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface {
                     log.debug("Deployment policy [id] " + deploymentPolicy.getId()
                             + " is not valid for Cartridge [type] " + cartridgeType, ignoredException);
                 }
-            }
+            }*/
         }
         return validPolicies.toArray(new DeploymentPolicy[0]);
     }
@@ -116,6 +123,7 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface {
         String policyId = PolicyManager.getInstance().deployDeploymentPolicy(deploymentPolicy);
         //Need to start the application Monitor after validation of the deployment policies.
         //FIXME add validation
+        validateDeploymentPolicy(deploymentPolicy);
         //Check whether all the clusters are there
         ApplicationHolder.acquireReadLock();
         boolean allClusterInitialized = false;
@@ -146,6 +154,49 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface {
         return policyId;
     }
 
+    private boolean validateDeploymentPolicy(DeploymentPolicy deploymentPolicy) {
+
+        for(ChildPolicy childPolicy : deploymentPolicy.getChildPolicies()) {
+            String alias = childPolicy.getId();
+            ApplicationHolder.acquireReadLock();
+            List<Partition> partitionList = new ArrayList<Partition>();
+            for(ChildLevelNetworkPartition networkPartition : childPolicy.getChildLevelNetworkPartitions()) {
+                Partition[] partitions = deploymentPolicy.getApplicationLevelNetworkPartition(
+                                                    networkPartition.getId()).getPartitions();
+                for(Partition partition : partitions) {
+                    partitionList.add(partition);
+                }
+            }
+            try {
+                Application application = ApplicationHolder.getApplications().
+                                getApplication(deploymentPolicy.getApplicationId());
+                Partition[] partitions = new Partition[partitionList.size()];
+                Group group = application.getGroupRecursively(alias);
+                if(group != null) {
+                    Set<ClusterDataHolder> clusterDataHolders = group.getClusterDataHoldersOfGroup();
+                    for(ClusterDataHolder clusterDataHolder : clusterDataHolders) {
+                        CloudControllerClient.getInstance().validateDeploymentPolicy(
+                                clusterDataHolder.getServiceType(), partitionList.toArray(partitions));
+                    }
+                } else {
+                    ClusterDataHolder clusterDataHolder = application.
+                            getClusterDataHolderRecursivelyByAlias(alias);
+                    if(clusterDataHolder != null) {
+                        CloudControllerClient.getInstance().validateDeploymentPolicy(
+                                clusterDataHolder.getServiceType(), partitionList.toArray(partitions));
+                    }
+                }
+            } catch (PartitionValidationException e) {
+                log.error("Error while validating the deployment policy", e);
+            } finally {
+                ApplicationHolder.releaseReadLock();
+            }
+
+        }
+
+        return true;
+    }
+
     @Override
     public boolean undeployDeploymentPolicy(String applicationId) {
         return ApplicationBuilder.handleApplicationPolicyUndeployed(applicationId);

http://git-wip-us.apache.org/repos/asf/stratos/blob/17f20b37/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/CloudControllerClient.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/CloudControllerClient.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/CloudControllerClient.java
index 308e276..8bc60fa 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/CloudControllerClient.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/CloudControllerClient.java
@@ -89,14 +89,13 @@ public class CloudControllerClient {
      * This will validate the given partitions against the given cartridge type.
      */
 
-    public synchronized boolean validateDeploymentPolicy(String cartridgeType, DeploymentPolicy deploymentPolicy) throws PartitionValidationException {
+    public synchronized boolean validateDeploymentPolicy(String cartridgeType, org.apache.stratos.autoscaler.pojo.policy.deployment.partition.network.Partition[] partitions) throws PartitionValidationException {
         try {
             if (log.isInfoEnabled()) {
-                log.info(String.format("Validating partitions of policy via cloud controller: [id] %s", deploymentPolicy.getId()));
+                log.info(String.format("Validating partitions of policy via cloud controller: [cartridge-type] %s", cartridgeType));
             }
             long startTime = System.currentTimeMillis();
-            boolean result = stub.validateDeploymentPolicy(cartridgeType, getAllCCPartitions(deploymentPolicy.
-                    getAllPartitions()));
+            boolean result = stub.validateDeploymentPolicy(cartridgeType, getAllCCPartitions(partitions));
             if (log.isDebugEnabled()) {
                 long endTime = System.currentTimeMillis();
                 log.debug(String.format("Service call validateDeploymentPolicy() returned in %dms", (endTime - startTime)));

http://git-wip-us.apache.org/repos/asf/stratos/blob/17f20b37/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/Group.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/Group.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/Group.java
index 0be8207..1bf884b 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/Group.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/Group.java
@@ -127,4 +127,21 @@ public class Group extends ParentComponent<GroupInstance> {
     public void setGroupMaxInstances(int groupMaxInstances) {
         this.groupMaxInstances = groupMaxInstances;
     }
+
+    public Set<ClusterDataHolder> getClusterDataHoldersOfGroup() {
+        Set<ClusterDataHolder> appClusterData = new HashSet<ClusterDataHolder>();
+
+        // get top level Cluster Data
+        if (this.aliasToClusterDataMap != null && !this.aliasToClusterDataMap.isEmpty()) {
+            appClusterData.addAll(this.aliasToClusterDataMap.values());
+        }
+
+        // find other nested Cluster Data (in the Groups)
+        if (getGroups() != null) {
+            getClusterData(appClusterData, getGroups());
+        }
+
+        return appClusterData;
+
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/17f20b37/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java
index 954ebc1..af84e33 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java
@@ -34,9 +34,9 @@ public abstract class ParentComponent<T extends Instance> implements Serializabl
     // Dependency Order
     private DependencyOrder dependencyOrder;
     // Group Map, key = Group.alias
-    private final Map<String, Group> aliasToGroupMap;
+    protected final Map<String, Group> aliasToGroupMap;
     // Cluster Id map, key = subscription alias for the cartridge type
-    private final Map<String, ClusterDataHolder> aliasToClusterDataMap;
+    protected final Map<String, ClusterDataHolder> aliasToClusterDataMap;
     // Group/Cluster Instance Context map, key = instance id
     protected Map<String, T> instanceIdToInstanceContextMap;
     // flag for Group level scaling
@@ -120,6 +120,17 @@ public abstract class ParentComponent<T extends Instance> implements Serializabl
         return null;
     }
 
+    public ClusterDataHolder getClusterDataHolderRecursivelyByAlias(String alias) {
+        if(this.aliasToClusterDataMap.containsKey(alias)) {
+            return this.aliasToClusterDataMap.get(alias);
+        } else {
+            if(this.aliasToGroupMap != null && !this.aliasToGroupMap.isEmpty()) {
+                return getClusterDataByAlias(alias, this.aliasToGroupMap.values());
+            }
+        }
+        return null;
+    }
+
     /**
      * Getter for alias to Group map
      * Will not search recursively in the nested levels.
@@ -284,7 +295,7 @@ public abstract class ParentComponent<T extends Instance> implements Serializabl
         return getInstanceIdToInstanceContextMap().keySet().size();
     }
 
-    private void getClusterData (Set<ClusterDataHolder> clusterData, Collection<Group> groups) {
+    protected void getClusterData (Set<ClusterDataHolder> clusterData, Collection<Group> groups) {
 
         for (Group group : groups) {
             if (group.getClusterDataMap() != null && !group.getClusterDataMap().isEmpty()) {
@@ -296,6 +307,21 @@ public abstract class ParentComponent<T extends Instance> implements Serializabl
         }
     }
 
+    private ClusterDataHolder getClusterDataByAlias (String alias, Collection<Group> groups) {
+
+        for (Group group : groups) {
+            if (group.getClusterDataMap() != null && !group.getClusterDataMap().isEmpty()) {
+                if(group.getClusterData(alias) != null) {
+                    return group.getClusterData(alias);
+                }
+                if (group.getGroups() != null) {
+                    return getClusterDataByAlias(alias, group.getGroups());
+                }
+            }
+        }
+        return null;
+    }
+
     public Map<String, T> getInstanceIdToInstanceContextMap() {
         return instanceIdToInstanceContextMap;
     }


[2/2] stratos git commit: support for validate deployment policy and fixing partition validation issue

Posted by re...@apache.org.
support for validate deployment policy and fixing partition validation issue


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/0b554d37
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/0b554d37
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/0b554d37

Branch: refs/heads/master
Commit: 0b554d378f2b13284000d239425b6c3f03db83ea
Parents: 17f20b3
Author: reka <rt...@gmail.com>
Authored: Thu Dec 4 19:04:20 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Thu Dec 4 19:04:20 2014 +0530

----------------------------------------------------------------------
 .../org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java   | 2 ++
 .../cloud/controller/services/impl/CloudControllerServiceImpl.java | 2 +-
 .../stratos/messaging/domain/applications/ParentComponent.java     | 1 +
 3 files changed, 4 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/0b554d37/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 daa439f..bd98a76 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
@@ -174,11 +174,13 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface {
                 Group group = application.getGroupRecursively(alias);
                 if(group != null) {
                     Set<ClusterDataHolder> clusterDataHolders = group.getClusterDataHoldersOfGroup();
+                    //validating the group deployment policy against the leaf cartridges
                     for(ClusterDataHolder clusterDataHolder : clusterDataHolders) {
                         CloudControllerClient.getInstance().validateDeploymentPolicy(
                                 clusterDataHolder.getServiceType(), partitionList.toArray(partitions));
                     }
                 } else {
+                    //Validating the cartridge level deployment policy
                     ClusterDataHolder clusterDataHolder = application.
                             getClusterDataHolderRecursivelyByAlias(alias);
                     if(clusterDataHolder != null) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/0b554d37/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
index f9c55a0..33567bd 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
@@ -1445,7 +1445,7 @@ public class CloudControllerServiceImpl implements CloudControllerService {
 
             Map<String, Future<IaasProvider>> jobList = new HashMap<String, Future<IaasProvider>>();
             for (Partition partition : partitions) {
-                if (validatedPartitions.contains(partition.getId())) {
+                if (validatedPartitions != null && validatedPartitions.contains(partition.getId())) {
                     // partition cache hit
                     continue;
                 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/0b554d37/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java
index af84e33..285ad2f 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java
@@ -314,6 +314,7 @@ public abstract class ParentComponent<T extends Instance> implements Serializabl
                 if(group.getClusterData(alias) != null) {
                     return group.getClusterData(alias);
                 }
+            } else {
                 if (group.getGroups() != null) {
                     return getClusterDataByAlias(alias, group.getGroups());
                 }