Fixing deployment policy validation to cater docker partitions.
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/9affb35a Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/9affb35a Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/9affb35a Branch: refs/heads/master Commit: 9affb35a4808459b356dbb8f5d98d6d95d4a6344 Parents: 826bc65 Author: Nirmal Fernando <[email protected]> Authored: Sat Dec 6 18:18:33 2014 +0530 Committer: Nirmal Fernando <[email protected]> Committed: Sun Dec 7 18:00:49 2014 +0530 ---------------------------------------------------------------------- .../concurrent/PartitionValidatorCallable.java | 46 ++++------------ .../impl/CloudControllerServiceImpl.java | 45 +++------------- .../impl/CloudControllerServiceUtil.java | 56 ++++++++++++++++++++ 3 files changed, 73 insertions(+), 74 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/9affb35a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/PartitionValidatorCallable.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/PartitionValidatorCallable.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/PartitionValidatorCallable.java index 7cb88f1..b13d6fe 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/PartitionValidatorCallable.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/PartitionValidatorCallable.java @@ -27,6 +27,7 @@ import org.apache.stratos.cloud.controller.exception.InvalidIaasProviderExceptio import org.apache.stratos.cloud.controller.exception.InvalidPartitionException; import org.apache.stratos.cloud.controller.domain.Cartridge; import org.apache.stratos.cloud.controller.domain.IaasProvider; +import org.apache.stratos.cloud.controller.services.impl.CloudControllerServiceUtil; import org.apache.stratos.cloud.controller.util.CloudControllerUtil; import org.apache.stratos.cloud.controller.iaases.Iaas; import org.apache.stratos.cloud.controller.iaases.validators.IaasBasedPartitionValidator; @@ -46,47 +47,20 @@ public class PartitionValidatorCallable implements Callable<IaasProvider> { @Override public IaasProvider call() throws Exception { - if (log.isDebugEnabled()) { - log.debug("Partition validation started for "+partition+" of "+cartridge); - } - String provider = partition.getProvider(); - IaasProvider iaasProvider = cartridge.getIaasProvider(provider); - - if (iaasProvider == null) { - String msg = - "Invalid Partition - " + partition.toString() + - ". Cause: Iaas Provider is null for Provider: " + provider; - log.error(msg); - throw new InvalidPartitionException(msg); + if (log.isDebugEnabled()) { + log.debug("Partition validation started for " + partition + " of " + cartridge); } + String provider = partition.getProvider(); + IaasProvider iaasProvider = cartridge.getIaasProvider(provider); - Iaas iaas = iaasProvider.getIaas(); - - if (iaas == null) { - - try { - iaas = CloudControllerUtil.getIaas(iaasProvider); - } catch (InvalidIaasProviderException e) { - String msg = - "Invalid Partition - " + partition.toString() + - ". Cause: Unable to build Iaas of this IaasProvider [Provider] : " + provider+". "+e.getMessage(); - log.error(msg, e); - throw new InvalidPartitionException(msg, e); - } - - } - - IaasBasedPartitionValidator validator = (IaasBasedPartitionValidator) iaas.getPartitionValidator(); - validator.setIaasProvider(iaasProvider); IaasProvider updatedIaasProvider = - validator.validate(partition.getId(), - CloudControllerUtil.toJavaUtilProperties(partition.getProperties())); - + CloudControllerServiceUtil.validatePartitionAndGetIaasProvider(partition, iaasProvider); + if (log.isDebugEnabled()) { - log.debug("Partition "+partition.toString()+ " is validated successfully " - + "against the Cartridge: "+cartridge.getType()); + log.debug("Partition " + partition.toString() + " is validated successfully " + "against the Cartridge: " + + cartridge.getType()); } - + return updatedIaasProvider; } http://git-wip-us.apache.org/repos/asf/stratos/blob/9affb35a/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 3049735..b8fd6c5 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 @@ -1003,8 +1003,13 @@ public class CloudControllerServiceImpl implements CloudControllerService { String partitionId = entry.getKey(); Future<IaasProvider> job = entry.getValue(); try { + // add to a temporary Map - partitionToIaasProviders.put(partitionId, job.get()); + IaasProvider iaasProvider = job.get(); + + if(iaasProvider != null) { + partitionToIaasProviders.put(partitionId, iaasProvider); + } // add to cache CloudControllerContext.getInstance().addToCartridgeTypeToPartitionIdMap(cartridgeType, partitionId); @@ -1050,47 +1055,11 @@ public class CloudControllerServiceImpl implements CloudControllerService { String provider = partition.getProvider(); String partitionId = partition.getId(); - Properties partitionProperties = CloudControllerUtil.toJavaUtilProperties(partition.getProperties()); handleNullObject(provider, "Partition [" + partitionId + "] validation failed. Partition provider is null."); IaasProvider iaasProvider = CloudControllerConfig.getInstance().getIaasProvider(provider); - if (iaasProvider != null) { - // if this is a IaaS based partition - Iaas iaas = iaasProvider.getIaas(); - - if (iaas == null) { - - try { - iaas = CloudControllerUtil.getIaas(iaasProvider); - } catch (InvalidIaasProviderException e) { - String msg = - "Invalid Partition - " + partition.toString() - + ". Cause: Unable to build Iaas of this IaasProvider [Provider] : " + provider - + ". " + e.getMessage(); - log.error(msg, e); - throw new InvalidPartitionException(msg, e); - } - } - - IaasBasedPartitionValidator validator = (IaasBasedPartitionValidator) iaas.getPartitionValidator(); - validator.setIaasProvider(iaasProvider); - validator.validate(partitionId, partitionProperties); - return true; - - } else if (CloudControllerConstants.DOCKER_PARTITION_PROVIDER.equals(provider)) { - // if this is a docker based Partition - KubernetesBasedPartitionValidator validator = new KubernetesBasedPartitionValidator(); - validator.validate(partitionId, partitionProperties); - return true; - - } else { - - String msg = - "Invalid Partition - " + partition.toString() + ". Cause: Cannot identify as a valid partition."; - log.error(msg); - throw new InvalidPartitionException(msg); - } + return CloudControllerServiceUtil.validatePartition(partition, iaasProvider); } http://git-wip-us.apache.org/repos/asf/stratos/blob/9affb35a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceUtil.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceUtil.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceUtil.java index 056d991..4fbf294 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceUtil.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceUtil.java @@ -19,19 +19,27 @@ package org.apache.stratos.cloud.controller.services.impl; +import java.util.Properties; + import com.google.common.net.InetAddresses; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.stratos.cloud.controller.context.CloudControllerContext; import org.apache.stratos.cloud.controller.domain.ClusterContext; import org.apache.stratos.cloud.controller.domain.IaasProvider; import org.apache.stratos.cloud.controller.domain.MemberContext; +import org.apache.stratos.cloud.controller.domain.Partition; import org.apache.stratos.cloud.controller.domain.Volume; import org.apache.stratos.cloud.controller.exception.CloudControllerException; import org.apache.stratos.cloud.controller.exception.InvalidIaasProviderException; +import org.apache.stratos.cloud.controller.exception.InvalidPartitionException; import org.apache.stratos.cloud.controller.iaases.Iaas; +import org.apache.stratos.cloud.controller.iaases.validators.IaasBasedPartitionValidator; +import org.apache.stratos.cloud.controller.iaases.validators.KubernetesBasedPartitionValidator; import org.apache.stratos.cloud.controller.messaging.publisher.CartridgeInstanceDataPublisher; import org.apache.stratos.cloud.controller.messaging.topology.TopologyBuilder; +import org.apache.stratos.cloud.controller.util.CloudControllerConstants; import org.apache.stratos.cloud.controller.util.CloudControllerUtil; import org.apache.stratos.messaging.domain.topology.MemberStatus; import org.jclouds.rest.ResourceNotFoundException; @@ -141,4 +149,52 @@ public class CloudControllerServiceUtil { boolean isValid = InetAddresses.isInetAddress(ip); return isValid; } + + public static IaasProvider validatePartitionAndGetIaasProvider(Partition partition, IaasProvider iaasProvider) throws InvalidPartitionException { + String provider = partition.getProvider(); + String partitionId = partition.getId(); + Properties partitionProperties = CloudControllerUtil.toJavaUtilProperties(partition.getProperties()); + + if (iaasProvider != null) { + // if this is a IaaS based partition + Iaas iaas = iaasProvider.getIaas(); + + if (iaas == null) { + + try { + iaas = CloudControllerUtil.getIaas(iaasProvider); + } catch (InvalidIaasProviderException e) { + String msg = + "Invalid Partition - " + partition.toString() + + ". Cause: Unable to build Iaas of this IaasProvider [Provider] : " + provider + + ". " + e.getMessage(); + log.error(msg, e); + throw new InvalidPartitionException(msg, e); + } + } + + IaasBasedPartitionValidator validator = (IaasBasedPartitionValidator) iaas.getPartitionValidator(); + validator.setIaasProvider(iaasProvider); + iaasProvider = validator.validate(partitionId, partitionProperties); + return iaasProvider; + + } else if (CloudControllerConstants.DOCKER_PARTITION_PROVIDER.equals(provider)) { + // if this is a docker based Partition + KubernetesBasedPartitionValidator validator = new KubernetesBasedPartitionValidator(); + validator.validate(partitionId, partitionProperties); + return null; + + } else { + + String msg = + "Invalid Partition - " + partition.toString() + ". Cause: Cannot identify as a valid partition."; + log.error(msg); + throw new InvalidPartitionException(msg); + } + } + + public static boolean validatePartition(Partition partition, IaasProvider iaasProvider) throws InvalidPartitionException { + validatePartitionAndGetIaasProvider(partition, iaasProvider); + return true; + } }
