Repository: incubator-stratos Updated Branches: refs/heads/master 24766f958 -> aced00716
STRATOS-539: Support passing payload to vCloud instance via Customization Script Project: http://git-wip-us.apache.org/repos/asf/incubator-stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-stratos/commit/361dbeca Tree: http://git-wip-us.apache.org/repos/asf/incubator-stratos/tree/361dbeca Diff: http://git-wip-us.apache.org/repos/asf/incubator-stratos/diff/361dbeca Branch: refs/heads/master Commit: 361dbeca64e369869e62e86a8b3c0bdcf9a25499 Parents: 06bb534 Author: M. Isuru Tharanga Chrishantha Perera <[email protected]> Authored: Thu Mar 20 22:57:22 2014 +0530 Committer: M. Isuru Tharanga Chrishantha Perera <[email protected]> Committed: Thu Mar 20 22:57:22 2014 +0530 ---------------------------------------------------------------------- .../org.apache.stratos.cloud.controller/pom.xml | 1 + .../cloud/controller/iaases/VCloudIaas.java | 140 ++++++++++--------- .../resources/conf/scripts/sh/customization | 2 + .../src/main/resources/p2.inf | 1 + .../distribution/src/main/assembly/bin.xml | 4 + 5 files changed, 85 insertions(+), 63 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/361dbeca/components/org.apache.stratos.cloud.controller/pom.xml ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/pom.xml b/components/org.apache.stratos.cloud.controller/pom.xml index c998706..9b89a35 100644 --- a/components/org.apache.stratos.cloud.controller/pom.xml +++ b/components/org.apache.stratos.cloud.controller/pom.xml @@ -71,6 +71,7 @@ <Import-Package> !org.apache.commons.logging, org.apache.commons.logging; version=0.0.0, + org.apache.commons.io.*, org.wso2.carbon.utils.*, <!--org.jclouds.compute*;version="${jclouds.version}";resolution:=optional, org.jclouds*;version="${jclouds.version}",--> http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/361dbeca/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 595857d..b8ea1b9 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 @@ -18,7 +18,10 @@ */ package org.apache.stratos.cloud.controller.iaases; -import org.apache.commons.io.IOUtils; +import java.io.File; +import java.io.IOException; + +import org.apache.commons.io.FileUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.stratos.cloud.controller.exception.CloudControllerException; @@ -33,18 +36,18 @@ import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.compute.options.TemplateOptions; import org.jclouds.vcloud.compute.options.VCloudTemplateOptions; import org.jclouds.vcloud.domain.network.IpAddressAllocationMode; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.StringWriter; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; +import org.wso2.carbon.utils.CarbonUtils; public class VCloudIaas extends Iaas { private static final Log log = LogFactory.getLog(VCloudIaas.class); + private static final String SHELL_TYPE = "shellType"; + private static final String SCRIPTS_PATH = "scripts"; + private static final String CUSTOMIZATION_SCRIPT = "customization"; + private static final String PAYLOAD = "PAYLOAD"; + public VCloudIaas(IaasProvider iaasProvider) { super(iaasProvider); } @@ -105,67 +108,78 @@ public class VCloudIaas extends Iaas { @Override public void setDynamicPayload() { - + // in vCloud case we need to run a script IaasProvider iaasInfo = getIaasProvider(); - - // in VCloud case we need to run a script - if (iaasInfo.getTemplate() != null && iaasInfo.getPayload() != null) { - - Template template = iaasInfo.getTemplate(); - String script = ""; - String launchParams = "", key = ""; - - // open the zip file stream - ZipInputStream stream = new ZipInputStream( - new ByteArrayInputStream(iaasInfo.getPayload())); - - try { - - // now iterate through each item in the stream. The get next - // entry call will return a ZipEntry for each file in the - // stream - ZipEntry entry; - while ((entry = stream.getNextEntry()) != null) { - StringWriter writer = new StringWriter(); - IOUtils.copy(stream, writer); - - if (entry.getName().contains("launch-params")) { - launchParams = writer.toString(); - } else if (entry.getName().contains("id_rsa")) { - key = writer.toString(); - } - - } - } catch (IOException e) { - log.error(e.getMessage(), e); - } finally { - // we must always close the zip file. - try { - stream.close(); - } catch (IOException e) { - - log.error("failed to close the ZIP stream", e); - } + + if (iaasInfo.getTemplate() == null || iaasInfo.getPayload() == null) { + if (log.isDebugEnabled()) { + log.debug("Payload for vCloud not found"); + } + return; + } + + String shellType = iaasInfo.getProperty(SHELL_TYPE); + + if (shellType == null || shellType.isEmpty()) { + if (log.isDebugEnabled()) { + log.debug("Shell Type for vCloud Customization script not found from properties"); + } + return; + } + + if (log.isDebugEnabled()) { + log.debug(String.format("Shell Type '%s' will be used for vCloud Customization script", shellType)); + } + + // Payload is a String value + String payload = new String(iaasInfo.getPayload()); + + if (log.isDebugEnabled()) { + log.debug(String.format("Payload '%s' will be used for vCloud Customization script", shellType)); + } + + Template template = iaasInfo.getTemplate(); + + File scriptPath = new File(CarbonUtils.getCarbonConfigDirPath(), SCRIPTS_PATH); + + File customizationScriptFile = new File(new File(scriptPath, shellType), CUSTOMIZATION_SCRIPT); + + if (!customizationScriptFile.exists()) { + if (log.isWarnEnabled()) { + log.warn(String.format("The vCloud Customization script '%s' does not exist", + customizationScriptFile.getAbsolutePath())); + } + return; + } + + String customizationScript = null; + + try { + customizationScript = FileUtils.readFileToString(customizationScriptFile); + } catch (IOException e) { + if (log.isErrorEnabled()) { + log.error( + String.format("Error reading the vCloud Customization script '%s'", + customizationScriptFile.getAbsolutePath()), e); + } + } + + if (customizationScript == null || customizationScript.isEmpty()) { + if (log.isDebugEnabled()) { + log.debug("No content vCloud Customization script not found from properties"); } + return; + } + + // Set payload + customizationScript = customizationScript.replaceAll(PAYLOAD, payload); - script = "mkdir /var/lib/cloud && mkdir /var/lib/cloud/instance && mkdir /var/lib/cloud/instance/payload && " - + "echo \"" - + launchParams - + "\" > /var/lib/cloud/instance/payload/launch-params && " - + "echo \"" - + key - + "\" > /var/lib/cloud/instance/payload/id_rsa && " - + "cd /opt/ && " - + "chmod 755 wso2-openstack-init.sh && " - + "./wso2-openstack-init.sh"; - - template.getOptions() - .overrideLoginUser(iaasInfo.getProperty("loginUser")) - .overrideLoginPassword( - iaasInfo.getProperty("loginPassword")) - .runScript(script); + if (log.isDebugEnabled()) { + log.debug(String.format("The vCloud Customization script\n%s", customizationScript)); } + // Run the script + template.getOptions().runScript(customizationScript); } @Override http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/361dbeca/features/cloud-controller/org.apache.stratos.cloud.controller.feature/src/main/resources/conf/scripts/sh/customization ---------------------------------------------------------------------- diff --git a/features/cloud-controller/org.apache.stratos.cloud.controller.feature/src/main/resources/conf/scripts/sh/customization b/features/cloud-controller/org.apache.stratos.cloud.controller.feature/src/main/resources/conf/scripts/sh/customization new file mode 100644 index 0000000..b567c80 --- /dev/null +++ b/features/cloud-controller/org.apache.stratos.cloud.controller.feature/src/main/resources/conf/scripts/sh/customization @@ -0,0 +1,2 @@ +#!/bin/sh +echo "PAYLOAD" > /tmp/payload http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/361dbeca/features/cloud-controller/org.apache.stratos.cloud.controller.feature/src/main/resources/p2.inf ---------------------------------------------------------------------- diff --git a/features/cloud-controller/org.apache.stratos.cloud.controller.feature/src/main/resources/p2.inf b/features/cloud-controller/org.apache.stratos.cloud.controller.feature/src/main/resources/p2.inf index d2aa499..9a8d28c 100644 --- a/features/cloud-controller/org.apache.stratos.cloud.controller.feature/src/main/resources/p2.inf +++ b/features/cloud-controller/org.apache.stratos.cloud.controller.feature/src/main/resources/p2.inf @@ -23,3 +23,4 @@ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../featur org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.apache.stratos.cloud.controller_${feature.version}/conf/etc/services.xsd,target:${installFolder}/../../conf/etc/services.xsd,overwrite:true);\ org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/cartridges);\ org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/services);\ +org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.apache.stratos.cloud.controller_${feature.version}/conf/scripts,target:${installFolder}/../../conf/scripts,overwrite:true);\ http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/361dbeca/products/cloud-controller/modules/distribution/src/main/assembly/bin.xml ---------------------------------------------------------------------- diff --git a/products/cloud-controller/modules/distribution/src/main/assembly/bin.xml b/products/cloud-controller/modules/distribution/src/main/assembly/bin.xml index 132876d..3dbd2a0 100644 --- a/products/cloud-controller/modules/distribution/src/main/assembly/bin.xml +++ b/products/cloud-controller/modules/distribution/src/main/assembly/bin.xml @@ -162,6 +162,10 @@ <include>**/**.png</include> </includes> </fileSet> + <fileSet> + <directory>../p2-profile/target/wso2carbon-core-${carbon.kernel.version}/repository/conf/scripts</directory> + <outputDirectory>apache-stratos-cc-${pom.version}/repository/conf/scripts</outputDirectory> + </fileSet> <!-- Kernel Patches--> <fileSet>
