org.apache.stratos.rest.endpoint.services.ServiceUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.stratos.rest.endpoint.services.ServiceUtils.java

Source

/**
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
    
 *  http://www.apache.org/licenses/LICENSE-2.0
    
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License.
 */
package org.apache.stratos.rest.endpoint.services;

import org.apache.axis2.AxisFault;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
import org.apache.stratos.cloud.controller.stub.pojo.CartridgeConfig;
import org.apache.stratos.cloud.controller.stub.pojo.CartridgeInfo;
import org.apache.stratos.cloud.controller.stub.pojo.Property;
import org.apache.stratos.autoscaler.stub.AutoScalerServiceInvalidPartitionExceptionException;
import org.apache.stratos.autoscaler.stub.AutoScalerServiceInvalidPolicyExceptionException;
import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidCartridgeDefinitionExceptionException;
import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidCartridgeTypeExceptionException;
import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidIaasProviderExceptionException;
import org.apache.stratos.manager.client.AutoscalerServiceClient;
import org.apache.stratos.manager.client.CloudControllerServiceClient;
import org.apache.stratos.manager.deploy.service.Service;
import org.apache.stratos.manager.deploy.service.ServiceDeploymentManager;
import org.apache.stratos.manager.dto.Cartridge;
import org.apache.stratos.manager.dto.SubscriptionInfo;
import org.apache.stratos.manager.exception.*;
import org.apache.stratos.manager.manager.CartridgeSubscriptionManager;
import org.apache.stratos.manager.repository.RepositoryNotification;
import org.apache.stratos.manager.subscription.CartridgeSubscription;
import org.apache.stratos.manager.subscription.DataCartridgeSubscription;
import org.apache.stratos.manager.subscription.PersistenceContext;
import org.apache.stratos.manager.subscription.SubscriptionData;
import org.apache.stratos.manager.subscription.SubscriptionDomain;
import org.apache.stratos.manager.topology.model.TopologyClusterInformationModel;
import org.apache.stratos.manager.utils.ApplicationManagementUtil;
import org.apache.stratos.manager.utils.CartridgeConstants;
import org.apache.stratos.messaging.domain.topology.Cluster;
import org.apache.stratos.messaging.domain.topology.Member;
import org.apache.stratos.messaging.domain.topology.MemberStatus;
import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
import org.apache.stratos.messaging.util.Constants;
import org.apache.stratos.rest.endpoint.bean.CartridgeInfoBean;
import org.apache.stratos.rest.endpoint.bean.StratosAdminResponse;
import org.apache.stratos.rest.endpoint.bean.SubscriptionDomainRequest;
import org.apache.stratos.rest.endpoint.bean.autoscaler.partition.Partition;
import org.apache.stratos.rest.endpoint.bean.autoscaler.partition.PartitionGroup;
import org.apache.stratos.rest.endpoint.bean.autoscaler.policy.autoscale.AutoscalePolicy;
import org.apache.stratos.rest.endpoint.bean.cartridge.definition.CartridgeDefinitionBean;
import org.apache.stratos.rest.endpoint.bean.cartridge.definition.ServiceDefinitionBean;
import org.apache.stratos.rest.endpoint.bean.repositoryNotificationInfoBean.Payload;
import org.apache.stratos.rest.endpoint.bean.subscription.domain.SubscriptionDomainBean;
import org.apache.stratos.rest.endpoint.bean.util.converter.PojoConverter;
import org.apache.stratos.rest.endpoint.exception.RestAPIException;

import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

import java.rmi.RemoteException;
import java.util.*;
import java.util.regex.Pattern;

public class ServiceUtils {
    public static final String IS_VOLUME_REQUIRED = "volume.required";
    public static final String SHOULD_DELETE_VOLUME = "volume.delete.on.unsubscription";
    public static final String VOLUME_SIZE = "volume.size.gb";
    public static final String DEVICE_NAME = "volume.device.name";

    private static Log log = LogFactory.getLog(ServiceUtils.class);
    private static CartridgeSubscriptionManager cartridgeSubsciptionManager = new CartridgeSubscriptionManager();
    private static ServiceDeploymentManager serviceDeploymentManager = new ServiceDeploymentManager();

    static StratosAdminResponse deployCartridge(CartridgeDefinitionBean cartridgeDefinitionBean,
            ConfigurationContext ctxt, String userName, String tenantDomain) throws RestAPIException {

        log.info("Starting to deploy a Cartridge [type] " + cartridgeDefinitionBean.type);

        CloudControllerServiceClient cloudControllerServiceClient = getCloudControllerServiceClient();

        if (cloudControllerServiceClient != null) {

            CartridgeConfig cartridgeConfig = PojoConverter.populateCartridgeConfigPojo(cartridgeDefinitionBean);

            if (cartridgeConfig == null) {
                throw new RestAPIException(
                        "Populated CartridgeConfig instance is null, cartridge deployment aborted");
            }

            // call CC
            try {
                cloudControllerServiceClient.deployCartridgeDefinition(cartridgeConfig);
            } catch (RemoteException e) {
                log.error(e.getMessage(), e);
                throw new RestAPIException(e.getMessage(), e);
            } catch (CloudControllerServiceInvalidCartridgeDefinitionExceptionException e) {
                String message = e.getFaultMessage().getInvalidCartridgeDefinitionException().getMessage();
                log.error(message, e);
                throw new RestAPIException(message, e);
            } catch (CloudControllerServiceInvalidIaasProviderExceptionException e) {
                String message = e.getFaultMessage().getInvalidIaasProviderException().getMessage();
                log.error(message, e);
                throw new RestAPIException(message, e);
            }

            log.info("Successfully deployed Cartridge [type] " + cartridgeDefinitionBean.type);

        }

        StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
        stratosAdminResponse
                .setMessage("Successfully deployed cartridge definition with type " + cartridgeDefinitionBean.type);
        return stratosAdminResponse;
    }

    @SuppressWarnings("unused")
    private static DeploymentPolicy[] intersection(DeploymentPolicy[] cartridgeDepPolicies,
            DeploymentPolicy[] lbCartridgeDepPolicies) {

        List<DeploymentPolicy> commonPolicies = new ArrayList<DeploymentPolicy>();
        for (DeploymentPolicy policy1 : cartridgeDepPolicies) {
            for (DeploymentPolicy policy2 : lbCartridgeDepPolicies) {
                if (policy1.equals(policy2)) {
                    commonPolicies.add(policy1);
                }
            }

        }
        return commonPolicies.toArray(new DeploymentPolicy[0]);
    }

