Updated Branches: refs/heads/master 9052f2650 -> 8b81d3c2f
refactoring IaaS abstract class Project: http://git-wip-us.apache.org/repos/asf/incubator-stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-stratos/commit/172c86cc Tree: http://git-wip-us.apache.org/repos/asf/incubator-stratos/tree/172c86cc Diff: http://git-wip-us.apache.org/repos/asf/incubator-stratos/diff/172c86cc Branch: refs/heads/master Commit: 172c86ccade592df37c16c3c3ed19806e372021a Parents: 87f8d5d Author: Nirmal Fernando <[email protected]> Authored: Sun Jan 26 17:51:47 2014 +0530 Committer: Nirmal Fernando <[email protected]> Committed: Sun Jan 26 17:51:47 2014 +0530 ---------------------------------------------------------------------- .../controller/deployers/CartridgeDeployer.java | 213 ------------------- .../cloud/controller/iaases/AWSEC2Iaas.java | 60 +++--- .../controller/iaases/OpenstackNovaIaas.java | 80 ++++--- .../cloud/controller/iaases/VCloudIaas.java | 53 ++--- .../impl/CloudControllerServiceImpl.java | 63 +++--- .../cloud/controller/interfaces/Iaas.java | 51 +++-- .../validate/AWSEC2PartitionValidator.java | 7 +- .../OpenstackNovaPartitionValidator.java | 7 +- 8 files changed, 179 insertions(+), 355 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/172c86cc/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployers/CartridgeDeployer.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployers/CartridgeDeployer.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployers/CartridgeDeployer.java deleted file mode 100644 index 1e6f6cd..0000000 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployers/CartridgeDeployer.java +++ /dev/null @@ -1,213 +0,0 @@ -/* - * 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.cloud.controller.deployers; - -import org.apache.axiom.om.OMElement; -import org.apache.axis2.context.ConfigurationContext; -import org.apache.axis2.deployment.AbstractDeployer; -import org.apache.axis2.deployment.DeploymentException; -import org.apache.axis2.deployment.repository.util.DeploymentFileData; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.stratos.cloud.controller.axiom.AxiomXpathParserUtil; -import org.apache.stratos.cloud.controller.axiom.parser.CartridgeConfigParser; -import org.apache.stratos.cloud.controller.concurrent.ThreadExecutor; -import org.apache.stratos.cloud.controller.exception.CloudControllerException; -import org.apache.stratos.cloud.controller.exception.MalformedConfigurationFileException; -import org.apache.stratos.cloud.controller.interfaces.Iaas; -import org.apache.stratos.cloud.controller.pojo.Cartridge; -import org.apache.stratos.cloud.controller.pojo.IaasProvider; -import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder; -import org.apache.stratos.cloud.controller.topology.TopologyBuilder; -import org.wso2.carbon.utils.CarbonUtils; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * All the {@link org.apache.stratos.cloud.controller.pojo.Cartridge}s will get deployed / undeployed / updated via this class. - */ -public class CartridgeDeployer extends AbstractDeployer{ - - private static final Log log = LogFactory.getLog(CartridgeDeployer.class); - - private FasterLookUpDataHolder serviceContextLookUpStructure; - private Map<String, List<Cartridge>> fileToCartridgeListMap; - private File cartridgesSchema, cartridgeSchema; - - public void init(ConfigurationContext arg0) { - fileToCartridgeListMap = new ConcurrentHashMap<String, List<Cartridge>>(); - String etcDir = CarbonUtils.getCarbonConfigDirPath() + File.separator + "etc" + File.separator; - cartridgesSchema = new File(etcDir+"cartridges.xsd"); - cartridgeSchema = new File(etcDir+"cartridge.xsd"); - } - - public void setDirectory(String arg0) { - // component xml handles this - } - - public void setExtension(String arg0) { - // component xml handles this - } - - public void deploy(DeploymentFileData deploymentFileData) throws DeploymentException { - - log.debug("Started to deploy the deployment artifact: "+deploymentFileData.getFile()); - - try { - OMElement docElt = AxiomXpathParserUtil.parse(deploymentFileData.getFile()); - String fileName = deploymentFileData.getFile().getAbsolutePath(); - - // validate - validateCartridge(docElt, fileName); - - // deploy - grab cartridges - List<Cartridge> cartridges = CartridgeConfigParser.parse(fileName, docElt); - - // update map - fileToCartridgeListMap.put(deploymentFileData.getAbsolutePath(), - new ArrayList<Cartridge>(cartridges)); - - ThreadExecutor exec = ThreadExecutor.getInstance(); - // create Jclouds objects, for each IaaS - for (Cartridge cartridge : cartridges) { - // jclouds object building is time consuming, hence I use Java executor framework - exec.execute(new JcloudsObjectBuilder(cartridge, deploymentFileData)); - } - - TopologyBuilder.handleServiceCreated(cartridges); - log.info("Successfully deployed the Cartridge definition specified at " + deploymentFileData.getAbsolutePath()); - - } catch (Exception e) { - String msg = "Invalid deployment artefact at "+deploymentFileData.getAbsolutePath(); - // back up the file - this will in-turn triggers undeploy() - File f = deploymentFileData.getFile(); - f.renameTo(new File(deploymentFileData.getAbsolutePath()+".back")); - log.error(msg, e); - throw new DeploymentException(msg, e); - } - } - - private void validateCartridge(final OMElement elt, final String fileName) throws MalformedConfigurationFileException { - boolean validated = false; - Exception firstException = null; - - try{ - // first try to validate using cartridges schema - AxiomXpathParserUtil.validate(elt, cartridgesSchema); - validated = true; - - }catch (Exception e) { - firstException = e; - } - - if(!validated){ - try{ - // Now try to validate using cartridge schema - AxiomXpathParserUtil.validate(elt, cartridgeSchema); - validated = true; - log.debug("Cartridge validation was successful."); - - }catch (Exception e) { - String msg = "Cartridge XML validation failed. Invalid Cartridge XML: "+fileName; - log.error(msg, firstException); - throw new MalformedConfigurationFileException(msg, firstException); - } - } - - - } - - public void undeploy(String file) throws DeploymentException { - - serviceContextLookUpStructure = FasterLookUpDataHolder.getInstance(); - - // grab the entry from Map - if(fileToCartridgeListMap.containsKey(file)){ - // remove 'em - TopologyBuilder.handleServiceRemoved(fileToCartridgeListMap.get(file)); - serviceContextLookUpStructure.removeCartridges(fileToCartridgeListMap.get(file)); - - log.info("Successfully undeployed the Cartridge definition specified at "+file); - } - - } - - private void handleException(String msg, Exception e) { - log.fatal(msg, e); - throw new CloudControllerException(msg, e); - } - - /** - * JcloudsObjectBuilder job - * - */ - class JcloudsObjectBuilder implements Runnable{ - - private Cartridge cartridge; - private DeploymentFileData file; - - public JcloudsObjectBuilder (Cartridge cartridge, DeploymentFileData file){ - this.cartridge = cartridge; - this.file = file; - } - - @Override - public void run() { - - for (IaasProvider iaasProvider : cartridge.getIaases()) { - try { - Iaas iaas = (Iaas) Class.forName(iaasProvider.getClassName()).newInstance(); - iaas.buildComputeServiceAndTemplate(iaasProvider); - iaasProvider.setIaas(iaas); -// if(iaasProvider.getListOfRegions() != null) { -// for(Region region : iaasProvider.getListOfRegions()) { -// iaas.buildComputeServiceAndTemplate(region); -// for(Zone zone : region.getListOfZones()) { -// zone.setComputeService(region.getComputeService()); -// iaas.buildTemplate(zone); -// for(Host host: zone.getListOfHosts()) { -// host.setComputeService(region.getComputeService()); -// iaas.buildTemplate(host); -// } -// } -// -// } -// } - - } catch (Exception e) { - rename(); - handleException(e.getMessage(), e); - } - } - - } - - private void rename(){ - // back up the file - File f = file.getFile(); - f.renameTo(new File(file.getAbsolutePath()+".back")); - } - - } - -} http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/172c86cc/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/AWSEC2Iaas.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/AWSEC2Iaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/AWSEC2Iaas.java index aad717c..3248d1d 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/AWSEC2Iaas.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/AWSEC2Iaas.java @@ -64,22 +64,27 @@ import java.util.Set; @SuppressWarnings("deprecation") public class AWSEC2Iaas extends Iaas { + public AWSEC2Iaas(IaasProvider iaasProvider) { + super(iaasProvider); + } + private static final Log log = LogFactory.getLog(AWSEC2Iaas.class); private static final String SUCCESSFUL_LOG_LINE = "A key-pair is created successfully in "; private static final String FAILED_LOG_LINE = "Key-pair is unable to create in "; @Override - public void buildComputeServiceAndTemplate(IaasProvider iaasInfo) { + public void buildComputeServiceAndTemplate() { // builds and sets Compute Service - ComputeServiceBuilderUtil.buildDefaultComputeService(iaasInfo); + ComputeServiceBuilderUtil.buildDefaultComputeService(getIaasProvider()); // builds and sets Template - buildTemplate(iaasInfo); + buildTemplate(); } - public void buildTemplate(IaasProvider iaas) { + public void buildTemplate() { + IaasProvider iaas = getIaasProvider(); if (iaas.getComputeService() == null) { String msg = "Compute service is null for IaaS provider: " + iaas.getName(); @@ -160,8 +165,8 @@ public class AWSEC2Iaas extends Iaas { } @Override - public void setDynamicPayload(IaasProvider iaasInfo) { - + public void setDynamicPayload() { + IaasProvider iaasInfo = getIaasProvider(); if (iaasInfo.getTemplate() != null && iaasInfo.getPayload() != null) { iaasInfo.getTemplate().getOptions().as(AWSEC2TemplateOptions.class) @@ -171,9 +176,10 @@ public class AWSEC2Iaas extends Iaas { } @Override - public synchronized boolean createKeyPairFromPublicKey( - IaasProvider iaasInfo, String region, String keyPairName, + public synchronized boolean createKeyPairFromPublicKey(String region, String keyPairName, String publicKey) { + + IaasProvider iaasInfo = getIaasProvider(); String ec2Msg = " ec2. Region: " + region + " - Key Pair Name: "; @@ -203,9 +209,10 @@ public class AWSEC2Iaas extends Iaas { } @Override - public synchronized String associateAddress(IaasProvider iaasInfo, - NodeMetadata node) { + public synchronized String associateAddress(NodeMetadata node) { + IaasProvider iaasInfo = getIaasProvider(); + ComputeServiceContext context = iaasInfo.getComputeService() .getContext(); AWSEC2Client ec2Client = context.unwrap(AWSEC2ApiMetadata.CONTEXT_TOKEN).getApi(); @@ -272,19 +279,6 @@ public class AWSEC2Iaas extends Iaas { return ip; } - - @Override - public void mapPersistanceVolumes(Template template, List<PersistanceMapping> persistancemapings){ - if(persistancemapings ==null || persistancemapings.isEmpty()) - return; - - Iterator< PersistanceMapping> it = persistancemapings.iterator(); - while(it.hasNext()){ - PersistanceMapping maping = it.next(); - template.getOptions().as(EC2TemplateOptions.class) - .mapEBSSnapshotToDeviceName(maping.getDevice(), maping.getSnapshotId(), maping.getSize(), maping.isRemoveOntermination()); - } - } /** * @param ec2Client @@ -306,8 +300,10 @@ public class AWSEC2Iaas extends Iaas { } @Override - public synchronized void releaseAddress(IaasProvider iaasInfo, String ip) { + public synchronized void releaseAddress(String ip) { + IaasProvider iaasInfo = getIaasProvider(); + ComputeServiceContext context = iaasInfo.getComputeService() .getContext(); AWSEC2Client ec2Client = context.unwrap(AWSEC2ApiMetadata.CONTEXT_TOKEN).getApi(); @@ -320,8 +316,10 @@ public class AWSEC2Iaas extends Iaas { } @Override - public boolean isValidRegion(IaasProvider iaasInfo, String region) throws InvalidRegionException { - + public boolean isValidRegion(String region) throws InvalidRegionException { + + IaasProvider iaasInfo = getIaasProvider(); + if (region == null || iaasInfo == null) { String msg = "Region or IaaSProvider is null: region: " + region + " - IaaSProvider: " + @@ -346,7 +344,10 @@ public class AWSEC2Iaas extends Iaas { } @Override - public boolean isValidZone(IaasProvider iaasInfo, String region, String zone) throws InvalidZoneException { + public boolean isValidZone(String region, String zone) throws InvalidZoneException { + + IaasProvider iaasInfo = getIaasProvider(); + if (zone == null || iaasInfo == null) { String msg = "Zone or IaaSProvider is null: zone: " + zone + " - IaaSProvider: " + @@ -379,7 +380,10 @@ public class AWSEC2Iaas extends Iaas { } @Override - public boolean isValidHost(IaasProvider iaasInfo, String zone, String host) throws InvalidHostException { + public boolean isValidHost(String zone, String host) throws InvalidHostException { + + IaasProvider iaasInfo = getIaasProvider(); + // there's no such concept in EC2 String msg = "Invalid host: " + host +" in the zone: "+zone+ " and of the iaas: "+iaasInfo.getType(); log.error(msg); http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/172c86cc/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java index 6fe664a..2f45f9b 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java @@ -32,7 +32,6 @@ import org.apache.stratos.cloud.controller.exception.InvalidZoneException; import org.apache.stratos.cloud.controller.interfaces.Iaas; import org.apache.stratos.cloud.controller.jcloud.ComputeServiceBuilderUtil; import org.apache.stratos.cloud.controller.pojo.IaasProvider; -import org.apache.stratos.cloud.controller.pojo.PersistanceMapping; import org.apache.stratos.cloud.controller.util.CloudControllerConstants; import org.apache.stratos.cloud.controller.util.CloudControllerUtil; import org.apache.stratos.cloud.controller.validate.OpenstackNovaPartitionValidator; @@ -55,37 +54,45 @@ import org.jclouds.openstack.nova.v2_0.extensions.KeyPairApi; import java.util.ArrayList; import java.util.Collections; -import java.util.List; public class OpenstackNovaIaas extends Iaas { + private static final Log log = LogFactory.getLog(OpenstackNovaIaas.class); private static final String SUCCESSFUL_LOG_LINE = "A key-pair is created successfully in "; private static final String FAILED_LOG_LINE = "Key-pair is unable to create in "; + public OpenstackNovaIaas(IaasProvider iaasProvider) { + super(iaasProvider); + } + @Override - public void buildComputeServiceAndTemplate(IaasProvider iaasInfo) { + public void buildComputeServiceAndTemplate() { + IaasProvider iaasInfo = getIaasProvider(); + // builds and sets Compute Service ComputeServiceBuilderUtil.buildDefaultComputeService(iaasInfo); // builds and sets Template - buildTemplate(iaasInfo); + buildTemplate(); } - public void buildTemplate(IaasProvider iaas) { - if (iaas.getComputeService() == null) { + public void buildTemplate() { + IaasProvider iaasInfo = getIaasProvider(); + + if (iaasInfo.getComputeService() == null) { throw new CloudControllerException( "Compute service is null for IaaS provider: " - + iaas.getName()); + + iaasInfo.getName()); } - TemplateBuilder templateBuilder = iaas.getComputeService() + TemplateBuilder templateBuilder = iaasInfo.getComputeService() .templateBuilder(); - templateBuilder.imageId(iaas.getImage()); - if(!(iaas instanceof IaasProvider)) { - templateBuilder.locationId(iaas.getType()); + templateBuilder.imageId(iaasInfo.getImage()); + if(!(iaasInfo instanceof IaasProvider)) { + templateBuilder.locationId(iaasInfo.getType()); } // to avoid creation of template objects in each and every time, we @@ -94,7 +101,7 @@ public class OpenstackNovaIaas extends Iaas { String instanceType; // set instance type - if (((instanceType = iaas.getProperty(CloudControllerConstants.INSTANCE_TYPE)) != null)) { + if (((instanceType = iaasInfo.getProperty(CloudControllerConstants.INSTANCE_TYPE)) != null)) { templateBuilder.hardwareId(instanceType); } @@ -105,7 +112,7 @@ public class OpenstackNovaIaas extends Iaas { // blocking, but if you // wish to assign IPs manually, it can be non-blocking. // is auto-assign-ip mode or manual-assign-ip mode? - boolean blockUntilRunning = Boolean.parseBoolean(iaas + boolean blockUntilRunning = Boolean.parseBoolean(iaasInfo .getProperty(CloudControllerConstants.AUTO_ASSIGN_IP)); template.getOptions().as(TemplateOptions.class) .blockUntilRunning(blockUntilRunning); @@ -115,17 +122,17 @@ public class OpenstackNovaIaas extends Iaas { template.getOptions().as(TemplateOptions.class) .inboundPorts(new int[] {}); - if (iaas.getProperty(CloudControllerConstants.SECURITY_GROUPS) != null) { + if (iaasInfo.getProperty(CloudControllerConstants.SECURITY_GROUPS) != null) { template.getOptions() .as(NovaTemplateOptions.class) .securityGroupNames( - iaas.getProperty(CloudControllerConstants.SECURITY_GROUPS).split( + iaasInfo.getProperty(CloudControllerConstants.SECURITY_GROUPS).split( CloudControllerConstants.ENTRY_SEPARATOR)); } - if (iaas.getProperty(CloudControllerConstants.KEY_PAIR) != null) { + if (iaasInfo.getProperty(CloudControllerConstants.KEY_PAIR) != null) { template.getOptions().as(NovaTemplateOptions.class) - .keyPairName(iaas.getProperty(CloudControllerConstants.KEY_PAIR)); + .keyPairName(iaasInfo.getProperty(CloudControllerConstants.KEY_PAIR)); } //TODO @@ -135,12 +142,14 @@ public class OpenstackNovaIaas extends Iaas { // } // set Template - iaas.setTemplate(template); + iaasInfo.setTemplate(template); } @Override - public void setDynamicPayload(IaasProvider iaasInfo) { + public void setDynamicPayload() { + IaasProvider iaasInfo = getIaasProvider(); + if (iaasInfo.getTemplate() != null && iaasInfo.getPayload() != null) { iaasInfo.getTemplate().getOptions().as(NovaTemplateOptions.class) @@ -150,10 +159,11 @@ public class OpenstackNovaIaas extends Iaas { } @Override - public synchronized boolean createKeyPairFromPublicKey( - IaasProvider iaasInfo, String region, String keyPairName, + public synchronized boolean createKeyPairFromPublicKey(String region, String keyPairName, String publicKey) { + IaasProvider iaasInfo = getIaasProvider(); + String openstackNovaMsg = " Openstack-nova. Region: " + region + " - Name: "; @@ -181,8 +191,9 @@ public class OpenstackNovaIaas extends Iaas { } @Override - public synchronized String associateAddress(IaasProvider iaasInfo, - NodeMetadata node) { + public synchronized String associateAddress(NodeMetadata node) { + + IaasProvider iaasInfo = getIaasProvider(); ComputeServiceContext context = iaasInfo.getComputeService() .getContext(); @@ -252,8 +263,10 @@ public class OpenstackNovaIaas extends Iaas { } @Override - public synchronized void releaseAddress(IaasProvider iaasInfo, String ip) { + public synchronized void releaseAddress(String ip) { + IaasProvider iaasInfo = getIaasProvider(); + ComputeServiceContext context = iaasInfo.getComputeService() .getContext(); @@ -283,7 +296,9 @@ public class OpenstackNovaIaas extends Iaas { } @Override - public boolean isValidRegion(IaasProvider iaasInfo, String region) throws InvalidRegionException { + public boolean isValidRegion(String region) throws InvalidRegionException { + IaasProvider iaasInfo = getIaasProvider(); + // jclouds' zone = region in openstack if (region == null || iaasInfo == null) { String msg = @@ -311,7 +326,9 @@ public class OpenstackNovaIaas extends Iaas { } @Override - public boolean isValidZone(IaasProvider iaasInfo, String region, String zone) throws InvalidZoneException { + public boolean isValidZone(String region, String zone) throws InvalidZoneException { + IaasProvider iaasInfo = getIaasProvider(); + // jclouds doesn't support zone in Openstack-Nova API String msg = "Invalid zone: " + zone +" in the region: "+region+ " and of the iaas: "+iaasInfo.getType(); log.error(msg); @@ -320,7 +337,9 @@ public class OpenstackNovaIaas extends Iaas { } @Override - public boolean isValidHost(IaasProvider iaasInfo, String zone, String host) throws InvalidHostException { + public boolean isValidHost(String zone, String host) throws InvalidHostException { + IaasProvider iaasInfo = getIaasProvider(); + if (host == null || zone == null || iaasInfo == null) { String msg = "Host or Zone or IaaSProvider is null: host: " + host + " - zone: " + zone + " - IaaSProvider: " + iaasInfo; @@ -352,11 +371,4 @@ public class OpenstackNovaIaas extends Iaas { return new OpenstackNovaPartitionValidator(); } - @Override - public void mapPersistanceVolumes(Template template, - List<PersistanceMapping> persistancemapings) { - // TODO Auto-generated method stub - - } - } http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/172c86cc/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/VCloudIaas.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/VCloudIaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/VCloudIaas.java index 56ea1ef..b49f2c8 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/VCloudIaas.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/VCloudIaas.java @@ -25,7 +25,6 @@ import org.apache.stratos.cloud.controller.exception.CloudControllerException; import org.apache.stratos.cloud.controller.interfaces.Iaas; import org.apache.stratos.cloud.controller.jcloud.ComputeServiceBuilderUtil; import org.apache.stratos.cloud.controller.pojo.IaasProvider; -import org.apache.stratos.cloud.controller.pojo.PersistanceMapping; import org.apache.stratos.cloud.controller.validate.interfaces.PartitionValidator; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.Template; @@ -37,38 +36,46 @@ import org.jclouds.vcloud.domain.network.IpAddressAllocationMode; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.StringWriter; -import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class VCloudIaas extends Iaas { + private static final Log log = LogFactory.getLog(VCloudIaas.class); + + public VCloudIaas(IaasProvider iaasProvider) { + super(iaasProvider); + } @Override - public void buildComputeServiceAndTemplate(IaasProvider iaasInfo) { + public void buildComputeServiceAndTemplate() { + IaasProvider iaasInfo = getIaasProvider(); + // builds and sets Compute Service ComputeServiceBuilderUtil.buildDefaultComputeService(iaasInfo); // builds and sets Template - buildTemplate(iaasInfo); + buildTemplate(); } - public void buildTemplate(IaasProvider iaas) { - if (iaas.getComputeService() == null) { + public void buildTemplate() { + IaasProvider iaasInfo = getIaasProvider(); + + if (iaasInfo.getComputeService() == null) { String msg = "Compute service is null for IaaS provider: " - + iaas.getName(); + + iaasInfo.getName(); log.fatal(msg); throw new CloudControllerException(msg); } - TemplateBuilder templateBuilder = iaas.getComputeService() + TemplateBuilder templateBuilder = iaasInfo.getComputeService() .templateBuilder(); // set image id specified - templateBuilder.imageId(iaas.getImage()); + templateBuilder.imageId(iaasInfo.getImage()); // build the Template Template template = templateBuilder.build(); @@ -78,7 +85,7 @@ public class VCloudIaas extends Iaas { // wish to assign IPs manually, it can be non-blocking. // is auto-assign-ip mode or manual-assign-ip mode? - default mode is // non-blocking - boolean blockUntilRunning = Boolean.parseBoolean(iaas + boolean blockUntilRunning = Boolean.parseBoolean(iaasInfo .getProperty("autoAssignIp")); template.getOptions().as(TemplateOptions.class) .blockUntilRunning(blockUntilRunning); @@ -92,12 +99,14 @@ public class VCloudIaas extends Iaas { .ipAddressAllocationMode(IpAddressAllocationMode.POOL); // set Template - iaas.setTemplate(template); + iaasInfo.setTemplate(template); } @Override - public void setDynamicPayload(IaasProvider iaasInfo) { + public void setDynamicPayload() { + IaasProvider iaasInfo = getIaasProvider(); + // in VCloud case we need to run a script if (iaasInfo.getTemplate() != null && iaasInfo.getPayload() != null) { @@ -159,15 +168,14 @@ public class VCloudIaas extends Iaas { } @Override - public boolean createKeyPairFromPublicKey(IaasProvider iaasInfo, - String region, String keyPairName, String publicKey) { + public boolean createKeyPairFromPublicKey(String region, String keyPairName, String publicKey) { // TODO return false; } @Override - public String associateAddress(IaasProvider iaasInfo, NodeMetadata node) { + public String associateAddress(NodeMetadata node) { // TODO return ""; @@ -175,24 +183,24 @@ public class VCloudIaas extends Iaas { } @Override - public void releaseAddress(IaasProvider iaasInfo, String ip) { + public void releaseAddress(String ip) { // TODO } @Override - public boolean isValidRegion(IaasProvider iaasInfo, String region) { + public boolean isValidRegion(String region) { // TODO Auto-generated method stub return false; } @Override - public boolean isValidZone(IaasProvider iaasInfo, String region, String zone) { + public boolean isValidZone(String region, String zone) { // TODO Auto-generated method stub return false; } @Override - public boolean isValidHost(IaasProvider iaasInfo, String zone, String host) { + public boolean isValidHost(String zone, String host) { // TODO Auto-generated method stub return false; } @@ -203,11 +211,4 @@ public class VCloudIaas extends Iaas { return null; } - @Override - public void mapPersistanceVolumes(Template template, - List<PersistanceMapping> persistancemapings) { - // TODO Auto-generated method stub - - } - } http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/172c86cc/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java index ac2e1e2..10b06ae 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java @@ -41,6 +41,8 @@ import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.Template; import org.wso2.carbon.registry.core.exceptions.RegistryException; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -160,20 +162,32 @@ public class CloudControllerServiceImpl implements CloudControllerService { log.info("Successfully deployed the Cartridge definition: " + cartridgeType); } - private Iaas setIaas(IaasProvider iaasProvider) throws InvalidIaasProviderException { - try { - Iaas iaas = (Iaas) Class.forName(iaasProvider.getClassName()).newInstance(); - iaas.buildComputeServiceAndTemplate(iaasProvider); - iaasProvider.setIaas(iaas); - return iaas; - } catch (Exception e) { - String msg = - "Unable to build the jclouds object for iaas " + "of type: " + - iaasProvider.getType(); - log.error(msg, e); - throw new InvalidIaasProviderException(msg, e); - } - } + private Iaas setIaas(IaasProvider iaasProvider) throws InvalidIaasProviderException { + + Iaas iaas; + try { + Constructor<?> c = Class.forName(iaasProvider.getClassName()) + .getConstructor(IaasProvider.class); + iaas = (Iaas) c.newInstance(iaasProvider); + } catch (Exception e) { + String msg = "Class [" + iaasProvider.getClassName() + + "] which represents the iaas of type: [" + + iaasProvider.getType() + "] has failed to instantiate."; + log.error(msg, e); + throw new InvalidIaasProviderException(msg, e); + } + + try { + iaas.buildComputeServiceAndTemplate(); + iaasProvider.setIaas(iaas); + return iaas; + } catch (Exception e) { + String msg = "Unable to build the jclouds object for iaas " + + "of type: " + iaasProvider.getType(); + log.error(msg, e); + throw new InvalidIaasProviderException(msg, e); + } + } public void undeployCartridgeDefinition(String cartridgeType) { @@ -283,7 +297,7 @@ public class CloudControllerServiceImpl implements CloudControllerService { } - iaas.setDynamicPayload(iaasProvider); + iaas.setDynamicPayload(); // get the pre built ComputeService from provider or region or zone or host computeService = iaasProvider.getComputeService(); template = iaasProvider.getTemplate(); @@ -299,7 +313,6 @@ public class CloudControllerServiceImpl implements CloudControllerService { throw new CloudControllerException(msg); } - iaas.mapPersistanceVolumes(template, cartridge.getPeristanceMappings()); // generate the group id from domain name and sub domain // name. // Should have lower-case ASCII letters, numbers, or dashes. @@ -509,7 +522,7 @@ public class CloudControllerServiceImpl implements CloudControllerService { Iaas iaas = iaasProvider.getIaas(); // allocate an IP address - manual IP assigning mode - ip = iaas.associateAddress(iaasProvider, node); + ip = iaas.associateAddress(node); memberContext.setAllocatedIpAddress(ip); log.info("Allocated an ip address: " + memberContext.toString()); } @@ -776,8 +789,7 @@ public class CloudControllerServiceImpl implements CloudControllerService { // release allocated IP address if (ctxt.getAllocatedIpAddress() != null) { - iaas.releaseAddress(iaasProvider, - ctxt.getAllocatedIpAddress()); + iaas.releaseAddress(ctxt.getAllocatedIpAddress()); } // publish data to BAM @@ -969,6 +981,7 @@ public class CloudControllerServiceImpl implements CloudControllerService { @Override public boolean validatePartition(Partition partition) throws InvalidPartitionException { + //FIXME add logs String provider = partition.getProvider(); IaasProvider iaasProvider = dataHolder.getIaasProvider(provider); @@ -984,14 +997,12 @@ public class CloudControllerServiceImpl implements CloudControllerService { if (iaas == null) { - try { - iaas = (Iaas) Class.forName(iaasProvider.getClassName()).newInstance(); - ComputeServiceBuilderUtil.buildDefaultComputeService(iaasProvider); - iaasProvider.setIaas(iaas); - } catch (Exception e) { + try { + iaas = setIaas(iaasProvider); + } catch (InvalidIaasProviderException e) { String msg = - "Unable to build the jclouds object for iaas " + "of type: " + - iaasProvider.getType(); + "Invalid Partition - " + partition.toString() + + ". Cause: Unable to build Iaas of this IaasProvider [Provider] : " + provider; log.error(msg, e); throw new InvalidPartitionException(msg, e); } http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/172c86cc/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/Iaas.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/Iaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/Iaas.java index c6fd6ea..d6303c2 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/Iaas.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/Iaas.java @@ -18,8 +18,6 @@ */ package org.apache.stratos.cloud.controller.interfaces; -import java.util.List; - import org.jclouds.compute.ComputeService; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.Template; @@ -27,88 +25,96 @@ import org.apache.stratos.cloud.controller.exception.InvalidHostException; import org.apache.stratos.cloud.controller.exception.InvalidRegionException; import org.apache.stratos.cloud.controller.exception.InvalidZoneException; import org.apache.stratos.cloud.controller.pojo.IaasProvider; -import org.apache.stratos.cloud.controller.pojo.PersistanceMapping; import org.apache.stratos.cloud.controller.validate.interfaces.PartitionValidator; /** * All IaaSes that are going to support by Cloud Controller, should extend this abstract class. */ public abstract class Iaas { - + /** + * Reference to the corresponding {@link IaasProvider} + */ + private IaasProvider iaasProvider; + + public Iaas(IaasProvider iaasProvider) { + this.setIaasProvider(iaasProvider); + } + + public IaasProvider getIaasProvider() { + return iaasProvider; + } + + public void setIaasProvider(IaasProvider iaasProvider) { + this.iaasProvider = iaasProvider; + } + /** * This should build the {@link ComputeService} object and the {@link Template} object, * using the information from {@link IaasProvider} and should set the built * {@link ComputeService} object in the {@link IaasProvider#setComputeService(ComputeService)} * and also should set the built {@link Template} object in the * {@link IaasProvider#setTemplate(Template)}. - * @param iaasInfo corresponding {@link IaasProvider} */ - public abstract void buildComputeServiceAndTemplate(IaasProvider iaasInfo); + public abstract void buildComputeServiceAndTemplate(); /** * This method provides a way to set payload that can be obtained from {@link IaasProvider#getPayload()} * in the {@link Template} of this IaaS. - * @param iaasInfo corresponding {@link IaasProvider} */ - public abstract void setDynamicPayload(IaasProvider iaasInfo); + public abstract void setDynamicPayload(); /** * This will obtain an IP address from the allocated list and associate that IP with this node. - * @param iaasInfo corresponding {@link IaasProvider} * @param node Node to be associated with an IP. * @return associated public IP. */ - public abstract String associateAddress(IaasProvider iaasInfo, NodeMetadata node); + public abstract String associateAddress(NodeMetadata node); /** * This will deallocate/release the given IP address back to pool. * @param iaasInfo corresponding {@link IaasProvider} * @param ip public IP address to be released. */ - public abstract void releaseAddress(IaasProvider iaasInfo, String ip); + public abstract void releaseAddress(String ip); /** * This method should create a Key Pair corresponds to a given public key in the respective region having the name given. * Also should override the value of the key pair in the {@link Template} of this IaaS. - * @param iaasInfo {@link IaasProvider} * @param region region that the key pair will get created. * @param keyPairName name of the key pair. NOTE: Jclouds adds a prefix : <code>jclouds#</code> * @param publicKey public key, from which the key pair will be created. * @return whether the key pair creation is successful or not. */ - public abstract boolean createKeyPairFromPublicKey(IaasProvider iaasInfo, String region, String keyPairName, String publicKey); + public abstract boolean createKeyPairFromPublicKey(String region, String keyPairName, String publicKey); /** * Validate a given region name against a particular IaaS. * If a particular IaaS doesn't have a concept called region, it can simply throw {@link InvalidRegionException}. - * @param iaasInfo {@link IaasProvider} * @param region name of the region. * @return whether the region is valid. * @throws InvalidRegionException if the region is invalid. */ - public abstract boolean isValidRegion(IaasProvider iaasInfo, String region) throws InvalidRegionException; + public abstract boolean isValidRegion(String region) throws InvalidRegionException; /** * Validate a given zone name against a particular region in an IaaS. * If a particular IaaS doesn't have a concept called zone, it can simply throw {@link InvalidZoneException}. - * @param iaasInfo {@link IaasProvider} * @param region region of the IaaS that the zone belongs to. * @param zone * @return whether the zone is valid in the given region or not. * @throws InvalidZoneException if the zone is invalid in a given region. */ - public abstract boolean isValidZone(IaasProvider iaasInfo, String region, String zone) throws InvalidZoneException; + public abstract boolean isValidZone(String region, String zone) throws InvalidZoneException; /** * Validate a given host id against a particular zone in an IaaS. * If a particular IaaS doesn't have a concept called hosts, it can simply throw {@link InvalidHostException}. - * @param iaasInfo {@link IaasProvider} * @param zone zone of the IaaS that the host belongs to. * @param host * @return whether the host is valid in the given zone or not. * @throws InvalidHostException if the host is invalid in a given zone. */ - public abstract boolean isValidHost(IaasProvider iaasInfo, String zone, String host) throws InvalidHostException; + public abstract boolean isValidHost(String zone, String host) throws InvalidHostException; /** * provides the {@link PartitionValidator} corresponds to this particular IaaS. @@ -116,8 +122,9 @@ public abstract class Iaas { */ public abstract PartitionValidator getPartitionValidator(); - public abstract void buildTemplate(IaasProvider iaas); - - public abstract void mapPersistanceVolumes(Template template, List<PersistanceMapping> persistancemapings); + /** + * Builds only the jclouds {@link Template} + */ + public abstract void buildTemplate(); } http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/172c86cc/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/validate/AWSEC2PartitionValidator.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/validate/AWSEC2PartitionValidator.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/validate/AWSEC2PartitionValidator.java index 3c5814d..19c7d55 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/validate/AWSEC2PartitionValidator.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/validate/AWSEC2PartitionValidator.java @@ -57,16 +57,17 @@ public class AWSEC2PartitionValidator implements PartitionValidator { throw new InvalidPartitionException(msg); } - iaas.isValidRegion(iaasProvider, region); + iaas.isValidRegion(region); IaasProvider updatedIaasProvider = new IaasProvider(iaasProvider); Iaas updatedIaas = updatedIaasProvider.getIaas(); + updatedIaas.setIaasProvider(updatedIaasProvider); if (properties.containsKey(Scope.zone.toString())) { String zone = properties.getProperty(Scope.zone.toString()); - iaas.isValidZone(iaasProvider, region, zone); + iaas.isValidZone(region, zone); updatedIaasProvider.setProperty(CloudControllerConstants.AVAILABILITY_ZONE, zone); - updatedIaas.buildTemplate(updatedIaasProvider); + updatedIaas.buildTemplate(); } return updatedIaasProvider; http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/172c86cc/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/validate/OpenstackNovaPartitionValidator.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/validate/OpenstackNovaPartitionValidator.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/validate/OpenstackNovaPartitionValidator.java index 64a3567..60c3044 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/validate/OpenstackNovaPartitionValidator.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/validate/OpenstackNovaPartitionValidator.java @@ -57,17 +57,18 @@ public class OpenstackNovaPartitionValidator implements PartitionValidator { throw new InvalidPartitionException(msg); } - iaas.isValidRegion(iaasProvider, region); + iaas.isValidRegion(region); IaasProvider updatedIaasProvider = new IaasProvider(iaasProvider); Iaas updatedIaas = updatedIaasProvider.getIaas(); + updatedIaas.setIaasProvider(updatedIaasProvider); if (properties.containsKey(Scope.host.toString())) { String host = properties.getProperty(Scope.host.toString()); - iaas.isValidHost(iaasProvider, region, host); + iaas.isValidHost(region, host); updatedIaasProvider.setProperty(CloudControllerConstants.HOST, host); - updatedIaas.buildTemplate(updatedIaasProvider); + updatedIaas.buildTemplate(); } return updatedIaasProvider;
