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 <[email protected]> Authored: Wed May 13 21:54:07 2015 +0530 Committer: Vishanth <[email protected]> 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
