Tenant Isolation - Network Partition
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/d106e8f4 Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/d106e8f4 Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/d106e8f4 Branch: refs/heads/tenantisolation Commit: d106e8f47de393269f5d0c0738d4807dd9e3b18e Parents: f5c4c8e Author: Dinithi <[email protected]> Authored: Thu Jun 25 15:21:14 2015 +0530 Committer: Dinithi <[email protected]> Committed: Thu Jun 25 15:21:14 2015 +0530 ---------------------------------------------------------------------- .../controller/domain/NetworkPartition.java | 36 +- .../impl/CloudControllerServiceImpl.java | 26 +- .../beans/partition/NetworkPartitionBean.java | 18 + .../default/configure/network-partitions.json | 1 + .../schema/configure/network-partitions.json | 7 +- .../themes/theme0/partials/configure_form.hbs | 4 + .../rest/endpoint/api/StratosApiV41.java | 8 +- .../rest/endpoint/api/StratosApiV41Utils.java | 21 +- .../util/converter/ObjectConverter.java | 4 + .../main/resources/CloudControllerService.wsdl | 1020 +++++++++--------- 10 files changed, 613 insertions(+), 532 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/d106e8f4/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/NetworkPartition.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/NetworkPartition.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/NetworkPartition.java index 85b6179..8ac69f4 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/NetworkPartition.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/NetworkPartition.java @@ -32,13 +32,37 @@ public class NetworkPartition implements Serializable { private static final long serialVersionUID = -8043298009352097370L; + private String uuid; private String id; + private int tenantId; private String provider; private boolean activeByDefault; private Partition[] partitions; private String partitionAlgo; private Properties properties; + /** + * Gets the local Id of the network partition. + */ + public String getId() { + return id; + } + + /** + * Sets the local Id of the network partition. + */ + public void setId(String id) { + this.id = id; + } + + public int getTenantId() { + return tenantId; + } + + public void setTenantId(int tenantId) { + this.tenantId = tenantId; + } + public void setPartitions(Partition[] partitions) { if (partitions == null) { this.partitions = partitions; @@ -58,17 +82,17 @@ public class NetworkPartition implements Serializable { } /** - * Gets the value of the id. + * Gets the global Id network partition */ - public String getId() { - return id; + public String getUuid() { + return uuid; } /** - * sets the value of the id. + * Sets the global Id network partition */ - public void setId(String id) { - this.id = id; + public void setUuid(String uuid) { + this.uuid = uuid; } public boolean isActiveByDefault() { http://git-wip-us.apache.org/repos/asf/stratos/blob/d106e8f4/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java index 4d51cc1..801f41e 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java @@ -1453,13 +1453,13 @@ public class CloudControllerServiceImpl implements CloudControllerService { InvalidNetworkPartitionException { handleNullObject(networkPartition, "Network Partition is null"); - handleNullObject(networkPartition.getId(), "Network Partition ID is null"); + handleNullObject(networkPartition.getUuid(), "Network Partition ID is null"); if (log.isInfoEnabled()) { - log.info(String.format("Adding network partition: [network-partition-id] %s", networkPartition.getId())); + log.info(String.format("Adding network partition: [network-partition-id] %s", networkPartition.getUuid())); } - String networkPartitionID = networkPartition.getId(); + String networkPartitionID = networkPartition.getUuid(); if (cloudControllerContext.getNetworkPartition(networkPartitionID) != null) { String message = "Network partition already exists: [network-partition-id] " + networkPartitionID; log.error(message); @@ -1471,7 +1471,7 @@ public class CloudControllerServiceImpl implements CloudControllerService { if (partition != null) { if (log.isInfoEnabled()) { log.info(String.format("Validating partition: [network-partition-id] %s [partition-id] %s", - networkPartition.getId(), partition.getId())); + networkPartition.getUuid(), partition.getId())); } // Overwrites partition provider with network partition provider partition.setProvider(networkPartition.getProvider()); @@ -1481,18 +1481,18 @@ public class CloudControllerServiceImpl implements CloudControllerService { //Following message is shown to the end user in all the the API clients(GUI/CLI/Rest API) throw new InvalidNetworkPartitionException(String.format("Network partition " + " %s, is invalid since the partition %s is invalid", - networkPartition.getId(), partition.getId()), e); + networkPartition.getUuid(), partition.getId()), e); } if (log.isInfoEnabled()) { log.info(String.format("Partition validated successfully: [network-partition-id] %s " + - "[partition-id] %s", networkPartition.getId(), partition.getId())); + "[partition-id] %s", networkPartition.getUuid(), partition.getId())); } } } } else { //Following message is shown to the end user in all the the API clients(GUI/CLI/Rest API) throw new InvalidNetworkPartitionException(String.format("Network partition: " + - "%s doesn't not have any partitions ", networkPartition.getId())); + "%s doesn't not have any partitions ", networkPartition.getUuid())); } // adding network partition to CC-Context @@ -1501,7 +1501,7 @@ public class CloudControllerServiceImpl implements CloudControllerService { CloudControllerContext.getInstance().persist(); if (log.isInfoEnabled()) { log.info(String.format("Network partition added successfully: [network-partition-id] %s", - networkPartition.getId())); + networkPartition.getUuid())); } return true; } @@ -1540,10 +1540,10 @@ public class CloudControllerServiceImpl implements CloudControllerService { public boolean updateNetworkPartition(NetworkPartition networkPartition) throws NetworkPartitionNotExistsException { try { handleNullObject(networkPartition, "Network Partition is null"); - handleNullObject(networkPartition.getId(), "Network Partition ID is null"); + handleNullObject(networkPartition.getUuid(), "Network Partition ID is null"); if (log.isInfoEnabled()) { - log.info(String.format("Updating network partition: [network-partition-id] %s", networkPartition.getId())); + log.info(String.format("Updating network partition: [network-partition-id] %s", networkPartition.getUuid())); } String networkPartitionID = networkPartition.getId(); @@ -1558,14 +1558,14 @@ public class CloudControllerServiceImpl implements CloudControllerService { if (partition != null) { if (log.isInfoEnabled()) { log.info(String.format("Validating partition: [network-partition-id] %s [partition-id] %s", - networkPartition.getId(), partition.getId())); + networkPartition.getUuid(), partition.getId())); } // Overwrites partition provider with network partition provider partition.setProvider(networkPartition.getProvider()); validatePartition(partition); if (log.isInfoEnabled()) { log.info(String.format("Partition validated successfully: [network-partition-id] %s " + - "[partition-id] %s", networkPartition.getId(), partition.getId())); + "[partition-id] %s", networkPartition.getUuid(), partition.getId())); } } } @@ -1577,7 +1577,7 @@ public class CloudControllerServiceImpl implements CloudControllerService { CloudControllerContext.getInstance().persist(); if (log.isInfoEnabled()) { log.info(String.format("Network partition updated successfully: [network-partition-id] %s", - networkPartition.getId())); + networkPartition.getUuid())); } return true; } catch (Exception e) { http://git-wip-us.apache.org/repos/asf/stratos/blob/d106e8f4/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/beans/partition/NetworkPartitionBean.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/beans/partition/NetworkPartitionBean.java b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/beans/partition/NetworkPartitionBean.java index 3a31903..fe9305d 100644 --- a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/beans/partition/NetworkPartitionBean.java +++ b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/beans/partition/NetworkPartitionBean.java @@ -27,11 +27,29 @@ import java.util.List; @XmlRootElement public class NetworkPartitionBean { + private String uuid; + private int tenantId; private String id; private String provider; private List<PartitionBean> partitions; private List<PropertyBean> properties; + public int getTenantId() { + return tenantId; + } + + public void setTenantId(int tenantId) { + this.tenantId = tenantId; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + public String getId() { return id; } http://git-wip-us.apache.org/repos/asf/stratos/blob/d106e8f4/components/org.apache.stratos.manager.console/console/controllers/forms/default/configure/network-partitions.json ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.manager.console/console/controllers/forms/default/configure/network-partitions.json b/components/org.apache.stratos.manager.console/console/controllers/forms/default/configure/network-partitions.json index 0ad6424..70f2899 100644 --- a/components/org.apache.stratos.manager.console/console/controllers/forms/default/configure/network-partitions.json +++ b/components/org.apache.stratos.manager.console/console/controllers/forms/default/configure/network-partitions.json @@ -1,4 +1,5 @@ { + "uuid": "", "id": "network-partition-1", "provider": "mock", "partitions": [ http://git-wip-us.apache.org/repos/asf/stratos/blob/d106e8f4/components/org.apache.stratos.manager.console/console/controllers/forms/schema/configure/network-partitions.json ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.manager.console/console/controllers/forms/schema/configure/network-partitions.json b/components/org.apache.stratos.manager.console/console/controllers/forms/schema/configure/network-partitions.json index 22d781a..85bcfab 100644 --- a/components/org.apache.stratos.manager.console/console/controllers/forms/schema/configure/network-partitions.json +++ b/components/org.apache.stratos.manager.console/console/controllers/forms/schema/configure/network-partitions.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-04/schema#", - "id": "root", + "uuid": "root", "type": "object", "title": "Network Partition Definition", "name": "Network Partition Policy", @@ -9,6 +9,11 @@ "disable_collapse": true }, "properties": { + "uuid": { + "id": "root/uuid", + "type": "string", + "title": "UUID" + }, "id": { "id": "root/id", "type": "string", http://git-wip-us.apache.org/repos/asf/stratos/blob/d106e8f4/components/org.apache.stratos.manager.console/console/themes/theme0/partials/configure_form.hbs ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/configure_form.hbs b/components/org.apache.stratos.manager.console/console/themes/theme0/partials/configure_form.hbs index 2071a60..36d4893 100644 --- a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/configure_form.hbs +++ b/components/org.apache.stratos.manager.console/console/themes/theme0/partials/configure_form.hbs @@ -434,6 +434,10 @@ $(document).ready(function () { }else if(editor.getEditor('root.type')){ editor.getEditor('root.type').disable(); } + + if(editor.getEditor('root.uuid')){ + editor.getEditor('root.uuid').disable(); + } {{/if}} // Hook up the validation indicator to update its http://git-wip-us.apache.org/repos/asf/stratos/blob/d106e8f4/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java index 9712980..8075e50 100644 --- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java +++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java @@ -63,6 +63,7 @@ import java.net.URI; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.List; +import java.util.UUID; /** * Stratos API v4.1 for Stratos 4.1.0 release. @@ -611,6 +612,11 @@ public class StratosApiV41 extends AbstractApi { public Response addNetworkPartition( NetworkPartitionBean networkPartitionBean) throws RestAPIException { String networkPartitionId = networkPartitionBean.getId(); + networkPartitionBean.setUuid(UUID.randomUUID().toString()); + + PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext(); + networkPartitionBean.setTenantId(carbonContext.getTenantId()); + try { StratosApiV41Utils.addNetworkPartition(networkPartitionBean); } catch (CloudControllerServiceNetworkPartitionAlreadyExistsExceptionException e) { @@ -627,7 +633,7 @@ public class StratosApiV41 extends AbstractApi { } URI url = uriInfo.getAbsolutePathBuilder().path(networkPartitionId).build(); return Response.created(url).entity(new ResponseMessageBean(ResponseMessageBean.SUCCESS, - String.format("Network partition added successfully: [network-partition] %s", networkPartitionId))) + String.format("Network partition added successfully: [network-partition-uuid] %s", networkPartitionId))) .build(); } http://git-wip-us.apache.org/repos/asf/stratos/blob/d106e8f4/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java index 0d685bf..5b12e59 100644 --- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java +++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java @@ -30,6 +30,7 @@ import org.apache.stratos.autoscaler.stub.pojo.ApplicationContext; import org.apache.stratos.autoscaler.stub.pojo.ServiceGroup; import org.apache.stratos.cloud.controller.stub.*; import org.apache.stratos.cloud.controller.stub.domain.Cartridge; +import org.apache.stratos.cloud.controller.stub.domain.NetworkPartition; import org.apache.stratos.common.beans.IaasProviderInfoBean; import org.apache.stratos.common.beans.PropertyBean; import org.apache.stratos.common.beans.TenantInfoBean; @@ -2521,7 +2522,7 @@ public class StratosApiV41Utils { } if (!application.isMultiTenant()) { - throw new RestAPIException("Application singups not available for single-tenant applications"); + throw new RestAPIException("Application signups not available for single-tenant applications"); } int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); @@ -2695,7 +2696,23 @@ public class StratosApiV41Utils { CloudControllerServiceClient serviceClient = CloudControllerServiceClient.getInstance(); org.apache.stratos.cloud.controller.stub.domain.NetworkPartition[] networkPartitions = serviceClient.getNetworkPartitions(); - return ObjectConverter.convertCCStubNetworkPartitionsToNetworkPartitions(networkPartitions); + + NetworkPartition[] networkPartitionsForTenantArray = new NetworkPartition[0]; + + if (networkPartitions != null) { + PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext(); + List<NetworkPartition> networkPartitionsForTenant = new ArrayList<NetworkPartition>(); + for (NetworkPartition networkPartition : networkPartitions) { + if (carbonContext.getTenantId() == networkPartition.getTenantId()) { + networkPartitionsForTenant.add(networkPartition); + } + } + if (networkPartitionsForTenant.size() != 0) { + networkPartitionsForTenantArray = networkPartitionsForTenant.toArray(new + NetworkPartition[networkPartitionsForTenant.size()]); + } + } + return ObjectConverter.convertCCStubNetworkPartitionsToNetworkPartitions(networkPartitionsForTenantArray); } catch (RemoteException e) { String message = e.getMessage(); log.error(message); http://git-wip-us.apache.org/repos/asf/stratos/blob/d106e8f4/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java index 035c32d..5f4b3d9 100644 --- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java +++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java @@ -452,7 +452,9 @@ public class ObjectConverter { NetworkPartitionBean networkPartition = new NetworkPartitionBean(); networkPartition.setId(stubNetworkPartition.getId()); + networkPartition.setUuid(stubNetworkPartition.getUuid()); networkPartition.setProvider(stubNetworkPartition.getProvider()); + networkPartition.setTenantId(stubNetworkPartition.getTenantId()); if (stubNetworkPartition.getPartitions() != null) { List<PartitionBean> partitionList = new ArrayList<PartitionBean>(); for (org.apache.stratos.cloud.controller.stub.domain.Partition stubPartition : stubNetworkPartition.getPartitions()) { @@ -585,6 +587,8 @@ public class ObjectConverter { = new org.apache.stratos.cloud.controller.stub.domain.NetworkPartition(); networkPartition.setId(networkPartitionBean.getId()); networkPartition.setProvider(networkPartitionBean.getProvider()); + networkPartition.setUuid(networkPartitionBean.getUuid()); + networkPartition.setTenantId(networkPartitionBean.getTenantId()); if (networkPartitionBean.getPartitions() != null && !networkPartitionBean.getPartitions().isEmpty()) { networkPartition.setPartitions(convertToStubPartitions(networkPartitionBean.getPartitions())); }
