You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by is...@apache.org on 2013/07/10 18:52:03 UTC
[28/45] fixing component version issues and adding currently
refactored components to the parent pom
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/ac065d73/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/HostingConstants.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/HostingConstants.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/HostingConstants.java
new file mode 100644
index 0000000..9259ea6
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/HostingConstants.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright WSO2, Inc. (http://wso2.com)
+ *
+ * Licensed 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.internal;
+
+/**
+ * Web Application Constants
+ */
+public final class HostingConstants {
+ public static final String WEBAPP_PREFIX = "webapps";
+ public static final String WEBAPP_DEPLOYMENT_FOLDER = "webapps";
+ public static final String WEBAPP_EXTENSION = "war";
+
+ public static final class WebappState {
+ public static final String STARTED = "started";
+ public static final String STOPPED = "stopped";
+
+ private WebappState() {
+ }
+ }
+
+ private HostingConstants() {
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/ac065d73/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/HostingManagementActivator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/HostingManagementActivator.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/HostingManagementActivator.java
new file mode 100644
index 0000000..2e61894
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/HostingManagementActivator.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright WSO2, Inc. (http://wso2.com)
+ *
+ * Licensed 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.internal;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.wso2.carbon.utils.CarbonUtils;
+
+/**
+ * Activator for the Webapp Management Bundle
+ */
+public class HostingManagementActivator implements BundleActivator {
+ private static final Log log = LogFactory.getLog(HostingManagementActivator.class);
+
+ @Override
+ public void start(final BundleContext bundleContext) {
+
+ // If Carbon is running as a webapp within some other servlet container,
+ // then we should
+ // uninstall this component
+ if (!CarbonUtils.isRunningInStandaloneMode()) {
+ Thread th = new Thread() {
+ @Override
+ public void run() {
+ try {
+ bundleContext.getBundle().uninstall();
+ } catch (Throwable e) {
+ log.warn("Error occurred while uninstalling hosting.mgt UI bundle", e);
+ }
+ }
+ };
+ try {
+ th.join();
+ } catch (InterruptedException ignored) {
+ }
+ th.start();
+ }
+ }
+
+ @Override
+ public void stop(BundleContext bundleContext) {
+ // No implementation required for this method
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/ac065d73/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/ApplicationManagementService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/ApplicationManagementService.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/ApplicationManagementService.java
new file mode 100644
index 0000000..c977bc4
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/ApplicationManagementService.java
@@ -0,0 +1,620 @@
+/*
+ * Copyright WSO2, Inc. (http://wso2.com)
+ *
+ * Licensed 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.service;
+
+import org.apache.axis2.AxisFault;
+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.CartridgeSubscription;
+import org.apache.stratos.adc.mgt.dns.DNSManager;
+import org.apache.stratos.adc.mgt.dto.Cartridge;
+import org.apache.stratos.adc.mgt.dto.CartridgeWrapper;
+import org.apache.stratos.adc.mgt.dto.PolicyDefinition;
+import org.apache.stratos.adc.mgt.dto.RepositoryInformation;
+import org.apache.stratos.adc.mgt.dto.SubscriptionInfo;
+import org.apache.stratos.adc.mgt.exception.*;
+import org.apache.stratos.adc.mgt.internal.DataHolder;
+import org.apache.stratos.adc.mgt.utils.*;
+import org.apache.stratos.adc.topology.mgt.service.TopologyManagementService;
+import org.wso2.carbon.context.PrivilegedCarbonContext;
+import org.wso2.carbon.core.AbstractAdmin;
+import org.wso2.carbon.registry.core.exceptions.RegistryException;
+import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
+import org.wso2.carbon.utils.DataPaginator;
+import org.wso2.carbon.utils.multitenancy.MultitenantConstants;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ *
+ *
+ *
+ */
+public class ApplicationManagementService extends AbstractAdmin {
+
+
+ private static final Log log = LogFactory.getLog(ApplicationManagementService.class);
+ RegistryManager registryManager = new RegistryManager();
+
+ PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext();
+ String tenantDomain = carbonContext.getTenantDomain();
+
+ /*
+ * Instantiate RepoNotificationService. Since this service is in the same
+ * component (org.apache.stratos.adc.mgt), a new object is created.
+ * TODO: Is there a better way to get this service?
+ */
+ private RepoNotificationService repoNotificationService = new RepoNotificationService();
+
+ /**
+ * Get Available Cartridges
+ *
+ * @return Available Cartridges
+ */
+ public Cartridge[] getAvailableCartridges(boolean multiTenant) throws ADCException {
+ List<Cartridge> cartridges = getAvailableCartridges(null, multiTenant);
+ // Following is very important when working with axis2
+ return cartridges.isEmpty() ? new Cartridge[0] : cartridges.toArray(new Cartridge[cartridges.size()]);
+ }
+
+ /**
+ * Get Subscribed Cartridges
+ *
+ * @return Subscribed Cartridges
+ */
+ public Cartridge[] getSubscribedCartridges() throws ADCException {
+ checkSuperTenant();
+ List<Cartridge> cartridgeList = getSubscribedCartridges(null);
+ // Following is very important when working with axis2
+ return cartridgeList.isEmpty() ? new Cartridge[0] : cartridgeList.toArray(new Cartridge[cartridgeList.size()]);
+ }
+
+ /**
+ * Get available cartridges
+ */
+ public CartridgeWrapper getPagedAvailableCartridges(String cartridgeSearchString, int pageNumber, boolean multiTenant)
+ throws ADCException {
+ checkSuperTenant();
+ CartridgeWrapper cartridgeWrapper = new CartridgeWrapper();
+ List<Cartridge> cartridges = getAvailableCartridges(cartridgeSearchString, multiTenant);
+
+ // TODO Improve pagination
+ if (!cartridges.isEmpty()) {
+ // Paginate only if cartridges are there.
+ DataPaginator.doPaging(pageNumber, cartridges, cartridgeWrapper);
+ } else {
+ // Must set this value as axis2 stub client will return an array
+ // with length = 1 and null element if cartridges[] is null
+ cartridgeWrapper.set(cartridges);
+ }
+ return cartridgeWrapper;
+ }
+
+ private List<Cartridge> getAvailableCartridges(String cartridgeSearchString, Boolean multiTenant) throws ADCException {
+ List<Cartridge> cartridges = new ArrayList<Cartridge>();
+
+ if (log.isDebugEnabled()) {
+ log.debug("Getting available cartridges. Search String: " + cartridgeSearchString + ", Multi-Tenant: " + multiTenant);
+ }
+
+ boolean allowMultipleSubscription = new Boolean(
+ System.getProperty(CartridgeConstants.FEATURE_MULTI_TENANT_MULTIPLE_SUBSCRIPTION_ENABLED));
+
+ try {
+ Pattern searchPattern = getSearchStringPattern(cartridgeSearchString);
+
+ String[] availableCartridges = ApplicationManagementUtil.getServiceClient().getRegisteredCartridges();
+
+ if (availableCartridges != null) {
+ for (String cartridgeType : availableCartridges) {
+ CartridgeInfo cartridgeInfo = null;
+ try {
+ cartridgeInfo = ApplicationManagementUtil.getServiceClient().getCartridgeInfo(cartridgeType);
+ } catch (Exception e) {
+ if (log.isWarnEnabled()) {
+ log.warn("Error when calling getCartridgeInfo for " + cartridgeType + ", Error: "
+ + e.getMessage());
+ }
+ }
+ if (cartridgeInfo == null) {
+ // This cannot happen. But continue
+ if (log.isDebugEnabled()) {
+ log.debug("Cartridge Info not found: " + cartridgeType);
+ }
+ continue;
+ }
+
+ if (multiTenant != null && !multiTenant && cartridgeInfo.getMultiTenant()) {
+ // Need only Single-Tenant cartridges
+ continue;
+ } else if (multiTenant != null && multiTenant && !cartridgeInfo.getMultiTenant()) {
+ // Need only Multi-Tenant cartridges
+ continue;
+ }
+
+ if (!cartridgeMatches(cartridgeInfo, searchPattern)) {
+ continue;
+ }
+
+ Cartridge cartridge = new Cartridge();
+ cartridge.setCartridgeType(cartridgeType);
+ cartridge.setProvider(cartridgeInfo.getProvider());
+ cartridge.setDisplayName(cartridgeInfo.getDisplayName());
+ cartridge.setDescription(cartridgeInfo.getDescription());
+ cartridge.setVersion(cartridgeInfo.getVersion());
+ cartridge.setMultiTenant(cartridgeInfo.getMultiTenant());
+ cartridge.setStatus(CartridgeConstants.NOT_SUBSCRIBED);
+ cartridge.setCartridgeAlias("-");
+ cartridge.setActiveInstances(0);
+ cartridges.add(cartridge);
+
+ if (cartridgeInfo.getMultiTenant() && !allowMultipleSubscription) {
+ // If the cartridge is multi-tenant. We should not let users
+ // subscribe twice.
+ if (PersistenceManager.isAlreadySubscribed(cartridgeType,
+ ApplicationManagementUtil.getTenantId(getConfigContext()))) {
+ if (log.isDebugEnabled()) {
+ log.debug("Already subscribed to " + cartridgeType
+ + ". This multi-tenant cartridge will not be available to subscribe");
+ }
+ cartridge.setStatus(CartridgeConstants.SUBSCRIBED);
+ }
+ }
+ }
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug("There are no available cartridges");
+ }
+ }
+ } catch (Exception e) {
+ String msg = "Error when getting available cartridges. " + e.getMessage();
+ log.error(msg, e);
+ throw new ADCException("An error occurred getting available cartridges ", e);
+ }
+
+ Collections.sort(cartridges);
+
+ if (log.isDebugEnabled()) {
+ log.debug("Returning available cartridges " + cartridges.size());
+ }
+
+ return cartridges;
+ }
+
+ /**
+ * Get subscribed cartridges
+ */
+ public CartridgeWrapper getPagedSubscribedCartridges(String cartridgeSearchString, int pageNumber)
+ throws ADCException {
+ checkSuperTenant();
+ CartridgeWrapper cartridgeWrapper = new CartridgeWrapper();
+ List<Cartridge> cartridges = getSubscribedCartridges(cartridgeSearchString);
+
+ // TODO Improve pagination
+ if (!cartridges.isEmpty()) {
+ // Paginate only if cartridges are there.
+ DataPaginator.doPaging(pageNumber, cartridges, cartridgeWrapper);
+ } else {
+ cartridgeWrapper.set(cartridges);
+ }
+ return cartridgeWrapper;
+ }
+
+ private List<Cartridge> getSubscribedCartridges(String cartridgeSearchString) throws ADCException {
+ List<Cartridge> cartridges = new ArrayList<Cartridge>();
+
+ if (log.isDebugEnabled()) {
+ log.debug("Getting subscribed cartridges. Search String: " + cartridgeSearchString);
+ }
+
+ try {
+ Pattern searchPattern = getSearchStringPattern(cartridgeSearchString);
+
+ List<CartridgeSubscription> subscriptionList = PersistenceManager
+ .retrieveSubscribedCartridges(ApplicationManagementUtil.getTenantId(getConfigContext()));
+
+ if (subscriptionList != null && !subscriptionList.isEmpty()) {
+ for (CartridgeSubscription subscription : subscriptionList) {
+ CartridgeInfo cartridgeInfo = null;
+ try {
+ cartridgeInfo = ApplicationManagementUtil.getServiceClient().getCartridgeInfo(
+ subscription.getCartridge());
+ } catch (Exception e) {
+ if (log.isWarnEnabled()) {
+ log.warn("Error when calling getCartridgeInfo for " + subscription.getCartridge()
+ + ", Error: " + e.getMessage());
+ }
+ }
+ if (cartridgeInfo == null) {
+ // This cannot happen. But continue
+ if (log.isDebugEnabled()) {
+ log.debug("Cartridge Info not found: " + subscription.getCartridge());
+ }
+ continue;
+ }
+ if (!cartridgeMatches(cartridgeInfo, subscription, searchPattern)) {
+ continue;
+ }
+ TopologyManagementService topologyMgtService = DataHolder.getTopologyMgtService();
+ String[] ips = topologyMgtService.getActiveIPs(subscription.getCartridge(),
+ subscription.getClusterDomain(), subscription.getClusterSubdomain());
+ Cartridge cartridge = ApplicationManagementUtil.populateCartridgeInfo(cartridgeInfo, subscription, ips, tenantDomain);
+ cartridges.add(cartridge);
+ }
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug("There are no subscribed cartridges");
+ }
+ }
+ } catch (Exception e) {
+ String msg = "Error when getting subscribed cartridges. " + e.getMessage();
+ log.error(msg, e);
+ throw new ADCException("An Error occurred when getting subscribed cartridges.", e);
+ }
+
+ Collections.sort(cartridges);
+
+ if (log.isDebugEnabled()) {
+ log.debug("Returning subscribed cartridges " + cartridges.size());
+ }
+
+ return cartridges;
+ }
+
+ private Pattern getSearchStringPattern(String searchString) {
+ if (log.isDebugEnabled()) {
+ log.debug("Creating search pattern for " + searchString);
+ }
+ if (searchString != null) {
+ // Copied from org.wso2.carbon.webapp.mgt.WebappAdmin.doesWebappSatisfySearchString(WebApplication, String)
+ String regex = searchString.toLowerCase().replace("..?", ".?").replace("..*", ".*").replaceAll("\\?", ".?")
+ .replaceAll("\\*", ".*?");
+ if (log.isDebugEnabled()) {
+ log.debug("Created regex: " + regex + " for search string " + searchString);
+ }
+
+ Pattern pattern = Pattern.compile(regex);
+ return pattern;
+ }
+ return null;
+ }
+
+ // TODO: Improve search method
+ private boolean cartridgeMatches(CartridgeInfo cartridgeInfo, Pattern pattern) {
+ if (pattern != null) {
+ boolean matches = false;
+ if (cartridgeInfo.getDisplayName() != null) {
+ matches = pattern.matcher(cartridgeInfo.getDisplayName().toLowerCase()).find();
+ }
+ if (!matches && cartridgeInfo.getDescription() != null) {
+ matches = pattern.matcher(cartridgeInfo.getDescription().toLowerCase()).find();
+ }
+ return matches;
+ }
+ return true;
+ }
+
+ private boolean cartridgeMatches(CartridgeInfo cartridgeInfo, CartridgeSubscription cartridgeSubscription, Pattern pattern) {
+ if (pattern != null) {
+ boolean matches = false;
+ if (cartridgeInfo.getDisplayName() != null) {
+ matches = pattern.matcher(cartridgeInfo.getDisplayName().toLowerCase()).find();
+ }
+ if (!matches && cartridgeInfo.getDescription() != null) {
+ matches = pattern.matcher(cartridgeInfo.getDescription().toLowerCase()).find();
+ }
+ if (!matches && cartridgeSubscription.getCartridge() != null) {
+ matches = pattern.matcher(cartridgeSubscription.getCartridge().toLowerCase()).find();
+ }
+ if (!matches && cartridgeSubscription.getAlias() != null) {
+ matches = pattern.matcher(cartridgeSubscription.getAlias().toLowerCase()).find();
+ }
+ return matches;
+ }
+ return true;
+ }
+
+ public Cartridge getCartridgeInfo(String alias) throws ADCException, NotSubscribedException {
+ checkSuperTenant();
+ return ApplicationManagementUtil.getCartridgeInfo(alias, getTenantDomain());
+ }
+
+ public String[] getSubscribedCartridgeAliases() throws AxisFault {
+ try {
+ List<CartridgeSubscription> subscriptionList = PersistenceManager
+ .retrieveSubscribedCartridges(ApplicationManagementUtil.getTenantId(getConfigContext()));
+ List<String> subscribedAliases = new ArrayList<String>();
+ for (CartridgeSubscription cartridgeSubscription : subscriptionList) {
+
+ if(cartridgeSubscription.getProvider().equalsIgnoreCase(CartridgeConstants.PROVIDER_NAME_WSO2) &&
+ getCartridgeInfo(cartridgeSubscription.getAlias()).isMultiTenant()) {
+
+ subscribedAliases.add(cartridgeSubscription.getCartridge());
+ } else {
+ subscribedAliases.add(cartridgeSubscription.getAlias());
+ }
+ }
+ if(subscribedAliases.size() == 0) {
+ return new String[]{""};
+ } else {
+ return subscribedAliases.toArray(new String[subscribedAliases.size()]);
+ }
+
+ } catch (Exception e) {
+ String msg = "Exception in getting subscribed cartridge aliases :" + e.getMessage();
+ log.error(msg, e);
+ throw new AxisFault("An error occurred while getting subscribed cartridge aliases", e);
+ }
+ }
+
+ public PolicyDefinition[] getPolicyDefinitions() {
+ List<PolicyDefinition> policyDefinitions = PolicyHolder.getInstance().getPolicyDefinitions();
+ return policyDefinitions == null || policyDefinitions.isEmpty() ? new PolicyDefinition[0] : policyDefinitions
+ .toArray(new PolicyDefinition[policyDefinitions.size()]);
+ }
+
+ /**
+ * Subscribe to a cartridge
+ */
+ public SubscriptionInfo subscribe(String cartridgeType, String alias, String policy, String repoURL,
+ boolean privateRepo, String repoUsername, String repoPassword, String dataCartridgeType,
+ String dataCartridgeAlias) throws ADCException, PolicyException, UnregisteredCartridgeException,
+ InvalidCartridgeAliasException, DuplicateCartridgeAliasException, RepositoryRequiredException,
+ AlreadySubscribedException, RepositoryCredentialsRequiredException, InvalidRepositoryException,
+ RepositoryTransportException {
+
+ checkSuperTenant();
+
+ return ApplicationManagementUtil.doSubscribe(cartridgeType, alias, policy, repoURL, privateRepo, repoUsername,
+ repoPassword, dataCartridgeType, dataCartridgeAlias, getUsername(),
+ ApplicationManagementUtil.getTenantId(getConfigContext()), getTenantDomain());
+
+ }
+
+
+ /**
+ * Unsubscribing the cartridge
+ *
+ * @param alias name of the cartridge to be unsubscribed
+ */
+ public void unsubscribe(String alias) throws ADCException, NotSubscribedException {
+ checkSuperTenant();
+ CartridgeSubscription subscription = null;
+
+ try {
+ subscription = PersistenceManager.getSubscription(tenantDomain, alias);
+ } catch (Exception e) {
+ String msg = "Failed to get subscription for " + tenantDomain + " and alias " + alias;
+ log.error(msg, e);
+ throw new ADCException(msg, e);
+ }
+
+ if (subscription == null) {
+ String msg = "Tenant " + tenantDomain + " is not subscribed for " + alias;
+ log.error(msg);
+ throw new NotSubscribedException("You have not subscribed for " + alias, alias);
+ }
+
+ try {
+ String clusterDomain = subscription.getClusterDomain();
+ String clusterSubDomain = subscription.getClusterSubdomain();
+
+ if (log.isDebugEnabled()) {
+ log.debug("Finding cartridge information for " + subscription.getCartridge());
+ }
+ CartridgeInfo cartridgeInfo = ApplicationManagementUtil.getServiceClient().getCartridgeInfo(subscription.getCartridge());
+ if (log.isDebugEnabled()) {
+ log.debug("Found " + cartridgeInfo.getDisplayName() + " for " + subscription.getCartridge());
+ }
+ if (!cartridgeInfo.getMultiTenant()) {
+ log.info("Terminating all instances of " + clusterDomain + " " + clusterSubDomain);
+ ApplicationManagementUtil.getServiceClient().terminateAllInstances(clusterDomain, clusterSubDomain);
+ log.info("All instances terminated.");
+ log.info("Unregistering services...");
+ ApplicationManagementUtil.getServiceClient().unregisterService(clusterDomain, clusterSubDomain);
+ log.info("Successfully terminated instances ..");
+ } else {
+ if (log.isInfoEnabled()) {
+ log.info("Cartridge "
+ + subscription.getCartridge()
+ + " is a multi-tenant cartridge and therefore will not terminate all instances and unregister services");
+ }
+ }
+
+ new RepositoryFactory().destroyRepository(alias, tenantDomain, getUsername());
+ log.info("Repo is destroyed successfully.. ");
+
+ PersistenceManager.updateSubscriptionState(subscription.getSubscriptionId(), "UNSUBSCRIBED");
+ new DNSManager().removeSubDomain(subscription.getHostName());
+ registryManager.removeDomainMappingFromRegistry(subscription.getHostName());
+ TopologyManagementService topologyMgtService = DataHolder.getTopologyMgtService();
+
+ String[] ips = topologyMgtService.getActiveIPs(subscription.getCartridge(),
+ subscription.getClusterDomain(), subscription.getClusterSubdomain());
+ PersistenceManager.updateInstanceState("INACTIVE", ips, subscription.getClusterDomain(), subscription.getClusterSubdomain(), subscription.getCartridge());
+
+ } catch (ADCException e) {
+ log.error(e.getMessage(), e);
+ throw e;
+ } catch (Exception e1) {
+ String msg1 = "Exception occurred :" + e1.getMessage();
+ log.error(msg1);
+ throw new ADCException("Unsubscribe failed for cartridge " + alias, e1);
+ }
+ }
+
+
+ public String addDomainMapping(String mappedDomain, String cartridgeAlias) throws ADCException, DomainMappingExistsException, NotSubscribedException {
+ checkSuperTenant();
+ // TODO Following was in CLI. Fix this
+ // if (domain.indexOf('.') == -1) {
+ // System.out.println("\nOwn domain should include a '.' ");
+ // }
+
+ CartridgeSubscription subscription = null;
+ String actualHost = null;
+
+ try {
+ subscription = PersistenceManager.getSubscription(tenantDomain, cartridgeAlias);
+ } catch (Exception e) {
+ String msg = "Failed to get subscription for " + tenantDomain + " and alias " + cartridgeAlias;
+ log.error(msg, e);
+ throw new ADCException(msg, e);
+ }
+ if (subscription == null) {
+ String msg = "Tenant " + tenantDomain + " is not subscribed for " + cartridgeAlias;
+ log.error(msg);
+ throw new NotSubscribedException("You have not subscribed for " + cartridgeAlias, cartridgeAlias);
+ }
+
+ try {
+ actualHost = getActualHost(cartridgeAlias);
+ registryManager.addDomainMappingToRegistry(mappedDomain, actualHost);
+ log.info("Domain mapping is added for " + mappedDomain + " tenant: " + tenantDomain);
+ PersistenceManager.updateDomainMapping(
+ ApplicationManagementUtil.getTenantId(getConfigContext()), cartridgeAlias, mappedDomain);
+ } catch (RegistryException e) {
+ String msg = "Unable to add the mapping due to registry transaction error";
+ log.error(msg, e);
+ throw new ADCException("Unable to add the mapping due to internal error!", e);
+ } catch (DomainMappingExistsException e) {
+ String msg = "Domain mapping already exists.";
+ log.error(msg, e);
+ throw e;
+ } catch (Exception e) {
+ String msg = "Error occurred. Reason : " + e.getMessage();
+ log.error(msg, e);
+ throw new ADCException(msg, e);
+ }
+ return actualHost;
+ }
+
+ private String getActualHost(String cartridgeName) throws Exception {
+ return PersistenceManager.getHostNameForCartridgeName(
+ ApplicationManagementUtil.getTenantId(getConfigContext()), cartridgeName);
+ }
+
+ public void removeDomainMapping(String cartridgeAlias) throws ADCException, NotSubscribedException {
+ checkSuperTenant();
+ CartridgeSubscription subscription = null;
+ String actualHost = null;
+
+ try {
+ subscription = PersistenceManager.getSubscription(tenantDomain, cartridgeAlias);
+ } catch (Exception e) {
+ String msg = "Failed to get subscription for " + tenantDomain + " and alias " + cartridgeAlias;
+ log.error(msg, e);
+ throw new ADCException(msg, e);
+ }
+ if (subscription == null) {
+ String msg = "Tenant " + tenantDomain + " is not subscribed for " + cartridgeAlias;
+ log.error(msg);
+ throw new NotSubscribedException("You have not subscribed for " + cartridgeAlias, cartridgeAlias);
+ }
+
+ try {
+ actualHost = getActualHost(cartridgeAlias);
+ registryManager.removeDomainMappingFromRegistry(actualHost);
+ log.info("Domain mapping is removed for " + actualHost + " tenant: " + tenantDomain);
+ PersistenceManager.updateDomainMapping(ApplicationManagementUtil.getTenantId(getConfigContext()),
+ cartridgeAlias, null);
+ } catch (RegistryException e) {
+ String msg = "Unable to remove the mapping due to registry transaction error";
+ log.error(msg, e);
+ throw new ADCException("Unable to remove the mapping due to internal error!", e);
+ } catch (Exception e) {
+ String msg = "Error occurred. Reason : " + e.getMessage();
+ log.error(msg, e);
+ throw new ADCException(msg, e);
+ }
+ }
+
+ public void synchronizeRepository(String cartridgeAlias) throws ADCException, NotSubscribedException {
+ checkSuperTenant();
+ CartridgeSubscription subscription = null;
+
+ // Validating subscription
+ try {
+ subscription = PersistenceManager.getSubscription(tenantDomain, cartridgeAlias);
+ } catch (Exception e) {
+ String msg = "Failed to get subscription for " + tenantDomain + " and alias " + cartridgeAlias;
+ log.error(msg, e);
+ throw new ADCException(msg, e);
+ }
+ if (subscription == null) {
+ String msg = "Tenant " + tenantDomain + " is not subscribed for " + cartridgeAlias;
+ log.error(msg);
+ throw new NotSubscribedException("You have not subscribed for " + cartridgeAlias, cartridgeAlias);
+ }
+
+ try {
+ repoNotificationService.notifyRepoUpdate(tenantDomain, cartridgeAlias);
+ } catch (Exception e) {
+ throw new ADCException(e.getMessage() != null ? e.getMessage() : "Failed to synchronize repository", e);
+ }
+ }
+
+ /**
+ * Validate authentication.
+ * First call of cli tool in the prompt mode after log in.
+ *
+ * @return The tenant domain
+ */
+ public String getTenantDomain() {
+ if (tenantDomain != null) {
+ // This means, authentication is successful
+ log.info("Tenant " + tenantDomain + " is authorized to access Application Management Service!");
+ }
+ return tenantDomain;
+ }
+
+ /**
+ * Allow to check whether features are enabled in the back-end
+ *
+ * @param key
+ * The propery key
+ * @return {@code true} if feature is enabled
+ */
+ public boolean isFeatureEnabled(String key) {
+ if (key != null && key.startsWith("feature.")) {
+ return new Boolean(System.getProperty(key));
+ }
+ return false;
+ }
+
+
+ public RepositoryInformation testRepositoryConnection(String repoURL, String repoUsername, String repoPassword, boolean privateRepo)
+ throws RepositoryRequiredException, ADCException, RepositoryCredentialsRequiredException,
+ InvalidRepositoryException, RepositoryTransportException {
+ return ApplicationManagementUtil.validateRepository(repoURL, repoUsername, repoPassword, privateRepo, true);
+ }
+
+ // TODO Remove following when we support cartridge subscription for Super-tenant
+ private void checkSuperTenant() throws ADCException {
+ if (log.isDebugEnabled()) {
+ log.debug("Checking whether super tenant accesses the service methods. Tenant ID: "
+ + ApplicationManagementUtil.getTenantId(getConfigContext()) + ", Tenant Domain: " + carbonContext.getTenantDomain());
+ }
+ if (MultitenantConstants.SUPER_TENANT_ID == ApplicationManagementUtil.getTenantId(getConfigContext())) {
+ throw new ADCException("Super Tenant is not allowed to complete requested operation");
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/ac065d73/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/InstanceInformationManagementService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/InstanceInformationManagementService.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/InstanceInformationManagementService.java
new file mode 100644
index 0000000..692dafa
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/InstanceInformationManagementService.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright WSO2, Inc. (http://wso2.com)
+ *
+ * Licensed 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.service;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.adc.mgt.utils.PersistenceManager;
+
+public class InstanceInformationManagementService {
+
+
+ private static final Log log = LogFactory.getLog(InstanceInformationManagementService.class);
+
+ /**
+ * Everytime an instance is started up, this operation is invoked
+ * (by the AgentService)
+ * @param instanceIp
+ * @param tenantId
+ * @param clusterDomain
+ * @param clusterSubDomain
+ * @param cartridge
+ * @param state
+ *
+ */
+ public void updateInstanceState(String instanceIp,
+ int tenantId,
+ String clusterDomain,
+ String clusterSubDomain,
+ String cartridge,
+ String state) {
+
+ log.info("Message receieved in Instance Info Service.." + instanceIp + tenantId + clusterDomain + clusterSubDomain
+ + cartridge + state);
+
+ try {
+ PersistenceManager.persistCartridgeInstanceInfo(instanceIp, clusterDomain, clusterSubDomain, cartridge, state);
+ } catch (Exception e) {
+ log.error("Exception is occurred in updating instance state. Reason, " + e.getMessage());
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/ac065d73/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepoNotificationService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepoNotificationService.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepoNotificationService.java
new file mode 100644
index 0000000..b26e885
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepoNotificationService.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright WSO2, Inc. (http://wso2.com)
+ *
+ * Licensed 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.service;
+
+import java.io.File;
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.axis2.clustering.ClusteringAgent;
+import org.apache.axis2.clustering.ClusteringFault;
+import org.apache.axis2.clustering.management.GroupManagementAgent;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.adc.mgt.dao.CartridgeSubscription;
+import org.apache.stratos.adc.mgt.internal.DataHolder;
+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.wso2.carbon.core.deployment.SynchronizeGitRepositoryRequest;
+import org.wso2.carbon.utils.CarbonUtils;
+
+
+public class RepoNotificationService {
+
+ private static final Log log = LogFactory.getLog(RepoNotificationService.class);
+
+
+ public void notifyRepoUpdate(String tenantDomain, String cartridgeAlias) throws Exception {
+ // FIXME Throwing generic Exception is wrong
+ log.info("Updating repository of tenant : " + tenantDomain + " , cartridge: " +
+ cartridgeAlias);
+
+ CartridgeSubscription subscription = null;
+ try {
+ subscription = PersistenceManager.getSubscription(tenantDomain, cartridgeAlias);
+ } catch (Exception e) {
+ String msg = "Failed to find subscription for " + cartridgeAlias + ". "
+ + (e.getMessage() != null ? e.getMessage() : "");
+ log.error(msg, e);
+ throw new Exception(msg, e);
+ }
+
+ if (subscription == null) {
+ String msg = "Tenant " + tenantDomain + " is not subscribed for " + cartridgeAlias;
+ log.error(msg);
+ throw new Exception("You have not subscribed for " + cartridgeAlias);
+ }
+
+ try {
+ handleRepoSynch(subscription);
+ } catch (Exception e) {
+ String msg = "Failed to synchronize the repository for " + cartridgeAlias + ". "
+ + (e.getMessage() != null ? e.getMessage() : "");
+ log.error(msg, e);
+ throw new Exception(msg, e);
+ }
+
+ }
+
+ public void synchronize(String repositoryURL) throws Exception {
+
+ log.info(" repository URL received : " + repositoryURL);
+ List<CartridgeSubscription> subscription = PersistenceManager.getSubscription(repositoryURL);
+ for (CartridgeSubscription cartridgeSubscription : subscription) {
+ handleRepoSynch(cartridgeSubscription);
+ }
+ }
+
+ private void handleRepoSynch(CartridgeSubscription subscription) throws Exception {
+ if (subscription == null) {
+ throw new Exception("Cannot synchronize repository. subscription is null");
+ }
+
+ if (CartridgeConstants.PROVIDER_NAME_WSO2.equals(subscription.getProvider())) {
+ log.info(" wso2 cartridge.. ");
+ createAndSendClusterMessage(subscription.getTenantId(), subscription.getTenantDomain(),
+ UUID.randomUUID(), subscription.getClusterDomain(),
+ subscription.getClusterSubdomain());
+ //for manager node
+ /* if (subscription.getMgtClusterSubDomain() != null && !subscription.getMgtClusterSubDomain().isEmpty()) {
+ createAndSendClusterMessage(subscription.getTenantId(), subscription.getTenantDomain(),
+ UUID.randomUUID(), subscription.getMgtClusterDomain(),
+ subscription.getMgtClusterSubDomain());
+ }
+ else {
+ if(log.isDebugEnabled())
+ log.debug("Manager node cluster information not found, not sending the SynchronizeGitRepositoryRequest");
+ }*/
+
+ } else {
+
+ // Query DB and get all the IP s for this tenant
+ // Invoke update-instance script
+
+ String appPath = subscription.getBaseDirectory();
+ String cartridgePrivateKey = System.getProperty(CartridgeConstants.CARTRIDGE_KEY);
+
+ File keyFile = new File(cartridgePrivateKey);
+ if (!keyFile.exists()) {
+ log.error("The key file does not exist! " + cartridgePrivateKey);
+ }
+
+ if (subscription != null) {
+ TopologyManagementService topologyMgtService = DataHolder.getTopologyMgtService();
+
+
+ if (topologyMgtService == null) {
+ String msg = " Topology Management Service is null ";
+ log.error(msg);
+ throw new Exception(msg);
+ }
+
+ String[] activeIpArray =
+ topologyMgtService.getActiveIPs(subscription.getCartridge(),
+ subscription.getClusterDomain(),
+ subscription.getClusterSubdomain());
+ try {
+
+ for (String instanceIp : activeIpArray) {
+ String command =
+ CarbonUtils.getCarbonHome() + File.separator + "bin" +
+ File.separator + "update-instance.sh " +
+ instanceIp + " " + appPath + " " +
+ cartridgePrivateKey + " /";
+ log.info("Update instance command.... " + command);
+ Process proc = Runtime.getRuntime().exec(command);
+ proc.waitFor();
+ }
+
+ } catch (Exception e) {
+ log.error("Exception is occurred in notify update operation. Reason : " +
+ e.getMessage());
+ throw e;
+ }
+ }
+ }
+ }
+
+ private void createAndSendClusterMessage(int tenantId, String tenantDomain, UUID uuid,
+ String clusterDomain, String clusterSubdomain) {
+
+ SynchronizeGitRepositoryRequest request =
+ new SynchronizeGitRepositoryRequest(tenantId,
+ tenantDomain,
+ uuid);
+
+ ClusteringAgent clusteringAgent =
+ DataHolder.getServerConfigContext()
+ .getAxisConfiguration().getClusteringAgent();
+ GroupManagementAgent groupMgtAgent =
+ clusteringAgent.getGroupManagementAgent(clusterDomain,
+ clusterSubdomain);
+
+ try {
+ log.info("Sending Request to.. " + clusterDomain + " : " + clusterSubdomain);
+ groupMgtAgent.send(request);
+
+ } catch (ClusteringFault e) {
+ e.printStackTrace();
+ }
+
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/ac065d73/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepositoryInfoBean.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepositoryInfoBean.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepositoryInfoBean.java
new file mode 100644
index 0000000..7a6380c
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepositoryInfoBean.java
@@ -0,0 +1,78 @@
+/**
+ *
+ */
+package org.apache.stratos.adc.mgt.service;
+
+import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
+
+/**
+ * @author wso2
+ *
+ */
+public class RepositoryInfoBean {
+
+ private String repoURL;
+ private String cartridgeAlias;
+ private String tenantDomain;
+ private String userName;
+ private String password;
+ private String[] dirArray;
+ private CartridgeInfo cartridgeInfo;
+
+
+ public RepositoryInfoBean(String repoURL, String cartridgeAlias, String tenantDomain,
+ String userName, String password, String[] dirArray, CartridgeInfo cartridgeInfo) {
+ this.repoURL = repoURL;
+ this.cartridgeAlias = cartridgeAlias;
+ this.tenantDomain = tenantDomain;
+ this.userName = userName;
+ this.setPassword(password);
+ this.dirArray = dirArray;
+ this.cartridgeInfo = cartridgeInfo;
+ }
+ public String getRepoURL() {
+ return repoURL;
+ }
+ public void setRepoURL(String repoURL) {
+ this.repoURL = repoURL;
+ }
+ public String getCartridgeAlias() {
+ return cartridgeAlias;
+ }
+ public void setCartridgeAlias(String cartridgeAlias) {
+ this.cartridgeAlias = cartridgeAlias;
+ }
+ public String getTenantDomain() {
+ return tenantDomain;
+ }
+ public void setTenantDomain(String tenantDomain) {
+ this.tenantDomain = tenantDomain;
+ }
+ public String getUserName() {
+ return userName;
+ }
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+ public String[] getDirArray() {
+ return dirArray;
+ }
+ public void setDirArray(String[] dirArray) {
+ this.dirArray = dirArray;
+ }
+ public CartridgeInfo getCartridgeInfo() {
+ return cartridgeInfo;
+ }
+ public void setCartridgeInfo(CartridgeInfo cartridgeInfo) {
+ this.cartridgeInfo = cartridgeInfo;
+ }
+ public String getPassword() {
+ return password;
+ }
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/ac065d73/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepositoryInformationService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepositoryInformationService.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepositoryInformationService.java
new file mode 100644
index 0000000..ad7db58
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepositoryInformationService.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright WSO2, Inc. (http://wso2.com)
+ *
+ * Licensed 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.service;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.adc.mgt.dao.RepositoryCredentials;
+import org.apache.stratos.adc.mgt.utils.PersistenceManager;
+
+/**
+ *
+ * Exposes information related to internally created repositories
+ *
+ */
+public class RepositoryInformationService {
+
+ private static final Log log = LogFactory.getLog(RepositoryInformationService.class);
+
+ public String getRepositoryUrl(int tenantId, String cartridgeType) throws Exception {
+
+ String repoUrl = null;
+ try {
+ repoUrl = PersistenceManager.getRepoURL(tenantId, cartridgeType);
+ } catch (Exception e) {
+ String msg = "System Exception is occurred when retriving repo URL";
+ log.error(msg + ". Reason :" + e.getMessage());
+ throw new Exception(msg);
+ }
+ if (repoUrl == null) {
+ log.error("Repository URL is not successfully retrieved " + "for tenant [" + tenantId +
+ "] and cartridge [" + cartridgeType + "] ");
+ }
+ return repoUrl;
+ }
+
+ public RepositoryCredentials getRepositoryCredentials(int tenantId, String cartridgeType, String alias) throws Exception {
+
+ RepositoryCredentials repoCredentials = null;
+ try {
+ repoCredentials = PersistenceManager.getRepoCredentials(tenantId,cartridgeType, alias);
+ } catch (Exception e) {
+ String msg = "System Exception is occurred when retrieving user credentials";
+ log.error(msg + ". Reason :" + e.getMessage());
+ throw new Exception(msg);
+ }
+ if (repoCredentials == null) {
+ log.error("Repository credentials are not successfully retrieved " + "for tenant [" + tenantId +
+ "] and cartridge [" + cartridgeType + "] ");
+ }
+ return repoCredentials;
+ }
+}