    static StratosAdminResponse undeployCartridge(String cartridgeType) throws RestAPIException {

        CloudControllerServiceClient cloudControllerServiceClient = getCloudControllerServiceClient();
        if (cloudControllerServiceClient != null) {
            try {
                cloudControllerServiceClient.unDeployCartridgeDefinition(cartridgeType);
            } catch (RemoteException e) {
                log.error(e.getMessage(), e);
                throw new RestAPIException(e.getMessage(), e);
            } catch (CloudControllerServiceInvalidCartridgeTypeExceptionException e) {
                String msg = e.getFaultMessage().getInvalidCartridgeTypeException().getMessage();
                log.error(msg, e);
                throw new RestAPIException(msg, e);
            }

        }

        StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
        stratosAdminResponse.setMessage("Successfully undeployed cartridge definition with type " + cartridgeType);
        return stratosAdminResponse;
    }

    public static StratosAdminResponse deployPartition(Partition partitionBean) throws RestAPIException {

        //log.info("***** " + cartridgeDefinitionBean.toString() + " *****");

        AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient();
        if (autoscalerServiceClient != null) {

            org.apache.stratos.cloud.controller.stub.deployment.partition.Partition partition = PojoConverter
                    .convertToCCPartitionPojo(partitionBean);

            try {
                autoscalerServiceClient.deployPartition(partition);
            } catch (RemoteException e) {
                log.error(e.getMessage(), e);
                throw new RestAPIException(e.getMessage(), e);
            } catch (AutoScalerServiceInvalidPartitionExceptionException e) {
                String message = e.getFaultMessage().getInvalidPartitionException().getMessage();
                log.error(message, e);
                throw new RestAPIException(message, e);
            }

        }

        StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
        stratosAdminResponse.setMessage("Successfully deployed partition definition with id " + partitionBean.id);
        return stratosAdminResponse;
    }

    public static StratosAdminResponse deployAutoscalingPolicy(AutoscalePolicy autoscalePolicyBean)
            throws RestAPIException {

        //log.info("***** " + cartridgeDefinitionBean.toString() + " *****");

        AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient();
        if (autoscalerServiceClient != null) {

            org.apache.stratos.autoscaler.policy.model.AutoscalePolicy autoscalePolicy = PojoConverter
                    .convertToCCAutoscalerPojo(autoscalePolicyBean);

            try {
                autoscalerServiceClient.deployAutoscalingPolicy(autoscalePolicy);
            } catch (RemoteException e) {
                log.error(e.getMessage(), e);
                throw new RestAPIException(e.getMessage(), e);
            } catch (AutoScalerServiceInvalidPolicyExceptionException e) {
                String message = e.getFaultMessage().getInvalidPolicyException().getMessage();
                log.error(message, e);
                throw new RestAPIException(message, e);
            }

        }

        StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
        stratosAdminResponse.setMessage(
                "Successfully deployed autoscaling policy definition with id " + autoscalePolicyBean.getId());
        return stratosAdminResponse;
    }

    public static StratosAdminResponse deployDeploymentPolicy(
            org.apache.stratos.rest.endpoint.bean.autoscaler.policy.deployment.DeploymentPolicy deploymentPolicyBean)
            throws RestAPIException {

        //log.info("***** " + cartridgeDefinitionBean.toString() + " *****");

        AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient();
        if (autoscalerServiceClient != null) {

            org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy deploymentPolicy = PojoConverter
                    .convetToCCDeploymentPolicyPojo(deploymentPolicyBean);

            try {
                autoscalerServiceClient.deployDeploymentPolicy(deploymentPolicy);
            } catch (RemoteException e) {
                log.error(e.getMessage(), e);
                throw new RestAPIException(e.getMessage(), e);
            } catch (AutoScalerServiceInvalidPolicyExceptionException e) {
                String message = e.getFaultMessage().getInvalidPolicyException().getMessage();
                log.error(message, e);
                throw new RestAPIException(message, e);
            }

        }

        StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
        stratosAdminResponse.setMessage(
                "Successfully deployed deployment policy definition with type " + deploymentPolicyBean.id);
        return stratosAdminResponse;
    }

    private static CloudControllerServiceClient getCloudControllerServiceClient() throws RestAPIException {

        try {
            return CloudControllerServiceClient.getServiceClient();

        } catch (AxisFault axisFault) {
            String errorMsg = "Error while getting CloudControllerServiceClient instance to connect to the "
                    + "Cloud Controller. Cause: " + axisFault.getMessage();
            log.error(errorMsg, axisFault);
            throw new RestAPIException(errorMsg, axisFault);
        }
    }

    public static Partition[] getAvailablePartitions() throws RestAPIException {

        org.apache.stratos.cloud.controller.stub.deployment.partition.Partition[] partitions = null;
        AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient();
        if (autoscalerServiceClient != null) {
            try {
                partitions = autoscalerServiceClient.getAvailablePartitions();

            } catch (RemoteException e) {
                String errorMsg = "Error while getting available partitions. Cause : " + e.getMessage();
                log.error(errorMsg, e);
                throw new RestAPIException(errorMsg, e);
            }
        }

        return PojoConverter.populatePartitionPojos(partitions);
    }

    public static Partition[] getPartitionsOfDeploymentPolicy(String deploymentPolicyId) throws RestAPIException {

        org.apache.stratos.cloud.controller.stub.deployment.partition.Partition[] partitions = null;
        AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient();
        if (autoscalerServiceClient != null) {
            try {
                partitions = autoscalerServiceClient.getPartitionsOfDeploymentPolicy(deploymentPolicyId);

            } catch (RemoteException e) {
                String errorMsg = "Error while getting available partitions for deployment policy id "
                        + deploymentPolicyId + ". Cause: " + e.getMessage();
                log.error(errorMsg, e);
                throw new RestAPIException(errorMsg, e);
            }
        }

        return PojoConverter.populatePartitionPojos(partitions);
    }

    public static Partition[] getPartitionsOfGroup(String deploymentPolicyId, String groupId)
            throws RestAPIException {

        org.apache.stratos.cloud.controller.stub.deployment.partition.Partition[] partitions = null;
        AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient();
        if (autoscalerServiceClient != null) {
            try {
                partitions = autoscalerServiceClient.getPartitionsOfGroup(deploymentPolicyId, groupId);

            } catch (RemoteException e) {
                String errorMsg = "Error while getting available partitions for deployment policy id "
                        + deploymentPolicyId + ", group id " + groupId + ". Cause: " + e.getMessage();
                log.error(errorMsg, e);
                throw new RestAPIException(errorMsg, e);
            }
        }

        return PojoConverter.populatePartitionPojos(partitions);
    }

