Adding in tenant isolation into the mock rest endpoint
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/a76a4599 Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/a76a4599 Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/a76a4599 Branch: refs/heads/master Commit: a76a459945a42bc83f6d2255c2f88821f34613d5 Parents: 24c84ad Author: Shiro <[email protected]> Authored: Wed Sep 10 07:10:39 2014 +0530 Committer: Nirmal Fernando <[email protected]> Committed: Mon Sep 15 09:26:35 2014 +0530 ---------------------------------------------------------------------- .../org.apache.stratos.rest.endpoint/as.json | 26 -- .../endpoint/handlers/StratosMockHandler.java | 146 +++++++ .../stratos/rest/endpoint/mock/MockContext.java | 402 +++++++++++++------ .../rest/endpoint/mock/StratosTestAdmin.java | 28 +- .../webapp/stratos-test/WEB-INF/cxf-servlet.xml | 2 + 5 files changed, 456 insertions(+), 148 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/a76a4599/components/org.apache.stratos.rest.endpoint/as.json ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.rest.endpoint/as.json b/components/org.apache.stratos.rest.endpoint/as.json deleted file mode 100644 index 5aaae67..0000000 --- a/components/org.apache.stratos.rest.endpoint/as.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "id": "simpleAutoscalePolicy2", - "loadThresholds": { - "requestsInFlight": { - "average": "20", - "gradient": "0", - "secondDerivative": "0", - "scaleDownMarginOfGradient": "1.0", - "scaleDownMarginOfSecondDerivative": "0.2" - }, - "memoryConsumption": { - "average": "1000", - "gradient": "0", - "secondDerivative": "0", - "scaleDownMarginOfGradient": "1.0", - "scaleDownMarginOfSecondDerivative": "0.2" - }, - "loadAverage": { - "average": "1000", - "gradient": "0", - "secondDerivative": "0", - "scaleDownMarginOfGradient": "1.0", - "scaleDownMarginOfSecondDerivative": "0.2" - } - } -} http://git-wip-us.apache.org/repos/asf/stratos/blob/a76a4599/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/handlers/StratosMockHandler.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/handlers/StratosMockHandler.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/handlers/StratosMockHandler.java new file mode 100644 index 0000000..6c04de1 --- /dev/null +++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/handlers/StratosMockHandler.java @@ -0,0 +1,146 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.stratos.rest.endpoint.handlers; + +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.cxf.configuration.security.AuthorizationPolicy; +import org.apache.cxf.jaxrs.ext.RequestHandler; +import org.apache.cxf.jaxrs.model.ClassResourceInfo; +import org.apache.cxf.message.Message; +import org.apache.cxf.security.SecurityContext; +import org.apache.stratos.rest.endpoint.ServiceHolder; +import org.apache.stratos.rest.endpoint.Utils; +import org.apache.stratos.rest.endpoint.context.AuthenticationContext; +import org.apache.stratos.rest.endpoint.exception.RestAPIException; +import org.apache.stratos.rest.endpoint.security.StratosSecurityContext; +import org.wso2.carbon.context.PrivilegedCarbonContext; +import org.wso2.carbon.core.common.AuthenticationException; +import org.wso2.carbon.core.util.AnonymousSessionUtil; +import org.wso2.carbon.registry.core.service.RegistryService; +import org.wso2.carbon.user.api.UserRealm; +import org.wso2.carbon.user.core.service.RealmService; +import org.wso2.carbon.utils.multitenancy.MultitenantUtils; + +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.util.List; + +/** + * Here we are doing the request authentication within a {@link RequestHandler}. The request handlers + * are get invoked just before the actual method invocation. This authentication handler make use + * of HTTP basic auth headers as the authentication mechanism. + */ +public class StratosMockHandler extends AbstractAuthenticationAuthorizationHandler { + private static Log log = LogFactory.getLog(StratosAuthenticationHandler.class); + private static String SUPPORTED_AUTHENTICATION_TYPE = "Basic"; + + public boolean canHandle(String authHeaderPrefix){ + return SUPPORTED_AUTHENTICATION_TYPE.equals(authHeaderPrefix); + } + + /** + * Authenticate the user against the user store. Once authenticate, populate the {@link org.wso2.carbon.context.CarbonContext} + * to be used by the downstream code. + * @param message + * @param classResourceInfo + * @return + */ + public Response handle(Message message, ClassResourceInfo classResourceInfo) { + // If Mutual SSL is enabled + HttpServletRequest request = (HttpServletRequest) message.get("HTTP.REQUEST"); + Object certObject = request.getAttribute("javax.servlet.request.X509Certificate"); + + AuthorizationPolicy policy = (AuthorizationPolicy) message.get(AuthorizationPolicy.class); + String username = policy.getUserName().trim(); + String password = policy.getPassword().trim(); + + //sanity check + if ((username == null) || username.equals("")) { + log.error("username is seen as null/empty values."); + return Response.status(Response.Status.UNAUTHORIZED) + .header("WWW-Authenticate", "Basic").type(MediaType.APPLICATION_JSON) + .entity(Utils.buildMessage("Username cannot be null")).build(); + } else if (certObject == null && ((password == null) || password.equals(""))) { + log.error("password is seen as null/empty values."); + return Response.status(Response.Status.UNAUTHORIZED) + .header("WWW-Authenticate", "Basic").type(MediaType.APPLICATION_JSON) + .entity(Utils.buildMessage("password cannot be null")).build(); + } + + try { + // setting the correct tenant info for downstream code.. + PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext(); + carbonContext.setUsername(username); + + return null; + /*RealmService realmService = ServiceHolder.getRealmService(); + RegistryService registryService = ServiceHolder.getRegistryService(); + String tenantDomain = MultitenantUtils.getTenantDomain(username); + int tenantId = realmService.getTenantManager().getTenantId(tenantDomain); + + UserRealm userRealm = null; + if (certObject == null) { + userRealm = AnonymousSessionUtil.getRealmByTenantDomain(registryService, realmService, tenantDomain); + if (userRealm == null) { + log .error("Invalid domain or unactivated tenant login"); + // is this the correct HTTP code for this scenario ? (401) + return Response.status(Response.Status.UNAUTHORIZED).header("WWW-Authenticate", "Basic"). + type(MediaType.APPLICATION_JSON).entity(Utils.buildMessage("Tenant not found")).build(); + } + } + username = MultitenantUtils.getTenantAwareUsername(username); + if (certObject != null || userRealm.getUserStoreManager().authenticate(username, password)) { // if authenticated + + // setting the correct tenant info for downstream code.. + PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext(); + carbonContext.setTenantDomain(tenantDomain); + carbonContext.setTenantId(tenantId); + carbonContext.setUsername(username); + //populate the secuirtyContext of authenticated user + SecurityContext securityContext = new StratosSecurityContext(username); + message.put(SecurityContext.class, securityContext); + + // set the authenticated flag and let the request to continue + AuthenticationContext.setAuthenticated(true); + if (log.isDebugEnabled()) { + log.debug("authenticated using the " + CookieBasedAuthenticationHandler.class.getName() + "for username :" + + username + "tenantDomain : " + tenantDomain + " tenantId : " + tenantId); + } + return null; + } else { + log.warn("unable to authenticate the request"); + // authentication failed, request the authetication, add the realm name if needed to the value of WWW-Authenticate + return Response.status(Response.Status.UNAUTHORIZED).header("WWW-Authenticate", "Basic"). + type(MediaType.APPLICATION_JSON).entity(Utils.buildMessage("Authentication failed. Please " + + "check your username/password")).build(); + }*/ + } catch (Exception exception) { + log.error("Authentication failed",exception); + // server error in the eyes of the client. Hence 5xx HTTP code. + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).type(MediaType.APPLICATION_JSON). + entity(Utils.buildMessage("Unexpected error. Please contact the system admin")).build(); + } + + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/a76a4599/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/mock/MockContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/mock/MockContext.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/mock/MockContext.java index 7046f70..84f8931 100644 --- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/mock/MockContext.java +++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/mock/MockContext.java @@ -35,27 +35,29 @@ import org.apache.stratos.rest.endpoint.bean.subscription.domain.SubscriptionDom import org.apache.stratos.rest.endpoint.bean.topology.Cluster; import org.apache.stratos.rest.endpoint.bean.util.converter.PojoConverter; import org.apache.stratos.rest.endpoint.exception.RestAPIException; - +import org.wso2.carbon.context.CarbonContext; import java.util.*; import javax.ws.rs.core.Response.Status; public class MockContext { private static MockContext mockContext = new MockContext(); // singleton + private Map<String, List<SubscriptionDomain>> subscriptionAliasToDomainMap = new HashMap<String, List<SubscriptionDomain>>(); private Map<Integer, List<String>> tenantIdToAliasesMap = new HashMap<Integer, List<String>>(); - private List<CartridgeDefinitionBean> cartridgeDefinitionBeanList = new LinkedList<CartridgeDefinitionBean>(); - private Map<String,Cartridge> availableSingleTenantCartridges = new HashMap<String,Cartridge>(); - private Map<String,Cartridge> availableMultiTenantCartridges = new HashMap<String,Cartridge>(); - private Map<String,Cartridge> subscribedCartridges = new HashMap<String,Cartridge>(); + private Map<Integer, List<CartridgeDefinitionBean>> cartridgeDefinitionBeanList = new HashMap<Integer, List<CartridgeDefinitionBean>>(); + private Map<Integer, Map<String,Cartridge>> availableSingleTenantCartridges = new HashMap<Integer, Map<String,Cartridge>>(); + private Map<Integer, Map<String,Cartridge>> availableMultiTenantCartridges = new HashMap<Integer, Map<String,Cartridge>>(); + private Map<Integer, Map<String,Cartridge>> subscribedCartridges = new HashMap<Integer, Map<String,Cartridge>>(); private Map<String,TenantInfoBean> tenantMap = new HashMap<String, TenantInfoBean>(); - private Map<String,Partition> partitionMap = new HashMap<String, Partition>(); - private Map<String,AutoscalePolicy> autoscalePolicyMap = new HashMap<String, AutoscalePolicy>(); - private Map<String,DeploymentPolicy> deploymentPolicyMap = new HashMap<String, DeploymentPolicy>(); - private Map<String,ServiceDefinitionBean> serviceDefinitionMap = new HashMap<String, ServiceDefinitionBean>(); + private Map<String, Integer> tenantIdMap = new HashMap<String, Integer>(); + private Map<Integer, Map<String,Partition>> partitionMap = new HashMap<Integer, Map<String, Partition>>(); + private Map<Integer, Map<String,AutoscalePolicy>> autoscalePolicyMap = new HashMap<Integer, Map<String, AutoscalePolicy>>(); + private Map<Integer, Map<String,DeploymentPolicy>> deploymentPolicyMap = new HashMap<Integer, Map<String, DeploymentPolicy>>(); + private Map<Integer, Map<String,ServiceDefinitionBean>> serviceDefinitionMap = new HashMap<Integer, Map<String, ServiceDefinitionBean>>(); private Map<String,Cluster> clusterMap = new HashMap<String, Cluster>(); - - private Set<Cartridge> temp = new HashSet<Cartridge>(); + + private int tenantIdCount=1; private MockContext(){} // do not allow to initialize @@ -64,10 +66,19 @@ public class MockContext { return mockContext; } - public StratosAdminResponse addCartirdgeDefinition(CartridgeDefinitionBean cartridgeDefinitionBean){ - this.cartridgeDefinitionBeanList.add(cartridgeDefinitionBean); - Cartridge cartridge = new Cartridge(); + int tenantId = getTenantId(); + List<CartridgeDefinitionBean> tenantCartridges; + if(this.cartridgeDefinitionBeanList.containsKey(tenantId)){ + tenantCartridges = this.cartridgeDefinitionBeanList.get(tenantId); + } + else{ + tenantCartridges = new LinkedList<CartridgeDefinitionBean>(); + this.cartridgeDefinitionBeanList.put(tenantId, tenantCartridges); + } + tenantCartridges.add(cartridgeDefinitionBean); + + Cartridge cartridge = new Cartridge(); cartridge.setCartridgeType(cartridgeDefinitionBean.type); cartridge.setDescription(cartridgeDefinitionBean.description); cartridge.setDisplayName(cartridgeDefinitionBean.displayName); @@ -75,30 +86,51 @@ public class MockContext { cartridge.setProvider(cartridgeDefinitionBean.provider); cartridge.setVersion(cartridgeDefinitionBean.version); + Map<String,Cartridge> cartridges; if(cartridge.isMultiTenant()){ - availableMultiTenantCartridges.put(cartridge.getCartridgeType(), cartridge); + if(this.availableMultiTenantCartridges.containsKey(tenantId)){ + cartridges = availableMultiTenantCartridges.get(tenantId); + } + else{ + cartridges = new HashMap<String,Cartridge>(); + this.availableMultiTenantCartridges.put(tenantId, cartridges); + } + cartridges.put(cartridge.getCartridgeType(), cartridge); + System.out.println(cartridges.size()); }else{ - availableSingleTenantCartridges.put(cartridge.getCartridgeType(), cartridge); + if(this.availableSingleTenantCartridges.containsKey(tenantId)){ + cartridges = availableMultiTenantCartridges.get(tenantId); + } + else{ + cartridges = new HashMap<String,Cartridge>(); + this.availableSingleTenantCartridges.put(tenantId, cartridges); + } + cartridges.put(cartridge.getCartridgeType(), cartridge); + System.out.println(cartridges.size()); } - System.out.println(availableMultiTenantCartridges.size()); - System.out.println(availableSingleTenantCartridges.size()); + StratosAdminResponse stratosAdminResponse = new StratosAdminResponse(); - stratosAdminResponse.setMessage("Successfully deployed deployment policy definition with type "); + stratosAdminResponse.setMessage("Successfully deployed cartridge definition with type "); return stratosAdminResponse; } public Cartridge[] getAvailableMultiTenantCartridges() throws RestAPIException{ - return availableMultiTenantCartridges.values().toArray(new Cartridge[0]); + if(!this.availableMultiTenantCartridges.containsKey(getTenantId())){ + return new HashMap<String, Cartridge>().values().toArray(new Cartridge[0]); + } + return this.availableMultiTenantCartridges.get(getTenantId()).values().toArray(new Cartridge[0]); } public Cartridge[] getAvailableSingleTenantCartridges() throws RestAPIException{ - return availableSingleTenantCartridges.values().toArray(new Cartridge[0]); + if(!this.availableSingleTenantCartridges.containsKey(getTenantId())){ + return new HashMap<String, Cartridge>().values().toArray(new Cartridge[0]); + } + return this.availableSingleTenantCartridges.get(getTenantId()).values().toArray(new Cartridge[0]); } - public Cartridge[] getAvailableLbCartridges() throws RestAPIException{ /*Map<String,Cartridge> availableLbCartridges = new HashMap<String,Cartridge>(); Iterator it = availableSingleTenantCartridges.entrySet().iterator(); @@ -121,7 +153,8 @@ public class MockContext { it.remove(); } return availableLbCartridges.values().toArray(new Cartridge[0]);*/ - return availableSingleTenantCartridges.values().toArray(new Cartridge[0]); + //return availableSingleTenantCartridges.values().toArray(new Cartridge[0]); + return getAvailableSingleTenantCartridges(); } public Cartridge[] getAvailableCartridges() throws RestAPIException{ @@ -147,65 +180,131 @@ public class MockContext { } System.out.println(availableCartridges.size()); return availableCartridges.values().toArray(new Cartridge[0]);*/ - return availableSingleTenantCartridges.values().toArray(new Cartridge[0]); + //return availableSingleTenantCartridges.values().toArray(new Cartridge[0]); + return getAvailableSingleTenantCartridges(); } public Cartridge[] getSubscribedCartridges() throws RestAPIException{ - return subscribedCartridges.values().toArray(new Cartridge[0]); + if(!this.subscribedCartridges.containsKey(getTenantId())){ + return new HashMap<String, Cartridge>().values().toArray(new Cartridge[0]); + } + return (subscribedCartridges.get(getTenantId())).values().toArray(new Cartridge[0]); } public SubscriptionInfo subscribeToCartridge(CartridgeInfoBean cartridgeInfoBean) throws RestAPIException{ - String cartridgeType = cartridgeInfoBean.getCartridgeType(); - String alias = cartridgeInfoBean.getAlias(); - Cartridge subscribedCartridge; - // retrieve the cartridge from available ones - if(availableSingleTenantCartridges.containsKey(cartridgeType)){ - subscribedCartridge = availableSingleTenantCartridges.get(cartridgeType); - - }else if(availableMultiTenantCartridges.containsKey(cartridgeType)){ - subscribedCartridge = availableMultiTenantCartridges.get(cartridgeType); - }else { - String msg = "Wrong programme sequence"; - throw new RestAPIException(msg); - } - //Proper way is copy construrctor - Cartridge copy = new Cartridge(); - copy.setCartridgeType(subscribedCartridge.getCartridgeType()); - copy.setDescription(subscribedCartridge.getDescription()); - copy.setDisplayName(subscribedCartridge.getDisplayName()); - copy.setMultiTenant(subscribedCartridge.isMultiTenant()); - copy.setProvider(subscribedCartridge.getProvider()); - copy.setVersion(subscribedCartridge.getVersion()); - copy.setCartridgeAlias(alias); - copy.setHostName("dummy.stratos.com"); - copy.setRepoURL("http://dummy.stratos.com/myrepo.git"); - - subscribedCartridges.put(alias,copy); + int tenantId = this.getTenantId(); + String cartridgeType = cartridgeInfoBean.getCartridgeType(); + String alias = cartridgeInfoBean.getAlias(); + Cartridge subscribedCartridge=null; + // retrieve the cartridge from available ones for specific tenant + if(availableMultiTenantCartridges.containsKey(tenantId)){ + if((availableMultiTenantCartridges.get(tenantId)).containsKey(cartridgeType)){ + subscribedCartridge = (availableMultiTenantCartridges.get(tenantId)).get(cartridgeType); + } + } + else if(availableSingleTenantCartridges.containsKey(tenantId)){ + if((availableSingleTenantCartridges.get(tenantId)).containsKey(cartridgeType)){ + subscribedCartridge = (availableSingleTenantCartridges.get(tenantId)).get(cartridgeType); + } + }else{ + throw new RestAPIException(Status.NO_CONTENT,"Cartridge not defined"); + } + + if(subscribedCartridge!=null){ + //Proper way is copy constructor + Cartridge copy = new Cartridge(); + copy.setCartridgeType(subscribedCartridge.getCartridgeType()); + copy.setDescription(subscribedCartridge.getDescription()); + copy.setDisplayName(subscribedCartridge.getDisplayName()); + copy.setMultiTenant(subscribedCartridge.isMultiTenant()); + copy.setProvider(subscribedCartridge.getProvider()); + copy.setVersion(subscribedCartridge.getVersion()); + copy.setCartridgeAlias(alias); + copy.setHostName("dummy.stratos.com"); + copy.setRepoURL("http://dummy.stratos.com/myrepo.git"); + + Map<String,Cartridge> subscriptions; + if(subscribedCartridges.containsKey(tenantId)){ + (subscribedCartridges.get(tenantId)).put(alias,copy); + } + else{ + subscriptions = new HashMap<String,Cartridge>(); + subscriptions.put(alias, copy); + subscribedCartridges.put(tenantId, subscriptions); + } + + SubscriptionInfo subscriptionInfo = new SubscriptionInfo(); + subscriptionInfo.setHostname(copy.getHostName()); + subscriptionInfo.setRepositoryURL(copy.getRepoURL()); - SubscriptionInfo subscriptionInfo = new SubscriptionInfo(); - subscriptionInfo.setHostname(copy.getHostName()); - subscriptionInfo.setRepositoryURL(copy.getRepoURL()); + return subscriptionInfo; + } + + return new SubscriptionInfo(); - return subscriptionInfo; } public StratosAdminResponse unsubscribe(String alias) throws RestAPIException{ - if(subscribedCartridges.containsKey(alias)){ - subscribedCartridges.remove(alias); + if(subscribedCartridges.containsKey(getTenantId())){ + if((subscribedCartridges.get(getTenantId())).containsKey(alias)){ + (subscribedCartridges.get(getTenantId())).remove(alias); + } }else{ - throw new RestAPIException("Unable to un-subscribe"); + throw new RestAPIException(Status.NO_CONTENT,"Unable to un-subscribe"); } StratosAdminResponse stratosAdminResponse = new StratosAdminResponse(); stratosAdminResponse.setMessage("Successfully un-subscribed"); return stratosAdminResponse; } + public Cartridge getCartridgeInfo(String alias) throws RestAPIException{ + if(!subscribedCartridges.containsKey(getTenantId())) + throw new RestAPIException(Status.NO_CONTENT, "No cartridges subscribed for current tenant."); + + if(!(subscribedCartridges.get(getTenantId())).containsKey(alias)) + throw new RestAPIException(Status.NO_CONTENT,"Cartridge information is not available."); + + return (subscribedCartridges.get(getTenantId())).get(alias); + } + + public Cartridge getAvailableSingleTenantCartridgeInfo(String cartridgeType) throws RestAPIException{ + if(!availableSingleTenantCartridges.containsKey(getTenantId())) + throw new RestAPIException(Status.NO_CONTENT,"No cartridges defined for current tenant"); + + if(!(availableSingleTenantCartridges.get(getTenantId())).containsKey(cartridgeType)) + throw new RestAPIException(Status.NO_CONTENT,"Cartridge is not available."); + + return (availableSingleTenantCartridges.get(getTenantId())).get(cartridgeType); + } + + public StratosAdminResponse deleteCartridgeDefinition(String cartridgeType) throws RestAPIException{ + if((!availableSingleTenantCartridges.containsKey(getTenantId())) && (!availableMultiTenantCartridges.containsKey(getTenantId()))) + throw new RestAPIException(Status.NO_CONTENT,"No cartridges defined for tenant"); + + if(availableSingleTenantCartridges.containsKey(getTenantId())){ + if((availableSingleTenantCartridges.get(getTenantId())).containsKey(cartridgeType)){ + (availableSingleTenantCartridges.get(getTenantId())).remove(cartridgeType); + } + } else if(availableMultiTenantCartridges.containsKey(getTenantId())){ + if((availableMultiTenantCartridges.get(getTenantId())).containsKey(cartridgeType)){ + (availableMultiTenantCartridges.get(getTenantId())).remove(cartridgeType); + } + } else{ + throw new RestAPIException(Status.BAD_REQUEST,"invalid cartridge type"); + } + StratosAdminResponse stratosAdminResponse = new StratosAdminResponse(); + stratosAdminResponse.setMessage("Successfully delete cartridge definition"); + return stratosAdminResponse; + } + public StratosAdminResponse addTenant(TenantInfoBean tenantInfoBean) throws RestAPIException{ try{ tenantMap.put(tenantInfoBean.getTenantDomain(),tenantInfoBean); + tenantInfoBean.setTenantId(tenantIdCount); + tenantIdMap.put(tenantInfoBean.getAdmin(), tenantIdCount++); }catch (Exception e){ - throw new RestAPIException(e.getMessage()); + throw new RestAPIException(Status.INTERNAL_SERVER_ERROR,e.getMessage()); } StratosAdminResponse stratosAdminResponse = new StratosAdminResponse(); stratosAdminResponse.setMessage("Successfully added new Tenant"); @@ -214,34 +313,25 @@ public class MockContext { public TenantInfoBean getTenant(String tenantDomain) throws RestAPIException{ if(!tenantMap.containsKey(tenantDomain)){ - throw new RestAPIException("Information for tenant: " + tenantDomain + " is not available"); + throw new RestAPIException(Status.NO_CONTENT,"Information for tenant: " + tenantDomain + " is not available"); } return tenantMap.get(tenantDomain); } - - public Cartridge getCartridgeInfo(String alias) throws RestAPIException{ - if(!subscribedCartridges.containsKey(alias)){ - throw new RestAPIException("Cartridge information is not available."); - } - return subscribedCartridges.get(alias); - } - - public Cartridge getAvailableSingleTenantCartridgeInfo(String cartridgeType) throws RestAPIException{ - if(!availableSingleTenantCartridges.containsKey(cartridgeType)){ - throw new RestAPIException("Cartridge is not available."); - } - return availableSingleTenantCartridges.get(cartridgeType); - } - + public StratosAdminResponse deleteTenant(String tenantDomain) { - tenantMap.remove(tenantDomain); + if(tenantMap.containsKey(tenantDomain)){ + TenantInfoBean tenant=tenantMap.get(tenantDomain); + tenantMap.remove(tenantDomain); + tenantIdMap.remove(tenant.getTenantId()); + } + StratosAdminResponse stratosAdminResponse = new StratosAdminResponse(); stratosAdminResponse.setMessage("Successfully deleted tenant"); return stratosAdminResponse; } public TenantInfoBean[] getTenants() throws RestAPIException{ - return tenantMap.values().toArray(new TenantInfoBean[0]); + return tenantMap.values().toArray(new TenantInfoBean[0]); } public TenantInfoBean[] retrievePartialSearchTenants(String searchDomain) throws RestAPIException{ @@ -258,7 +348,7 @@ public class MockContext { if(tenantMap.containsKey(tenantDomain)){ tenantMap.get(tenantDomain).setActive(true); } else{ - throw new RestAPIException("Invalid tenant domain"); + throw new RestAPIException(Status.BAD_REQUEST,"Invalid tenant domain"); } StratosAdminResponse stratosAdminResponse = new StratosAdminResponse(); stratosAdminResponse.setMessage("Successfully activated Tenant"); @@ -269,130 +359,193 @@ public class MockContext { if(tenantMap.containsKey(tenantDomain)){ tenantMap.get(tenantDomain).setActive(false); } else{ - throw new RestAPIException("Invalid tenant domain"); + throw new RestAPIException(Status.BAD_REQUEST,"Invalid tenant domain"); } StratosAdminResponse stratosAdminResponse = new StratosAdminResponse(); stratosAdminResponse.setMessage("Successfully deactivated Tenant"); return stratosAdminResponse; } - public StratosAdminResponse deleteCartridgeDefinition(String cartridgeType) throws RestAPIException{ - if(availableSingleTenantCartridges.containsKey(cartridgeType)){ - availableSingleTenantCartridges.remove(cartridgeType); - } else if(availableMultiTenantCartridges.containsKey(cartridgeType)){ - availableMultiTenantCartridges.remove(cartridgeType); - } else{ - throw new RestAPIException("invalid cartridge type"); - } - StratosAdminResponse stratosAdminResponse = new StratosAdminResponse(); - stratosAdminResponse.setMessage("Successfully delete cartridge definition"); - return stratosAdminResponse; - } - public StratosAdminResponse addPartition(Partition partition) { - partitionMap.put(partition.id, partition); + Map<String,Partition> partitions; + if (partitionMap.containsKey(getTenantId())){ + partitions = partitionMap.get(getTenantId()); + } + else{ + partitions = new HashMap<String, Partition>(); + partitionMap.put(getTenantId(), partitions); + } + partitions.put(partition.id, partition); StratosAdminResponse stratosAdminResponse = new StratosAdminResponse(); stratosAdminResponse.setMessage("Successfully deployed partition"); return stratosAdminResponse; } public StratosAdminResponse addAutoScalingPolicyDefinition(AutoscalePolicy autoscalePolicy) { - autoscalePolicyMap.put(autoscalePolicy.getId(), autoscalePolicy); + Map<String,AutoscalePolicy> policies; + if (autoscalePolicyMap.containsKey(getTenantId())){ + policies = autoscalePolicyMap.get(getTenantId()); + } + else{ + policies = new HashMap<String, AutoscalePolicy>(); + autoscalePolicyMap.put(getTenantId(), policies); + } + policies.put(autoscalePolicy.getId(), autoscalePolicy); StratosAdminResponse stratosAdminResponse = new StratosAdminResponse(); stratosAdminResponse.setMessage("Successfully deployed auto scaling policy definition"); return stratosAdminResponse; } public StratosAdminResponse addDeploymentPolicyDefinition(DeploymentPolicy deploymentPolicy) { - deploymentPolicyMap.put(deploymentPolicy.id,deploymentPolicy); + Map<String,DeploymentPolicy> policies; + if (deploymentPolicyMap.containsKey(getTenantId())){ + policies = deploymentPolicyMap.get(getTenantId()); + } + else{ + policies = new HashMap<String, DeploymentPolicy>(); + deploymentPolicyMap.put(getTenantId(), policies); + } + policies.put(deploymentPolicy.id,deploymentPolicy); StratosAdminResponse stratosAdminResponse = new StratosAdminResponse(); stratosAdminResponse.setMessage("Successfully deployed deployment policy definition"); return stratosAdminResponse; } public Partition[] getPartitions() throws RestAPIException{ - return partitionMap.values().toArray(new Partition[0]); + if(!partitionMap.containsKey(getTenantId())){ + return new HashMap<String,Partition>().values().toArray(new Partition[0]); + } + return (partitionMap.get(getTenantId())).values().toArray(new Partition[0]); } public Partition getPartition(String partitionId) throws RestAPIException{ - if(!partitionMap.containsKey(partitionId)){ + if(!partitionMap.containsKey(getTenantId())) + throw new RestAPIException(Status.NO_CONTENT,"No partitions have been defined for the tenant"); + + if(!(partitionMap.get(getTenantId())).containsKey(partitionId)){ throw new RestAPIException("There is no partition with the id: " + partitionId); } - return partitionMap.get(partitionId); + return (partitionMap.get(getTenantId())).get(partitionId); } public Partition[] getPartitionsOfPolicy(String deploymentPolicyId) throws RestAPIException{ - if(!deploymentPolicyMap.containsKey(deploymentPolicyId)){ - throw new RestAPIException("There is no deployment policy with id: " + deploymentPolicyId); + if(!deploymentPolicyMap.containsKey(getTenantId())) + throw new RestAPIException(Status.NO_CONTENT,"No deployment policies have been defined for tenant"); + + if(!(deploymentPolicyMap.get(getTenantId())).containsKey(deploymentPolicyId)){ + throw new RestAPIException(Status.NO_CONTENT,"There is no deployment policy with id: " + deploymentPolicyId); } - return deploymentPolicyMap.get(deploymentPolicyId).partition.toArray(new Partition[0]); + return (deploymentPolicyMap.get(getTenantId())).get(deploymentPolicyId).partition.toArray(new Partition[0]); } public PartitionGroup[] getPartitionGroups(String deploymentPolicyId) throws RestAPIException{ - if(!deploymentPolicyMap.containsKey(deploymentPolicyId)){ - throw new RestAPIException("There is no policy with id: " + deploymentPolicyId); + if(!deploymentPolicyMap.containsKey(getTenantId())) + throw new RestAPIException(Status.NO_CONTENT,"No deployment policies have been defined for tenant"); + + if(!(deploymentPolicyMap.get(getTenantId())).containsKey(deploymentPolicyId)){ + throw new RestAPIException(Status.NO_CONTENT,"There is no policy with id: " + deploymentPolicyId); } - return deploymentPolicyMap.get(deploymentPolicyId).partitionGroup.toArray(new PartitionGroup[0]); + return (deploymentPolicyMap.get(getTenantId())).get(deploymentPolicyId).partitionGroup.toArray(new PartitionGroup[0]); } public AutoscalePolicy[] getAutoscalePolicies() throws RestAPIException{ - return autoscalePolicyMap.values().toArray(new AutoscalePolicy[0]); + if(!autoscalePolicyMap.containsKey(getTenantId())){ + return new HashMap<String,AutoscalePolicy>().values().toArray(new AutoscalePolicy[0]); + } + return (autoscalePolicyMap.get(getTenantId())).values().toArray(new AutoscalePolicy[0]); } public AutoscalePolicy getAutoscalePolicies(String autoscalePolicyId) throws RestAPIException{ - if(!autoscalePolicyMap.containsKey(autoscalePolicyId)){ + if(!autoscalePolicyMap.containsKey(getTenantId())) + throw new RestAPIException(Status.NO_CONTENT,"No autoscaling policies have been defined for tenant"); + + if(!(autoscalePolicyMap.get(getTenantId())).containsKey(autoscalePolicyId)){ throw new RestAPIException("There is no auto scale policy with id: " + autoscalePolicyId); } - return autoscalePolicyMap.get(autoscalePolicyId); + return (autoscalePolicyMap.get(getTenantId())).get(autoscalePolicyId); } public DeploymentPolicy[] getDeploymentPolicies() throws RestAPIException{ - return deploymentPolicyMap.values().toArray(new DeploymentPolicy[0]); + if(!deploymentPolicyMap.containsKey(getTenantId())){ + return new HashMap<String,DeploymentPolicy>().values().toArray(new DeploymentPolicy[0]); + } + + return (deploymentPolicyMap.get(getTenantId())).values().toArray(new DeploymentPolicy[0]); } public DeploymentPolicy getDeploymentPolicies(String deploymentPolicyId) throws RestAPIException{ - if(!deploymentPolicyMap.containsKey(deploymentPolicyId)){ + if(!deploymentPolicyMap.containsKey(getTenantId())) + throw new RestAPIException("No deployment policies have been defined for tenant"); + + if(!(deploymentPolicyMap.get(getTenantId())).containsKey(deploymentPolicyId)){ throw new RestAPIException("There is no deployment policy with id: " + deploymentPolicyId); } - return deploymentPolicyMap.get(deploymentPolicyId); + return (deploymentPolicyMap.get(getTenantId())).get(deploymentPolicyId); } + public StratosAdminResponse deployService(ServiceDefinitionBean serviceDefinitionBean) { - serviceDefinitionMap.put(serviceDefinitionBean.getCartridgeType(),serviceDefinitionBean); + Map<String,ServiceDefinitionBean> serviceDefinitions; + + if(!serviceDefinitionMap.containsKey(getTenantId())){ + serviceDefinitions = new HashMap<String,ServiceDefinitionBean>(); + serviceDefinitionMap.put(getTenantId(), serviceDefinitions); + } + else{ + serviceDefinitions = serviceDefinitionMap.get(getTenantId()); + } + + serviceDefinitions.put(serviceDefinitionBean.getCartridgeType(),serviceDefinitionBean); StratosAdminResponse stratosAdminResponse = new StratosAdminResponse(); stratosAdminResponse.setMessage("Successfully deployed service"); return stratosAdminResponse; } + public ServiceDefinitionBean[] getServices() throws RestAPIException{ - return serviceDefinitionMap.values().toArray(new ServiceDefinitionBean[0]); + if(!serviceDefinitionMap.containsKey(getTenantId())){ + return new HashMap<String,ServiceDefinitionBean>().values().toArray(new ServiceDefinitionBean[0]); + } + return (serviceDefinitionMap.get(getTenantId())).values().toArray(new ServiceDefinitionBean[0]); } public ServiceDefinitionBean getServiceType(String serviceType) throws RestAPIException{ - return serviceDefinitionMap.get(serviceType); + if(!serviceDefinitionMap.containsKey(getTenantId())) + throw new RestAPIException(Status.NO_CONTENT,"No services have been defined for tenant"); + + return (serviceDefinitionMap.get(getTenantId())).get(serviceType); } public Partition[] getPartitions(String deploymentPolicyId, String partitionGroupId) throws RestAPIException{ - if(!deploymentPolicyMap.containsKey(deploymentPolicyId)){ - throw new RestAPIException("There is no deployment policy with id: " + deploymentPolicyId); + if(!deploymentPolicyMap.containsKey(getTenantId())) + throw new RestAPIException(Status.NO_CONTENT,"No deployment policies have been defined for tenant"); + + if(!(deploymentPolicyMap.get(getTenantId())).containsKey(deploymentPolicyId)){ + throw new RestAPIException(Status.NO_CONTENT,"There is no deployment policy with id: " + deploymentPolicyId); } + Partition[] partitions = null; - DeploymentPolicy deploymentPolicy = deploymentPolicyMap.get(deploymentPolicyId); + DeploymentPolicy deploymentPolicy = (deploymentPolicyMap.get(getTenantId())).get(deploymentPolicyId); for(PartitionGroup partitionGroup : deploymentPolicy.partitionGroup){ if(partitionGroup.id.equals(partitionGroupId)){ partitions = partitionGroup.partition.toArray(new Partition[0]); } } if(partitions == null){ - throw new RestAPIException("Partition not found"); + throw new RestAPIException(Status.NO_CONTENT,"Partition not found"); } return partitions; } + public Cluster[] getClusters() throws RestAPIException{ return clusterMap.values().toArray(new Cluster[0]); } + public DeploymentPolicy[] getDeploymentPoliciesForCartridgeType(String cartridgeType) throws RestAPIException{ - return deploymentPolicyMap.values().toArray(new DeploymentPolicy[0]); + if(!deploymentPolicyMap.containsKey(getTenantId())){ + return new HashMap<String,DeploymentPolicy>().values().toArray(new DeploymentPolicy[0]); + } + return (deploymentPolicyMap.get(getTenantId())).values().toArray(new DeploymentPolicy[0]); } public StratosAdminResponse addSubscriptionDomains(int tenantId, String alias, SubscriptionDomainRequest request) { @@ -467,12 +620,21 @@ public class MockContext { stratosAdminResponse.setMessage("Successfully removed the subscription domain: "+domainName); } } - } else { - + } else { stratosAdminResponse.setMessage("Failed to remove the subscription domain: "+domainName); } return stratosAdminResponse; } + + private int getTenantId() { + String userName = CarbonContext.getThreadLocalCarbonContext().getUsername(); + if (tenantIdMap.containsKey(userName)){ + return tenantIdMap.get(userName); + } + else { + return -1; + } + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/a76a4599/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/mock/StratosTestAdmin.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/mock/StratosTestAdmin.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/mock/StratosTestAdmin.java index d766ebd..5e878e1 100644 --- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/mock/StratosTestAdmin.java +++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/mock/StratosTestAdmin.java @@ -19,13 +19,20 @@ package org.apache.stratos.rest.endpoint.mock; +import java.net.URI; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.stratos.common.beans.TenantInfoBean; +import org.apache.stratos.common.exception.StratosException; +import org.apache.stratos.common.util.CommonUtil; import org.apache.stratos.manager.dto.Cartridge; import org.apache.stratos.manager.dto.SubscriptionInfo; import org.apache.stratos.manager.exception.ADCException; +import org.apache.stratos.manager.exception.ServiceDoesNotExistException; +import org.apache.stratos.manager.subscription.CartridgeSubscription; import org.apache.stratos.manager.subscription.SubscriptionDomain; +import org.apache.stratos.rest.endpoint.ServiceHolder; import org.apache.stratos.rest.endpoint.Utils; import org.apache.stratos.rest.endpoint.annotation.AuthorizationAction; import org.apache.stratos.rest.endpoint.annotation.SuperTenantService; @@ -42,6 +49,14 @@ import org.apache.stratos.rest.endpoint.bean.subscription.domain.SubscriptionDom import org.apache.stratos.rest.endpoint.bean.topology.Cluster; import org.apache.stratos.rest.endpoint.exception.RestAPIException; import org.apache.stratos.rest.endpoint.services.ServiceUtils; +import org.apache.stratos.tenant.mgt.core.TenantPersistor; +import org.apache.stratos.tenant.mgt.util.TenantMgtUtil; +import org.wso2.carbon.context.PrivilegedCarbonContext; +import org.wso2.carbon.context.RegistryType; +import org.wso2.carbon.registry.core.exceptions.RegistryException; +import org.wso2.carbon.registry.core.session.UserRegistry; +import org.wso2.carbon.user.core.tenant.Tenant; +import org.wso2.carbon.utils.multitenancy.MultitenantConstants; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; @@ -49,6 +64,7 @@ import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; @Path("/admin/") public class StratosTestAdmin { @@ -151,7 +167,7 @@ public class StratosTestAdmin { @AuthorizationAction("/permission/protected/manage/monitor/tenants") @SuperTenantService(true) public StratosAdminResponse addTenant(TenantInfoBean tenantInfoBean) throws RestAPIException { - return MockContext.getInstance().addTenant(tenantInfoBean); + return MockContext.getInstance().addTenant(tenantInfoBean); } @@ -191,7 +207,7 @@ public class StratosTestAdmin { @AuthorizationAction("/permission/protected/manage/monitor/tenants") @SuperTenantService(true) public TenantInfoBean[] retrieveTenants() throws RestAPIException { - return MockContext.getInstance().getTenants(); + return MockContext.getInstance().getTenants(); } @GET @@ -518,5 +534,13 @@ public class StratosTestAdmin { return MockContext.getInstance().removeSubscriptionDomain(2, subscriptionAlias, domainName); } + + @POST + @Path("/cartridge/sync") + @Consumes("application/json") + @AuthorizationAction("/permission/protected/manage/monitor/tenants") + public Response synchronizeRepository(String alias) throws RestAPIException { + return Response.noContent().build(); + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/a76a4599/components/org.apache.stratos.rest.endpoint/src/main/webapp/stratos-test/WEB-INF/cxf-servlet.xml ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.rest.endpoint/src/main/webapp/stratos-test/WEB-INF/cxf-servlet.xml b/components/org.apache.stratos.rest.endpoint/src/main/webapp/stratos-test/WEB-INF/cxf-servlet.xml index 7c9e7fd..7f326ab 100644 --- a/components/org.apache.stratos.rest.endpoint/src/main/webapp/stratos-test/WEB-INF/cxf-servlet.xml +++ b/components/org.apache.stratos.rest.endpoint/src/main/webapp/stratos-test/WEB-INF/cxf-servlet.xml @@ -38,6 +38,7 @@ <ref bean="badRequestExceptionHandler"/> <ref bean="jsonProvider"/> <ref bean="throwableExceptionHandler"/> + <ref bean="basicAuthenticationFilter"/> <bean class="org.apache.cxf.jaxrs.provider.json.JSONProvider"> <property name="dropRootElement" value="true"/> <property name="supportUnwrapped" value="true"/> @@ -47,6 +48,7 @@ </jaxrs:server> <bean id="stratosRestEndpointTestBean" class="org.apache.stratos.rest.endpoint.mock.StratosTestAdmin"/> + <bean id="basicAuthenticationFilter" class="org.apache.stratos.rest.endpoint.handlers.StratosMockHandler"/> <bean id="exceptionHandler" class="org.apache.stratos.rest.endpoint.handlers.CustomExceptionMapper"/> <bean id="badRequestExceptionHandler" class="org.apache.stratos.rest.endpoint.handlers.BadRequestExceptionMapper"/> <bean id="genericExceptionHandler" class="org.apache.stratos.rest.endpoint.handlers.GenericExceptionMapper"/>
