You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by im...@apache.org on 2015/05/14 12:46:00 UTC

[02/11] stratos git commit: Adding api method for updating cartridge group

Adding api method for updating cartridge group


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

Branch: refs/heads/master
Commit: 6cddb02d12ede270855d76393fbe5a5e28467039
Parents: bbda157
Author: Vishanth <vi...@gmail.com>
Authored: Wed May 13 21:54:07 2015 +0530
Committer: Vishanth <vi...@gmail.com>
Committed: Wed May 13 21:54:07 2015 +0530

----------------------------------------------------------------------
 .../autoscaler/registry/RegistryManager.java    |  23 +
 .../autoscaler/services/AutoscalerService.java  |   9 +
 .../services/impl/AutoscalerServiceImpl.java    |  54 ++
 .../common/client/AutoscalerServiceClient.java  |   5 +
 .../rest/endpoint/api/StratosApiV41.java        |  34 ++
 .../rest/endpoint/api/StratosApiV41Utils.java   |  88 +++
 .../src/main/resources/AutoscalerService.wsdl   | 556 ++++++++++---------
 7 files changed, 520 insertions(+), 249 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/6cddb02d/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java
index 2a64f25..61a73ac 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java
@@ -25,6 +25,7 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.algorithms.networkpartition.NetworkPartitionAlgorithmContext;
 import org.apache.stratos.autoscaler.applications.pojo.ApplicationContext;
 import org.apache.stratos.autoscaler.exception.AutoScalerException;
+import org.apache.stratos.autoscaler.exception.application.InvalidServiceGroupException;
 import org.apache.stratos.autoscaler.pojo.ServiceGroup;
 import org.apache.stratos.autoscaler.pojo.policy.autoscale.AutoscalePolicy;
 import org.apache.stratos.autoscaler.pojo.policy.deployment.ApplicationPolicy;
@@ -348,6 +349,28 @@ public class RegistryManager {
         }
     }
 