    public static Partition getPartition(String partitionId) throws RestAPIException {

        org.apache.stratos.cloud.controller.stub.deployment.partition.Partition partition = null;
        AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient();
        if (autoscalerServiceClient != null) {
            try {
                partition = autoscalerServiceClient.getPartition(partitionId);

            } catch (RemoteException e) {
                String errorMsg = "Error while getting partition for id " + partitionId + ". Cause: "
                        + e.getMessage();
                log.error(errorMsg, e);
                throw new RestAPIException(errorMsg, e);
            }
        }

        return PojoConverter.populatePartitionPojo(partition);
    }

    private static AutoscalerServiceClient getAutoscalerServiceClient() throws RestAPIException {

        try {
            return AutoscalerServiceClient.getServiceClient();

        } catch (AxisFault axisFault) {
            String errorMsg = "Error while getting AutoscalerServiceClient instance to connect to the "
                    + "Autoscaler. Cause: " + axisFault.getMessage();
            log.error(errorMsg, axisFault);
            throw new RestAPIException(errorMsg, axisFault);
        }
    }

    public static AutoscalePolicy[] getAutoScalePolicies() throws RestAPIException {

        org.apache.stratos.autoscaler.policy.model.AutoscalePolicy[] autoscalePolicies = null;
        AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient();
        if (autoscalerServiceClient != null) {
            try {
                autoscalePolicies = autoscalerServiceClient.getAutoScalePolicies();

            } catch (RemoteException e) {
                String errorMsg = "Error while getting available autoscaling policies. Cause : " + e.getMessage();
                log.error(errorMsg, e);
                throw new RestAPIException(errorMsg, e);
            }
        }
        return PojoConverter.populateAutoscalePojos(autoscalePolicies);
    }

    public static AutoscalePolicy getAutoScalePolicy(String autoscalePolicyId) throws RestAPIException {

        org.apache.stratos.autoscaler.policy.model.AutoscalePolicy autoscalePolicy = null;
        AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient();
        if (autoscalerServiceClient != null) {
            try {
                autoscalePolicy = autoscalerServiceClient.getAutoScalePolicy(autoscalePolicyId);

            } catch (RemoteException e) {
                String errorMsg = "Error while getting information for autoscaling policy with id "
                        + autoscalePolicyId + ".  Cause: " + e.getMessage();
                log.error(errorMsg, e);
                throw new RestAPIException(errorMsg, e);
            }
        }

        return PojoConverter.populateAutoscalePojo(autoscalePolicy);
    }

    public static org.apache.stratos.rest.endpoint.bean.autoscaler.policy.deployment.DeploymentPolicy[] getDeploymentPolicies()
            throws RestAPIException {

        DeploymentPolicy[] deploymentPolicies = null;
        AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient();
        if (autoscalerServiceClient != null) {
            try {
                deploymentPolicies = autoscalerServiceClient.getDeploymentPolicies();
            } catch (RemoteException e) {
                String errorMsg = "Error getting available deployment policies. Cause : " + e.getMessage();
                log.error(errorMsg, e);
                throw new RestAPIException(errorMsg, e);
            }
        }

        return PojoConverter.populateDeploymentPolicyPojos(deploymentPolicies);
    }

    public static org.apache.stratos.rest.endpoint.bean.autoscaler.policy.deployment.DeploymentPolicy[] getDeploymentPolicies(
            String cartridgeType) throws RestAPIException {

        DeploymentPolicy[] deploymentPolicies = null;
        AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient();
        if (autoscalerServiceClient != null) {
            try {
                deploymentPolicies = autoscalerServiceClient.getDeploymentPolicies(cartridgeType);

            } catch (RemoteException e) {
                String errorMsg = "Error while getting available deployment policies for cartridge type "
                        + cartridgeType + ". Cause: " + e.getMessage();
                ;
                log.error(errorMsg, e);
                throw new RestAPIException(errorMsg, e);
            }
        }

        if (deploymentPolicies.length == 0) {
            String errorMsg = "Cannot find any matching deployment policy for Cartridge [type] " + cartridgeType;
            log.error(errorMsg);
            throw new RestAPIException(errorMsg);
        }

        return PojoConverter.populateDeploymentPolicyPojos(deploymentPolicies);
    }

    public static org.apache.stratos.rest.endpoint.bean.autoscaler.policy.deployment.DeploymentPolicy getDeploymentPolicy(
            String deploymentPolicyId) throws RestAPIException {

        DeploymentPolicy deploymentPolicy = null;
        AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient();
        if (autoscalerServiceClient != null) {
            try {
                deploymentPolicy = autoscalerServiceClient.getDeploymentPolicy(deploymentPolicyId);

            } catch (RemoteException e) {
                String errorMsg = "Error while getting deployment policy with id " + deploymentPolicyId
                        + ". Cause: " + e.getMessage();
                log.error(errorMsg, e);
                throw new RestAPIException(errorMsg, e);
            }
        }

        if (deploymentPolicy == null) {
            String errorMsg = "Cannot find a matching deployment policy for [id] " + deploymentPolicyId;
            log.error(errorMsg);
            throw new RestAPIException(errorMsg);
        }

        return PojoConverter.populateDeploymentPolicyPojo(deploymentPolicy);
    }

    public static PartitionGroup[] getPartitionGroups(String deploymentPolicyId) throws RestAPIException {

        org.apache.stratos.autoscaler.partition.PartitionGroup[] partitionGroups = null;
        AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient();
        if (autoscalerServiceClient != null) {
            try {
                partitionGroups = autoscalerServiceClient.getPartitionGroups(deploymentPolicyId);

            } catch (RemoteException e) {
                String errorMsg = "Error getting available partition groups for deployment policy id "
                        + deploymentPolicyId + ". Cause: " + e.getMessage();
                log.error(errorMsg, e);
                throw new RestAPIException(errorMsg, e);
            }
        }

        return PojoConverter.populatePartitionGroupPojos(partitionGroups);
    }

    static Cartridge getAvailableCartridgeInfo(String cartridgeType, Boolean multiTenant,
            ConfigurationContext configurationContext) throws RestAPIException {
        List<Cartridge> cartridges = getAvailableCartridges(null, multiTenant, configurationContext);
        for (Cartridge cartridge : cartridges) {
            if (cartridge.getCartridgeType().equals(cartridgeType)) {
                return cartridge;
            }
        }
        String msg = "Unavailable cartridge type: " + cartridgeType;
        log.error(msg);
        throw new RestAPIException(msg);
    }

