Fixing for multitenant subscription to LB cartridge
Project: http://git-wip-us.apache.org/repos/asf/incubator-stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-stratos/commit/1ba43d81 Tree: http://git-wip-us.apache.org/repos/asf/incubator-stratos/tree/1ba43d81 Diff: http://git-wip-us.apache.org/repos/asf/incubator-stratos/diff/1ba43d81 Branch: refs/heads/carbon-4.2.0-upgrade Commit: 1ba43d813d7b3ae7549ceff0ace1f85d2d87bd0e Parents: 37c56e7 Author: Sajith Kariyawasam <[email protected]> Authored: Sat Jan 4 22:24:51 2014 +0530 Committer: Sajith Kariyawasam <[email protected]> Committed: Sat Jan 4 22:24:51 2014 +0530 ---------------------------------------------------------------------- .../service/ServiceDeploymentManager.java | 218 ++++++++++++++++++- .../manager/CartridgeSubscriptionManager.java | 2 + .../rest/endpoint/services/ServiceUtils.java | 4 +- .../rest/endpoint/services/StratosAdmin.java | 2 +- 4 files changed, 221 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/1ba43d81/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/deploy/service/ServiceDeploymentManager.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/deploy/service/ServiceDeploymentManager.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/deploy/service/ServiceDeploymentManager.java index 8a03a14..4bc25d9 100644 --- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/deploy/service/ServiceDeploymentManager.java +++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/deploy/service/ServiceDeploymentManager.java @@ -19,26 +19,39 @@ package org.apache.stratos.adc.mgt.deploy.service; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.stratos.adc.mgt.client.AutoscalerServiceClient; import org.apache.stratos.adc.mgt.client.CloudControllerServiceClient; import org.apache.stratos.adc.mgt.deploy.service.multitenant.MultiTenantService; import org.apache.stratos.adc.mgt.exception.ADCException; import org.apache.stratos.adc.mgt.exception.UnregisteredCartridgeException; +import org.apache.stratos.adc.mgt.manager.CartridgeSubscriptionManager; import org.apache.stratos.adc.mgt.payload.BasicPayloadData; import org.apache.stratos.adc.mgt.payload.PayloadData; import org.apache.stratos.adc.mgt.payload.PayloadFactory; +import org.apache.stratos.adc.mgt.subscription.CartridgeSubscription; import org.apache.stratos.adc.mgt.subscription.utils.CartridgeSubscriptionUtils; import org.apache.stratos.adc.mgt.utils.CartridgeConstants; import org.apache.stratos.adc.mgt.utils.PersistenceManager; +import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy; import org.apache.stratos.cloud.controller.pojo.CartridgeInfo; +import org.apache.stratos.cloud.controller.pojo.LoadbalancerConfig; +import org.apache.stratos.cloud.controller.pojo.Properties; import org.apache.stratos.cloud.controller.pojo.Property; +import org.apache.stratos.messaging.util.Constants; public class ServiceDeploymentManager { private static Log log = LogFactory.getLog(ServiceDeploymentManager.class); - - public Service deployService (String type, String autoscalingPolicyName, String deploymentPolicyName, int tenantId, String tenantRange) + private CartridgeSubscriptionManager cartridgeSubsciptionManager = new CartridgeSubscriptionManager(); + + public Service deployService (String type, String autoscalingPolicyName, String deploymentPolicyName, int tenantId, String tenantRange, + String tenantDomain, String userName) throws ADCException, UnregisteredCartridgeException { //get deployed Cartridge Definition information @@ -63,6 +76,174 @@ public class ServiceDeploymentManager { throw new ADCException(errorMsg); } + + // TODO - LB cartridge.... ?? + + List<Property> lbRefProp = new ArrayList<Property>(); + + // get lb config reference + LoadbalancerConfig lbConfig = cartridgeInfo.getLbConfig(); + + if (lbConfig == null || lbConfig.getProperties() == null) { + if (log.isDebugEnabled()) { + log.debug("This Service does not require a load balancer. " + "[Service Name] " + + type); + } + } else { + + CartridgeInfo lbCartridgeInfo; + String lbCartridgeType = lbConfig.getType(); + try { + // retrieve lb Cartridge info + lbCartridgeInfo = CloudControllerServiceClient.getServiceClient().getCartridgeInfo(lbCartridgeType); + } catch (Exception e) { + String msg = "Cannot get cartridge info: " + type; + log.error(msg, e); + throw new ADCException(msg, e); + } + + Properties lbReferenceProperties = lbConfig.getProperties(); + + Property property = new Property(); + property.setName(org.apache.stratos.messaging.util.Constants.LOAD_BALANCER_REF); + + for (org.apache.stratos.cloud.controller.pojo.Property prop : lbReferenceProperties.getProperties()) { + + String name = prop.getName(); + String value = prop.getValue(); + + // TODO make following a chain of responsibility pattern + if (Constants.NO_LOAD_BALANCER.equals(name)) { + if ("true".equals(value)) { + if (log.isDebugEnabled()) { + log.debug("This cartridge does not require a load balancer. " + + "[Type] " + type); + } + property.setValue(name); + lbRefProp.add(property); + break; + } + } else if (Constants.EXISTING_LOAD_BALANCERS.equals(name)) { + String clusterIdsVal = value; + if (log.isDebugEnabled()) { + log.debug("This cartridge refers to existing load balancers. " + "[Type] " + + type + "[Referenced Cluster Ids] " + clusterIdsVal); + } + + String[] clusterIds = clusterIdsVal.split(","); + + for (String clusterId : clusterIds) { + + try { + AutoscalerServiceClient.getServiceClient().checkLBExistenceAgainstPolicy(clusterId, + deploymentPolicyName); + } catch (Exception ex) { + // we don't need to throw the error here. + log.error(ex.getMessage(), ex); + } + + } + + property.setValue(name); + lbRefProp.add(property); + break; + + } else if (Constants.DEFAULT_LOAD_BALANCER.equals(name)) { + if ("true".equals(value)) { + property.setValue(name); + if (log.isDebugEnabled()) { + log.debug("This cartridge uses default load balancer. " + "[Type] " + + type); + } + + try { + // get the valid policies for lb cartridge + DeploymentPolicy[] lbCartridgeDepPolicies = + AutoscalerServiceClient.getServiceClient().getDeploymentPolicies(lbCartridgeType); + // traverse deployment policies of lb cartridge + for (DeploymentPolicy policy : lbCartridgeDepPolicies) { + // check existence of the subscribed policy + if (deploymentPolicyName.equals(policy.getId())) { + + if (!AutoscalerServiceClient.getServiceClient().checkDefaultLBExistenceAgainstPolicy(deploymentPolicyName)) { + + // if lb cluster doesn't exist + String lbAlias = "lb" + new Random().nextInt(); + lbCartridgeInfo.addProperties(property); + subscribeToLb(lbCartridgeType, + lbAlias, + lbCartridgeInfo.getDefaultAutoscalingPolicy(), + deploymentPolicyName, tenantId, + userName, + tenantDomain, + lbCartridgeInfo.getProperties()); + } + } + } + + } catch (Exception ex) { + // we don't need to throw the error here. + log.error(ex.getMessage(), ex); + } + + + lbRefProp.add(property); + break; + } else if (Constants.SERVICE_AWARE_LOAD_BALANCER.equals(name)) { + if ("true".equals(value)) { + property.setValue(name); + if (log.isDebugEnabled()) { + log.debug("This cartridge uses a service aware load balancer. " + + "[Type] " + type); + } + + try { + + // get the valid policies for lb cartridge + DeploymentPolicy[] lbCartridgeDepPolicies = + AutoscalerServiceClient.getServiceClient().getDeploymentPolicies(lbCartridgeType); + // traverse deployment policies of lb cartridge + for (DeploymentPolicy policy : lbCartridgeDepPolicies) { + // check existence of the subscribed policy + if (deploymentPolicyName.equals(policy.getId())) { + + if (!AutoscalerServiceClient.getServiceClient().checkServiceLBExistenceAgainstPolicy(type, + deploymentPolicyName)) { + + // if lb cluster doesn't exist + String lbAlias = + "lb" + type + + new Random().nextInt(); + lbCartridgeInfo.addProperties(property); + subscribeToLb(lbCartridgeType, + lbAlias, + lbCartridgeInfo.getDefaultAutoscalingPolicy(), + deploymentPolicyName, + tenantId, + userName, + tenantDomain, + lbCartridgeInfo.getProperties()); + } + } + } + + } catch (Exception ex) { + // we don't need to throw the error here. + log.error(ex.getMessage(), ex); + } + + + lbRefProp.add(property); + break; + } + } + } + } + } + + + + Service service = new MultiTenantService(type, autoscalingPolicyName, deploymentPolicyName, tenantId, cartridgeInfo, tenantRange); //generate the cluster ID (domain)for the service @@ -113,4 +294,37 @@ public class ServiceDeploymentManager { //TODO: } + + private void configureLBDeployment() { + + + + } + + private void subscribeToLb(String cartridgeType, String lbAlias, + String defaultAutoscalingPolicy, String deploymentPolicy, + int tenantId, String userName, String tenantDomain, Property[] props) throws ADCException { + + try { + if(log.isDebugEnabled()) { + log.debug("Subscribing to a load balancer [cartridge] "+cartridgeType+" [alias] "+lbAlias); + } + CartridgeSubscription cartridgeSubscription = + cartridgeSubsciptionManager.subscribeToCartridgeWithProperties(cartridgeType, lbAlias.trim(), defaultAutoscalingPolicy, + deploymentPolicy, + tenantDomain, + tenantId, + userName, "git", null, false, null, null, props); + + cartridgeSubsciptionManager.registerCartridgeSubscription(cartridgeSubscription); + + if(log.isDebugEnabled()) { + log.debug("Successfully subscribed to a load balancer [cartridge] "+cartridgeType+" [alias] "+lbAlias); + } + } catch (Exception e) { + String msg = "Error while subscribing to load balancer cartridge [type] "+cartridgeType; + log.error(msg, e); + throw new ADCException(msg, e); + } + } } http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/1ba43d81/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/manager/CartridgeSubscriptionManager.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/manager/CartridgeSubscriptionManager.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/manager/CartridgeSubscriptionManager.java index 92b5dd4..2a22c82 100644 --- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/manager/CartridgeSubscriptionManager.java +++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/manager/CartridgeSubscriptionManager.java @@ -222,6 +222,8 @@ public class CartridgeSubscriptionManager { if(cartridgeInfo.getMultiTenant()) { log.info(" Multitenant --> Publishing Artifact update event -- "); + log.info(" Values : cluster id - " + cartridgeSubscription.getClusterDomain() + " tenant - " + + cartridgeSubscription.getSubscriber().getTenantId()); ArtifactUpdatePublisher publisher = new ArtifactUpdatePublisher(cartridgeSubscription.getRepository(), cartridgeSubscription.getClusterDomain(), // clusterId String.valueOf(cartridgeSubscription.getSubscriber().getTenantId())); http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/1ba43d81/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java index acde631..816caad 100644 --- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java +++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java @@ -910,10 +910,10 @@ public class ServiceUtils { * */ static void deployService (String cartridgeType, String alias, String autoscalingPolicy, String deploymentPolicy, - String tenantDomain, int tenantId, String clusterDomain, String clusterSubdomain, String tenantRange) { + String tenantDomain, String tenantUsername, int tenantId, String clusterDomain, String clusterSubdomain, String tenantRange) { log.info("Deploying service.."); try { - serviceDeploymentManager.deployService(cartridgeType, autoscalingPolicy, deploymentPolicy, tenantId, tenantRange); + serviceDeploymentManager.deployService(cartridgeType, autoscalingPolicy, deploymentPolicy, tenantId, tenantRange, tenantDomain, tenantUsername); } catch (Exception e) { e.printStackTrace(); } http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/1ba43d81/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/StratosAdmin.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/StratosAdmin.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/StratosAdmin.java index bdc7c00..0cc4ca8 100644 --- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/StratosAdmin.java +++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/StratosAdmin.java @@ -684,7 +684,7 @@ public class StratosAdmin extends AbstractAdmin { // super tenant Deploying service (MT) // here an alias is generated ServiceUtils.deployService(serviceDefinitionBean.getCartridgeType(), UUID.randomUUID().toString(), serviceDefinitionBean.getAutoscalingPolicyName(), - serviceDefinitionBean.getDeploymentPolicyName(), getTenantDomain(), getTenantId(), + serviceDefinitionBean.getDeploymentPolicyName(), getTenantDomain(), getUsername(), getTenantId(), serviceDefinitionBean.getClusterDomain(), serviceDefinitionBean.getClusterSubDomain(), serviceDefinitionBean.getTenantRange()); }