+
+    public void updateServiceGroup(ServiceGroup serviceGroup) throws InvalidServiceGroupException {
+        try {
+            if (serviceGroup == null || StringUtils.isEmpty(serviceGroup.getName())) {
+                throw new IllegalArgumentException("Cartridge group or group name cannot be null");
+            }
+            if (getServiceGroup(serviceGroup.getName()) == null) {
+                throw new InvalidServiceGroupException(String.format("Cartridge group does not exist: " +
+                        "[cartridge-group] %s", serviceGroup.getName()));
+            }
+
+            persistServiceGroup(serviceGroup);
+
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Updated cartridge group: [group-name] %s", serviceGroup.getName()));
+            }
+        } catch (Exception e) {
+            log.error((String.format("Unable to update cartridge group [group-name] %s",
+                    serviceGroup.getName())), e);
+        }
+    }
+
     public boolean serviceGroupExist(String serviceGroupName) {
         String resourcePath = AutoscalerConstants.AUTOSCALER_RESOURCE + AutoscalerConstants.SERVICE_GROUP + "/" + serviceGroupName;
         return resourceExist(resourcePath);

http://git-wip-us.apache.org/repos/asf/stratos/blob/6cddb02d/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/AutoscalerService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/AutoscalerService.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/AutoscalerService.java
index 9aa9e6a..05ceac6 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/AutoscalerService.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/AutoscalerService.java
@@ -201,6 +201,15 @@ public interface AutoscalerService {
     public boolean addServiceGroup(ServiceGroup servicegroup) throws InvalidServiceGroupException;
 
     /**
+     * Update a cartridge group
+     *
+     * @param serviceGroup
+     * @return
+     * @throws InvalidServiceGroupException
+     */
+    public boolean updateServiceGroup(ServiceGroup serviceGroup) throws InvalidServiceGroupException;
+
+    /**
      * Remove a cartridge group
      *
      * @param groupName

http://git-wip-us.apache.org/repos/asf/stratos/blob/6cddb02d/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java
index 4d2e3bf..248b2a4 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java
@@ -655,6 +655,60 @@ public class AutoscalerServiceImpl implements AutoscalerService {
         return true;
     }
 
+    public boolean updateServiceGroup(ServiceGroup cartridgeGroup) throws InvalidServiceGroupException {
+
+        if (cartridgeGroup == null || StringUtils.isEmpty(cartridgeGroup.getName())) {
+            String msg = "Cartridge group cannot be null or service name cannot be empty.";
+            log.error(msg);
+            throw new IllegalArgumentException(msg);
+        }
+
+        if (log.isInfoEnabled()) {
+            log.info(String.format("Updating cartridge group: [group-name] %s", cartridgeGroup.getName()));
+        }
+
+        String groupName = cartridgeGroup.getName();
+        if (!RegistryManager.getInstance().serviceGroupExist(groupName)) {
+            throw new InvalidServiceGroupException(String.format("Cartridge group does not exist: [cartridge-group] %s",
+                    cartridgeGroup.getName()));
+        }
+
+        Dependencies dependencies = cartridgeGroup.getDependencies();
+        if (dependencies != null) {
+            String[] startupOrders = dependencies.getStartupOrders();
+            AutoscalerUtil.validateStartupOrders(groupName, startupOrders);
+
+            if (log.isDebugEnabled()) {
+                log.debug("StartupOrders " + Arrays.toString(startupOrders));
+
+                if (startupOrders != null) {
+                    log.debug("StartupOrder:size  " + startupOrders.length);
+                } else {
+                    log.debug("StartupOrder: is null");
+                }
+            }
+
+            String[] scalingDependents = dependencies.getScalingDependants();
+            AutoscalerUtil.validateScalingDependencies(groupName, scalingDependents);
+
+            if (log.isDebugEnabled()) {
+                log.debug("ScalingDependent " + Arrays.toString(scalingDependents));
+
+                if (scalingDependents != null) {
+                    log.debug("ScalingDependents:size " + scalingDependents.length);
+                } else {
+                    log.debug("ScalingDependent: is null");
+                }
+            }
+        }
+
+        RegistryManager.getInstance().updateServiceGroup(cartridgeGroup);
+        if (log.isInfoEnabled()) {
+            log.info(String.format("Cartridge group successfully updated: [group-name] %s", cartridgeGroup.getName()));
+        }
+        return true;
+    }
+
     @Override
     public boolean removeServiceGroup(String groupName) throws CartridgeGroupNotFoundException {
         try {

http://git-wip-us.apache.org/repos/asf/stratos/blob/6cddb02d/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/client/AutoscalerServiceClient.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/client/AutoscalerServiceClient.java b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/client/AutoscalerServiceClient.java
index c9c8750..ccc89d6 100644
--- a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/client/AutoscalerServiceClient.java
+++ b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/client/AutoscalerServiceClient.java
@@ -185,6 +185,11 @@ public class AutoscalerServiceClient {
         stub.addServiceGroup(serviceGroup);
     }
 
+    public void updateServiceGroup(ServiceGroup serviceGroup) throws AutoscalerServiceInvalidServiceGroupExceptionException,
+            RemoteException {
+        stub.updateServiceGroup(serviceGroup);
+    }
+
     public void removeServiceGroup(String groupName) throws RemoteException,
             AutoscalerServiceCartridgeGroupNotFoundExceptionException {
         stub.removeServiceGroup(groupName);

http://git-wip-us.apache.org/repos/asf/stratos/blob/6cddb02d/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java
index 7082465..3c5b5a0 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java
@@ -21,6 +21,7 @@ package org.apache.stratos.rest.endpoint.api;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.stub.*;
+import org.apache.stratos.autoscaler.stub.exception.InvalidServiceGroupException;
 import org.apache.stratos.cloud.controller.stub.*;
 import org.apache.stratos.common.beans.*;
 import org.apache.stratos.common.beans.application.ApplicationBean;
@@ -467,6 +468,39 @@ public class StratosApiV41 extends AbstractApi {
     }
 
     /**
+     * Updates a cartridge group
+     *
+     * @param cartridgeGroup cartridge group definition
+     * @return 200 if network partition is successfully updated
+     * @throws RestAPIException
+     */
+    @PUT
+    @Path("/cartridgeGroups")
+    @Produces("application/json")
+    @Consumes("application/json")
+    @AuthorizationAction("/permission/protected/manage/updateServiceGroup")
+    public Response updateServiceGroup(
+            GroupBean cartridgeGroup) throws RestAPIException {
+
+        try {
+            StratosApiV41Utils.updateServiceGroup(cartridgeGroup);
+            URI url = uriInfo.getAbsolutePathBuilder().path(cartridgeGroup.getName()).build();
+
+            return Response.created(url).entity(new ResponseMessageBean(ResponseMessageBean.SUCCESS,
+                    String.format("Cartridge group updated successfully: [cartridge-group] %s",
+                            cartridgeGroup.getName()))).build();
+
+        } catch (InvalidCartridgeGroupDefinitionException e) {
+            return Response.status(Response.Status.BAD_REQUEST).entity(new ResponseMessageBean(
+                    ResponseMessageBean.ERROR, "Invalid cartridge group definition")).build();
+        } catch (RestAPIException e) {
+            return Response.status(Response.Status.NOT_FOUND).entity(new ResponseMessageBean(
+                    ResponseMessageBean.ERROR, "Cartridge group not found")).build();
+        }
+    }
+
+
+    /**
      * Gets the cartridge group definition.
      *
      * @param groupDefinitionName the group definition name

http://git-wip-us.apache.org/repos/asf/stratos/blob/6cddb02d/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java
index ff2c08c..ab798c7 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java
@@ -25,6 +25,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.stub.*;
 import org.apache.stratos.autoscaler.stub.deployment.policy.ApplicationPolicy;
+import org.apache.stratos.autoscaler.stub.exception.InvalidServiceGroupException;
 import org.apache.stratos.autoscaler.stub.pojo.ApplicationContext;
 import org.apache.stratos.autoscaler.stub.pojo.ServiceGroup;
 import org.apache.stratos.cloud.controller.stub.*;
@@ -1071,6 +1072,93 @@ public class StratosApiV41Utils {
     }
 
     /**
+     * Update a cartridge group
+     *
+     * @param cartridgeGroup
+     * @throws RestAPIException
+     */
+    public static void updateServiceGroup(GroupBean cartridgeGroup) throws RestAPIException,
+            InvalidCartridgeGroupDefinitionException {
+        try {
+            ServiceGroup serviceGroup = ObjectConverter.convertServiceGroupDefinitionToASStubServiceGroup(
+                    cartridgeGroup);
+            AutoscalerServiceClient autoscalerServiceClient = AutoscalerServiceClient.getInstance();
+
+            StratosManagerServiceClient smServiceClient = getStratosManagerServiceClient();
+
+            // Validate whether cartridge group can be updated
+            if (!smServiceClient.canCartirdgeGroupBeRemoved(cartridgeGroup.getName())) {
+                String message = "Cannot update cartridge group: [group-name] " + cartridgeGroup.getName() +
+                        " since it is used in another cartridge group or an application";
+                log.error(message);
+                throw new RestAPIException(message);
+            }
+
+            //validate the group definition to check if cartridges duplicate in any groups defined
+            validateCartridgeDuplicationInGroupDefinition(cartridgeGroup);
+
+            //validate the group definition to check if groups duplicate in any groups and
+            //validate the group definition to check for cyclic group behaviour
+            validateGroupDuplicationInGroupDefinition(cartridgeGroup);
+
+            List<String> cartridgesBeforeUpdating = new ArrayList<String>();
+            List<String> cartridgesAfterUpdating = new ArrayList<String>();
+
+            ServiceGroup serviceGroupToBeUpdated = autoscalerServiceClient.getServiceGroup(cartridgeGroup.getName());
+            findCartridgesInServiceGroup(serviceGroupToBeUpdated, cartridgesBeforeUpdating);
+            findCartridgesInGroupBean(cartridgeGroup, cartridgesAfterUpdating);
+
+            List<String> cartridgesToRemove = cartridgesBeforeUpdating;
+            List<String> cartridgesToAdd = cartridgesAfterUpdating;
+
+            if ((cartridgesBeforeUpdating != null) || (!cartridgesBeforeUpdating.isEmpty()) ||
+                    (cartridgesAfterUpdating != null) || (!cartridgesAfterUpdating.isEmpty())) {
+
+                for (String before : cartridgesBeforeUpdating) {
+                    for (String after : cartridgesAfterUpdating) {
+                        if (before.equals(after)) {
+                            cartridgesToRemove.remove(after);
+                            cartridgesToAdd.remove(after);
+                        }
+                    }
+                }
+            }
+
+            // Add cartridge group elements to SM cache - done after cartridge group has been updated
+            if (cartridgesToAdd != null || !cartridgesToAdd.isEmpty()) {
+                smServiceClient.addUsedCartridgesInCartridgeGroups(cartridgeGroup.getName(),
+                        cartridgesToAdd.toArray(new String[cartridgesToRemove.size()]));
+            }
+
+            // Remove cartridge group elements from SM cache - done after cartridge group has been updated
+            if (cartridgesToRemove != null || !cartridgesToRemove.isEmpty()) {
+                smServiceClient.removeUsedCartridgesInCartridgeGroups(cartridgeGroup.getName(),
+                        cartridgesToRemove.toArray(new String[cartridgesToRemove.size()]));
+            }
+
+            if (serviceGroup != null) {
+                autoscalerServiceClient.updateServiceGroup(
+                        ObjectConverter.convertServiceGroupDefinitionToASStubServiceGroup(cartridgeGroup));
+            }
+
+        } catch (RemoteException e) {
+            String message = String.format("Could not update cartridge group: [group-name] %s,",
+                    cartridgeGroup.getName());
+            log.error(message);
+            throw new RestAPIException(message, e);
+        } catch (AutoscalerServiceInvalidServiceGroupExceptionException e) {
+            String message = String.format("Autoscaler invalid cartridge group definition: [group-name] %s",
+                    cartridgeGroup.getName());
+            log.error(message);
+            throw new InvalidCartridgeGroupDefinitionException(message, e);
+        } catch (ServiceGroupDefinitionException e) {
+            String message = String.format("Invalid cartridge group definition: [group-name] %s", cartridgeGroup.getName());
+            log.error(message);
+            throw new InvalidCartridgeGroupDefinitionException(message, e);
+        }
+    }
+
+    /**
      * returns any duplicates in a List
      *
      * @param checkedList List to find duplicates from