    static List<Cartridge> getAvailableLbCartridges(Boolean multiTenant, ConfigurationContext configurationContext)
            throws RestAPIException {
        List<Cartridge> cartridges = getAvailableCartridges(null, multiTenant, configurationContext);
        List<Cartridge> lbCartridges = new ArrayList<Cartridge>();
        for (Cartridge cartridge : cartridges) {
            if (cartridge.isLoadBalancer()) {
                lbCartridges.add(cartridge);
            }
        }

        /*if(lbCartridges == null || lbCartridges.isEmpty()) {
           String msg = "Load balancer Cartridges are not available.";
             log.error(msg);
             throw new RestAPIException(msg) ;
        }*/
        return lbCartridges;
    }

    static List<Cartridge> getAvailableCartridges(String cartridgeSearchString, Boolean multiTenant,
            ConfigurationContext configurationContext) throws RestAPIException {
        List<Cartridge> cartridges = new ArrayList<Cartridge>();

        if (log.isDebugEnabled()) {
            log.debug("Getting available cartridges. Search String: " + cartridgeSearchString + ", Multi-Tenant: "
                    + multiTenant);
        }

        boolean allowMultipleSubscription = new Boolean(
                System.getProperty(CartridgeConstants.FEATURE_MULTI_TENANT_MULTIPLE_SUBSCRIPTION_ENABLED));

        try {
            Pattern searchPattern = getSearchStringPattern(cartridgeSearchString);

            String[] availableCartridges = CloudControllerServiceClient.getServiceClient()
                    .getRegisteredCartridges();

            if (availableCartridges != null) {
                for (String cartridgeType : availableCartridges) {
                    CartridgeInfo cartridgeInfo = null;
                    try {
                        cartridgeInfo = CloudControllerServiceClient.getServiceClient()
                                .getCartridgeInfo(cartridgeType);
                    } catch (Exception e) {
                        if (log.isWarnEnabled()) {
                            log.warn("Error when calling getCartridgeInfo for " + cartridgeType + ", Error: "
                                    + e.getMessage());
                        }
                    }
                    if (cartridgeInfo == null) {
                        // This cannot happen. But continue
                        if (log.isDebugEnabled()) {
                            log.debug("Cartridge Info not found: " + cartridgeType);
                        }
                        continue;
                    }

                    if (multiTenant != null && !multiTenant && cartridgeInfo.getMultiTenant()) {
                        // Need only Single-Tenant cartridges
                        continue;
                    } else if (multiTenant != null && multiTenant && !cartridgeInfo.getMultiTenant()) {
                        // Need only Multi-Tenant cartridges
                        continue;
                    }

                    if (!ServiceUtils.cartridgeMatches(cartridgeInfo, searchPattern)) {
                        continue;
                    }

                    Cartridge cartridge = new Cartridge();
                    cartridge.setCartridgeType(cartridgeType);
                    cartridge.setProvider(cartridgeInfo.getProvider());
                    cartridge.setDisplayName(cartridgeInfo.getDisplayName());
                    cartridge.setDescription(cartridgeInfo.getDescription());
                    cartridge.setVersion(cartridgeInfo.getVersion());
                    cartridge.setMultiTenant(cartridgeInfo.getMultiTenant());
                    cartridge.setHostName(cartridgeInfo.getHostName());
                    cartridge.setDefaultAutoscalingPolicy(cartridgeInfo.getDefaultAutoscalingPolicy());
                    cartridge.setDefaultDeploymentPolicy(cartridgeInfo.getDefaultDeploymentPolicy());
                    //cartridge.setStatus(CartridgeConstants.NOT_SUBSCRIBED);
                    cartridge.setCartridgeAlias("-");
                    cartridge.setPersistence(cartridgeInfo.getPersistence());
                    cartridge.setServiceGroup(cartridgeInfo.getServiceGroup());

                    if (cartridgeInfo.getLbConfig() != null && cartridgeInfo.getProperties() != null) {
                        for (Property property : cartridgeInfo.getProperties()) {
                            if (property.getName().equals("load.balancer")) {
                                cartridge.setLoadBalancer(true);
                            }
                        }
                    }
                    //cartridge.setActiveInstances(0);
                    cartridges.add(cartridge);

                    if (cartridgeInfo.getMultiTenant() && !allowMultipleSubscription) {
                        // If the cartridge is multi-tenant. We should not let users
                        // createSubscription twice.
                        if (isAlreadySubscribed(cartridgeType,
                                ApplicationManagementUtil.getTenantId(configurationContext))) {
                            if (log.isDebugEnabled()) {
                                log.debug("Already subscribed to " + cartridgeType
                                        + ". This multi-tenant cartridge will not be available to createSubscription");
                            }
                            //cartridge.setStatus(CartridgeConstants.SUBSCRIBED);
                        }
                    }
                }
            } else {
                if (log.isDebugEnabled()) {
                    log.debug("There are no available cartridges");
                }
            }
        } catch (Exception e) {
            String msg = "Error while getting available cartridges. Cause: " + e.getMessage();
            log.error(msg, e);
            throw new RestAPIException(msg, e);
        }

        Collections.sort(cartridges);

        if (log.isDebugEnabled()) {
            log.debug("Returning available cartridges " + cartridges.size());
        }

        return cartridges;
    }

    private static boolean isAlreadySubscribed(String cartridgeType, int tenantId) {

        Collection<CartridgeSubscription> subscriptionList = cartridgeSubsciptionManager
                .isCartridgeSubscribed(tenantId, cartridgeType);
        if (subscriptionList == null || subscriptionList.isEmpty()) {
            return false;
        } else {
            return true;
        }
    }

    public static List<ServiceDefinitionBean> getdeployedServiceInformation() throws RestAPIException {

        Collection<Service> services = null;

        try {
            services = serviceDeploymentManager.getServices();

        } catch (ADCException e) {
            String msg = "Unable to get deployed service information. Cause: " + e.getMessage();
            log.error(msg, e);
            throw new RestAPIException(msg, e);
        }

        if (services != null && !services.isEmpty()) {
            return PojoConverter.convertToServiceDefinitionBeans(services);
        }

        return null;
    }

    public static ServiceDefinitionBean getDeployedServiceInformation(String type) throws RestAPIException {

        Service service = null;

        try {
            service = serviceDeploymentManager.getService(type);

        } catch (ADCException e) {
            String msg = "Unable to get deployed service information for [type]: " + type + ". Cause: "
                    + e.getMessage();
            log.error(msg, e);
            throw new RestAPIException(msg, e);
        }

        if (service != null) {
            return PojoConverter.convertToServiceDefinitionBean(service);
        }

        return new ServiceDefinitionBean();
    }

