| /** |
| * 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); |
| } |
| } |
| } |