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