    public static List<Cartridge> getActiveDeployedServiceInformation(ConfigurationContext configurationContext)
            throws RestAPIException {

        Collection<Service> services = null;

        try {
            services = serviceDeploymentManager.getServices();

        } catch (ADCException e) {
            String msg = "Unable to get deployed service information. Cause: " + e.getMessage();
            log.error(msg, e);
            throw new RestAPIException(msg, e);
        }

        List<Cartridge> availableMultitenantCartridges = new ArrayList<Cartridge>();
        int tenantId = ApplicationManagementUtil.getTenantId(configurationContext);
        //getting the services for the tenantId
        for (Service service : services) {
            String tenantRange = service.getTenantRange();
            if (tenantRange.equals(Constants.TENANT_RANGE_ALL)) {
                //check whether any active instances found for this service in the Topology

                Cluster cluster = TopologyManager.getTopology().getService(service.getType())
                        .getCluster(service.getClusterId());
                boolean activeMemberFound = false;
                for (Member member : cluster.getMembers()) {
                    if (member.isActive()) {
                        activeMemberFound = true;
                        break;
                    }
                }
                if (activeMemberFound) {
                    availableMultitenantCartridges.add(getAvailableCartridgeInfo(null, true, configurationContext));
                }
            } else {
                //TODO have to check for the serivces which has correct tenant range
            }
        }

        /*if (availableMultitenantCartridges.isEmpty()) {
           String msg = "Cannot find any active deployed service for tenant [id] "+tenantId;
           log.error(msg);
           throw new RestAPIException(msg);
        }*/

        return availableMultitenantCartridges;
    }

    static List<Cartridge> getSubscriptions(String cartridgeSearchString, String serviceGroup,
            ConfigurationContext configurationContext) throws RestAPIException {

        List<Cartridge> cartridges = new ArrayList<Cartridge>();

        if (log.isDebugEnabled()) {
            log.debug("Getting subscribed cartridges. Search String: " + cartridgeSearchString);
        }

        try {
            Pattern searchPattern = getSearchStringPattern(cartridgeSearchString);

            Collection<CartridgeSubscription> subscriptions = cartridgeSubsciptionManager
                    .getCartridgeSubscriptions(ApplicationManagementUtil.getTenantId(configurationContext), null);

            if (subscriptions != null && !subscriptions.isEmpty()) {

                for (CartridgeSubscription subscription : subscriptions) {

                    if (!cartridgeMatches(subscription.getCartridgeInfo(), subscription, searchPattern)) {
                        continue;
                    }
                    Cartridge cartridge = getCartridgeFromSubscription(subscription);
                    if (cartridge == null) {
                        continue;
                    }
                    Cluster cluster = TopologyClusterInformationModel.getInstance().getCluster(
                            ApplicationManagementUtil.getTenantId(configurationContext),
                            cartridge.getCartridgeType(), cartridge.getCartridgeAlias());
                    String cartridgeStatus = "Inactive";
                    int activeMemberCount = 0;
                    if (cluster != null) {
                        Collection<Member> members = cluster.getMembers();
                        for (Member member : members) {
                            if (member.isActive()) {
                                cartridgeStatus = "Active";
                                activeMemberCount++;
                            }
                        }
                    }
                    cartridge.setActiveInstances(activeMemberCount);
                    cartridge.setStatus(cartridgeStatus);

                    // Ignoring the LB cartridges since they are not shown to the user.
                    if (cartridge.isLoadBalancer())
                        continue;
                    if (StringUtils.isNotEmpty(serviceGroup)) {
                        if (cartridge.getServiceGroup() != null
                                && serviceGroup.equals(cartridge.getServiceGroup())) {
                            cartridges.add(cartridge);
                        }
                    } else {
                        cartridges.add(cartridge);
                    }
                }
            } else {
                if (log.isDebugEnabled()) {
                    log.debug("There are no subscribed cartridges");
                }
            }
        } catch (Exception e) {
            String msg = "Error while getting subscribed cartridges. Cause: " + e.getMessage();
            log.error(msg, e);
            throw new RestAPIException(msg, e);
        }

        Collections.sort(cartridges);

        if (log.isDebugEnabled()) {
            log.debug("Returning subscribed cartridges " + cartridges.size());
        }

        /*if(cartridges.isEmpty()) {
           String msg = "Cannot find any subscribed Cartridge, matching the given string: "+cartridgeSearchString;
        log.error(msg);
        throw new RestAPIException(msg);
        }*/

        return cartridges;
    }

    static Cartridge getSubscription(String cartridgeAlias, ConfigurationContext configurationContext)
            throws RestAPIException {

        Cartridge cartridge = getCartridgeFromSubscription(cartridgeSubsciptionManager.getCartridgeSubscription(
                ApplicationManagementUtil.getTenantId(configurationContext), cartridgeAlias));

        if (cartridge == null) {
            String message = "Unregistered [alias]: " + cartridgeAlias + "! Please enter a valid alias.";
            log.error(message);
            throw new RestAPIException(Response.Status.NOT_FOUND, message);
        }
        Cluster cluster = TopologyClusterInformationModel.getInstance().getCluster(
                ApplicationManagementUtil.getTenantId(configurationContext), cartridge.getCartridgeType(),
                cartridge.getCartridgeAlias());
        String cartridgeStatus = "Inactive";
        int activeMemberCount = 0;

        // cluster might not be created yet, so need to check
        if (cluster != null) {
            Collection<Member> members = cluster.getMembers();
            if (members != null) {
                for (Member member : members) {
                    if (member.isActive()) {
                        cartridgeStatus = "Active";
                        activeMemberCount++;
                    }
                }
            }
        }

        cartridge.setActiveInstances(activeMemberCount);
        cartridge.setStatus(cartridgeStatus);
        return cartridge;

    }

    static int getActiveInstances(String cartridgeType, String cartridgeAlias,
            ConfigurationContext configurationContext) throws RestAPIException {
        int noOfActiveInstances = 0;
        Cluster cluster = TopologyClusterInformationModel.getInstance().getCluster(
                ApplicationManagementUtil.getTenantId(configurationContext), cartridgeType, cartridgeAlias);

        if (cluster == null) {
            String message = "No Cluster found for cartridge [type] " + cartridgeType + ", [alias] "
                    + cartridgeAlias;
            log.error(message);
            throw new RestAPIException(message);
        }

        for (Member member : cluster.getMembers()) {
            if (member.getStatus().toString().equals(MemberStatus.Activated)) {
                noOfActiveInstances++;
            }
        }
        return noOfActiveInstances;
    }

