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;
+}

Reply via email to