Updated Branches: refs/heads/master aa550b6be -> 91970c3ac
subscription model changes Project: http://git-wip-us.apache.org/repos/asf/incubator-stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-stratos/commit/74d89849 Tree: http://git-wip-us.apache.org/repos/asf/incubator-stratos/tree/74d89849 Diff: http://git-wip-us.apache.org/repos/asf/incubator-stratos/diff/74d89849 Branch: refs/heads/master Commit: 74d89849b13b3270d9a27a22ff7cf54a8a526474 Parents: 6984375 Author: Isuru <[email protected]> Authored: Fri Dec 6 15:00:12 2013 +0530 Committer: Isuru <[email protected]> Committed: Fri Dec 6 15:00:12 2013 +0530 ---------------------------------------------------------------------- .../AbstractCartridgeSubscription.java | 441 +++++++++++++++++++ .../ApplicationCartridgeSubscription.java | 51 +++ .../DataCartridgeSubscription1.java | 50 +++ .../FrameworkCartridgeSubscription.java | 78 ++++ .../SingleTenantCartridgeSubscription.java | 2 +- .../SubscriptionMultiTenantBehaviour.java | 117 +++++ .../SubscriptionSingleTenantBehaviour.java | 118 +++++ .../tenancy/SubscriptionTenancyBehaviour.java | 44 ++ 8 files changed, 900 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/74d89849/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/AbstractCartridgeSubscription.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/AbstractCartridgeSubscription.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/AbstractCartridgeSubscription.java new file mode 100644 index 0000000..3b7a2c7 --- /dev/null +++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/AbstractCartridgeSubscription.java @@ -0,0 +1,441 @@ +/* + * 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.adc.mgt.subscription; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.stratos.adc.mgt.custom.domain.RegistryManager; +import org.apache.stratos.adc.mgt.dao.CartridgeSubscriptionInfo; +import org.apache.stratos.adc.mgt.dao.Cluster; +import org.apache.stratos.adc.mgt.dns.DNSManager; +import org.apache.stratos.adc.mgt.dto.Policy; +import org.apache.stratos.adc.mgt.exception.*; +import org.apache.stratos.adc.mgt.internal.DataHolder; +import org.apache.stratos.adc.mgt.payload.Payload; +import org.apache.stratos.adc.mgt.payload.PayloadArg; +import org.apache.stratos.adc.mgt.repository.Repository; +import org.apache.stratos.adc.mgt.service.RepositoryInfoBean; +import org.apache.stratos.adc.mgt.subscriber.Subscriber; +import org.apache.stratos.adc.mgt.subscription.tenancy.SubscriptionMultiTenantBehaviour; +import org.apache.stratos.adc.mgt.subscription.tenancy.SubscriptionSingleTenantBehaviour; +import org.apache.stratos.adc.mgt.subscription.tenancy.SubscriptionTenancyBehaviour; +import org.apache.stratos.adc.mgt.utils.*; +import org.apache.stratos.adc.topology.mgt.service.TopologyManagementService; +import org.apache.stratos.cloud.controller.pojo.CartridgeInfo; + +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +public abstract class AbstractCartridgeSubscription { + + private static Log log = LogFactory.getLog(AbstractCartridgeSubscription.class); + private int subscriptionId; + private String type; + private String alias; + private Policy autoscalingPolicy; + private Subscriber subscriber; + private Repository repository; + private CartridgeInfo cartridgeInfo; + private Payload payload; + private Cluster cluster; + private String subscriptionStatus; + private String mappedDomain; + private List<String> connectedSubscriptionAliases; + private String subscriptionKey; + protected SubscriptionTenancyBehaviour subscriptionTenancyBehaviour; + + /** + * Constructor + * + * @param cartridgeInfo CartridgeInfo subscription + */ + public AbstractCartridgeSubscription(CartridgeInfo cartridgeInfo) { + + this.setCartridgeInfo(cartridgeInfo); + this.setType(cartridgeInfo.getType()); + this.setCluster(new Cluster()); + getCluster().setClusterDomain(""); + getCluster().setClusterSubDomain(CartridgeConstants.DEFAULT_SUBDOMAIN); + getCluster().setMgtClusterDomain(""); + getCluster().setMgtClusterSubDomain(CartridgeConstants.DEFAULT_MGT_SUBDOMAIN); + getCluster().setHostName(cartridgeInfo.getHostName()); + this.setSubscriptionStatus(CartridgeConstants.SUBSCRIBED); + this.connectedSubscriptionAliases = new ArrayList<String>(); + if(getCartridgeInfo().getMultiTenant()) { + subscriptionTenancyBehaviour = new SubscriptionMultiTenantBehaviour(this); + } + else { + subscriptionTenancyBehaviour = new SubscriptionSingleTenantBehaviour(this); + } + } + + /** + * Subscribes to this cartridge subscription + * + * @param subscriber Subscriber subscription + * @param alias Alias of the cartridge subscription + * @param autoscalingPolicy Auto scaling policy + * @param repository Relevenat Repository subscription + * + * @throws org.apache.stratos.adc.mgt.exception.ADCException + * @throws org.apache.stratos.adc.mgt.exception.PolicyException + * @throws org.apache.stratos.adc.mgt.exception.UnregisteredCartridgeException + * @throws org.apache.stratos.adc.mgt.exception.InvalidCartridgeAliasException + * @throws org.apache.stratos.adc.mgt.exception.DuplicateCartridgeAliasException + * @throws org.apache.stratos.adc.mgt.exception.RepositoryRequiredException + * @throws org.apache.stratos.adc.mgt.exception.AlreadySubscribedException + * @throws org.apache.stratos.adc.mgt.exception.RepositoryCredentialsRequiredException + * @throws org.apache.stratos.adc.mgt.exception.InvalidRepositoryException + * @throws org.apache.stratos.adc.mgt.exception.RepositoryTransportException + */ + public void createSubscription (Subscriber subscriber, String alias, Policy autoscalingPolicy, + Repository repository) + throws ADCException, PolicyException, UnregisteredCartridgeException, InvalidCartridgeAliasException, + DuplicateCartridgeAliasException, RepositoryRequiredException, AlreadySubscribedException, + RepositoryCredentialsRequiredException, InvalidRepositoryException, RepositoryTransportException { + + setSubscriber(subscriber); + setAlias(alias); + setAutoscalingPolicy(autoscalingPolicy); + setRepository(repository); + } + + /** + * Unsubscribe from this cartridge subscription + * + * @throws ADCException + * @throws NotSubscribedException + */ + public abstract void removeSubscription() throws ADCException, NotSubscribedException; + + /** + * Registers the subscription + * + * @param properties Any additional properties needed + * + * @return CartridgeSubscriptionInfo subscription populated with relevant data + * @throws ADCException + * @throws UnregisteredCartridgeException + */ + public abstract CartridgeSubscriptionInfo registerSubscription(Properties properties) + throws ADCException, UnregisteredCartridgeException; + + /** + * Connect cartridges + * + * @param connectingCartridgeAlias Alias of connecting cartridge + */ + public void connect (String connectingCartridgeAlias) { + connectedSubscriptionAliases.add(connectingCartridgeAlias); + } + + /** + * Disconnect from the cartridge subscription given by disconnectingCartridgeAlias + * + * @param disconnectingCartridgeAlias Alias of the cartridge subscription to disconnect + */ + public void disconnect (String disconnectingCartridgeAlias) { + connectedSubscriptionAliases.remove(disconnectingCartridgeAlias); + } + + /** + * Creates the relevant payload parameters for this cartridge subscription + * + * @return PayloadArg subscription + * @throws ADCException in an errpr + */ + public PayloadArg createPayloadParameters() throws ADCException { + + PayloadArg payloadArg = new PayloadArg(); + payloadArg.setCartridgeInfo(getCartridgeInfo()); + payloadArg.setPolicy(getAutoscalingPolicy()); + payloadArg.setMultitenant(getCartridgeInfo().getMultiTenant()); + payloadArg.setTenantId(getSubscriber().getTenantId()); + payloadArg.setTenantDomain(getSubscriber().getTenantDomain()); + payloadArg.setCartridgeAlias(getAlias()); + payloadArg.setServiceName(getCartridgeInfo().getType()); + payloadArg.setSubscriptionKey(subscriptionKey); + return payloadArg; + } + + /** + * Manages the repository for the cartridge subscription + * + * @param repoURL Repository URL + * @param repoUserName Repository Username + * @param repoUserPassword Repository password + * @param privateRepo public/private repository + * @param cartridgeAlias Alias of the cartridge subscription + * @param cartridgeInfo CartridgeInfo subscription + * @param tenantDomain Domain of the tenant + * + * @return Repository populated with relevant information or null of not repository is relevant to this cartridge + * subscription + * @throws ADCException + * @throws RepositoryRequiredException + * @throws RepositoryCredentialsRequiredException + * @throws RepositoryTransportException + * @throws InvalidRepositoryException + */ + public Repository manageRepository (String repoURL, String repoUserName, String repoUserPassword, + boolean privateRepo, String cartridgeAlias, CartridgeInfo cartridgeInfo, + String tenantDomain) + + throws ADCException, RepositoryRequiredException, RepositoryCredentialsRequiredException, + RepositoryTransportException, InvalidRepositoryException { + + if (!new Boolean(System.getProperty(CartridgeConstants.FEATURE_INTERNAL_REPO_ENABLED))) { + if (log.isDebugEnabled()) { + log.debug("Internal repo feature is not enabled."); + } + } + + Repository repository = new Repository(); + if (repoURL != null && repoURL.trim().length() > 0) { + log.info("External REPO URL is provided as [" + repoURL + + "]. Therefore not creating a new repo."); + //repository.setRepoName(repoURL.substring(0, repoURL.length()-4)); // remove .git part + repository.setUrl(repoURL); + repository.setUserName(repoUserName); + repository.setPassword(repoUserPassword); + repository.setPrivateRepository(privateRepo); + + } else { + + log.info("External git repo url not provided for tenant " + + tenantDomain + ", creating an git internal repository"); + + // for internal repos internal git server username and password is used. + repository.setUserName(System.getProperty(CartridgeConstants.INTERNAL_GIT_USERNAME)); + repository.setPassword(System.getProperty(CartridgeConstants.INTERNAL_GIT_PASSWORD)); + try { + new RepositoryCreator(new RepositoryInfoBean(repoURL, cartridgeAlias, tenantDomain, + repository.getUserName(), repository.getPassword(), cartridgeInfo.getDeploymentDirs(), + cartridgeInfo)).createInternalRepository(); + + } catch (Exception e) { + throw new ADCException(e.getMessage(), e); + } + String repoName = tenantDomain + "/" + cartridgeAlias; + repository.setUrl("https://" + System.getProperty(CartridgeConstants.GIT_HOST_NAME) + ":8443/git/" + + repoName); + } + + // Validate Remote Repository. + ApplicationManagementUtil.validateRepository(repoURL, repoUserName, repoUserPassword, privateRepo, + new Boolean(System.getProperty(CartridgeConstants.FEATURE_EXTERNAL_REPO_VAIDATION_ENABLED))); + + return repository; + } + + /** + * Cleans up the subscription information after unsubscribing + * + * @throws ADCException + */ + protected void cleanupSubscription () throws ADCException { + + try { + new RepositoryFactory().destroyRepository(alias, subscriber.getTenantDomain(), + subscriber.getAdminUserName()); + log.info("Repo is destroyed successfully.. "); + + } catch (Exception e) { + String errorMsg = "Error in destroying repository for tenant " + subscriber.getTenantDomain() + + "cartridge type " + type; + log.error(errorMsg); + } + + try { + PersistenceManager.updateSubscriptionState(subscriptionId, "UNSUBSCRIBED"); + + } catch (Exception e) { + String errorMsg = "Error in unscubscribing from cartridge, alias " + alias + ", tenant " + + subscriber.getTenantDomain(); + throw new ADCException(errorMsg, e); + } + + //TODO: FIXME: do we need this? + new DNSManager().removeSubDomain(getCluster().getHostName()); + + try { + new RegistryManager().removeDomainMappingFromRegistry(getCluster().getHostName()); + + } catch (Exception e) { + String errorMsg = "Error in removing domain mapping, alias " + alias + ", tenant " + + subscriber.getTenantDomain(); + log.error(errorMsg, e); + } + + TopologyManagementService topologyMgtService = DataHolder.getTopologyMgtService(); + String[] ips = topologyMgtService.getActiveIPs(type, getCluster().getClusterDomain(), getCluster().getClusterSubDomain()); + try { + PersistenceManager.updateInstanceState("INACTIVE", ips, getCluster().getClusterDomain(), getCluster().getClusterSubDomain(), type); + + } catch (Exception e) { + String errorMsg = "Error in updating state to INACTIVE"; + log.error(errorMsg, e); + } + + this.setSubscriptionStatus(CartridgeConstants.UNSUBSCRIBED); + } + + public String getType() { + return type; + } + + public String getAlias() { + return alias; + } + + public Subscriber getSubscriber() { + return subscriber; + } + + public Repository getRepository() { + return repository; + } + + public List<String> getConnectedSubscriptionAliases() { + return connectedSubscriptionAliases; + } + + public CartridgeInfo getCartridgeInfo() { + return cartridgeInfo; + } + + public String getHostName() { + return getCluster().getHostName(); + } + + public void setType(String type) { + this.type = type; + } + + public void setAlias(String alias) { + this.alias = alias; + } + + public String getClusterDomain() { + return getCluster().getClusterDomain(); + } + + public void setClusterDomain(String clusterDomain) { + getCluster().setClusterDomain(clusterDomain); + } + + public String getClusterSubDomain() { + return getCluster().getClusterSubDomain(); + } + + public void setClusterSubDomain(String clusterSubDomain) { + getCluster().setClusterSubDomain(clusterSubDomain); + } + + public String getMgtClusterDomain() { + return getCluster().getMgtClusterDomain(); + } + + public void setMgtClusterDomain(String mgtClusterDomain) { + getCluster().setMgtClusterDomain(mgtClusterDomain); + } + + public String getMgtClusterSubDomain() { + return getCluster().getMgtClusterSubDomain(); + } + + public void setMgtClusterSubDomain(String mgtClusterSubDomain) { + getCluster().setMgtClusterSubDomain(mgtClusterSubDomain); + } + + public void setHostName(String hostName) { + getCluster().setHostName(hostName); + } + + public Policy getAutoscalingPolicy() { + return autoscalingPolicy; + } + + public void setAutoscalingPolicy(Policy autoscalingPolicy) { + this.autoscalingPolicy = autoscalingPolicy; + } + + public void setSubscriber(Subscriber subscriber) { + this.subscriber = subscriber; + } + + public void setRepository(Repository repository) { + this.repository = repository; + } + + public void setCartridgeInfo(CartridgeInfo cartridgeInfo) { + this.cartridgeInfo = cartridgeInfo; + } + + public Payload getPayload() { + return payload; + } + + public void setPayload(Payload payload) { + this.payload = payload; + } + + public int getSubscriptionId() { + return subscriptionId; + } + + public void setSubscriptionId(int subscriptionId) { + this.subscriptionId = subscriptionId; + } + + public String getMappedDomain() { + return mappedDomain; + } + + public void setMappedDomain(String mappedDomain) { + this.mappedDomain = mappedDomain; + } + + public String getSubscriptionStatus() { + return subscriptionStatus; + } + + public void setSubscriptionStatus(String subscriptionStatus) { + this.subscriptionStatus = subscriptionStatus; + } + + public String getSubscriptionKey() { + return subscriptionKey; + } + + public void setSubscriptionKey(String subscriptionKey) { + this.subscriptionKey = subscriptionKey; + } + + public Cluster getCluster() { + return cluster; + } + + public void setCluster(Cluster cluster) { + this.cluster = cluster; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/74d89849/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/ApplicationCartridgeSubscription.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/ApplicationCartridgeSubscription.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/ApplicationCartridgeSubscription.java new file mode 100644 index 0000000..aa49ac7 --- /dev/null +++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/ApplicationCartridgeSubscription.java @@ -0,0 +1,51 @@ +/* + * 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.adc.mgt.subscription; + +import org.apache.stratos.adc.mgt.dao.CartridgeSubscriptionInfo; +import org.apache.stratos.adc.mgt.exception.ADCException; +import org.apache.stratos.adc.mgt.exception.NotSubscribedException; +import org.apache.stratos.adc.mgt.exception.UnregisteredCartridgeException; +import org.apache.stratos.cloud.controller.pojo.CartridgeInfo; + +import java.util.Properties; + +public class ApplicationCartridgeSubscription extends AbstractCartridgeSubscription { + + + /** + * Constructor + * + * @param cartridgeInfo CartridgeInfo subscription + */ + public ApplicationCartridgeSubscription(CartridgeInfo cartridgeInfo) { + super(cartridgeInfo); + } + + @Override + public CartridgeSubscriptionInfo registerSubscription(Properties properties) throws ADCException, UnregisteredCartridgeException { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void removeSubscription() throws ADCException, NotSubscribedException { + //To change body of implemented methods use File | Settings | File Templates. + } +} http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/74d89849/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/DataCartridgeSubscription1.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/DataCartridgeSubscription1.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/DataCartridgeSubscription1.java new file mode 100644 index 0000000..74f299a --- /dev/null +++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/DataCartridgeSubscription1.java @@ -0,0 +1,50 @@ +/* + * 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.adc.mgt.subscription; + +import org.apache.stratos.adc.mgt.dao.CartridgeSubscriptionInfo; +import org.apache.stratos.adc.mgt.exception.ADCException; +import org.apache.stratos.adc.mgt.exception.NotSubscribedException; +import org.apache.stratos.adc.mgt.exception.UnregisteredCartridgeException; +import org.apache.stratos.cloud.controller.pojo.CartridgeInfo; + +import java.util.Properties; + +public class DataCartridgeSubscription1 extends AbstractCartridgeSubscription { + + /** + * Constructor + * + * @param cartridgeInfo CartridgeInfo subscription + */ + public DataCartridgeSubscription1(CartridgeInfo cartridgeInfo) { + super(cartridgeInfo); + } + + @Override + public CartridgeSubscriptionInfo registerSubscription(Properties properties) throws ADCException, UnregisteredCartridgeException { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void removeSubscription() throws ADCException, NotSubscribedException { + //To change body of implemented methods use File | Settings | File Templates. + } +} http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/74d89849/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/FrameworkCartridgeSubscription.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/FrameworkCartridgeSubscription.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/FrameworkCartridgeSubscription.java new file mode 100644 index 0000000..6552fa9 --- /dev/null +++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/FrameworkCartridgeSubscription.java @@ -0,0 +1,78 @@ +/* + * 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.adc.mgt.subscription; + +import org.apache.stratos.adc.mgt.dao.CartridgeSubscriptionInfo; +import org.apache.stratos.adc.mgt.dto.Policy; +import org.apache.stratos.adc.mgt.exception.*; +import org.apache.stratos.adc.mgt.payload.PayloadArg; +import org.apache.stratos.adc.mgt.repository.Repository; +import org.apache.stratos.adc.mgt.subscriber.Subscriber; +import org.apache.stratos.adc.mgt.utils.ApplicationManagementUtil; +import org.apache.stratos.cloud.controller.pojo.CartridgeInfo; + +import java.util.Properties; + +public class FrameworkCartridgeSubscription extends AbstractCartridgeSubscription { + + /** + * Constructor + * + * @param cartridgeInfo CartridgeInfo subscription + */ + public FrameworkCartridgeSubscription(CartridgeInfo cartridgeInfo) { + super(cartridgeInfo); + } + + @Override + public void createSubscription(Subscriber subscriber, String alias, Policy autoscalingPolicy, + Repository repository) throws + InvalidCartridgeAliasException, DuplicateCartridgeAliasException, ADCException, + RepositoryCredentialsRequiredException, RepositoryTransportException, UnregisteredCartridgeException, + AlreadySubscribedException, RepositoryRequiredException, InvalidRepositoryException, PolicyException { + + super.createSubscription(subscriber, alias, autoscalingPolicy, repository); + subscriptionTenancyBehaviour.createSubscription(); + } + + @Override + public CartridgeSubscriptionInfo registerSubscription(Properties properties) throws ADCException, UnregisteredCartridgeException { + + subscriptionTenancyBehaviour.registerSubscription(); + + return ApplicationManagementUtil.createCartridgeSubscription(getCartridgeInfo(), getAutoscalingPolicy(), + getType(), getAlias(), getSubscriber().getTenantId(), getSubscriber().getTenantDomain(), + getRepository(), getCluster().getHostName(), getCluster().getClusterDomain(), getCluster().getClusterSubDomain(), + getCluster().getMgtClusterDomain(), getCluster().getMgtClusterSubDomain(), null, "PENDING", getSubscriptionKey()); + } + + @Override + public void removeSubscription() throws ADCException, NotSubscribedException { + + subscriptionTenancyBehaviour.removeSubscription(); + super.cleanupSubscription(); + } + + public PayloadArg createPayloadParameters () throws ADCException { + + PayloadArg payloadArg = super.createPayloadParameters(); + return subscriptionTenancyBehaviour.createPayloadParameters(payloadArg); + } +} http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/74d89849/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/SingleTenantCartridgeSubscription.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/SingleTenantCartridgeSubscription.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/SingleTenantCartridgeSubscription.java index 830deea..77caeac 100644 --- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/SingleTenantCartridgeSubscription.java +++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/SingleTenantCartridgeSubscription.java @@ -108,7 +108,7 @@ public class SingleTenantCartridgeSubscription extends CartridgeSubscription { log.info("Unregistered service cluster, domain " + getCluster().getClusterDomain() + ", sub domain " + getCluster().getClusterSubDomain()); - cleanupSubscription(); + super.cleanupSubscription(); } @Override http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/74d89849/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/tenancy/SubscriptionMultiTenantBehaviour.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/tenancy/SubscriptionMultiTenantBehaviour.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/tenancy/SubscriptionMultiTenantBehaviour.java new file mode 100644 index 0000000..c441036 --- /dev/null +++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/tenancy/SubscriptionMultiTenantBehaviour.java @@ -0,0 +1,117 @@ +/* + * 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.adc.mgt.subscription.tenancy; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.stratos.adc.mgt.exception.ADCException; +import org.apache.stratos.adc.mgt.exception.AlreadySubscribedException; +import org.apache.stratos.adc.mgt.exception.NotSubscribedException; +import org.apache.stratos.adc.mgt.exception.UnregisteredCartridgeException; +import org.apache.stratos.adc.mgt.internal.DataHolder; +import org.apache.stratos.adc.mgt.payload.PayloadArg; +import org.apache.stratos.adc.mgt.subscription.AbstractCartridgeSubscription; +import org.apache.stratos.adc.mgt.utils.CartridgeConstants; +import org.apache.stratos.adc.mgt.utils.PersistenceManager; +import org.apache.stratos.adc.topology.mgt.service.TopologyManagementService; +import org.apache.stratos.adc.topology.mgt.serviceobjects.DomainContext; + +public class SubscriptionMultiTenantBehaviour extends SubscriptionTenancyBehaviour { + + private static Log log = LogFactory.getLog(SubscriptionMultiTenantBehaviour.class); + + public SubscriptionMultiTenantBehaviour(AbstractCartridgeSubscription cartridgeSubscription) { + super(cartridgeSubscription); + } + + public void createSubscription() throws ADCException, AlreadySubscribedException { + + boolean allowMultipleSubscription = Boolean. + valueOf(System.getProperty(CartridgeConstants.FEATURE_MULTI_TENANT_MULTIPLE_SUBSCRIPTION_ENABLED)); + + if (!allowMultipleSubscription) { + // If the cartridge is multi-tenant. We should not let users createSubscription twice. + boolean subscribed; + try { + subscribed = PersistenceManager.isAlreadySubscribed(cartridgeSubscription.getType(), + cartridgeSubscription.getSubscriber().getTenantId()); + } catch (Exception e) { + String msg = "Error checking whether the cartridge type " + cartridgeSubscription.getType() + + " is already subscribed"; + log.error(msg, e); + throw new ADCException(msg, e); + } + + if (subscribed) { + String msg = "Already subscribed to " + cartridgeSubscription.getType() + + ". This multi-tenant cartridge will not be available to createSubscription"; + if (log.isDebugEnabled()) { + log.debug(msg); + } + throw new AlreadySubscribedException(msg, cartridgeSubscription.getType()); + } + } + + TopologyManagementService topologyService = DataHolder.getTopologyMgtService(); + DomainContext[] domainContexts = topologyService.getDomainsAndSubdomains(cartridgeSubscription.getType(), + cartridgeSubscription.getSubscriber().getTenantId()); + log.info("Retrieved " + domainContexts.length + " domain and corresponding subdomain pairs"); + + if (domainContexts.length > 0) { + if(domainContexts.length > 2) { + if(log.isDebugEnabled()) + log.debug("Too many domain sub domain pairs"); + } + + for (DomainContext domainContext : domainContexts) { + if (domainContext.getSubDomain().equalsIgnoreCase("mgt")) { + cartridgeSubscription.getCluster().setMgtClusterDomain(domainContext.getDomain()); + cartridgeSubscription.getCluster().setMgtClusterSubDomain(domainContext.getSubDomain()); + } else { + cartridgeSubscription.getCluster().setClusterDomain(domainContext.getDomain()); + cartridgeSubscription.getCluster().setClusterSubDomain(domainContext.getSubDomain()); + } + } + } else { + String msg = "Domain contexts not found for " + cartridgeSubscription.getType() + " and tenant id " + + cartridgeSubscription.getSubscriber().getTenantId(); + log.warn(msg); + throw new ADCException(msg); + } + } + + public void registerSubscription() throws ADCException, UnregisteredCartridgeException { + + //nothing to do + } + + public void removeSubscription() throws ADCException, NotSubscribedException { + + log.info("Cartridge with alias " + cartridgeSubscription.getAlias() + ", and type " + cartridgeSubscription.getType() + + " is a multi-tenant cartridge and therefore will not terminate all instances and " + + "unregister services"); + } + + public PayloadArg createPayloadParameters(PayloadArg payloadArg) throws ADCException { + + //payload not used + return null; + } +} http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/74d89849/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/tenancy/SubscriptionSingleTenantBehaviour.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/tenancy/SubscriptionSingleTenantBehaviour.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/tenancy/SubscriptionSingleTenantBehaviour.java new file mode 100644 index 0000000..263c1d6 --- /dev/null +++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/tenancy/SubscriptionSingleTenantBehaviour.java @@ -0,0 +1,118 @@ +/* + * 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.adc.mgt.subscription.tenancy; + +import org.apache.axis2.AxisFault; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.stratos.adc.mgt.client.CloudControllerServiceClient; +import org.apache.stratos.adc.mgt.exception.ADCException; +import org.apache.stratos.adc.mgt.exception.AlreadySubscribedException; +import org.apache.stratos.adc.mgt.exception.NotSubscribedException; +import org.apache.stratos.adc.mgt.exception.UnregisteredCartridgeException; +import org.apache.stratos.adc.mgt.payload.PayloadArg; +import org.apache.stratos.adc.mgt.subscription.AbstractCartridgeSubscription; +import org.apache.stratos.adc.mgt.utils.ApplicationManagementUtil; +import org.apache.stratos.adc.mgt.utils.CartridgeConstants; + +public class SubscriptionSingleTenantBehaviour extends SubscriptionTenancyBehaviour { + + private static Log log = LogFactory.getLog(SubscriptionSingleTenantBehaviour.class); + + public SubscriptionSingleTenantBehaviour(AbstractCartridgeSubscription cartridgeSubscription) { + super(cartridgeSubscription); + } + + public void createSubscription() throws ADCException, AlreadySubscribedException { + + //set the cluster and hostname + cartridgeSubscription.getCluster().setClusterDomain(cartridgeSubscription.getAlias() + "." + + cartridgeSubscription.getCluster().getHostName() + "." + cartridgeSubscription.getType() + ".domain"); + cartridgeSubscription.getCluster().setHostName(cartridgeSubscription.getAlias() + "." + + cartridgeSubscription.getCluster().getHostName()); + } + + public void registerSubscription() throws ADCException, UnregisteredCartridgeException { + + ApplicationManagementUtil.registerService(cartridgeSubscription.getType(), + cartridgeSubscription.getCluster().getClusterDomain(), + cartridgeSubscription.getCluster().getClusterSubDomain(), + cartridgeSubscription.getPayload().createPayload(), + cartridgeSubscription.getPayload().getPayloadArg().getTenantRange(), + cartridgeSubscription.getCluster().getHostName(), + null); + + cartridgeSubscription.getPayload().delete(); + } + + public void removeSubscription() throws ADCException, NotSubscribedException { + + try { + CloudControllerServiceClient.getServiceClient().terminateAllInstances(cartridgeSubscription.getCluster().getClusterDomain()); + + } catch (AxisFault e) { + String errorMsg = "Error in terminating cartridge subscription, alias " + cartridgeSubscription.getAlias(); + log.error(errorMsg); + throw new ADCException(errorMsg, e); + + } catch (Exception e) { + String errorMsg = "Error in terminating cartridge subscription, alias " + cartridgeSubscription.getAlias(); + log.error(errorMsg); + throw new ADCException(errorMsg, e); + } + + log.info("Terminated all instances of " + cartridgeSubscription.getCluster().getClusterDomain() + " " + + cartridgeSubscription.getCluster().getClusterSubDomain()); + + try { + CloudControllerServiceClient.getServiceClient().unregisterService(cartridgeSubscription.getCluster().getClusterDomain()); + + } catch (Exception e) { + String errorMsg = "Error in unregistering service cluster with domain " + cartridgeSubscription.getCluster().getClusterDomain() + + ", sub domain " + cartridgeSubscription.getCluster().getClusterSubDomain(); + log.error(errorMsg); + throw new ADCException(errorMsg, e); + } + + log.info("Unregistered service cluster, domain " + cartridgeSubscription.getCluster().getClusterDomain() + ", sub domain " + + cartridgeSubscription.getCluster().getClusterSubDomain()); + } + + public PayloadArg createPayloadParameters(PayloadArg payloadArg) throws ADCException { + + + if(cartridgeSubscription.getRepository() != null) { + payloadArg.setRepoURL(cartridgeSubscription.getRepository().getUrl()); + } + payloadArg.setHostName(cartridgeSubscription.getCluster().getHostName()); + payloadArg.setServiceDomain(cartridgeSubscription.getCluster().getClusterDomain()); + payloadArg.setServiceSubDomain(cartridgeSubscription.getCluster().getMgtClusterSubDomain()); + payloadArg.setMgtServiceDomain(cartridgeSubscription.getCluster().getMgtClusterDomain()); + payloadArg.setMgtServiceSubDomain(cartridgeSubscription.getCluster().getMgtClusterSubDomain()); + if(cartridgeSubscription.getCartridgeInfo().getProvider().equals(CartridgeConstants.PROVIDER_NAME_WSO2)) { + payloadArg.setTenantRange(Integer.toString(cartridgeSubscription.getSubscriber().getTenantId())); + } + else { + payloadArg.setTenantRange("*"); + } + + return payloadArg; + } +} http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/74d89849/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/tenancy/SubscriptionTenancyBehaviour.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/tenancy/SubscriptionTenancyBehaviour.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/tenancy/SubscriptionTenancyBehaviour.java new file mode 100644 index 0000000..eb073ce --- /dev/null +++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/tenancy/SubscriptionTenancyBehaviour.java @@ -0,0 +1,44 @@ +/* + * 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.adc.mgt.subscription.tenancy; + +import org.apache.stratos.adc.mgt.exception.ADCException; +import org.apache.stratos.adc.mgt.exception.AlreadySubscribedException; +import org.apache.stratos.adc.mgt.exception.NotSubscribedException; +import org.apache.stratos.adc.mgt.exception.UnregisteredCartridgeException; +import org.apache.stratos.adc.mgt.payload.PayloadArg; +import org.apache.stratos.adc.mgt.subscription.AbstractCartridgeSubscription; + +public abstract class SubscriptionTenancyBehaviour { + + protected AbstractCartridgeSubscription cartridgeSubscription; + + public SubscriptionTenancyBehaviour(AbstractCartridgeSubscription cartridgeSubscription) { + this.cartridgeSubscription = cartridgeSubscription; + } + + public abstract void createSubscription() throws ADCException, AlreadySubscribedException; + + public abstract void registerSubscription() throws ADCException, UnregisteredCartridgeException; + + public abstract void removeSubscription() throws ADCException, NotSubscribedException; + + public abstract PayloadArg createPayloadParameters(PayloadArg payloadArg) throws ADCException; +}