    private static Cartridge getCartridgeFromSubscription(CartridgeSubscription subscription)
            throws RestAPIException {

        if (subscription == null) {
            return null;
        }
        try {
            Cartridge cartridge = new Cartridge();
            cartridge.setCartridgeType(subscription.getCartridgeInfo().getType());
            cartridge.setMultiTenant(subscription.getCartridgeInfo().getMultiTenant());
            cartridge.setProvider(subscription.getCartridgeInfo().getProvider());
            cartridge.setVersion(subscription.getCartridgeInfo().getVersion());
            cartridge.setDescription(subscription.getCartridgeInfo().getDescription());
            cartridge.setDisplayName(subscription.getCartridgeInfo().getDisplayName());
            cartridge.setCartridgeAlias(subscription.getAlias());
            cartridge.setHostName(subscription.getHostName());
            cartridge.setMappedDomain(subscription.getMappedDomain());
            if (subscription.getRepository() != null) {
                cartridge.setRepoURL(subscription.getRepository().getUrl());
            }

            if (subscription instanceof DataCartridgeSubscription) {
                DataCartridgeSubscription dataCartridgeSubscription = (DataCartridgeSubscription) subscription;
                cartridge.setDbHost(dataCartridgeSubscription.getDBHost());
                cartridge.setDbUserName(dataCartridgeSubscription.getDBUsername());
                cartridge.setPassword(dataCartridgeSubscription.getDBPassword());
            }

            if (subscription.getLbClusterId() != null && !subscription.getLbClusterId().isEmpty()) {
                cartridge.setLbClusterId(subscription.getLbClusterId());
            }

            cartridge.setStatus(subscription.getSubscriptionStatus());
            cartridge.setPortMappings(subscription.getCartridgeInfo().getPortMappings());

            if (subscription.getCartridgeInfo().getLbConfig() != null
                    && subscription.getCartridgeInfo().getProperties() != null) {
                for (Property property : subscription.getCartridgeInfo().getProperties()) {
                    if (property.getName().equals("load.balancer")) {
                        cartridge.setLoadBalancer(true);
                    }
                }
            }
            if (subscription.getCartridgeInfo().getServiceGroup() != null) {
                cartridge.setServiceGroup(subscription.getCartridgeInfo().getServiceGroup());
            }
            return cartridge;

        } catch (Exception e) {
            String msg = "Unable to extract the Cartridge from subscription. Cause: " + e.getMessage();
            log.error(msg);
            throw new RestAPIException(msg);
        }

    }

    static Pattern getSearchStringPattern(String searchString) {
        if (log.isDebugEnabled()) {
            log.debug("Creating search pattern for " + searchString);
        }
        if (searchString != null) {
            // Copied from org.wso2.carbon.webapp.mgt.WebappAdmin.doesWebappSatisfySearchString(WebApplication, String)
            String regex = searchString.toLowerCase().replace("..?", ".?").replace("..*", ".*")
                    .replaceAll("\\?", ".?").replaceAll("\\*", ".*?");
            if (log.isDebugEnabled()) {
                log.debug("Created regex: " + regex + " for search string " + searchString);
            }

            Pattern pattern = Pattern.compile(regex);
            return pattern;
        }
        return null;
    }

    static boolean cartridgeMatches(CartridgeInfo cartridgeInfo, Pattern pattern) {
        if (pattern != null) {
            boolean matches = false;
            if (cartridgeInfo.getDisplayName() != null) {
                matches = pattern.matcher(cartridgeInfo.getDisplayName().toLowerCase()).find();
            }
            if (!matches && cartridgeInfo.getDescription() != null) {
                matches = pattern.matcher(cartridgeInfo.getDescription().toLowerCase()).find();
            }
            return matches;
        }
        return true;
    }

    static boolean cartridgeMatches(CartridgeInfo cartridgeInfo, CartridgeSubscription cartridgeSubscription,
            Pattern pattern) {
        if (pattern != null) {
            boolean matches = false;
            if (cartridgeInfo.getDisplayName() != null) {
                matches = pattern.matcher(cartridgeInfo.getDisplayName().toLowerCase()).find();
            }
            if (!matches && cartridgeInfo.getDescription() != null) {
                matches = pattern.matcher(cartridgeInfo.getDescription().toLowerCase()).find();
            }
            if (!matches && cartridgeSubscription.getType() != null) {
                matches = pattern.matcher(cartridgeSubscription.getType().toLowerCase()).find();
            }
            if (!matches && cartridgeSubscription.getAlias() != null) {
                matches = pattern.matcher(cartridgeSubscription.getAlias().toLowerCase()).find();
            }
            return matches;
        }
        return true;
    }

    public static CartridgeSubscription getCartridgeSubscription(String alias,
            ConfigurationContext configurationContext) {
        return cartridgeSubsciptionManager
                .getCartridgeSubscription(ApplicationManagementUtil.getTenantId(configurationContext), alias);
    }

    static SubscriptionInfo subscribeToCartridge(CartridgeInfoBean cartridgeInfoBean,
            ConfigurationContext configurationContext, String tenantUsername, String tenantDomain)
            throws RestAPIException {

        try {
            return subscribe(cartridgeInfoBean, configurationContext, tenantUsername, tenantDomain);

        } catch (Exception e) {
            throw new RestAPIException(e.getMessage(), e);
        }
    }

    private static SubscriptionInfo subscribe(CartridgeInfoBean cartridgeInfoBean,
            ConfigurationContext configurationContext, String tenantUsername, String tenantDomain)
            throws ADCException, PolicyException, UnregisteredCartridgeException, InvalidCartridgeAliasException,
            DuplicateCartridgeAliasException, RepositoryRequiredException, AlreadySubscribedException,
            RepositoryCredentialsRequiredException, InvalidRepositoryException, RepositoryTransportException,
            RestAPIException {

        SubscriptionData subscriptionData = new SubscriptionData();
        subscriptionData.setCartridgeType(cartridgeInfoBean.getCartridgeType());
        subscriptionData.setCartridgeAlias(cartridgeInfoBean.getAlias().trim());
        subscriptionData.setAutoscalingPolicyName(cartridgeInfoBean.getAutoscalePolicy());
        subscriptionData.setDeploymentPolicyName(cartridgeInfoBean.getDeploymentPolicy());
        subscriptionData.setTenantDomain(tenantDomain);
        subscriptionData.setTenantId(ApplicationManagementUtil.getTenantId(configurationContext));
        subscriptionData.setTenantAdminUsername(tenantUsername);
        subscriptionData.setRepositoryType("git");
        subscriptionData.setRepositoryURL(cartridgeInfoBean.getRepoURL());
        subscriptionData.setRepositoryUsername(cartridgeInfoBean.getRepoUsername());
        subscriptionData.setRepositoryPassword(cartridgeInfoBean.getRepoPassword());
        subscriptionData.setCommitsEnabled(cartridgeInfoBean.isCommitsEnabled());
        subscriptionData.setServiceGroup(cartridgeInfoBean.getServiceGroup());
        //subscriptionData.setServiceName(cartridgeInfoBean.getServiceName()); // For MT cartridges

        if (cartridgeInfoBean.isPersistanceRequired()) {
            // Add persistence related properties to PersistenceContext
            PersistenceContext persistenceContext = new PersistenceContext();
            persistenceContext.setPersistanceRequiredProperty(IS_VOLUME_REQUIRED,
                    String.valueOf(cartridgeInfoBean.isPersistanceRequired()));
            persistenceContext.setSizeProperty(VOLUME_SIZE, cartridgeInfoBean.getSize());
            persistenceContext.setDeleteOnTerminationProperty(SHOULD_DELETE_VOLUME,
                    String.valueOf(cartridgeInfoBean.isRemoveOnTermination()));
            subscriptionData.setPersistanceCtxt(persistenceContext);
        }

        //subscribe
        return cartridgeSubsciptionManager.subscribeToCartridgeWithProperties(subscriptionData);

    }

