Java tutorial
/** * 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.api; 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.stub.*; import org.apache.stratos.autoscaler.stub.deployment.policy.ApplicationPolicy; import org.apache.stratos.autoscaler.stub.deployment.policy.DeploymentPolicy; import org.apache.stratos.autoscaler.stub.pojo.ApplicationContext; import org.apache.stratos.autoscaler.stub.pojo.ServiceGroup; import org.apache.stratos.cloud.controller.stub.*; import org.apache.stratos.cloud.controller.stub.domain.Cartridge; import org.apache.stratos.common.beans.IaasProviderInfoBean; import org.apache.stratos.common.beans.PropertyBean; import org.apache.stratos.common.beans.TenantInfoBean; import org.apache.stratos.common.beans.UserInfoBean; import org.apache.stratos.common.beans.application.ApplicationBean; import org.apache.stratos.common.beans.application.ApplicationNetworkPartitionIdListBean; import org.apache.stratos.common.beans.application.ComponentBean; import org.apache.stratos.common.beans.application.domain.mapping.ApplicationDomainMappingsBean; import org.apache.stratos.common.beans.application.domain.mapping.DomainMappingBean; import org.apache.stratos.common.beans.application.signup.ApplicationSignUpBean; import org.apache.stratos.common.beans.artifact.repository.GitNotificationPayloadBean; import org.apache.stratos.common.beans.cartridge.*; import org.apache.stratos.common.beans.kubernetes.KubernetesClusterBean; import org.apache.stratos.common.beans.kubernetes.KubernetesHostBean; import org.apache.stratos.common.beans.kubernetes.KubernetesMasterBean; import org.apache.stratos.common.beans.partition.NetworkPartitionBean; import org.apache.stratos.common.beans.policy.autoscale.AutoscalePolicyBean; import org.apache.stratos.common.beans.policy.deployment.ApplicationPolicyBean; import org.apache.stratos.common.beans.policy.deployment.DeploymentPolicyBean; import org.apache.stratos.common.beans.topology.ApplicationInfoBean; import org.apache.stratos.common.beans.topology.ApplicationInstanceBean; import org.apache.stratos.common.beans.topology.ClusterBean; import org.apache.stratos.common.beans.topology.GroupInstanceBean; import org.apache.stratos.common.client.AutoscalerServiceClient; import org.apache.stratos.common.client.CloudControllerServiceClient; import org.apache.stratos.common.client.StratosManagerServiceClient; import org.apache.stratos.common.exception.InvalidEmailException; import org.apache.stratos.common.util.ClaimsMgtUtil; import org.apache.stratos.common.util.CommonUtil; import org.apache.stratos.kubernetes.client.KubernetesConstants; import org.apache.stratos.manager.service.stub.StratosManagerServiceApplicationSignUpExceptionException; import org.apache.stratos.manager.service.stub.StratosManagerServiceDomainMappingExceptionException; import org.apache.stratos.manager.service.stub.domain.application.signup.ApplicationSignUp; import org.apache.stratos.manager.service.stub.domain.application.signup.ArtifactRepository; import org.apache.stratos.manager.service.stub.domain.application.signup.DomainMapping; import org.apache.stratos.manager.user.management.StratosUserManagerUtils; import org.apache.stratos.manager.user.management.exception.UserManagerException; import org.apache.stratos.manager.utils.ApplicationManagementUtil; import org.apache.stratos.messaging.domain.application.Application; import org.apache.stratos.messaging.domain.application.ApplicationStatus; import org.apache.stratos.messaging.domain.application.ClusterDataHolder; import org.apache.stratos.messaging.domain.application.Group; import org.apache.stratos.messaging.domain.topology.Cluster; import org.apache.stratos.messaging.message.receiver.application.ApplicationManager; import org.apache.stratos.messaging.message.receiver.topology.TopologyManager; import org.apache.stratos.rest.endpoint.Constants; import org.apache.stratos.rest.endpoint.ServiceHolder; import org.apache.stratos.rest.endpoint.exception.*; import org.apache.stratos.rest.endpoint.util.converter.ObjectConverter; import org.wso2.carbon.context.CarbonContext; import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.context.RegistryType; import org.wso2.carbon.registry.core.Registry; import org.wso2.carbon.registry.core.exceptions.RegistryException; import org.wso2.carbon.registry.core.session.UserRegistry; import org.wso2.carbon.stratos.common.exception.StratosException; import org.wso2.carbon.tenant.mgt.core.TenantPersistor; import org.wso2.carbon.tenant.mgt.util.TenantMgtUtil; import org.wso2.carbon.user.api.UserRealm; import org.wso2.carbon.user.api.UserStoreException; import org.wso2.carbon.user.api.UserStoreManager; import org.wso2.carbon.user.core.tenant.Tenant; import org.wso2.carbon.user.core.tenant.TenantManager; import org.wso2.carbon.utils.multitenancy.MultitenantConstants; import java.rmi.RemoteException; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Pattern; public class StratosApiV41Utils { private static final Log log = LogFactory.getLog(StratosApiV41Utils.class); public static final String APPLICATION_STATUS_DEPLOYED = "Deployed"; public static final String APPLICATION_STATUS_CREATED = "Created"; public static final String APPLICATION_STATUS_UNDEPLOYING = "Undeploying"; public static final String KUBERNETES_IAAS_PROVIDER = "kubernetes"; private static final String METADATA_REG_PATH = "metadata/"; /** * Add New Cartridge * * @param cartridgeBean Cartridge definition * @throws RestAPIException */ // Util methods for cartridges public static void addCartridge(CartridgeBean cartridgeBean) throws RestAPIException { try { if (log.isDebugEnabled()) { log.debug(String.format("Adding cartridge: [cartridge-type] %s ", cartridgeBean.getType())); } List<IaasProviderBean> iaasProviders = cartridgeBean.getIaasProvider(); if ((iaasProviders == null) || iaasProviders.size() == 0) { throw new RestAPIException( String.format("IaaS providers not found in cartridge: %s", cartridgeBean.getType())); } boolean isKubernetesIaasProviderAvailable = false; for (IaasProviderBean providers : iaasProviders) { if (providers.getType().equals(KUBERNETES_IAAS_PROVIDER)) { isKubernetesIaasProviderAvailable = true; break; } } for (PortMappingBean portMapping : cartridgeBean.getPortMapping()) { if (StringUtils.isBlank(portMapping.getName())) { portMapping.setName(portMapping.getProtocol() + "-" + portMapping.getPort()); if (log.isInfoEnabled()) { log.info(String.format( "Port mapping name not found, default value generated: " + "[cartridge-type] %s [port-mapping-name] %s", cartridgeBean.getType(), portMapping.getName())); } } String type = portMapping.getKubernetesPortType(); if (isKubernetesIaasProviderAvailable) { if (type == null || type.equals("")) { portMapping.setKubernetesPortType(KubernetesConstants.NODE_PORT); } else if (!type.equals(KubernetesConstants.NODE_PORT) && !type.equals(KubernetesConstants.CLUSTER_IP)) { throw new RestAPIException((String.format( "Kubernetes" + "PortType is invalid : %s - Possible values - %s and %s", portMapping.getName(), KubernetesConstants.NODE_PORT, KubernetesConstants.CLUSTER_IP))); } } } Cartridge cartridgeConfig = createCartridgeConfig(cartridgeBean); CloudControllerServiceClient cloudControllerServiceClient = CloudControllerServiceClient.getInstance(); cloudControllerServiceClient.addCartridge(cartridgeConfig); if (log.isDebugEnabled()) { log.debug(String.format("Successfully added cartridge: [cartridge-type] %s ", cartridgeBean.getType())); } } catch (CloudControllerServiceCartridgeAlreadyExistsExceptionException e) { String msg = "Could not add cartridge. Cartridge already exists."; log.error(msg, e); throw new RestAPIException(msg); } catch (CloudControllerServiceInvalidCartridgeDefinitionExceptionException e) { String msg = "Could not add cartridge. Invalid cartridge definition."; log.error(msg, e); throw new RestAPIException(msg); } catch (RemoteException e) { String msg = "Could not add cartridge. " + e.getMessage(); log.error(msg, e); throw new RestAPIException(msg); } catch (CloudControllerServiceInvalidIaasProviderExceptionException e) { String msg = "Could not add cartridge. Invalid IaaS provider."; log.error(msg, e); throw new RestAPIException(msg); } } /** * Update Cartridge * * @param cartridgeBean Cartridge Definition * @throws RestAPIException */ public static void updateCartridge(CartridgeBean cartridgeBean) throws RestAPIException { try { if (log.isDebugEnabled()) { log.debug(String.format("Updating cartridge: [cartridge-type] %s ", cartridgeBean.getType())); } List<IaasProviderBean> iaasProviders = cartridgeBean.getIaasProvider(); if ((iaasProviders == null) || iaasProviders.size() == 0) { throw new RestAPIException( String.format("IaaS providers not found in cartridge: %s", cartridgeBean.getType())); } Cartridge cartridgeConfig = createCartridgeConfig(cartridgeBean); CloudControllerServiceClient cloudControllerServiceClient = CloudControllerServiceClient.getInstance(); cloudControllerServiceClient.updateCartridge(cartridgeConfig); if (log.isDebugEnabled()) { log.debug(String.format("Successfully updated cartridge: [cartridge-type] %s ", cartridgeBean.getType())); } } catch (CloudControllerServiceCartridgeDefinitionNotExistsExceptionException e) { String msg = "Could not update cartridge. Cartridge definition doesn't exists."; log.error(msg, e); throw new RestAPIException(msg); } catch (CloudControllerServiceInvalidCartridgeDefinitionExceptionException e) { String msg = "Could not update cartridge. Invalid cartridge definition."; log.error(msg, e); throw new RestAPIException(msg); } catch (RemoteException e) { String msg = "Could not update cartridge. " + e.getMessage(); log.error(msg, e); throw new RestAPIException(msg); } catch (CloudControllerServiceInvalidIaasProviderExceptionException e) { String msg = "Could not update cartridge. Invalid IaaS provider."; log.error(msg, e); throw new RestAPIException(msg); } } /** * Create cartridge configuration * * @param cartridgeDefinition Cartridge definition * @return Created cartridge * @throws RestAPIException */ private static Cartridge createCartridgeConfig(CartridgeBean cartridgeDefinition) throws RestAPIException { Cartridge cartridgeConfig = ObjectConverter.convertCartridgeBeanToStubCartridgeConfig(cartridgeDefinition); if (cartridgeConfig == null) { throw new RestAPIException("Could not read cartridge definition, cartridge deployment failed"); } if (StringUtils.isEmpty(cartridgeConfig.getCategory())) { throw new RestAPIException(String.format("Category is not specified in cartridge: [cartridge-type] %s", cartridgeConfig.getType())); } return cartridgeConfig; } /** * Remove Cartridge * * @param cartridgeType Cartridge Type * @throws RestAPIException */ public static void removeCartridge(String cartridgeType) throws RestAPIException, RemoteException, CloudControllerServiceCartridgeNotFoundExceptionException, CloudControllerServiceInvalidCartridgeTypeExceptionException { if (log.isDebugEnabled()) { log.debug(String.format("Removing cartridge: [cartridge-type] %s ", cartridgeType)); } CloudControllerServiceClient cloudControllerServiceClient = getCloudControllerServiceClient(); if (cloudControllerServiceClient.getCartridge(cartridgeType) == null) { throw new RuntimeException("Cartridge not found: [cartridge-type] " + cartridgeType); } StratosManagerServiceClient smServiceClient = getStratosManagerServiceClient(); // Validate whether cartridge can be removed if (!smServiceClient.canCartridgeBeRemoved(cartridgeType)) { String message = "Cannot remove cartridge : [cartridge-type] " + cartridgeType + " since it is used in another cartridge group or an application"; log.error(message); throw new RestAPIException(message); } cloudControllerServiceClient.removeCartridge(cartridgeType); if (log.isInfoEnabled()) { log.info(String.format("Successfully removed cartridge: [cartridge-type] %s ", cartridgeType)); } } /** * Get List of Cartridges by filter * * @param filter filter * @param criteria criteria * @param configurationContext Configuration Contex * @return List of cartridges matches filter * @throws RestAPIException */ public static List<CartridgeBean> getCartridgesByFilter(String filter, String criteria, ConfigurationContext configurationContext) throws RestAPIException { List<CartridgeBean> cartridges = null; if (Constants.FILTER_TENANT_TYPE_SINGLE_TENANT.equals(filter)) { cartridges = getAvailableCartridges(null, false, configurationContext); } else if (Constants.FILTER_TENANT_TYPE_MULTI_TENANT.equals(filter)) { cartridges = getAvailableCartridges(null, true, configurationContext); } else if (Constants.FILTER_LOAD_BALANCER.equals(filter)) { cartridges = getAvailableLbCartridges(false, configurationContext); } else if (Constants.FILTER_PROVIDER.equals(filter)) { cartridges = getAvailableCartridgesByProvider(criteria); } return cartridges; } /** * Get a Cartridge by filter * * @param filter filter * @param cartridgeType cartride Type * @param configurationContext Configuration Context * @return Cartridge matching filter * @throws RestAPIException */ public static CartridgeBean getCartridgeByFilter(String filter, String cartridgeType, ConfigurationContext configurationContext) throws RestAPIException { List<CartridgeBean> cartridges = getCartridgesByFilter(filter, null, configurationContext); for (CartridgeBean cartridge : cartridges) { if (cartridge.getType().equals(cartridgeType)) { return cartridge; } } return null; } /** * Get the available Load balancer cartridges * * @param multiTenant Multi tenant true of false * @param configurationContext Configuration Context * @return List of available Load balancer cartridges * @throws RestAPIException */ private static List<CartridgeBean> getAvailableLbCartridges(boolean multiTenant, ConfigurationContext configurationContext) throws RestAPIException { List<CartridgeBean> cartridges = getAvailableCartridges(null, multiTenant, configurationContext); List<CartridgeBean> lbCartridges = new ArrayList<CartridgeBean>(); for (CartridgeBean cartridge : cartridges) { if (Constants.FILTER_LOAD_BALANCER.equalsIgnoreCase(cartridge.getCategory())) { lbCartridges.add(cartridge); } } return lbCartridges; } /** * Get the available cartridges by provider * * @param provider provide name * @return List of the cartridge definitions * @throws RestAPIException */ private static List<CartridgeBean> getAvailableCartridgesByProvider(String provider) throws RestAPIException { List<CartridgeBean> cartridges = new ArrayList<CartridgeBean>(); if (log.isDebugEnabled()) { log.debug("Reading cartridges: [provider-name] " + provider); } try { String[] availableCartridges = CloudControllerServiceClient.getInstance().getRegisteredCartridges(); if (availableCartridges != null) { for (String cartridgeType : availableCartridges) { Cartridge cartridgeInfo = null; try { cartridgeInfo = CloudControllerServiceClient.getInstance().getCartridge(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 (!cartridgeInfo.getProvider().equals(provider)) { continue; } CartridgeBean cartridge = ObjectConverter .convertCartridgeToCartridgeDefinitionBean(cartridgeInfo); cartridges.add(cartridge); } } else { if (log.isDebugEnabled()) { log.debug("There are no available cartridges"); } } } catch (AxisFault axisFault) { String errorMsg = String .format("Error while getting CloudControllerServiceClient instance to connect to the Cloud " + "Controller. " + "Cause: %s ", axisFault.getMessage()); log.error(errorMsg, axisFault); throw new RestAPIException(errorMsg, axisFault); } catch (RemoteException e) { String errorMsg = String.format("Error while getting cartridge information for provider %s Cause: %s ", provider, e.getMessage()); log.error(errorMsg, e); throw new RestAPIException(errorMsg, e); } if (log.isDebugEnabled()) { log.debug("Returning available cartridges " + cartridges.size()); } return cartridges; } public static List<CartridgeBean> getAvailableCartridges(String cartridgeSearchString, Boolean multiTenant, ConfigurationContext configurationContext) throws RestAPIException { List<CartridgeBean> cartridges = new ArrayList<CartridgeBean>(); if (log.isDebugEnabled()) { log.debug("Getting available cartridges. [Search String]: " + cartridgeSearchString + ", [Multi-Tenant]: " + multiTenant); } try { Pattern searchPattern = getSearchStringPattern(cartridgeSearchString); String[] availableCartridges = CloudControllerServiceClient.getInstance().getRegisteredCartridges(); if (availableCartridges != null) { for (String cartridgeType : availableCartridges) { Cartridge cartridgeInfo = null; try { cartridgeInfo = CloudControllerServiceClient.getInstance().getCartridge(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 (!StratosApiV41Utils.cartridgeMatches(cartridgeInfo, searchPattern)) { continue; } CartridgeBean cartridge = ObjectConverter .convertCartridgeToCartridgeDefinitionBean(cartridgeInfo); cartridges.add(cartridge); } } 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; } /** * Get cartridge details * * @param cartridgeType Catridge Type * @return Cartridge details * @throws RestAPIException */ public static CartridgeBean getCartridge(String cartridgeType) throws RestAPIException { try { Cartridge cartridgeInfo = CloudControllerServiceClient.getInstance().getCartridge(cartridgeType); if (cartridgeInfo == null) { return null; } return ObjectConverter.convertCartridgeToCartridgeDefinitionBean(cartridgeInfo); } catch (RemoteException e) { String message = e.getMessage(); log.error(message); throw new RestAPIException(message, e); } catch (CloudControllerServiceCartridgeNotFoundExceptionException e) { String message = e.getFaultMessage().getCartridgeNotFoundException().getMessage(); log.error(message); throw new RestAPIException(message, e); } } /** * Check cartridge is available * * @param cartridgeType cartridgeType * @return CartridgeBean * @throws RestAPIException */ public static CartridgeBean getCartridgeForValidate(String cartridgeType) throws RestAPIException, CloudControllerServiceCartridgeNotFoundExceptionException { try { Cartridge cartridgeInfo = CloudControllerServiceClient.getInstance().getCartridge(cartridgeType); if (cartridgeInfo == null) { return null; } return ObjectConverter.convertCartridgeToCartridgeDefinitionBean(cartridgeInfo); } catch (RemoteException e) { String message = e.getMessage(); log.error(message, e); throw new RestAPIException(message, e); } } /** * Convert SearchString to Pattern * * @param searchString SearchString * @return Pattern */ private 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); } return Pattern.compile(regex); } return null; } /** * Search cartridge Display name/Description for pattern * * @param cartridgeInfo cartridgeInfo * @param pattern Pattern * @return Pattern match status */ private static boolean cartridgeMatches(Cartridge 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; } // Util methods to get the service clients /** * Get CloudController Service Client * * @return CloudControllerServiceClient * @throws RestAPIException */ private static CloudControllerServiceClient getCloudControllerServiceClient() throws RestAPIException { try { return CloudControllerServiceClient.getInstance(); } 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); } } /** * Get Autoscaler Service Client * * @return AutoscalerServiceClient * @throws RestAPIException */ private static AutoscalerServiceClient getAutoscalerServiceClient() throws RestAPIException { try { return AutoscalerServiceClient.getInstance(); } 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); } } /** * Get Stratos Manager Service Client * * @return StratosManagerServiceClient * @throws RestAPIException */ private static StratosManagerServiceClient getStratosManagerServiceClient() throws RestAPIException { try { return StratosManagerServiceClient.getInstance(); } catch (AxisFault axisFault) { String errorMsg = "Error while getting StratosManagerServiceClient instance to connect to the " + "Stratos Manager. Cause: " + axisFault.getMessage(); log.error(errorMsg, axisFault); throw new RestAPIException(errorMsg, axisFault); } } // Util methods for Autoscaling policies /** * Add AutoscalePolicy * * @param autoscalePolicyBean autoscalePolicyBean * @throws RestAPIException */ public static void addAutoscalingPolicy(AutoscalePolicyBean autoscalePolicyBean) throws RestAPIException, AutoscalerServiceInvalidPolicyExceptionException, AutoscalerServiceAutoScalingPolicyAlreadyExistExceptionException { log.info(String.format("Adding autoscaling policy: [id] %s", autoscalePolicyBean.getId())); AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient(); if (autoscalerServiceClient != null) { org.apache.stratos.autoscaler.stub.autoscale.policy.AutoscalePolicy autoscalePolicy = ObjectConverter .convertToCCAutoscalerPojo(autoscalePolicyBean); try { autoscalerServiceClient.addAutoscalingPolicy(autoscalePolicy); } catch (RemoteException e) { log.error(e.getMessage(), e); throw new RestAPIException(e.getMessage(), e); } } } /** * Add an application policy * * @param applicationPolicyBean applicationPolicyBean * @throws RestAPIException */ public static void addApplicationPolicy(ApplicationPolicyBean applicationPolicyBean) throws RestAPIException, AutoscalerServiceInvalidApplicationPolicyExceptionException, AutoscalerServiceApplicationPolicyAlreadyExistsExceptionException { if (applicationPolicyBean == null) { String msg = "Application policy bean is null"; log.error(msg); throw new ApplicationPolicyIsEmptyException(msg); } AutoscalerServiceClient serviceClient = getAutoscalerServiceClient(); try { ApplicationPolicy applicationPolicy = ObjectConverter .convertApplicationPolicyBeanToStubAppPolicy(applicationPolicyBean); if (applicationPolicy == null) { String msg = "Application policy is null"; log.error(msg); throw new ApplicationPolicyIsEmptyException(msg); } serviceClient.addApplicationPolicy(applicationPolicy); } catch (RemoteException e) { String msg = "Could not add application policy. " + e.getLocalizedMessage(); log.error(msg, e); throw new RestAPIException(msg); } catch (AutoscalerServiceRemoteExceptionException e) { String msg = "Could not add application policy. " + e.getLocalizedMessage(); log.error(msg, e); throw new RestAPIException(msg); } } /** * Updates Application Policy * * @param applicationPolicyBean applicationPolicyBean * @throws RestAPIException */ public static void updateApplicationPolicy(ApplicationPolicyBean applicationPolicyBean) throws RestAPIException, AutoscalerServiceInvalidApplicationPolicyExceptionException, AutoscalerServiceApplicatioinPolicyNotExistsExceptionException { log.info(String.format("Updating application policy: [id] %s", applicationPolicyBean.getId())); AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient(); if (autoscalerServiceClient != null) { ApplicationPolicy applicationPolicy = ObjectConverter .convertApplicationPolicyBeanToStubAppPolicy(applicationPolicyBean); try { autoscalerServiceClient.updateApplicationPolicy(applicationPolicy); } catch (RemoteException e) { String msg = "Could not update application policy" + e.getLocalizedMessage(); log.error(msg, e); throw new RestAPIException(msg); } catch (AutoscalerServiceRemoteExceptionException e) { String msg = "Could not update application policy" + e.getLocalizedMessage(); log.error(msg, e); throw new RestAPIException(msg); } } } /** * Get Application Policies * * @return Array of ApplicationPolicyBeans * @throws RestAPIException */ public static ApplicationPolicyBean[] getApplicationPolicies() throws RestAPIException { ApplicationPolicy[] applicationPolicies = null; AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient(); if (autoscalerServiceClient != null) { try { applicationPolicies = autoscalerServiceClient.getApplicationPolicies(); } catch (RemoteException e) { String msg = "Could not get application policies" + e.getLocalizedMessage(); log.error(msg, e); throw new RestAPIException(msg); } } return ObjectConverter.convertASStubApplicationPoliciesToApplicationPolicies(applicationPolicies); } /** * Get ApplicationPolicy by Id * * @param applicationPolicyId applicationPolicyId * @return ApplicationPolicyBean * @throws RestAPIException */ public static ApplicationPolicyBean getApplicationPolicy(String applicationPolicyId) throws RestAPIException { if (applicationPolicyId == null) { String msg = "Application policy bean id null"; log.error(msg); throw new ApplicationPolicyIdIsEmptyException(msg); } if (StringUtils.isBlank(applicationPolicyId)) { String msg = "Application policy id is empty"; log.error(msg); throw new ApplicationPolicyIdIsEmptyException(msg); } try { AutoscalerServiceClient serviceClient = AutoscalerServiceClient.getInstance(); ApplicationPolicy applicationPolicy = serviceClient.getApplicationPolicy(applicationPolicyId); return ObjectConverter.convertASStubApplicationPolicyToApplicationPolicy(applicationPolicy); } catch (RemoteException e) { String message = String.format("Could not get application policy [application-policy-id] %s", applicationPolicyId); log.error(message); throw new RestAPIException(message, e); } } /** * Removes an Application Policy * * @param applicationPolicyId applicationPolicyId * @throws RestAPIException */ public static void removeApplicationPolicy(String applicationPolicyId) throws RestAPIException, AutoscalerServiceInvalidPolicyExceptionException, AutoscalerServiceUnremovablePolicyExceptionException { if (applicationPolicyId == null) { String msg = "Application policy bean id null"; log.error(msg); throw new ApplicationPolicyIdIsEmptyException(msg); } if (StringUtils.isBlank(applicationPolicyId)) { String msg = "Application policy id is empty"; log.error(msg); throw new ApplicationPolicyIdIsEmptyException(msg); } AutoscalerServiceClient serviceClient = getAutoscalerServiceClient(); try { serviceClient.removeApplicationPolicy(applicationPolicyId); } catch (RemoteException e) { String msg = "Could not remove application policy. " + e.getLocalizedMessage(); log.error(msg, e); throw new RestAPIException(msg); } } /** * Updates an Autoscaling Policy * * @param autoscalePolicyBean autoscalePolicyBean * @throws RestAPIException */ public static void updateAutoscalingPolicy(AutoscalePolicyBean autoscalePolicyBean) throws RestAPIException, AutoscalerServiceInvalidPolicyExceptionException { log.info(String.format("Updating autoscaling policy: [id] %s", autoscalePolicyBean.getId())); AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient(); if (autoscalerServiceClient != null) { org.apache.stratos.autoscaler.stub.autoscale.policy.AutoscalePolicy autoscalePolicy = ObjectConverter .convertToCCAutoscalerPojo(autoscalePolicyBean); try { autoscalerServiceClient.updateAutoscalingPolicy(autoscalePolicy); } catch (RemoteException e) { log.error(e.getMessage(), e); throw new RestAPIException(e.getMessage(), e); } } } /** * Removes an AutoscalingPolicy * * @param autoscalePolicyId autoscalePolicyId * @throws RestAPIException */ public static void removeAutoscalingPolicy(String autoscalePolicyId) throws RestAPIException, AutoscalerServicePolicyDoesNotExistExceptionException, AutoscalerServiceUnremovablePolicyExceptionException { log.info(String.format("Removing autoscaling policy: [id] %s", autoscalePolicyId)); AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient(); if (autoscalerServiceClient != null) { try { autoscalerServiceClient.removeAutoscalingPolicy(autoscalePolicyId); } catch (RemoteException e) { log.error(e.getMessage(), e); throw new RestAPIException(e.getMessage(), e); } } } /** * Get list of Autoscaling Policies * * @return Array of AutoscalingPolicies * @throws RestAPIException */ public static AutoscalePolicyBean[] getAutoScalePolicies() throws RestAPIException { org.apache.stratos.autoscaler.stub.autoscale.policy.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 ObjectConverter.convertStubAutoscalePoliciesToAutoscalePolicies(autoscalePolicies); } /** * Get an AutoScalePolicy * * @param autoscalePolicyId autoscalePolicyId * @return AutoscalePolicyBean * @throws RestAPIException */ public static AutoscalePolicyBean getAutoScalePolicy(String autoscalePolicyId) throws RestAPIException { org.apache.stratos.autoscaler.stub.autoscale.policy.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 ObjectConverter.convertStubAutoscalePolicyToAutoscalePolicy(autoscalePolicy); } // Util methods for repo actions /** * Notify ArtifactUpdatedEvent * * @param payload GitNotificationPayloadBean * @throws RestAPIException */ public static void notifyArtifactUpdatedEvent(GitNotificationPayloadBean payload) throws RestAPIException { try { StratosManagerServiceClient serviceClient = StratosManagerServiceClient.getInstance(); serviceClient.notifyArtifactUpdatedEventForRepository(payload.getRepository().getUrl()); } catch (Exception e) { String message = "Could not send artifact updated event"; log.error(message, e); throw new RestAPIException(message, e); } } // Util methods for service groups /** * Add a Service Group * * @param serviceGroupDefinition serviceGroupDefinition * @throws InvalidCartridgeGroupDefinitionException * @throws RestAPIException */ public static void addCartridgeGroup(CartridgeGroupBean serviceGroupDefinition) throws InvalidCartridgeGroupDefinitionException, ServiceGroupDefinitionException, RestAPIException, CloudControllerServiceCartridgeNotFoundExceptionException, AutoscalerServiceInvalidServiceGroupExceptionException { if (serviceGroupDefinition == null) { throw new RuntimeException("Cartridge group definition is null"); } List<String> cartridgeTypes = new ArrayList<String>(); String[] cartridgeNames = null; List<String> groupNames; if (log.isDebugEnabled()) { log.debug("Checking cartridges in cartridge group " + serviceGroupDefinition.getName()); } findCartridgesInGroupBean(serviceGroupDefinition, cartridgeTypes); //validate the group definition to check if cartridges duplicate in any groups defined validateCartridgeDuplicationInGroupDefinition(serviceGroupDefinition); //validate the group definition to check if groups duplicate in any groups and //validate the group definition to check for cyclic group behaviour validateGroupDuplicationInGroupDefinition(serviceGroupDefinition); CloudControllerServiceClient ccServiceClient = getCloudControllerServiceClient(); cartridgeNames = new String[cartridgeTypes.size()]; int j = 0; for (String cartridgeType : cartridgeTypes) { try { if (ccServiceClient.getCartridge(cartridgeType) == null) { // cartridge is not deployed, can't continue log.error("Invalid cartridge found in cartridge group " + cartridgeType); throw new InvalidCartridgeException(); } else { cartridgeNames[j] = cartridgeType; j++; } } catch (RemoteException e) { String message = "Could not add the cartridge group: " + serviceGroupDefinition.getName(); log.error(message, e); throw new RestAPIException(message, e); } } // if any sub groups are specified in the group, they should be already deployed if (serviceGroupDefinition.getGroups() != null) { if (log.isDebugEnabled()) { log.debug("checking subGroups in cartridge group " + serviceGroupDefinition.getName()); } List<CartridgeGroupBean> groupDefinitions = serviceGroupDefinition.getGroups(); groupNames = new ArrayList<String>(); int i = 0; for (CartridgeGroupBean groupList : groupDefinitions) { groupNames.add(groupList.getName()); i++; } Set<String> duplicates = findDuplicates(groupNames); if (duplicates.size() > 0) { StringBuilder duplicatesOutput = new StringBuilder(); for (String dup : duplicates) { duplicatesOutput.append(dup).append(" "); } if (log.isDebugEnabled()) { log.debug("duplicate sub-groups defined: " + duplicatesOutput.toString()); } throw new InvalidCartridgeGroupDefinitionException("Invalid cartridge group definition, duplicate " + "sub-groups defined:" + duplicatesOutput.toString()); } } ServiceGroup serviceGroup = ObjectConverter .convertServiceGroupDefinitionToASStubServiceGroup(serviceGroupDefinition); AutoscalerServiceClient asServiceClient = getAutoscalerServiceClient(); try { asServiceClient.addServiceGroup(serviceGroup); // Add cartridge group elements to SM cache - done after service group has been added StratosManagerServiceClient smServiceClient = getStratosManagerServiceClient(); smServiceClient.addUsedCartridgesInCartridgeGroups(serviceGroupDefinition.getName(), cartridgeNames); } catch (RemoteException e) { String message = "Could not add the cartridge group: " + serviceGroupDefinition.getName(); log.error(message, e); throw new RestAPIException(message, e); } } /** * Update a cartridge group * * @param cartridgeGroup * @throws RestAPIException */ public static void updateServiceGroup(CartridgeGroupBean 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); if (serviceGroup != null) { autoscalerServiceClient.updateServiceGroup( ObjectConverter.convertServiceGroupDefinitionToASStubServiceGroup(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 = new ArrayList<String>(); List<String> cartridgesToAdd = new ArrayList<String>(); if (!cartridgesBeforeUpdating.isEmpty()) { cartridgesToRemove.addAll(cartridgesBeforeUpdating); } if (!cartridgesAfterUpdating.isEmpty()) { cartridgesToAdd.addAll(cartridgesAfterUpdating); } if ((!cartridgesBeforeUpdating.isEmpty()) && (!cartridgesAfterUpdating.isEmpty())) { for (String before : cartridgesBeforeUpdating) { for (String after : cartridgesAfterUpdating) { if (before.toLowerCase().equals(after.toLowerCase())) { if (cartridgesToRemove.contains(after)) { cartridgesToRemove.remove(after); } if (cartridgesToAdd.contains(after)) { cartridgesToAdd.remove(after); } } } } } // Add cartridge group elements to SM cache - done after cartridge group has been updated if (cartridgesToAdd != null) { if (!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) { if (!cartridgesToRemove.isEmpty()) { smServiceClient.removeUsedCartridgesInCartridgeGroups(cartridgeGroup.getName(), cartridgesToRemove.toArray(new String[cartridgesToRemove.size()])); } } } } 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 * @return Set of duplicates */ private static Set<String> findDuplicates(List<String> checkedList) { final Set<String> retVals = new HashSet<String>(); final Set<String> set1 = new HashSet<String>(); for (String val : checkedList) { if (!set1.add(val)) { retVals.add(val); } } return retVals; } /** * Get a Service Group Definition by Name * * @param name Group Name * @return GroupBean * @throws RestAPIException */ public static CartridgeGroupBean getServiceGroupDefinition(String name) throws RestAPIException { if (log.isDebugEnabled()) { log.debug("Reading cartridge group: [group-name] " + name); } try { AutoscalerServiceClient asServiceClient = AutoscalerServiceClient.getInstance(); ServiceGroup serviceGroup = asServiceClient.getServiceGroup(name); if (serviceGroup == null) { return null; } return ObjectConverter.convertStubServiceGroupToServiceGroupDefinition(serviceGroup); } catch (Exception e) { String message = "Could not get cartridge group: [group-name] " + name; log.error(message, e); throw new RestAPIException(message, e); } } /** * Get a list of GroupBeans * * @return array of Group Beans * @throws RestAPIException */ public static CartridgeGroupBean[] getServiceGroupDefinitions() throws RestAPIException { if (log.isDebugEnabled()) { log.debug("Reading cartridge groups..."); } try { AutoscalerServiceClient asServiceClient = AutoscalerServiceClient.getInstance(); ServiceGroup[] serviceGroups = asServiceClient.getServiceGroups(); if (serviceGroups == null || serviceGroups.length == 0 || (serviceGroups.length == 1 && serviceGroups[0] == null)) { return null; } CartridgeGroupBean[] serviceGroupDefinitions = new CartridgeGroupBean[serviceGroups.length]; for (int i = 0; i < serviceGroups.length; i++) { serviceGroupDefinitions[i] = ObjectConverter .convertStubServiceGroupToServiceGroupDefinition(serviceGroups[i]); } return serviceGroupDefinitions; } catch (Exception e) { throw new RestAPIException(e); } } /** * Remove Service Group * * @param name Group Name * @throws RestAPIException */ public static void removeServiceGroup(String name) throws RestAPIException, AutoscalerServiceCartridgeGroupNotFoundExceptionException { if (log.isDebugEnabled()) { log.debug("Removing cartridge group: [name] " + name); } AutoscalerServiceClient asServiceClient = getAutoscalerServiceClient(); StratosManagerServiceClient smServiceClient = getStratosManagerServiceClient(); // Check whether cartridge group exists try { if (asServiceClient.getServiceGroup(name) == null) { String message = "Cartridge group: [group-name] " + name + " cannot be removed since it does not exist"; log.error(message); throw new RestAPIException(message); } // Validate whether cartridge group can be removed if (!smServiceClient.canCartirdgeGroupBeRemoved(name)) { String message = "Cannot remove cartridge group: [group-name] " + name + " since it is used in another cartridge group or an application"; log.error(message); throw new RestAPIException(message); } ServiceGroup serviceGroup = asServiceClient.getServiceGroup(name); asServiceClient.undeployServiceGroupDefinition(name); // Remove the dependent cartridges and cartridge groups from Stratos Manager cache // - done after service group has been removed List<String> cartridgeList = new ArrayList<String>(); findCartridgesInServiceGroup(serviceGroup, cartridgeList); String[] cartridgeNames = cartridgeList.toArray(new String[cartridgeList.size()]); smServiceClient.removeUsedCartridgesInCartridgeGroups(name, cartridgeNames); } catch (RemoteException e) { throw new RestAPIException("Could not remove cartridge groups", e); } log.info("Successfully removed the cartridge group: [group-name] " + name); } /** * Find Cartridges In ServiceGroup * * @param serviceGroup serviceGroup * @param cartridges List of cartridges */ private static void findCartridgesInServiceGroup(ServiceGroup serviceGroup, List<String> cartridges) { if (serviceGroup == null || cartridges == null) { return; } if (serviceGroup.getCartridges() != null) { for (String cartridge : serviceGroup.getCartridges()) { if (cartridge != null && (!cartridges.contains(cartridge))) { cartridges.add(cartridge); } } } if (serviceGroup.getGroups() != null) { for (ServiceGroup seGroup : serviceGroup.getGroups()) { findCartridgesInServiceGroup(seGroup, cartridges); } } } /** * Find Cartrides in GroupBean * * @param groupBean groupBean * @param cartridges List of cartridges */ private static void findCartridgesInGroupBean(CartridgeGroupBean groupBean, List<String> cartridges) { if (groupBean == null || cartridges == null) { return; } if (groupBean.getCartridges() != null) { for (String cartridge : groupBean.getCartridges()) { if (!cartridges.contains(cartridge)) { cartridges.add(cartridge); } } } if (groupBean.getGroups() != null) { for (CartridgeGroupBean seGroup : groupBean.getGroups()) { findCartridgesInGroupBean(seGroup, cartridges); } } } // Util methods for Applications /** * Verify the existence of the application and add it. * * @param appDefinition Application definition * @param ctxt Configuration context * @param userName Username * @param tenantDomain Tenant Domain * @throws RestAPIException */ public static void addApplication(ApplicationBean appDefinition, ConfigurationContext ctxt, String userName, String tenantDomain) throws RestAPIException, AutoscalerServiceCartridgeNotFoundExceptionException, AutoscalerServiceCartridgeGroupNotFoundExceptionException { if (StringUtils.isBlank(appDefinition.getApplicationId())) { String message = "Please specify the application name"; log.error(message); throw new ApplicationAlreadyExistException(message); } // check if an application with same id already exists try { if (AutoscalerServiceClient.getInstance().existApplication(appDefinition.getApplicationId())) { String msg = "Application already exists: [application-id] " + appDefinition.getApplicationId(); throw new RestAPIException(msg); } } catch (RemoteException e) { throw new RestAPIException("Could not read application", e); } validateApplication(appDefinition); // To validate groups have unique alias in the application definition validateGroupsInApplicationDefinition(appDefinition); ApplicationContext applicationContext = ObjectConverter .convertApplicationDefinitionToStubApplicationContext(appDefinition); applicationContext.setTenantId(ApplicationManagementUtil.getTenantId(ctxt)); applicationContext.setTenantDomain(tenantDomain); applicationContext.setTenantAdminUsername(userName); if (appDefinition.getProperty() != null) { org.apache.stratos.autoscaler.stub.Properties properties = new org.apache.stratos.autoscaler.stub.Properties(); for (PropertyBean propertyBean : appDefinition.getProperty()) { org.apache.stratos.autoscaler.stub.Property property = new org.apache.stratos.autoscaler.stub.Property(); property.setName(propertyBean.getName()); property.setValue(propertyBean.getValue()); properties.addProperties(property); } applicationContext.setProperties(properties); } try { AutoscalerServiceClient.getInstance().addApplication(applicationContext); List<String> usedCartridges = new ArrayList<String>(); List<String> usedCartridgeGroups = new ArrayList<String>(); findCartridgesAndGroupsInApplication(appDefinition, usedCartridges, usedCartridgeGroups); StratosManagerServiceClient smServiceClient = getStratosManagerServiceClient(); smServiceClient.addUsedCartridgesInApplications(appDefinition.getApplicationId(), usedCartridges.toArray(new String[usedCartridges.size()])); smServiceClient.addUsedCartridgeGroupsInApplications(appDefinition.getApplicationId(), usedCartridgeGroups.toArray(new String[usedCartridgeGroups.size()])); } catch (AutoscalerServiceApplicationDefinitionExceptionException e) { String message = e.getFaultMessage().getApplicationDefinitionException().getMessage(); throw new RestAPIException(message, e); } catch (RemoteException e) { throw new RestAPIException(e); } } /** * Update the existence of the application and update it. * * @param appDefinition Application definition * @param ctxt Configuration context * @param userName Username * @param tenantDomain Tenant Domain * @throws RestAPIException */ public static void updateApplication(ApplicationBean appDefinition, ConfigurationContext ctxt, String userName, String tenantDomain) throws RestAPIException, AutoscalerServiceCartridgeNotFoundExceptionException, AutoscalerServiceCartridgeGroupNotFoundExceptionException { if (StringUtils.isBlank(appDefinition.getApplicationId())) { String message = "Please specify the application name"; log.error(message); throw new RestAPIException(message); } validateApplication(appDefinition); ApplicationContext applicationContext = ObjectConverter .convertApplicationDefinitionToStubApplicationContext(appDefinition); applicationContext.setTenantId(ApplicationManagementUtil.getTenantId(ctxt)); applicationContext.setTenantDomain(tenantDomain); applicationContext.setTenantAdminUsername(userName); if (appDefinition.getProperty() != null) { org.apache.stratos.autoscaler.stub.Properties properties = new org.apache.stratos.autoscaler.stub.Properties(); for (PropertyBean propertyBean : appDefinition.getProperty()) { org.apache.stratos.autoscaler.stub.Property property = new org.apache.stratos.autoscaler.stub.Property(); property.setName(propertyBean.getName()); property.setValue(propertyBean.getValue()); properties.addProperties(property); } applicationContext.setProperties(properties); } try { AutoscalerServiceClient.getInstance().updateApplication(applicationContext); } catch (AutoscalerServiceApplicationDefinitionExceptionException e) { String message = e.getFaultMessage().getApplicationDefinitionException().getMessage(); throw new RestAPIException(message, e); } catch (RemoteException e) { throw new RestAPIException(e); } } /** * Find Cartridges And Groups In Application * * @param applicationBean ApplicationBean * @param cartridges List<String> cartridges * @param cartridgeGroups List <String> cartridgeGroups */ private static void findCartridgesAndGroupsInApplication(ApplicationBean applicationBean, List<String> cartridges, List<String> cartridgeGroups) { if (applicationBean == null || applicationBean.getComponents() == null) { return; } ComponentBean componentBean = applicationBean.getComponents(); List<CartridgeGroupReferenceBean> groupReferenceBeans = componentBean.getGroups(); if (groupReferenceBeans != null) { for (CartridgeGroupReferenceBean groupReferenceBean : groupReferenceBeans) { findCartridgesAndGroupsInCartridgeGroup(groupReferenceBean, cartridges, cartridgeGroups); } } List<CartridgeReferenceBean> cartridgeReferenceBeans = componentBean.getCartridges(); findCartridgeNamesInCartridges(cartridgeReferenceBeans, cartridges); } /** * Find Cartridges And Groups In CartridgeGroup * * @param groupReferenceBean GroupReferenceBean * @param cartridges List <String> * @param cartridgeGroups List <String> */ private static void findCartridgesAndGroupsInCartridgeGroup(CartridgeGroupReferenceBean groupReferenceBean, List<String> cartridges, List<String> cartridgeGroups) { if (groupReferenceBean == null || cartridgeGroups == null) { return; } if (!cartridgeGroups.contains(groupReferenceBean.getName())) { cartridgeGroups.add(groupReferenceBean.getName()); } if (groupReferenceBean.getGroups() != null) { for (CartridgeGroupReferenceBean grReferenceBean : groupReferenceBean.getGroups()) { findCartridgesAndGroupsInCartridgeGroup(grReferenceBean, cartridges, cartridgeGroups); findCartridgeNamesInCartridges(groupReferenceBean.getCartridges(), cartridges); } } findCartridgeNamesInCartridges(groupReferenceBean.getCartridges(), cartridges); } /** * Find Cartridge Names In Cartridges * * @param cartridgeReferenceBeans List of CartridgeReferenceBean * @param cartridges List <String> */ private static void findCartridgeNamesInCartridges(List<CartridgeReferenceBean> cartridgeReferenceBeans, List<String> cartridges) { if (cartridgeReferenceBeans == null || cartridges == null) { return; } for (CartridgeReferenceBean cartridgeReferenceBean : cartridgeReferenceBeans) { if (cartridgeReferenceBean != null && !cartridges.contains(cartridgeReferenceBean.getType())) { cartridges.add(cartridgeReferenceBean.getType()); } } } /** * Validate Application * * @param appDefinition ApplicationBean * @throws RestAPIException */ private static void validateApplication(ApplicationBean appDefinition) throws RestAPIException { if (StringUtils.isBlank(appDefinition.getAlias())) { String message = "Please specify the application alias"; log.error(message); throw new RestAPIException(message); } } /** * This method is to validate the application definition to have unique aliases among its groups * * @param applicationDefinition - the application definition * @throws RestAPIException */ private static void validateGroupsInApplicationDefinition(ApplicationBean applicationDefinition) throws RestAPIException { ConcurrentHashMap<String, CartridgeGroupReferenceBean> groupsInApplicationDefinition = new ConcurrentHashMap<String, CartridgeGroupReferenceBean>(); boolean groupParentHasDeploymentPolicy = false; if ((applicationDefinition.getComponents().getGroups() != null) && (!applicationDefinition.getComponents().getGroups().isEmpty())) { //This is to validate the top level groups in the application definition for (CartridgeGroupReferenceBean group : applicationDefinition.getComponents().getGroups()) { if (groupsInApplicationDefinition.get(group.getAlias()) != null) { String message = "Cartridge group alias exists more than once: [group-alias] " + group.getAlias(); throw new RestAPIException(message); } // Validate top level group deployment policy with cartridges if (group.getCartridges() != null) { if (group.getDeploymentPolicy() != null) { groupParentHasDeploymentPolicy = true; } validateCartridgesForDeploymentPolicy(group.getCartridges(), groupParentHasDeploymentPolicy); } groupsInApplicationDefinition.put(group.getAlias(), group); if (group.getGroups() != null) { //This is to validate the groups aliases recursively validateGroupsRecursively(groupsInApplicationDefinition, group.getGroups(), groupParentHasDeploymentPolicy); } } } if ((applicationDefinition.getComponents().getCartridges() != null) && (!applicationDefinition.getComponents().getCartridges().isEmpty())) { validateCartridgesForDeploymentPolicy(applicationDefinition.getComponents().getCartridges(), false); } } /** * This method validates cartridges in groups * Deployment policy should not defined in cartridge if group has a deployment policy * If group does not have a DP, then cartridge should have one * * @param cartridgeReferenceBeans - Cartridges in a group * @throws RestAPIException */ private static void validateCartridgesForDeploymentPolicy(List<CartridgeReferenceBean> cartridgeReferenceBeans, boolean groupParentHasDeploymentPolicy) throws RestAPIException { if (groupParentHasDeploymentPolicy) { for (CartridgeReferenceBean cartridge : cartridgeReferenceBeans) { if (cartridge.getSubscribableInfo().getDeploymentPolicy() != null) { String message = "Group deployment policy already exists. Remove deployment policy from " + "cartridge subscription : [cartridge] " + cartridge.getSubscribableInfo().getAlias(); throw new RestAPIException(message); } } } else { for (CartridgeReferenceBean cartridge : cartridgeReferenceBeans) { if (cartridge.getSubscribableInfo().getDeploymentPolicy() == null) { String message = String.format( "Deployment policy is not defined for cartridge [cartridge] %s." + "It has not inherited any deployment policies.", cartridge.getSubscribableInfo().getAlias()); throw new RestAPIException(message); } } } } /** * This method validates group aliases recursively * * @param groupsSet - the group collection in which the groups are added to * @param groups - the group collection in which it traverses through * @throws RestAPIException */ private static void validateGroupsRecursively(ConcurrentHashMap<String, CartridgeGroupReferenceBean> groupsSet, Collection<CartridgeGroupReferenceBean> groups, boolean hasDeploymentPolicy) throws RestAPIException { boolean groupHasDeploymentPolicy = false; for (CartridgeGroupReferenceBean group : groups) { if (groupsSet.get(group.getAlias()) != null) { String message = "Cartridge group alias exists more than once: [group-alias] " + group.getAlias(); throw new RestAPIException(message); } if (group.getDeploymentPolicy() != null) { if (hasDeploymentPolicy) { String message = "Parent group has a deployment policy. Remove deployment policy from the" + " group: [group-alias] " + group.getAlias(); throw new RestAPIException(message); } else { groupHasDeploymentPolicy = true; } } else { groupHasDeploymentPolicy = hasDeploymentPolicy; } if (group.getCartridges() != null) { validateCartridgesForDeploymentPolicy(group.getCartridges(), groupHasDeploymentPolicy); } groupsSet.put(group.getAlias(), group); if (group.getGroups() != null) { validateGroupsRecursively(groupsSet, group.getGroups(), groupHasDeploymentPolicy); } } } /** * Deploy application with an application policy. * * @param applicationId Application ID * @param applicationPolicyId Application policy Id * @throws RestAPIException */ public static void deployApplication(String applicationId, String applicationPolicyId) throws RestAPIException { if (StringUtils.isEmpty(applicationPolicyId)) { String message = "Application policy id is Empty"; log.error(message); throw new RestAPIException(message); } try { if (log.isInfoEnabled()) { log.info(String.format("Starting to deploy application: [application-id] %s", applicationId)); } AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient(); ApplicationContext application = autoscalerServiceClient.getApplication(applicationId); if (application == null) { String message = String.format("Application not found: [application-id] %s", applicationId); log.error(message); throw new RestAPIException(message); } if (application.getStatus().equalsIgnoreCase(APPLICATION_STATUS_DEPLOYED)) { String message = String.format( "Application is already in DEPLOYED state: [application-id] %s [current status] %s ", applicationId, application.getStatus()); log.error(message); throw new ApplicationAlreadyDeployedException(message); } // This is a redundant state since there is only CREATED,DEPLOYED state. // But this will be usefull when more status are added. if (!application.getStatus().equalsIgnoreCase(APPLICATION_STATUS_CREATED)) { String message = String.format( "Application is not in CREATED state: [application-id] %s [current status] %s ", applicationId, application.getStatus()); log.error(message); throw new RestAPIException(message); } ApplicationBean applicationBean = getApplication(applicationId); int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); if (applicationBean.isMultiTenant() && (tenantId != -1234)) { String message = String.format( "Multi-tenant applications can only be deployed by super tenant: [application-id] %s", applicationId); log.error(message); throw new RestAPIException(message); } autoscalerServiceClient.deployApplication(applicationId, applicationPolicyId); if (log.isInfoEnabled()) { log.info(String.format("Application deployed successfully: [application-id] %s", applicationId)); } } 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); } catch (AutoscalerServiceApplicationDefinitionExceptionException e) { String message = e.getMessage(); log.error(message, e); throw new RestAPIException(message, e); } } /** * Get Application Network Partitions * * @param applicationId Application ID * @return ApplicationNetworkPartitionIdListBean */ public static ApplicationNetworkPartitionIdListBean getApplicationNetworkPartitions(String applicationId) { try { AutoscalerServiceClient serviceClient = AutoscalerServiceClient.getInstance(); String[] networkPartitions = serviceClient.getApplicationNetworkPartitions(applicationId); ApplicationNetworkPartitionIdListBean appNetworkPartitionsBean = new ApplicationNetworkPartitionIdListBean(); appNetworkPartitionsBean.setNetworkPartitionIds(Arrays.asList(networkPartitions)); return appNetworkPartitionsBean; } catch (Exception e) { String message = String.format("Could not get application network partitions [application-id] %s", applicationId); log.error(message); throw new RuntimeException(message, e); } } /** * Remove Application * * @param applicationId Application Id * @throws RestAPIException */ public static void removeApplication(String applicationId) throws RestAPIException { try { log.info(String.format("Starting to remove application [application-id %s", applicationId)); AutoscalerServiceClient asServiceClient = getAutoscalerServiceClient(); ApplicationContext asApplication = asServiceClient.getApplication(applicationId); ApplicationBean application = ObjectConverter .convertStubApplicationContextToApplicationDefinition(asApplication); asServiceClient.deleteApplication(applicationId); List<String> usedCartridges = new ArrayList<String>(); List<String> usedCartridgeGroups = new ArrayList<String>(); findCartridgesAndGroupsInApplication(application, usedCartridges, usedCartridgeGroups); StratosManagerServiceClient smServiceClient = getStratosManagerServiceClient(); smServiceClient.removeUsedCartridgesInApplications(application.getApplicationId(), usedCartridges.toArray(new String[usedCartridges.size()])); smServiceClient.removeUsedCartridgeGroupsInApplications(application.getApplicationId(), usedCartridgeGroups.toArray(new String[usedCartridgeGroups.size()])); } catch (RemoteException e) { String message = "Could not delete application: [application-id] " + applicationId; log.error(message, e); throw new RestAPIException(message, e); } } /** * Get Application Details * * @param applicationId Application Id * @return ApplicationBean * @throws RestAPIException */ public static ApplicationBean getApplication(String applicationId) throws RestAPIException { try { return ObjectConverter.convertStubApplicationContextToApplicationDefinition( AutoscalerServiceClient.getInstance().getApplication(applicationId)); } catch (RemoteException e) { String message = "Could not read application: [application-id] " + applicationId; log.error(message, e); throw new RestAPIException(message, e); } } /** * Get list of Applications * * @return List of Application Beans * @throws RestAPIException */ public static List<ApplicationBean> getApplications() throws RestAPIException { try { List<ApplicationBean> applicationDefinitions = new ArrayList<ApplicationBean>(); ApplicationContext[] applicationContexts = AutoscalerServiceClient.getInstance().getApplications(); if (applicationContexts != null) { for (ApplicationContext applicationContext : applicationContexts) { if (applicationContext != null) { ApplicationBean applicationDefinition = ObjectConverter .convertStubApplicationContextToApplicationDefinition(applicationContext); if (applicationDefinition.isMultiTenant()) { int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); boolean hasSignUps = StratosManagerServiceClient.getInstance() .applicationSignUpExist(applicationDefinition.getApplicationId(), tenantId); applicationDefinition.setSignUpsExist(hasSignUps); } applicationDefinitions.add(applicationDefinition); } } } return applicationDefinitions; } catch (RemoteException e) { String message = "Could not read applications"; log.error(message, e); throw new RestAPIException(message, e); } catch (StratosManagerServiceApplicationSignUpExceptionException e) { String message = "Could not read applications"; log.error(message, e); throw new RestAPIException(message, e); } } /** * Undeploy an Application * * @param applicationId applicationId * @param force parameter to set force undeployment * @throws RestAPIException */ public static void undeployApplication(String applicationId, boolean force) throws RestAPIException { AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient(); if (force) { if (log.isDebugEnabled()) { log.debug("Forcefully undeploying application [application-id] " + applicationId); } } else { if (log.isDebugEnabled()) { log.debug("Gracefully undeploying application [application-id] " + applicationId); } } if (autoscalerServiceClient != null) { try { autoscalerServiceClient.undeployApplication(applicationId, force); try { clearMetadata(applicationId); } catch (RestAPIException e) { String message = "Could not remove application metadata: [application-id] " + applicationId; log.error(message, e); throw new RestAPIException(message, e); } } catch (RemoteException | AutoscalerServiceApplicationDefinitionExceptionException | AutoscalerServiceRemoteExceptionException | AutoscalerServiceStratosManagerServiceApplicationSignUpExceptionExceptionException e) { String message = "Could not undeploy application: [application-id] " + applicationId; log.error(message, e); throw new RestAPIException(message, e); } catch (AutoscalerServiceUnremovableApplicationExceptionException e) { String message = "Could not undeploy application: [application-id] " + applicationId + " since it has" + " application signups"; log.error(message, e); throw new RestAPIException(message, e); } } } private static void clearMetadata(String applicationId) throws RestAPIException { PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); ctx.setTenantId(MultitenantConstants.SUPER_TENANT_ID); ctx.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME); String resourcePath = METADATA_REG_PATH + applicationId; Registry registry = (UserRegistry) PrivilegedCarbonContext.getThreadLocalCarbonContext() .getRegistry(RegistryType.SYSTEM_GOVERNANCE); try { registry.beginTransaction(); if (registry.resourceExists(resourcePath)) { registry.delete(resourcePath); log.info(String.format("Application metadata removed: [application-id] %s", applicationId)); } registry.commitTransaction(); } catch (RegistryException e) { try { registry.rollbackTransaction(); } catch (RegistryException e1) { log.error("Could not rollback transaction", e1); } throw new RestAPIException( String.format("Application metadata removed: [application-id] %s", applicationId), e); } } /** * Get Application Runtime * * @param applicationId Application Id * @return ApplicationInfoBean */ public static ApplicationInfoBean getApplicationRuntime(String applicationId) throws RestAPIException { ApplicationInfoBean applicationBean = null; ApplicationContext applicationContext = null; //Checking whether application is in deployed mode try { applicationContext = getAutoscalerServiceClient().getApplication(applicationId); } catch (RemoteException e) { String message = "Could not get application definition: [application-id] " + applicationId; log.error(message, e); throw new RestAPIException(message, e); } catch (RestAPIException e) { String message = "Could not get application definition: [application-id] " + applicationId; log.error(message, e); throw new RestAPIException(message, e); } try { ApplicationManager.acquireReadLockForApplication(applicationId); Application application = ApplicationManager.getApplications().getApplication(applicationId); if (application != null) { if (application.getInstanceContextCount() > 0 || (applicationContext != null && applicationContext.getStatus().equals("Deployed"))) { applicationBean = ObjectConverter.convertApplicationToApplicationInstanceBean(application); for (ApplicationInstanceBean instanceBean : applicationBean.getApplicationInstances()) { addClustersInstancesToApplicationInstanceBean(instanceBean, application); addGroupsInstancesToApplicationInstanceBean(instanceBean, application); } } } } finally { ApplicationManager.releaseReadLockForApplication(applicationId); } return applicationBean; } /** * Add GroupsInstances To ApplicationInstanceBean * * @param applicationInstanceBean ApplicationInstanceBean * @param application Application */ private static void addGroupsInstancesToApplicationInstanceBean(ApplicationInstanceBean applicationInstanceBean, Application application) { Collection<Group> groups = application.getGroups(); if (groups != null && !groups.isEmpty()) { for (Group group : groups) { List<GroupInstanceBean> groupInstanceBeans = ObjectConverter .convertGroupToGroupInstancesBean(applicationInstanceBean.getInstanceId(), group); for (GroupInstanceBean groupInstanceBean : groupInstanceBeans) { setSubGroupInstances(group, groupInstanceBean); applicationInstanceBean.getGroupInstances().add(groupInstanceBean); } } } } /** * Add ClustersInstances To ApplicationInstanceBean * * @param applicationInstanceBean ApplicationInstanceBean * @param application Application */ private static void addClustersInstancesToApplicationInstanceBean( ApplicationInstanceBean applicationInstanceBean, Application application) { Map<String, ClusterDataHolder> topLevelClusterDataMap = application.getClusterDataMap(); if (topLevelClusterDataMap != null) { for (Map.Entry<String, ClusterDataHolder> entry : topLevelClusterDataMap.entrySet()) { ClusterDataHolder clusterDataHolder = entry.getValue(); String clusterId = clusterDataHolder.getClusterId(); String serviceType = clusterDataHolder.getServiceType(); try { TopologyManager.acquireReadLockForCluster(serviceType, clusterId); Cluster cluster = TopologyManager.getTopology().getService(serviceType).getCluster(clusterId); applicationInstanceBean.getClusterInstances() .add(ObjectConverter.convertClusterToClusterInstanceBean( applicationInstanceBean.getInstanceId(), cluster, entry.getKey())); } finally { TopologyManager.releaseReadLockForCluster(serviceType, clusterId); } } } } /** * Add ClustersInstances To GroupInstanceBean * * @param groupInstanceBean GroupInstanceBean * @param group Group */ private static void addClustersInstancesToGroupInstanceBean(GroupInstanceBean groupInstanceBean, Group group) { Map<String, ClusterDataHolder> topLevelClusterDataMap = group.getClusterDataMap(); if (topLevelClusterDataMap != null && !topLevelClusterDataMap.isEmpty()) { for (Map.Entry<String, ClusterDataHolder> entry : topLevelClusterDataMap.entrySet()) { ClusterDataHolder clusterDataHolder = entry.getValue(); String clusterId = clusterDataHolder.getClusterId(); String serviceType = clusterDataHolder.getServiceType(); try { TopologyManager.acquireReadLockForCluster(serviceType, clusterId); Cluster topLevelCluster = TopologyManager.getTopology().getService(serviceType) .getCluster(clusterId); groupInstanceBean.getClusterInstances().add(ObjectConverter.convertClusterToClusterInstanceBean( groupInstanceBean.getInstanceId(), topLevelCluster, entry.getKey())); } finally { TopologyManager.releaseReadLockForCluster(serviceType, clusterId); } } } } /** * Set Sub Group Instances * * @param group Group * @param groupInstanceBean GroupInstanceBean */ private static void setSubGroupInstances(Group group, GroupInstanceBean groupInstanceBean) { Collection<Group> subgroups = group.getGroups(); addClustersInstancesToGroupInstanceBean(groupInstanceBean, group); if (subgroups != null && !subgroups.isEmpty()) { for (Group subGroup : subgroups) { List<GroupInstanceBean> groupInstanceBeans = ObjectConverter .convertGroupToGroupInstancesBean(groupInstanceBean.getInstanceId(), subGroup); for (GroupInstanceBean groupInstanceBean1 : groupInstanceBeans) { setSubGroupInstances(subGroup, groupInstanceBean1); groupInstanceBean.getGroupInstances().add(groupInstanceBean1); } } } } // Util methods for Kubernetes clusters /** * Add Kubernetes Cluster * * @param kubernetesClusterBean KubernetesClusterBean * @return add status * @throws RestAPIException */ public static boolean addKubernetesCluster(KubernetesClusterBean kubernetesClusterBean) throws RestAPIException, CloudControllerServiceInvalidKubernetesClusterExceptionException, CloudControllerServiceKubernetesClusterAlreadyExistsExceptionException { CloudControllerServiceClient cloudControllerServiceClient = getCloudControllerServiceClient(); if (cloudControllerServiceClient != null) { org.apache.stratos.cloud.controller.stub.domain.kubernetes.KubernetesCluster kubernetesCluster = ObjectConverter .convertToCCKubernetesClusterPojo(kubernetesClusterBean); try { return cloudControllerServiceClient.deployKubernetesCluster(kubernetesCluster); } catch (RemoteException e) { log.error(e.getMessage(), e); throw new RestAPIException(e.getMessage(), e); } } return false; } /** * Update Kubernetes Cluster * * @param kubernetesClusterBean KubernetesClusterBean * @return add status * @throws RestAPIException */ public static boolean updateKubernetesCluster(KubernetesClusterBean kubernetesClusterBean) throws RestAPIException, CloudControllerServiceInvalidKubernetesClusterExceptionException { CloudControllerServiceClient cloudControllerServiceClient = getCloudControllerServiceClient(); if (cloudControllerServiceClient != null) { org.apache.stratos.cloud.controller.stub.domain.kubernetes.KubernetesCluster kubernetesCluster = ObjectConverter .convertToCCKubernetesClusterPojo(kubernetesClusterBean); try { return cloudControllerServiceClient.updateKubernetesCluster(kubernetesCluster); } catch (RemoteException e) { log.error(e.getMessage(), e); throw new RestAPIException(e.getMessage(), e); } } return false; } /** * Add Kubernetes Host * * @param kubernetesClusterId KubernetesClusterId * @param kubernetesHostBean KubernetesHostBean * @return add status * @throws RestAPIException */ public static boolean addKubernetesHost(String kubernetesClusterId, KubernetesHostBean kubernetesHostBean) throws RestAPIException { CloudControllerServiceClient cloudControllerServiceClient = getCloudControllerServiceClient(); if (cloudControllerServiceClient != null) { org.apache.stratos.cloud.controller.stub.domain.kubernetes.KubernetesHost kubernetesHost = ObjectConverter .convertKubernetesHostToStubKubernetesHost(kubernetesHostBean); try { return cloudControllerServiceClient.addKubernetesHost(kubernetesClusterId, kubernetesHost); } catch (RemoteException e) { log.error(e.getMessage(), e); throw new RestAPIException(e.getMessage(), e); } catch (CloudControllerServiceInvalidKubernetesHostExceptionException e) { String message = e.getFaultMessage().getInvalidKubernetesHostException().getMessage(); log.error(message, e); throw new RestAPIException(message, e); } catch (CloudControllerServiceNonExistingKubernetesClusterExceptionException e) { String message = e.getFaultMessage().getNonExistingKubernetesClusterException().getMessage(); log.error(message, e); throw new RestAPIException(message, e); } } return false; } /** * Update Kubernetes Master * * @param kubernetesMasterBean KubernetesMasterBean * @return update status * @throws RestAPIException */ public static boolean updateKubernetesMaster(KubernetesMasterBean kubernetesMasterBean) throws RestAPIException { CloudControllerServiceClient cloudControllerServiceClient = getCloudControllerServiceClient(); if (cloudControllerServiceClient != null) { org.apache.stratos.cloud.controller.stub.domain.kubernetes.KubernetesMaster kubernetesMaster = ObjectConverter .convertStubKubernetesMasterToKubernetesMaster(kubernetesMasterBean); try { return cloudControllerServiceClient.updateKubernetesMaster(kubernetesMaster); } catch (RemoteException e) { log.error(e.getMessage(), e); throw new RestAPIException(e.getMessage(), e); } catch (CloudControllerServiceInvalidKubernetesMasterExceptionException e) { String message = e.getFaultMessage().getInvalidKubernetesMasterException().getMessage(); log.error(message, e); throw new RestAPIException(message, e); } catch (CloudControllerServiceNonExistingKubernetesMasterExceptionException e) { String message = e.getFaultMessage().getNonExistingKubernetesMasterException().getMessage(); log.error(message, e); throw new RestAPIException(message, e); } } return false; } /** * Get Available Kubernetes Clusters * * @return Array of KubernetesClusterBeans * @throws RestAPIException */ public static KubernetesClusterBean[] getAvailableKubernetesClusters() throws RestAPIException { CloudControllerServiceClient cloudControllerServiceClient = getCloudControllerServiceClient(); if (cloudControllerServiceClient != null) { try { org.apache.stratos.cloud.controller.stub.domain.kubernetes.KubernetesCluster[] kubernetesClusters = cloudControllerServiceClient .getAvailableKubernetesClusters(); if (kubernetesClusters == null) { if (log.isDebugEnabled()) { log.debug("There are no available Kubernetes clusters"); } return null; } return ObjectConverter.convertStubKubernetesClustersToKubernetesClusters(kubernetesClusters); } catch (RemoteException e) { log.error(e.getMessage(), e); throw new RestAPIException(e.getMessage(), e); } } return null; } /** * Get a Kubernetes Cluster * * @param kubernetesClusterId Cluster ID * @return KubernetesClusterBean * @throws RestAPIException */ public static KubernetesClusterBean getKubernetesCluster(String kubernetesClusterId) throws RestAPIException { CloudControllerServiceClient cloudControllerServiceClient = getCloudControllerServiceClient(); if (cloudControllerServiceClient != null) { try { org.apache.stratos.cloud.controller.stub.domain.kubernetes.KubernetesCluster kubernetesCluster = cloudControllerServiceClient .getKubernetesCluster(kubernetesClusterId); return ObjectConverter.convertStubKubernetesClusterToKubernetesCluster(kubernetesCluster); } catch (RemoteException e) { log.error(e.getMessage(), e); throw new RestAPIException(e.getMessage(), e); } catch (CloudControllerServiceNonExistingKubernetesClusterExceptionException e) { String message = e.getFaultMessage().getNonExistingKubernetesClusterException().getMessage(); log.error(message); throw new RestAPIException(message, e); } } return null; } /** * Remove Kubernetes Cluster * * @param kubernetesClusterId kubernetesClusterId * @return remove status * @throws RestAPIException */ public static boolean removeKubernetesCluster(String kubernetesClusterId) throws RestAPIException, CloudControllerServiceNonExistingKubernetesClusterExceptionException, CloudControllerServiceKubernetesClusterAlreadyUsedExceptionException { CloudControllerServiceClient cloudControllerServiceClient = getCloudControllerServiceClient(); if (cloudControllerServiceClient != null) { try { cloudControllerServiceClient.undeployKubernetesCluster(kubernetesClusterId); return true; } catch (RemoteException e) { log.error(e.getMessage(), e); throw new RestAPIException(e.getMessage(), e); } } return false; } /** * Remove Kubernetes Host * * @param kubernetesHostId Kubernetes HostId * @return remove status * @throws RestAPIException */ public static boolean removeKubernetesHost(String kubernetesHostId) throws RestAPIException { CloudControllerServiceClient cloudControllerServiceClient = getCloudControllerServiceClient(); if (cloudControllerServiceClient != null) { try { return cloudControllerServiceClient.undeployKubernetesHost(kubernetesHostId); } catch (RemoteException e) { log.error(e.getMessage(), e); throw new RestAPIException(e.getMessage(), e); } catch (CloudControllerServiceNonExistingKubernetesHostExceptionException e) { String message = e.getFaultMessage().getNonExistingKubernetesHostException().getMessage(); log.error(message, e); throw new RestAPIException(message, e); } } return false; } /** * Get Kubernetes Hosts * * @param kubernetesClusterId kubernetesClusterId * @return List of KubernetesHostBeans * @throws RestAPIException */ public static KubernetesHostBean[] getKubernetesHosts(String kubernetesClusterId) throws RestAPIException { CloudControllerServiceClient cloudControllerServiceClient = getCloudControllerServiceClient(); if (cloudControllerServiceClient != null) { try { org.apache.stratos.cloud.controller.stub.domain.kubernetes.KubernetesHost[] kubernetesHosts = cloudControllerServiceClient .getKubernetesHosts(kubernetesClusterId); List<KubernetesHostBean> arrayList = ObjectConverter .convertStubKubernetesHostsToKubernetesHosts(kubernetesHosts); KubernetesHostBean[] array = new KubernetesHostBean[arrayList.size()]; array = arrayList.toArray(array); return array; } catch (RemoteException e) { log.error(e.getMessage(), e); throw new RestAPIException(e.getMessage(), e); } catch (CloudControllerServiceNonExistingKubernetesClusterExceptionException e) { String message = e.getFaultMessage().getNonExistingKubernetesClusterException().getMessage(); log.error(message); throw new RestAPIException(message, e); } } return null; } /** * Get Kubernetes Master * * @param kubernetesClusterId Kubernetes ClusterId * @return KubernetesMasterBean * @throws RestAPIException */ public static KubernetesMasterBean getKubernetesMaster(String kubernetesClusterId) throws RestAPIException { CloudControllerServiceClient cloudControllerServiceClient = getCloudControllerServiceClient(); if (cloudControllerServiceClient != null) { try { org.apache.stratos.cloud.controller.stub.domain.kubernetes.KubernetesMaster kubernetesMaster = cloudControllerServiceClient .getKubernetesMaster(kubernetesClusterId); return ObjectConverter.convertStubKubernetesMasterToKubernetesMaster(kubernetesMaster); } catch (RemoteException e) { log.error(e.getMessage(), e); throw new RestAPIException(e.getMessage(), e); } catch (CloudControllerServiceNonExistingKubernetesClusterExceptionException e) { String message = e.getFaultMessage().getNonExistingKubernetesClusterException().getMessage(); log.error(message); throw new RestAPIException(message, e); } } return null; } /** * Update KubernetesHost * * @param kubernetesHostBean KubernetesHostBean * @return update status * @throws RestAPIException */ public static boolean updateKubernetesHost(KubernetesHostBean kubernetesHostBean) throws RestAPIException { CloudControllerServiceClient cloudControllerServiceClient = getCloudControllerServiceClient(); if (cloudControllerServiceClient != null) { org.apache.stratos.cloud.controller.stub.domain.kubernetes.KubernetesHost kubernetesHost = ObjectConverter .convertKubernetesHostToStubKubernetesHost(kubernetesHostBean); try { return cloudControllerServiceClient.updateKubernetesHost(kubernetesHost); } catch (RemoteException e) { log.error(e.getMessage(), e); throw new RestAPIException(e.getMessage(), e); } catch (CloudControllerServiceInvalidKubernetesHostExceptionException e) { String message = e.getFaultMessage().getInvalidKubernetesHostException().getMessage(); log.error(message, e); throw new RestAPIException(message, e); } catch (CloudControllerServiceNonExistingKubernetesHostExceptionException e) { String message = e.getFaultMessage().getNonExistingKubernetesHostException().getMessage(); log.error(message, e); throw new RestAPIException(message, e); } } return false; } /** * Add Application Signup * * @param applicationId applicationId * @param applicationSignUpBean ApplicationSignUpBean * @param tenantId * @throws RestAPIException */ public static void addApplicationSignUp(String applicationId, ApplicationSignUpBean applicationSignUpBean, int tenantId) throws RestAPIException { if (StringUtils.isBlank(applicationId)) { throw new RestAPIException("Application id is null"); } ApplicationBean applicationBean = getApplication(applicationId); Application application = ApplicationManager.getApplications().getApplication(applicationId); if ((applicationBean == null) || (application == null)) { throw new RestAPIException("Application not found: [application-id] " + applicationId); } if (!ApplicationStatus.Active.equals(application.getStatus())) { throw new RestAPIException("Application has not been activated: [application-id] " + applicationId); } if (!applicationBean.isMultiTenant()) { throw new RestAPIException("Application signups cannot be added to single-tenant applications"); } if (applicationSignUpBean == null) { throw new RestAPIException("Application signup is null"); } try { if (log.isInfoEnabled()) { log.info(String.format("Adding applicationBean signup: [application-id] %s", applicationId)); } ApplicationSignUp applicationSignUp = ObjectConverter .convertApplicationSignUpBeanToStubApplicationSignUp(applicationSignUpBean); applicationSignUp.setApplicationId(applicationId); applicationSignUp.setTenantId(tenantId); List<String> clusterIds = findApplicationClusterIds(application); String[] clusterIdsArray = clusterIds.toArray(new String[clusterIds.size()]); applicationSignUp.setClusterIds(clusterIdsArray); // Encrypt artifact repository passwords encryptRepositoryPasswords(applicationSignUp, application.getKey()); StratosManagerServiceClient serviceClient = StratosManagerServiceClient.getInstance(); serviceClient.addApplicationSignUp(applicationSignUp); if (log.isInfoEnabled()) { log.info(String.format("Application signup added successfully: [application-id] %s [tenant-id] %d", applicationId, tenantId)); } serviceClient.notifyArtifactUpdatedEventForSignUp(applicationId, tenantId); if (log.isInfoEnabled()) { log.info(String.format("Artifact updated event sent: [application-id] %s [tenant-id] %d", applicationId, tenantId)); } } catch (Exception e) { String message = "Error in applicationBean signup: [application-id] " + applicationId; log.error(message, e); throw new RestAPIException(message, e); } } /** * Find application cluster ids. * * @param application Application * @return list of cluster Ids */ private static List<String> findApplicationClusterIds(Application application) { List<String> clusterIds = new ArrayList<String>(); for (ClusterDataHolder clusterDataHolder : application.getClusterDataRecursively()) { clusterIds.add(clusterDataHolder.getClusterId()); } return clusterIds; } /** * Encrypt artifact repository passwords. * * @param applicationSignUp Application Signup * @param applicationKey Application Key */ private static void encryptRepositoryPasswords(ApplicationSignUp applicationSignUp, String applicationKey) { if (applicationSignUp.getArtifactRepositories() != null) { for (ArtifactRepository artifactRepository : applicationSignUp.getArtifactRepositories()) { if (artifactRepository != null) { String repoPassword = artifactRepository.getRepoPassword(); if ((StringUtils.isNotBlank(repoPassword))) { String encryptedRepoPassword = CommonUtil.encryptPassword(repoPassword, applicationKey); artifactRepository.setRepoPassword(encryptedRepoPassword); if (log.isDebugEnabled()) { log.debug(String.format( "Artifact repository password encrypted: [application-id] %s " + "[tenant-id] %d [repo-url] %s", applicationSignUp.getApplicationId(), applicationSignUp.getTenantId(), artifactRepository.getRepoUrl())); } } } } } } /** * Get Application SignUp * * @param applicationId applicationId * @return ApplicationSignUpBean * @throws RestAPIException */ public static ApplicationSignUpBean getApplicationSignUp(String applicationId) throws RestAPIException, StratosManagerServiceApplicationSignUpExceptionException { if (StringUtils.isBlank(applicationId)) { throw new ApplicationSignUpRestAPIException("Application id is null"); } ApplicationBean application = getApplication(applicationId); if (application == null) { throw new ApplicationSignUpRestAPIException( "Application does not exist: [application-id] " + applicationId); } if (!application.isMultiTenant()) { throw new ApplicationSignUpRestAPIException( "Application sign ups not available for single-tenant applications"); } int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); try { StratosManagerServiceClient serviceClient = StratosManagerServiceClient.getInstance(); ApplicationSignUp applicationSignUp = serviceClient.getApplicationSignUp(applicationId, tenantId); if (applicationSignUp != null) { return ObjectConverter.convertStubApplicationSignUpToApplicationSignUpBean(applicationSignUp); } return null; } catch (RemoteException e) { String message = String.format("Could not get application signup: [application-id] %s [tenant-id] %d", applicationId, tenantId); log.error(message, e); throw new RestAPIException(message, e); } } /** * Remove Application SignUp * * @param applicationId applicationId * @param tenantId * @throws RestAPIException */ public static void removeApplicationSignUp(String applicationId, int tenantId) throws RestAPIException { if (StringUtils.isBlank(applicationId)) { throw new RestAPIException("Application id is null"); } ApplicationBean application = getApplication(applicationId); if (application == null) { throw new RestAPIException("Application does not exist: [application-id] " + applicationId); } if (!application.isMultiTenant()) { throw new RestAPIException("Application singups not available for single-tenant applications"); } try { StratosManagerServiceClient serviceClient = StratosManagerServiceClient.getInstance(); serviceClient.removeApplicationSignUp(applicationId, tenantId); if (log.isInfoEnabled()) { log.info(String.format( "Application signup removed successfully: [application-id] %s" + "[tenant-id] %d", applicationId, tenantId)); } } catch (Exception e) { String message = String.format( "Could not remove application signup: [application-id] %s [tenant-id] %d ", applicationId, tenantId); log.error(message, e); throw new RestAPIException(message, e); } } /** * Add Application Domain Mappings * * @param applicationId application Id * @param domainMappingsBean ApplicationDomainMappingsBean * @throws RestAPIException */ public static void addApplicationDomainMappings(String applicationId, ApplicationDomainMappingsBean domainMappingsBean) throws RestAPIException, StratosManagerServiceDomainMappingExceptionException { try { int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); if (domainMappingsBean.getDomainMappings() != null) { StratosManagerServiceClient serviceClient = StratosManagerServiceClient.getInstance(); for (DomainMappingBean domainMappingBean : domainMappingsBean.getDomainMappings()) { ClusterDataHolder clusterDataHolder = findClusterDataHolder(applicationId, domainMappingBean.getCartridgeAlias()); DomainMapping domainMapping = ObjectConverter .convertDomainMappingBeanToStubDomainMapping(domainMappingBean); domainMapping.setApplicationId(applicationId); domainMapping.setTenantId(tenantId); domainMapping.setServiceName(clusterDataHolder.getServiceType()); domainMapping.setClusterId(clusterDataHolder.getClusterId()); serviceClient.addDomainMapping(domainMapping); if (log.isInfoEnabled()) { log.info(String.format( "Domain mapping added: [application-id] %s [tenant-id] %d " + "[domain-name] %s [context-path] %s", applicationId, tenantId, domainMapping.getDomainName(), domainMapping.getContextPath())); } } } } catch (RemoteException e) { String message = "Could not add domain mappings: [application-id] " + applicationId; log.error(message, e); throw new RestAPIException(message, e); } } /** * Find Cluster Data Holder * * @param applicationId applicationId * @param cartridgeAlias cartridge Alias * @return ClusterDataHolder */ private static ClusterDataHolder findClusterDataHolder(String applicationId, String cartridgeAlias) { Application application = ApplicationManager.getApplications().getApplication(applicationId); if (application == null) { throw new RuntimeException(String.format("Application not found: [application-id] %s", applicationId)); } ClusterDataHolder clusterDataHolder = application.getClusterData(cartridgeAlias); if (clusterDataHolder == null) { throw new RuntimeException(String.format( "Cluster data not found for cartridge alias: [application-id] %s " + "[cartridge-alias] %s", applicationId, cartridgeAlias)); } return clusterDataHolder; } /** * Remove Application Domain Mappings * * @param applicationId applicationId * @param domainName the domain name * @throws RestAPIException */ public static void removeApplicationDomainMapping(String applicationId, String domainName) throws RestAPIException, StratosManagerServiceDomainMappingExceptionException { try { int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); StratosManagerServiceClient serviceClient = StratosManagerServiceClient.getInstance(); if (domainName != null) { serviceClient.removeDomainMapping(applicationId, tenantId, domainName); if (log.isInfoEnabled()) { log.info(String.format( "Domain mapping removed: [application-id] %s [tenant-id] %d " + "[domain-name] %s", applicationId, tenantId, domainName)); } } } catch (RemoteException e) { String message = "Could not remove domain mappings: [application-id] " + applicationId; log.error(message, e); throw new RestAPIException(message, e); } } /** * Get Application Domain Mappings * * @param applicationId applicationId * @return List of DomainMappingBeans * @throws RestAPIException */ public static List<DomainMappingBean> getApplicationDomainMappings(String applicationId) throws RestAPIException, StratosManagerServiceDomainMappingExceptionException { try { int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); List<DomainMappingBean> domainMappingsBeans = new ArrayList<DomainMappingBean>(); StratosManagerServiceClient serviceClient = StratosManagerServiceClient.getInstance(); DomainMapping[] domainMappings = serviceClient.getDomainMappings(applicationId, tenantId); if (domainMappings != null) { for (DomainMapping domainMapping : domainMappings) { if (domainMapping != null) { DomainMappingBean domainMappingBean = ObjectConverter .convertStubDomainMappingToDomainMappingBean(domainMapping); domainMappingsBeans.add(domainMappingBean); } } } return domainMappingsBeans; } catch (RemoteException e) { String message = "Could not get domain mappings: [application-id] " + applicationId; log.error(message, e); throw new RestAPIException(message, e); } } /** * Add a Network Partition * * @param networkPartitionBean NetworkPartitionBean */ public static void addNetworkPartition(NetworkPartitionBean networkPartitionBean) throws RestAPIException, CloudControllerServiceNetworkPartitionAlreadyExistsExceptionException, CloudControllerServiceInvalidNetworkPartitionExceptionException { try { CloudControllerServiceClient serviceClient = CloudControllerServiceClient.getInstance(); serviceClient.addNetworkPartition( ObjectConverter.convertNetworkPartitionToCCStubNetworkPartition(networkPartitionBean)); } catch (RemoteException e) { String message = e.getMessage(); log.error(message); throw new RestAPIException(message, e); } } /** * Get Network Partitions * * @return Array of NetworkPartitionBeans */ public static NetworkPartitionBean[] getNetworkPartitions() throws RestAPIException { try { CloudControllerServiceClient serviceClient = CloudControllerServiceClient.getInstance(); org.apache.stratos.cloud.controller.stub.domain.NetworkPartition[] networkPartitions = serviceClient .getNetworkPartitions(); return ObjectConverter.convertCCStubNetworkPartitionsToNetworkPartitions(networkPartitions); } catch (RemoteException e) { String message = e.getMessage(); log.error(message); throw new RestAPIException(message, e); } } /** * Remove Network Partition * * @param networkPartitionId networkPartitionId */ public static void removeNetworkPartition(String networkPartitionId) throws RestAPIException, CloudControllerServiceNetworkPartitionNotExistsExceptionException { try { AutoscalerServiceClient autoscalerServiceClient = AutoscalerServiceClient.getInstance(); ApplicationContext[] applicationContexts = autoscalerServiceClient.getApplications(); if (applicationContexts != null) { for (ApplicationContext applicationContext : applicationContexts) { if (applicationContext != null) { String[] networkPartitions = AutoscalerServiceClient.getInstance() .getApplicationNetworkPartitions(applicationContext.getApplicationId()); if (networkPartitions != null) { for (int i = 0; i < networkPartitions.length; i++) { if (networkPartitions[i].equals(networkPartitionId)) { String message = String.format( "Cannot remove the network partition " + "[network-partition-id] %s, since it is used in application " + "[application-id] %s", networkPartitionId, applicationContext.getApplicationId()); log.error(message); throw new RestAPIException(message); } } } } } } DeploymentPolicy[] deploymentPolicies = autoscalerServiceClient.getDeploymentPolicies(); if (deploymentPolicies != null) { for (DeploymentPolicy deploymentPolicy : deploymentPolicies) { for (org.apache.stratos.autoscaler.stub.partition.NetworkPartitionRef networkPartitionRef : deploymentPolicy .getNetworkPartitionRefs()) { if (networkPartitionRef.getId().equals(networkPartitionId)) { String message = String.format( "Cannot remove the network partition %s, since" + " it is used in deployment policy %s", networkPartitionId, deploymentPolicy.getDeploymentPolicyID()); log.error(message); throw new RestAPIException(message); } } } } ApplicationPolicy[] applicationPolicies = autoscalerServiceClient.getApplicationPolicies(); if (applicationPolicies != null) { for (ApplicationPolicy applicationPolicy : applicationPolicies) { for (String networkPartition : applicationPolicy.getNetworkPartitions()) { if (networkPartition.equals(networkPartitionId)) { String message = String.format( "Cannot remove the network partition %s, since" + " it is used in application policy %s", networkPartitionId, applicationPolicy.getId()); log.error(message); throw new RestAPIException(message); } } } } CloudControllerServiceClient serviceClient = CloudControllerServiceClient.getInstance(); serviceClient.removeNetworkPartition(networkPartitionId); } catch (AutoscalerServiceAutoScalerExceptionException e) { String message = e.getMessage(); log.error(message); throw new RestAPIException(message, e); } catch (RemoteException e) { String message = e.getMessage(); log.error(message); throw new RestAPIException(message, e); } } /** * Get Network Partition * * @param networkPartitionId networkPartitionId * @return NetworkPartitionBean */ public static NetworkPartitionBean getNetworkPartition(String networkPartitionId) throws RestAPIException { try { CloudControllerServiceClient serviceClient = CloudControllerServiceClient.getInstance(); org.apache.stratos.cloud.controller.stub.domain.NetworkPartition networkPartition = serviceClient .getNetworkPartition(networkPartitionId); return ObjectConverter.convertCCStubNetworkPartitionToNetworkPartition(networkPartition); } catch (RemoteException e) { String message = e.getMessage(); log.error(message); throw new RestAPIException(message, e); } } /** * Update Network Partition * * @param networkPartition NetworkPartitionBean */ public static void updateNetworkPartition(NetworkPartitionBean networkPartition) throws RestAPIException, CloudControllerServiceNetworkPartitionNotExistsExceptionException { try { CloudControllerServiceClient serviceClient = CloudControllerServiceClient.getInstance(); serviceClient.updateNetworkPartition( ObjectConverter.convertNetworkPartitionToCCStubNetworkPartition(networkPartition)); } catch (RemoteException e) { String message = e.getMessage(); log.error(message); throw new RestAPIException(message, e); } } /** * Add deployment policy * * @param deployementPolicyDefinitionBean DeploymentPolicyBean */ public static void addDeploymentPolicy(DeploymentPolicyBean deployementPolicyDefinitionBean) throws RestAPIException, AutoscalerServiceDeploymentPolicyAlreadyExistsExceptionException, AutoscalerServiceInvalidDeploymentPolicyExceptionException { try { if (log.isDebugEnabled()) { log.debug(String.format("Adding deployment policy: [deployment-policy-id] %s ", deployementPolicyDefinitionBean.getId())); } org.apache.stratos.autoscaler.stub.deployment.policy.DeploymentPolicy deploymentPolicy = ObjectConverter .convertDeploymentPolicyBeanToASDeploymentPolicy(deployementPolicyDefinitionBean); AutoscalerServiceClient.getInstance().addDeploymentPolicy(deploymentPolicy); if (log.isDebugEnabled()) { log.debug(String.format("Successfully added deploymentPolicy: [deployment-policy-id] %s ", deployementPolicyDefinitionBean.getId())); } } catch (RemoteException e) { String msg = e.getMessage(); log.error(msg, e); throw new RestAPIException(msg, e); } catch (AutoscalerServiceRemoteExceptionException e) { String msg = e.getMessage(); log.error(msg, e); throw new RestAPIException(msg, e); } } /** * Get deployment policy by deployment policy id * * @param deploymentPolicyID deployment policy id * @return {@link DeploymentPolicyBean} */ public static DeploymentPolicyBean getDeployementPolicy(String deploymentPolicyID) throws RestAPIException { DeploymentPolicyBean deploymentPolicyBean; try { org.apache.stratos.autoscaler.stub.deployment.policy.DeploymentPolicy deploymentPolicy = AutoscalerServiceClient .getInstance().getDeploymentPolicy(deploymentPolicyID); if (deploymentPolicy == null) { return null; } deploymentPolicyBean = ObjectConverter .convertCCStubDeploymentPolicyToDeploymentPolicy(deploymentPolicy); } catch (RemoteException e) { String msg = "Could not find deployment policy: [deployment-policy-id] " + deploymentPolicyID; log.error(msg, e); throw new RestAPIException(msg); } return deploymentPolicyBean; } /** * Get deployment policies * * @return array of {@link DeploymentPolicyBean} */ public static DeploymentPolicyBean[] getDeployementPolicies() throws RestAPIException { try { org.apache.stratos.autoscaler.stub.deployment.policy.DeploymentPolicy[] deploymentPolicies = AutoscalerServiceClient .getInstance().getDeploymentPolicies(); return ObjectConverter.convertASStubDeploymentPoliciesToDeploymentPolicies(deploymentPolicies); } catch (RemoteException e) { String message = "Could not get deployment policies"; log.error(message); throw new RestAPIException(message, e); } } /** * Update deployement policy * * @param deploymentPolicyDefinitionBean DeploymentPolicyBean * @throws RestAPIException */ public static void updateDeploymentPolicy(DeploymentPolicyBean deploymentPolicyDefinitionBean) throws RestAPIException, AutoscalerServiceInvalidPolicyExceptionException, AutoscalerServiceInvalidDeploymentPolicyExceptionException, AutoscalerServiceDeploymentPolicyNotExistsExceptionException { try { if (log.isDebugEnabled()) { log.debug(String.format("Updating deployment policy: [deployment-policy-id] %s ", deploymentPolicyDefinitionBean.getId())); } org.apache.stratos.autoscaler.stub.deployment.policy.DeploymentPolicy deploymentPolicy = ObjectConverter .convertDeploymentPolicyBeanToASDeploymentPolicy(deploymentPolicyDefinitionBean); AutoscalerServiceClient.getInstance().updateDeploymentPolicy(deploymentPolicy); if (log.isDebugEnabled()) { log.debug(String.format("DeploymentPolicy updated successfully : [deployment-policy-id] %s ", deploymentPolicyDefinitionBean.getId())); } } catch (RemoteException e) { String msg = "Could not update deployment policy " + e.getLocalizedMessage(); log.error(msg, e); throw new RestAPIException(msg); } catch (AutoscalerServiceCloudControllerConnectionExceptionException e) { String msg = "Could not update deployment policy " + e.getLocalizedMessage(); log.error(msg, e); throw new RestAPIException(msg); } catch (AutoscalerServiceRemoteExceptionException e) { String msg = "Could not update deployment policy " + e.getLocalizedMessage(); log.error(msg, e); throw new RestAPIException(msg); } } /** * Remove deployment policy * * @param deploymentPolicyID Deployment policy ID * @throws RestAPIException */ public static void removeDeploymentPolicy(String deploymentPolicyID) throws RestAPIException, AutoscalerServiceDeploymentPolicyNotExistsExceptionException, AutoscalerServiceUnremovablePolicyExceptionException { try { AutoscalerServiceClient.getInstance().removeDeploymentPolicy(deploymentPolicyID); } catch (RemoteException e) { String msg = "Could not remove deployment policy " + e.getLocalizedMessage(); log.error(msg, e); throw new RestAPIException(msg); } } public static ClusterBean getClusterInfo(String clusterId) throws RestAPIException { if (StringUtils.isEmpty(clusterId)) { throw new ClusterIdIsEmptyException("Cluster Id can not be empty"); } Cluster cluster = TopologyManager.getTopology().getCluster(clusterId); if (cluster == null) { return null; } return ObjectConverter.convertClusterToClusterBean(cluster, clusterId); } //util methods for Tenants /** * Add Tenant * * @param tenantInfoBean TenantInfoBean * @throws RestAPIException */ public static void addTenant(org.apache.stratos.common.beans.TenantInfoBean tenantInfoBean) throws RestAPIException, InvalidEmailException { try { CommonUtil.validateEmail(tenantInfoBean.getEmail()); } catch (Exception e) { // validate Email methods throws exception therefore we catch and throw InvalidEmailException throw new InvalidEmailException(e.getMessage()); } String tenantDomain = tenantInfoBean.getTenantDomain(); try { TenantMgtUtil.validateDomain(tenantDomain); } catch (Exception e) { String msg = "Tenant domain validation error for tenant " + tenantDomain; log.error(msg, e); throw new InvalidDomainException(msg); } UserRegistry userRegistry = (UserRegistry) PrivilegedCarbonContext.getThreadLocalCarbonContext() .getRegistry(RegistryType.USER_GOVERNANCE); if (userRegistry == null) { String msg = "Security alert! User registry is null. A user is trying create a tenant " + " without an authenticated session."; log.error(msg); throw new RestAPIException("Could not add tenant: Session is not authenticated"); } if (userRegistry.getTenantId() != MultitenantConstants.SUPER_TENANT_ID) { String msg = "Security alert! None super tenant trying to create a tenant."; log.error(msg); throw new RestAPIException(msg); } Tenant tenant = TenantMgtUtil .initializeTenant(ObjectConverter.convertTenantInfoBeanToCarbonTenantInfoBean(tenantInfoBean)); TenantPersistor persistor = ServiceHolder.getTenantPersistor(); // not validating the domain ownership, since created by super tenant int tenantId; //TODO verify whether this is the correct approach (isSkeleton) try { tenantId = persistor.persistTenant(tenant, false, tenantInfoBean.getSuccessKey(), tenantInfoBean.getOriginatedService(), false); } catch (Exception e) { String msg = "Could not add tenant: " + e.getMessage(); log.error(msg, e); throw new RestAPIException(msg); } tenantInfoBean.setTenantId(tenantId); try { TenantMgtUtil.addClaimsToUserStoreManager(tenant); } catch (Exception e) { String msg = "Error in granting permissions for tenant " + tenantDomain + e.getLocalizedMessage(); log.error(msg, e); throw new RestAPIException(msg); } //Notify tenant addition try { TenantMgtUtil .triggerAddTenant(ObjectConverter.convertTenantInfoBeanToCarbonTenantInfoBean(tenantInfoBean)); } catch (StratosException e) { String msg = "Error in notifying tenant addition."; log.error(msg, e); throw new RestAPIException(msg); } // For the super tenant tenant creation, tenants are always activated as they are created. try { TenantMgtUtil.activateTenantInitially( ObjectConverter.convertTenantInfoBeanToCarbonTenantInfoBean(tenantInfoBean), tenantId); } catch (Exception e) { String msg = "Error in initial activation of tenant " + tenantDomain; log.error(msg, e); throw new RestAPIException(msg); } try { TenantMgtUtil.prepareStringToShowThemeMgtPage(tenant.getId()); } catch (RegistryException e) { String msg = "Error in preparing theme mgt page for tenant " + tenantDomain; log.error(msg, e); throw new RestAPIException(msg); } } /** * @param tenantInfoBean TenantInfoBean * @throws RestAPIException * @throws InvalidEmailException * @throws RegistryException */ public static void updateExistingTenant(org.apache.stratos.common.beans.TenantInfoBean tenantInfoBean) throws RestAPIException, RegistryException, InvalidEmailException { TenantManager tenantManager = ServiceHolder.getTenantManager(); UserStoreManager userStoreManager; // filling the non-set admin and admin password first UserRegistry configSystemRegistry = ServiceHolder.getRegistryService() .getConfigSystemRegistry(tenantInfoBean.getTenantId()); String tenantDomain = tenantInfoBean.getTenantDomain(); int tenantId; try { tenantId = tenantManager.getTenantId(tenantDomain); if (tenantId == -1) { String errorMsg = "The tenant with domain name: " + tenantDomain + " does not exist."; throw new InvalidDomainException(errorMsg); } } catch (UserStoreException e) { String msg = "Error in retrieving the tenant id for the tenant domain: " + tenantDomain + "."; log.error(msg, e); throw new RestAPIException(msg, e); } Tenant tenant; try { tenant = (Tenant) tenantManager.getTenant(tenantId); if (tenant == null) { String errorMsg = "The tenant with tenant id: " + tenantId + " does not exist."; throw new TenantNotFoundException(errorMsg); } } catch (UserStoreException e) { String msg = "Error in retrieving the tenant from tenant id: " + tenantId + "."; log.error(msg, e); throw new RestAPIException(msg, e); } // filling the first and last name values if (StringUtils.isBlank(tenantInfoBean.getFirstName())) { String msg = "Invalid first name is provided."; log.error(msg); throw new RestAPIException(msg); } if (StringUtils.isBlank(tenantInfoBean.getLastName())) { String msg = "Invalid last name is provided."; log.error(msg); throw new RestAPIException(msg); } tenant.setAdminFirstName(tenantInfoBean.getFirstName()); tenant.setAdminLastName(tenantInfoBean.getLastName()); try { TenantMgtUtil.addClaimsToUserStoreManager(tenant); } catch (Exception e) { String msg = "Error in adding claims to the user."; log.error(msg, e); throw new RestAPIException(msg, e); } // filling the email value if (StringUtils.isNotBlank(tenantInfoBean.getEmail())) { // validate the email try { CommonUtil.validateEmail(tenantInfoBean.getEmail()); } catch (Exception e) { String msg = "Invalid email is provided."; log.error(msg, e); throw new InvalidEmailException(msg); } tenant.setEmail(tenantInfoBean.getEmail()); } UserRealm userRealm = configSystemRegistry.getUserRealm(); try { userStoreManager = userRealm.getUserStoreManager(); } catch (UserStoreException e) { String msg = "Error in getting the user store manager for tenant, tenant domain: " + tenantDomain + "." + e.getLocalizedMessage(); log.error(msg, e); throw new RestAPIException(msg, e); } boolean updatePassword = false; if (StringUtils.isBlank(tenantInfoBean.getAdminPassword())) { updatePassword = true; } try { if (!userStoreManager.isReadOnly() && updatePassword) { // now we will update the tenant admin with the admin given // password. try { userStoreManager.updateCredentialByAdmin(tenantInfoBean.getAdmin(), tenantInfoBean.getAdminPassword()); } catch (UserStoreException e) { String msg = "Error in changing the tenant admin password, tenant domain: " + tenantInfoBean.getTenantDomain() + ". " + e.getMessage() + " for: " + tenantInfoBean.getAdmin(); log.error(msg, e); throw new RestAPIException(msg, e); } } else { //Password should be empty since no password update done tenantInfoBean.setAdminPassword(null); } } catch (UserStoreException e) { String msg = "Error in getting the user store manager is read only " + e.getLocalizedMessage(); log.error(msg, e); throw new RestAPIException(msg, e); } try { tenantManager.updateTenant(tenant); } catch (UserStoreException e) { String msg = "Error in updating the tenant for tenant domain: " + tenantDomain + "."; log.error(msg, e); throw new RestAPIException(msg, e); } //Notify tenant update to all listeners try { TenantMgtUtil.triggerUpdateTenant( ObjectConverter.convertTenantInfoBeanToCarbonTenantInfoBean(tenantInfoBean)); } catch (StratosException e) { String msg = "Error in notifying tenant update."; log.error(msg, e); throw new RestAPIException(msg, e); } } /** * Get a Tenant by Domain * * @param tenantDomain TenantInfoBean * @return TenantInfoBean * @throws Exception */ public static org.apache.stratos.common.beans.TenantInfoBean getTenantByDomain(String tenantDomain) throws RestAPIException { TenantManager tenantManager = ServiceHolder.getTenantManager(); int tenantId; try { tenantId = tenantManager.getTenantId(tenantDomain); } catch (UserStoreException e) { String msg = "Error in retrieving the tenant id for the tenant domain: " + tenantDomain + "."; log.error(msg, e); throw new RestAPIException(msg, e); } Tenant tenant; try { tenant = (Tenant) tenantManager.getTenant(tenantId); } catch (UserStoreException e) { String msg = "Error in retrieving the tenant from the tenant manager."; log.error(msg, e); throw new RestAPIException(msg, e); } TenantInfoBean bean; try { bean = ObjectConverter.convertCarbonTenantInfoBeanToTenantInfoBean( TenantMgtUtil.initializeTenantInfoBean(tenantId, tenant)); } catch (Exception e) { log.error(String.format("Couldn't find tenant for provided tenant domain. [Tenant Domain] %s", tenantDomain), e); return null; } try { // retrieve first and last names from the UserStoreManager bean.setFirstName( ClaimsMgtUtil.getFirstNamefromUserStoreManager(ServiceHolder.getRealmService(), tenantId)); bean.setLastName( ClaimsMgtUtil.getLastNamefromUserStoreManager(ServiceHolder.getRealmService(), tenantId)); } catch (UserStoreException e) { String msg = "Error in retrieving the tenant from the tenant manager."; log.error(msg, e); throw new RestAPIException(msg, e); } return bean; } /** * Get a list of available Tenants * * @return list of available Tenants * @throws RestAPIException */ public static List<org.apache.stratos.common.beans.TenantInfoBean> getAllTenants() throws RestAPIException { TenantManager tenantManager = ServiceHolder.getTenantManager(); Tenant[] tenants; try { tenants = (Tenant[]) tenantManager.getAllTenants(); } catch (Exception e) { String msg = "Error in retrieving the tenant information"; log.error(msg, e); throw new RestAPIException(msg); } List<org.apache.stratos.common.beans.TenantInfoBean> tenantList = new ArrayList<org.apache.stratos.common.beans.TenantInfoBean>(); for (Tenant tenant : tenants) { org.apache.stratos.common.beans.TenantInfoBean tenantInfoBean = ObjectConverter .convertCarbonTenantInfoBeanToTenantInfoBean( TenantMgtUtil.getTenantInfoBeanfromTenant(tenant.getId(), tenant)); tenantList.add(tenantInfoBean); } return tenantList; } /** * Get List of Partial Tenant Domains * * @param domain domain Name * @return List of Partial Tenant Domains * @throws RestAPIException */ public static List<org.apache.stratos.common.beans.TenantInfoBean> searchPartialTenantsDomains(String domain) throws RestAPIException { TenantManager tenantManager = ServiceHolder.getTenantManager(); Tenant[] tenants; try { domain = domain.trim(); tenants = (Tenant[]) tenantManager.getAllTenantsForTenantDomainStr(domain); } catch (Exception e) { String msg = "Error in retrieving the tenant information."; log.error(msg, e); throw new RestAPIException(msg); } List<org.apache.stratos.common.beans.TenantInfoBean> tenantList = new ArrayList<org.apache.stratos.common.beans.TenantInfoBean>(); for (Tenant tenant : tenants) { org.apache.stratos.common.beans.TenantInfoBean bean = ObjectConverter .convertCarbonTenantInfoBeanToTenantInfoBean( TenantMgtUtil.getTenantInfoBeanfromTenant(tenant.getId(), tenant)); tenantList.add(bean); } return tenantList; } /** * Activate a Tenant * * @param tenantDomain tenantDomainName * @throws RestAPIException */ public static void activateTenant(String tenantDomain) throws RestAPIException { TenantManager tenantManager = ServiceHolder.getTenantManager(); int tenantId; try { tenantId = tenantManager.getTenantId(tenantDomain); if (tenantId != -1) { try { TenantMgtUtil.activateTenant(tenantDomain, tenantManager, tenantId); } catch (Exception e) { String msg = "Error in activating Tenant :" + tenantDomain; log.error(msg, e); throw new RestAPIException(msg, e); } //Notify tenant activation all listeners try { TenantMgtUtil.triggerTenantActivation(tenantId); } catch (StratosException e) { String msg = "Error in notifying tenant activate."; log.error(msg, e); throw new RestAPIException(msg, e); } } else { String msg = "The tenant with domain name: " + tenantDomain + " does not exist."; throw new InvalidDomainException(msg); } } catch (UserStoreException e) { String msg = "Error in retrieving the tenant id for the tenant domain: " + tenantDomain + "."; log.error(msg, e); throw new RestAPIException(msg, e); } } /** * Deactivate Tenant * * @param tenantDomain tenantDomain * @throws RestAPIException */ public static void deactivateTenant(String tenantDomain) throws RestAPIException { TenantManager tenantManager = ServiceHolder.getTenantManager(); int tenantId; try { tenantId = tenantManager.getTenantId(tenantDomain); if (tenantId != -1) { try { TenantMgtUtil.deactivateTenant(tenantDomain, tenantManager, tenantId); } catch (Exception e) { String msg = "Error in deactivating Tenant :" + tenantDomain; log.error(msg, e); throw new RestAPIException(msg, e); } //Notify tenant deactivation all listeners try { TenantMgtUtil.triggerTenantDeactivation(tenantId); } catch (StratosException e) { String msg = "Error in notifying tenant deactivate."; log.error(msg, e); throw new RestAPIException(msg, e); } } else { String msg = "The tenant with domain name: " + tenantDomain + " does not exist."; throw new InvalidDomainException(msg); } } catch (UserStoreException e) { String msg = "Error in retrieving the tenant id for the tenant domain: " + tenantDomain + "."; log.error(msg, e); throw new RestAPIException(msg, e); } } //Util methods for Users /** * Adds an User * * @param userInfoBean User Info * @throws RestAPIException */ public static void addUser(UserInfoBean userInfoBean) throws RestAPIException { try { StratosUserManagerUtils.addUser(getTenantUserStoreManager(), userInfoBean); } catch (UserManagerException e) { String msg = "Error in adding User"; log.error(msg, e); throw new RestAPIException(e.getMessage()); } } /** * Get Tenant UserStoreManager * * @return UserStoreManager * @throws UserManagerException */ private static UserStoreManager getTenantUserStoreManager() throws UserManagerException { CarbonContext carbonContext = CarbonContext.getThreadLocalCarbonContext(); UserRealm userRealm; UserStoreManager userStoreManager; try { userRealm = carbonContext.getUserRealm(); userStoreManager = userRealm.getUserStoreManager(); } catch (UserStoreException e) { String msg = "Error in retrieving UserStore Manager"; log.error(msg, e); throw new UserManagerException(msg, e); } return userStoreManager; } /** * Delete an user * * @param userName userName * @throws RestAPIException */ public static void removeUser(String userName) throws RestAPIException { try { StratosUserManagerUtils.removeUser(getTenantUserStoreManager(), userName); } catch (UserManagerException e) { String msg = "Error in removing user :" + userName; log.error(msg, e); throw new RestAPIException(e.getMessage()); } } /** * Update User * * @param userInfoBean UserInfoBean * @throws RestAPIException */ public static void updateUser(UserInfoBean userInfoBean) throws RestAPIException { try { StratosUserManagerUtils.updateUser(getTenantUserStoreManager(), userInfoBean); } catch (UserManagerException e) { String msg = "Error in updating user"; log.error(msg, e); throw new RestAPIException(msg, e); } } /** * Get List of Users * * @return List of Users * @throws RestAPIException */ public static List<UserInfoBean> getUsers() throws RestAPIException { List<UserInfoBean> userList; try { userList = StratosUserManagerUtils.getAllUsers(getTenantUserStoreManager()); } catch (UserManagerException e) { String msg = "Error in retrieving users"; log.error(msg, e); throw new RestAPIException(msg, e); } return userList; } /** * This method is to validate the cartridge duplication in the group definition recursively for group within groups * * @param groupBean - cartridge group definition * @throws InvalidCartridgeGroupDefinitionException - throws when the group definition is invalid */ private static void validateCartridgeDuplicationInGroupDefinition(CartridgeGroupBean groupBean) throws InvalidCartridgeGroupDefinitionException { if (groupBean == null) { return; } List<String> cartridges = new ArrayList<String>(); if (groupBean.getCartridges() != null) { if (groupBean.getCartridges().size() > 1) { cartridges.addAll(groupBean.getCartridges()); validateCartridgeDuplicationInGroup(cartridges); } } if (groupBean.getGroups() != null) { //Recursive because to check groups inside groups for (CartridgeGroupBean group : groupBean.getGroups()) { validateCartridgeDuplicationInGroupDefinition(group); } } } /** * This method is to validate the duplication of cartridges from the given list * * @param cartridges - list of strings which holds the cartridgeTypes values * @throws InvalidCartridgeGroupDefinitionException - throws when the cartridges are duplicated */ private static void validateCartridgeDuplicationInGroup(List<String> cartridges) throws InvalidCartridgeGroupDefinitionException { List<String> checkList = new ArrayList<String>(); for (String cartridge : cartridges) { if (!checkList.contains(cartridge)) { checkList.add(cartridge); } else { if (log.isDebugEnabled()) { log.debug("Duplicate cartridges defined: " + cartridge); } throw new InvalidCartridgeGroupDefinitionException( "Invalid cartridge group definition, " + "duplicate cartridges defined: " + cartridge); } } } /** * This is a wrapper method to invoke validateGroupDuplicationInGroupDefinition with a new arraylist of string * * @param groupBean - cartridge group definition * @throws InvalidCartridgeGroupDefinitionException */ private static void validateGroupDuplicationInGroupDefinition(CartridgeGroupBean groupBean) throws InvalidCartridgeGroupDefinitionException { validateGroupDuplicationInGroupDefinition(groupBean, new ArrayList<String>()); } /** * This is to validate the group duplication in the group definition recursively for group within groups * * @param groupBean - cartridge group definition * @param parentGroups - list of string which holds the parent group names (all parents in the hierarchy) * @throws InvalidCartridgeGroupDefinitionException - throws when the group definition is invalid */ private static void validateGroupDuplicationInGroupDefinition(CartridgeGroupBean groupBean, List<String> parentGroups) throws InvalidCartridgeGroupDefinitionException { if (groupBean == null) { return; } List<String> groups = new ArrayList<String>(); parentGroups.add(groupBean.getName()); if (groupBean.getGroups() != null) { if (!groupBean.getGroups().isEmpty()) { for (CartridgeGroupBean g : groupBean.getGroups()) { groups.add(g.getName()); } validateGroupDuplicationInGroup(groups, parentGroups); } } if (groupBean.getGroups() != null) { //Recursive because to check groups inside groups for (CartridgeGroupBean group : groupBean.getGroups()) { validateGroupDuplicationInGroupDefinition(group, parentGroups); parentGroups.remove(group.getName()); } } } /** * This method is to validate the duplication of groups in the same level and to validate cyclic behaviour of groups * * @param groups - cartridge group definition * @param parentGroups - list of string which holds the parent group names (all parents in the hierarchy) * @throws InvalidCartridgeGroupDefinitionException - throws when group duplicate or when cyclic behaviour occurs */ private static void validateGroupDuplicationInGroup(List<String> groups, List<String> parentGroups) throws InvalidCartridgeGroupDefinitionException { List<String> checkList = new ArrayList<String>(); for (String group : groups) { if (!checkList.contains(group)) { checkList.add(group); } else { if (log.isDebugEnabled()) { log.debug("Duplicate group defined: " + group); } throw new InvalidCartridgeGroupDefinitionException( "Invalid cartridge group definition, " + "duplicate groups defined: " + group); } if (parentGroups.contains(group)) { if (log.isDebugEnabled()) { log.debug("Cyclic group behaviour identified [group-name]: " + group); } throw new InvalidCartridgeGroupDefinitionException( "Invalid cartridge group definition, " + "cyclic group behaviour identified: " + group); } } } /** * Get Iaas Providers * * @return Array of Strings */ public static IaasProviderInfoBean getIaasProviders() throws RestAPIException { try { CloudControllerServiceClient serviceClient = CloudControllerServiceClient.getInstance(); String[] iaasProviders = serviceClient.getIaasProviders(); return ObjectConverter.convertStringArrayToIaasProviderInfoBean(iaasProviders); } catch (RemoteException e) { String message = e.getMessage(); log.error(message); throw new RestAPIException(message, e); } } }