    public static org.apache.stratos.rest.endpoint.bean.topology.Cluster getCluster(String cartridgeType,
            String subscriptionAlias, ConfigurationContext configurationContext) throws RestAPIException {

        Cluster cluster = TopologyClusterInformationModel.getInstance().getCluster(
                ApplicationManagementUtil.getTenantId(configurationContext), cartridgeType, subscriptionAlias);
        if (cluster == null) {
            throw new RestAPIException("No matching cluster found for [cartridge type]: " + cartridgeType
                    + " [alias] " + subscriptionAlias);
        } else {
            return PojoConverter.populateClusterPojos(cluster);
        }
    }

    public static org.apache.stratos.rest.endpoint.bean.topology.Cluster[] getClustersForTenant(
            ConfigurationContext configurationContext) {

        Set<Cluster> clusterSet = TopologyClusterInformationModel.getInstance()
                .getClusters(ApplicationManagementUtil.getTenantId(configurationContext), null);
        ArrayList<org.apache.stratos.rest.endpoint.bean.topology.Cluster> clusters = new ArrayList<org.apache.stratos.rest.endpoint.bean.topology.Cluster>();
        for (Cluster cluster : clusterSet) {
            clusters.add(PojoConverter.populateClusterPojos(cluster));
        }
        org.apache.stratos.rest.endpoint.bean.topology.Cluster[] arrCluster = new org.apache.stratos.rest.endpoint.bean.topology.Cluster[clusters
                .size()];
        arrCluster = clusters.toArray(arrCluster);
        return arrCluster;

    }

    public static org.apache.stratos.rest.endpoint.bean.topology.Cluster[] getClustersForTenantAndCartridgeType(
            ConfigurationContext configurationContext, String cartridgeType) {

        Set<Cluster> clusterSet = TopologyClusterInformationModel.getInstance()
                .getClusters(ApplicationManagementUtil.getTenantId(configurationContext), cartridgeType);
        List<org.apache.stratos.rest.endpoint.bean.topology.Cluster> clusters = new ArrayList<org.apache.stratos.rest.endpoint.bean.topology.Cluster>();
        for (Cluster cluster : clusterSet) {
            clusters.add(PojoConverter.populateClusterPojos(cluster));
        }
        org.apache.stratos.rest.endpoint.bean.topology.Cluster[] arrCluster = new org.apache.stratos.rest.endpoint.bean.topology.Cluster[clusters
                .size()];
        arrCluster = clusters.toArray(arrCluster);
        return arrCluster;

    }

    public static org.apache.stratos.rest.endpoint.bean.topology.Cluster[] getClustersForCartridgeType(
            String cartridgeType) {

        Set<Cluster> clusterSet = TopologyClusterInformationModel.getInstance().getClusters(cartridgeType);
        List<org.apache.stratos.rest.endpoint.bean.topology.Cluster> clusters = new ArrayList<org.apache.stratos.rest.endpoint.bean.topology.Cluster>();
        for (Cluster cluster : clusterSet) {
            clusters.add(PojoConverter.populateClusterPojos(cluster));
        }
        org.apache.stratos.rest.endpoint.bean.topology.Cluster[] arrCluster = new org.apache.stratos.rest.endpoint.bean.topology.Cluster[clusters
                .size()];
        arrCluster = clusters.toArray(arrCluster);
        return arrCluster;

    }

    // return the cluster id for the lb. This is a temp fix.
    /*private static String subscribeToLb(String cartridgeType, String loadBalancedCartridgeType, String lbAlias,
    String defaultAutoscalingPolicy, String deploymentPolicy,
    ConfigurationContext configurationContext, String userName, String tenantDomain, Property[] props) throws ADCException {
        
    CartridgeSubscription cartridgeSubscription;
        
    try {
        if(log.isDebugEnabled()) {
            log.debug("Subscribing to a load balancer [cartridge] "+cartridgeType+" [alias] "+lbAlias);
        }
        
        SubscriptionData subscriptionData = new SubscriptionData();
        subscriptionData.setCartridgeType(cartridgeType);
        subscriptionData.setCartridgeAlias(lbAlias.trim());
        subscriptionData.setAutoscalingPolicyName(defaultAutoscalingPolicy);
        subscriptionData.setDeploymentPolicyName(deploymentPolicy);
        subscriptionData.setTenantDomain(tenantDomain);
        subscriptionData.setTenantId(ApplicationManagementUtil.getTenantId(configurationContext));
        subscriptionData.setTenantAdminUsername(userName);
        subscriptionData.setRepositoryType("git");
        //subscriptionData.setProperties(props);
        subscriptionData.setPrivateRepository(false);
        
        cartridgeSubscription =
                cartridgeSubsciptionManager.subscribeToCartridgeWithProperties(subscriptionData);
        
        //set a payload parameter to indicate the load balanced cartridge type
        cartridgeSubscription.getPayloadData().add("LOAD_BALANCED_SERVICE_TYPE", loadBalancedCartridgeType);
        
        Properties lbProperties = new Properties();
        lbProperties.setProperties(props);
        cartridgeSubsciptionManager.registerCartridgeSubscription(cartridgeSubscription, lbProperties);
            
        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+". Cause: "+e.getMessage();
        log.error(msg, e);
        throw new ADCException(msg, e);
    }
        
    return cartridgeSubscription.getClusterDomain();
    } */

    static StratosAdminResponse unsubscribe(String alias, String tenantDomain) throws RestAPIException {

        try {
            cartridgeSubsciptionManager.unsubscribeFromCartridge(tenantDomain, alias);

        } catch (ADCException e) {
            String msg = "Failed to unsubscribe from [alias] " + alias + ". Cause: " + e.getMessage();
            log.error(msg, e);
            throw new RestAPIException(msg, e);

        } catch (NotSubscribedException e) {
            log.error(e.getMessage(), e);
            throw new RestAPIException(e.getMessage(), e);
        }

        StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
        stratosAdminResponse.setMessage("Successfully terminated the subscription with alias " + alias);
        return stratosAdminResponse;
    }

    /**
     * 
     * Super tenant will deploy multitenant service. 
     * 
     * get domain , subdomain as well..
     * @param clusterDomain
     * @param clusterSubdomain
     * 
     */
    static StratosAdminResponse deployService(String cartridgeType, String alias, String autoscalingPolicy,
            String deploymentPolicy, String tenantDomain, String tenantUsername, int tenantId, String clusterDomain,
            String clusterSubdomain, String tenantRange) throws RestAPIException {
        log.info("Deploying service..");
        try {
            serviceDeploymentManager.deployService(cartridgeType, autoscalingPolicy, deploymentPolicy, tenantId,
                    tenantRange, tenantDomain, tenantUsername);

        } catch (Exception e) {
            String msg = String.format("Failed to deploy the Service [Cartridge type] %s [alias] %s . Cause: %s",
                    cartridgeType, alias, e.getMessage());
            log.error(msg, e);
            throw new RestAPIException(msg, e);
        }

        StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
        stratosAdminResponse
                .setMessage("Successfully deployed service cluster definition with type " + cartridgeType);
        return stratosAdminResponse;
    }

    static StratosAdminResponse undeployService(String serviceType) throws RestAPIException {

        try {
            serviceDeploymentManager.undeployService(serviceType);

        } catch (Exception e) {
            String msg = "Failed to undeploy service cluster definition of type " + serviceType + " Cause: "
                    + e.getMessage();
            log.error(msg, e);
            throw new RestAPIException(msg, e);
        }

        StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
        stratosAdminResponse
                .setMessage("Successfully undeployed service cluster definition for service type " + serviceType);
        return stratosAdminResponse;
    }

    static void getGitRepositoryNotification(Payload payload) throws RestAPIException {
        try {

            RepositoryNotification repoNotification = new RepositoryNotification();
            repoNotification.updateRepository(payload.getRepository().getUrl());

        } catch (Exception e) {
            String msg = "Failed to get git repository notifications. Cause : " + e.getMessage();
            log.error(msg, e);
            throw new RestAPIException(msg, e);
        }
    }

    static StratosAdminResponse synchronizeRepository(CartridgeSubscription cartridgeSubscription)
            throws RestAPIException {
        try {
            RepositoryNotification repoNotification = new RepositoryNotification();
            repoNotification.updateRepository(cartridgeSubscription);
        } catch (Exception e) {
            String msg = "Failed to get git repository notifications. Cause : " + e.getMessage();
            log.error(msg, e);
            throw new RestAPIException(msg, e);
        }

        StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
        stratosAdminResponse.setMessage(
                "Successfully sent the repository synchronization request for " + cartridgeSubscription.getAlias());
        return stratosAdminResponse;
    }

    public static StratosAdminResponse addSubscriptionDomains(ConfigurationContext configurationContext,
            String cartridgeType, String subscriptionAlias, SubscriptionDomainRequest request)
            throws RestAPIException {
        try {
            int tenantId = ApplicationManagementUtil.getTenantId(configurationContext);

            for (org.apache.stratos.rest.endpoint.bean.subscription.domain.SubscriptionDomainBean subscriptionDomain : request.domains) {
                boolean isDomainExists = isSubscriptionDomainExists(configurationContext, cartridgeType,
                        subscriptionAlias, subscriptionDomain.domainName);
                if (isDomainExists) {
                    String message = "Subscription domain " + subscriptionDomain.domainName + " exists";
                    throw new RestAPIException(Status.INTERNAL_SERVER_ERROR, message);
                }
            }

            for (org.apache.stratos.rest.endpoint.bean.subscription.domain.SubscriptionDomainBean subscriptionDomain : request.domains) {
                cartridgeSubsciptionManager.addSubscriptionDomain(tenantId, subscriptionAlias,
                        subscriptionDomain.domainName, subscriptionDomain.applicationContext);
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw new RestAPIException(e.getMessage(), e);
        }

        StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
        stratosAdminResponse.setMessage("Successfully added domains to cartridge subscription");
        return stratosAdminResponse;
    }

    public static boolean isSubscriptionDomainExists(ConfigurationContext configurationContext,
            String cartridgeType, String subscriptionAlias, String domain) throws RestAPIException {
        try {
            int tenantId = ApplicationManagementUtil.getTenantId(configurationContext);
            SubscriptionDomainBean subscriptionDomain = PojoConverter.populateSubscriptionDomainPojo(
                    cartridgeSubsciptionManager.getSubscriptionDomain(tenantId, subscriptionAlias, domain));

            if (subscriptionDomain.domainName != null) {
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw new RestAPIException(e.getMessage(), e);
        }

    }

    public static List<SubscriptionDomainBean> getSubscriptionDomains(ConfigurationContext configurationContext,
            String cartridgeType, String subscriptionAlias) throws RestAPIException {
        try {
            int tenantId = ApplicationManagementUtil.getTenantId(configurationContext);
            return PojoConverter.populateSubscriptionDomainPojos(
                    cartridgeSubsciptionManager.getSubscriptionDomains(tenantId, subscriptionAlias));
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw new RestAPIException(e.getMessage(), e);
        }
    }

    public static SubscriptionDomainBean getSubscriptionDomain(ConfigurationContext configurationContext,
            String cartridgeType, String subscriptionAlias, String domain) throws RestAPIException {
        try {
            int tenantId = ApplicationManagementUtil.getTenantId(configurationContext);
            SubscriptionDomainBean subscriptionDomain = PojoConverter.populateSubscriptionDomainPojo(
                    cartridgeSubsciptionManager.getSubscriptionDomain(tenantId, subscriptionAlias, domain));

            if (subscriptionDomain == null) {
                String message = "Could not find a subscription [domain] " + domain + " for Cartridge [type] "
                        + cartridgeType + " and [alias] " + subscriptionAlias;
                log.error(message);
                throw new RestAPIException(Status.NOT_FOUND, message);
            }

            return subscriptionDomain;

        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw new RestAPIException(e.getMessage(), e);
        }
    }

    public static StratosAdminResponse removeSubscriptionDomain(ConfigurationContext configurationContext,
            String cartridgeType, String subscriptionAlias, String domain) throws RestAPIException {
        try {
            int tenantId = ApplicationManagementUtil.getTenantId(configurationContext);
            cartridgeSubsciptionManager.removeSubscriptionDomain(tenantId, subscriptionAlias, domain);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw new RestAPIException(e.getMessage(), e);
        }

        StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
        stratosAdminResponse.setMessage("Successfully removed domains from cartridge subscription");
        return stratosAdminResponse;
    }

}