diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/functions/VAppToNodeMetadata.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/functions/VAppToNodeMetadata.java index 9e11ae4026..a6797782e8 100644 --- a/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/functions/VAppToNodeMetadata.java +++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/functions/VAppToNodeMetadata.java @@ -21,6 +21,7 @@ package org.jclouds.vcloud.compute.functions; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Predicates.not; import static com.google.common.collect.Iterables.filter; +import static org.jclouds.compute.util.ComputeServiceUtils.addMetadataAndParseTagsFromCommaDelimitedValue; import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.getCredentialsFrom; import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.getIpsFromVApp; import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.toComputeOs; @@ -43,6 +44,8 @@ import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.VApp; import com.google.common.base.Function; +import com.google.common.base.Splitter; +import static com.google.common.base.Strings.*; /** * @author Adrian Cole @@ -74,6 +77,9 @@ public class VAppToNodeMetadata implements Function { builder.ids(from.getHref().toASCIIString()); builder.uri(from.getHref()); builder.name(from.getName()); + if (!isNullOrEmpty(from.getDescription()) && from.getDescription().indexOf('=') != -1) + addMetadataAndParseTagsFromCommaDelimitedValue(builder, + Splitter.on('\n').withKeyValueSeparator("=").split(from.getDescription())); builder.hostname(from.getName()); builder.location(findLocationForResourceInVDC.apply(from.getVDC())); builder.group(nodeNamingConvention.groupInUniqueNameOrNull(from.getName())); diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/strategy/InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOn.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/strategy/InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOn.java index 19b36d7be2..fa7a998123 100644 --- a/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/strategy/InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOn.java +++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/strategy/InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOn.java @@ -23,10 +23,12 @@ import static com.google.common.base.Predicates.not; import static com.google.common.collect.Iterables.find; import static com.google.common.collect.Iterables.get; import static org.jclouds.compute.util.ComputeServiceUtils.getCores; +import static org.jclouds.compute.util.ComputeServiceUtils.metadataAndTagsAsCommaDelimitedValue; import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.getCredentialsFrom; import static org.jclouds.vcloud.options.InstantiateVAppTemplateOptions.Builder.addNetworkConfig; import java.net.URI; +import java.util.Map; import javax.annotation.Resource; import javax.inject.Inject; @@ -57,6 +59,7 @@ import org.jclouds.vcloud.domain.network.NetworkConfig; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Joiner; import com.google.common.base.Predicate; import com.google.common.cache.LoadingCache; import com.google.common.collect.ImmutableSet; @@ -189,8 +192,10 @@ public class InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployA String description = VCloudTemplateOptions.class.cast(template.getOptions()).getDescription(); - if (description == null) - description = vAppTemplate.getName(); + if (description == null) { + Map md = metadataAndTagsAsCommaDelimitedValue(template.getOptions()); + description = Joiner.on('\n').withKeyValueSeparator("=").join(md); + } options.description(description); options.deploy(false); diff --git a/apis/vcloud/src/test/java/org/jclouds/vcloud/compute/VCloudComputeServiceLiveTest.java b/apis/vcloud/src/test/java/org/jclouds/vcloud/compute/VCloudComputeServiceLiveTest.java index b2b266c854..c4ae96a73f 100644 --- a/apis/vcloud/src/test/java/org/jclouds/vcloud/compute/VCloudComputeServiceLiveTest.java +++ b/apis/vcloud/src/test/java/org/jclouds/vcloud/compute/VCloudComputeServiceLiveTest.java @@ -18,12 +18,10 @@ */ package org.jclouds.vcloud.compute; -import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.internal.BaseComputeServiceLiveTest; import org.jclouds.sshj.config.SshjSshClientModule; import org.testng.annotations.Test; -import com.google.common.collect.ImmutableMap; import com.google.inject.Module; /** @@ -55,11 +53,4 @@ public class VCloudComputeServiceLiveTest extends BaseComputeServiceLiveTest { return new SshjSshClientModule(); } - // vcloud does not support metadata - @Override - protected void checkUserMetadataInNodeEquals(NodeMetadata node, ImmutableMap userMetadata) { - assert node.getUserMetadata().equals(ImmutableMap. of()) : String.format( - "node userMetadata did not match %s %s", userMetadata, node); - } - } \ No newline at end of file diff --git a/apis/vcloud/src/test/java/org/jclouds/vcloud/compute/functions/VAppToNodeMetadataTest.java b/apis/vcloud/src/test/java/org/jclouds/vcloud/compute/functions/VAppToNodeMetadataTest.java index 7f7a8b6097..f64eeebbf4 100644 --- a/apis/vcloud/src/test/java/org/jclouds/vcloud/compute/functions/VAppToNodeMetadataTest.java +++ b/apis/vcloud/src/test/java/org/jclouds/vcloud/compute/functions/VAppToNodeMetadataTest.java @@ -43,13 +43,16 @@ import org.jclouds.vcloud.compute.config.VCloudComputeServiceDependenciesModule; import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.VApp; +import org.jclouds.vcloud.domain.internal.VAppImpl; import org.jclouds.vcloud.xml.VAppHandler; import org.jclouds.vcloud.xml.ovf.VCloudResourceAllocationSettingDataHandler; import org.testng.annotations.Test; import com.google.common.base.Function; +import com.google.common.base.Joiner; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; import com.google.inject.AbstractModule; @@ -113,10 +116,40 @@ public class VAppToNodeMetadataTest { VApp result = factory.create(injector.getInstance(VAppHandler.class)).parse(is); VAppToNodeMetadata converter = injector.getInstance(VAppToNodeMetadata.class); NodeMetadata node = converter.apply(result); + assertEquals(node.getUserMetadata(), ImmutableMap.of()); + assertEquals(node.getTags(), ImmutableSet.of()); assertEquals(node.getLocation(), location); assertEquals(node.getPrivateAddresses(), ImmutableSet.of("172.16.7.230")); assertEquals(node.getPublicAddresses(), ImmutableSet.of()); } + + + public void testWithEncodedMetadata() { + Location location = new LocationBuilder().id("https://1.1.1.1/api/v1.0/vdc/1").description("description") + .scope(LocationScope.PROVIDER).build(); + Injector injector = createInjectorWithLocation(location); + InputStream is = getClass().getResourceAsStream("/vapp-pool.xml"); + Factory factory = injector.getInstance(ParseSax.Factory.class); + VApp result = factory.create(injector.getInstance(VAppHandler.class)).parse(is); + VAppToNodeMetadata converter = injector.getInstance(VAppToNodeMetadata.class); + ImmutableMap metadata = ImmutableMap.of("foo", "bar"); + ImmutableSet tags = ImmutableSet.of("tag1", "tag2"); + + String description = Joiner + .on('\n') + .withKeyValueSeparator("=") + .join(ImmutableMap. builder().putAll(metadata) + .put("jclouds_tags", Joiner.on(',').join(tags)).build()); + + result = new VAppImpl(result.getName(), result.getType(), result.getHref(), result.getStatus(), result.getVDC(), + description, result.getTasks(), result.isOvfDescriptorUploaded(), result.getChildren(), + result.getNetworkSection()); + + NodeMetadata node = converter.apply(result); + assertEquals(node.getUserMetadata(), metadata); + assertEquals(node.getTags(), tags); + + } public void testGracefulWhenNoIPs() { Location location = new LocationBuilder().id("https://1.1.1.1/api/v1.0/vdc/1").description("description") diff --git a/apis/vcloud/src/test/java/org/jclouds/vcloud/compute/strategy/InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOnExpectTest.java b/apis/vcloud/src/test/java/org/jclouds/vcloud/compute/strategy/InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOnExpectTest.java index 176e82aded..8c94bd8973 100644 --- a/apis/vcloud/src/test/java/org/jclouds/vcloud/compute/strategy/InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOnExpectTest.java +++ b/apis/vcloud/src/test/java/org/jclouds/vcloud/compute/strategy/InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOnExpectTest.java @@ -70,7 +70,7 @@ public class InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployA String instantiateXML = XMLBuilder.create("InstantiateVAppTemplateParams") .a("xmlns", ns).a("xmlns:ovf", "http://schemas.dmtf.org/ovf/envelope/1") .a("deploy", "false").a("name", name).a("powerOn", "false") - .e("Description").t("UbuntuServer-x64-2GB").up() + .e("Description").up() .e("InstantiationParams") .e("NetworkConfigSection") .e("ovf:Info").t("Configuration parameters for logical networks").up() @@ -127,7 +127,7 @@ public class InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployA String instantiateXML = XMLBuilder.create("InstantiateVAppTemplateParams") .a("xmlns", ns).a("xmlns:ovf", "http://schemas.dmtf.org/ovf/envelope/1") .a("deploy", "false").a("name", name).a("powerOn", "false") - .e("Description").t("UbuntuServer-x64-2GB").up() + .e("Description").up() .e("InstantiationParams") .e("NetworkConfigSection") .e("ovf:Info").t("Configuration parameters for logical networks").up() diff --git a/apis/vcloud/src/test/resources/vapp-pool.xml b/apis/vcloud/src/test/resources/vapp-pool.xml index 13d9432242..1ac8ff3736 100644 --- a/apis/vcloud/src/test/resources/vapp-pool.xml +++ b/apis/vcloud/src/test/resources/vapp-pool.xml @@ -10,7 +10,7 @@ - + Example FTP Server vApp Lease settings section diff --git a/providers/bluelock-vcloud-zone01/src/test/java/org/jclouds/bluelock/vcloud/zone01/compute/BluelockVCloudZone01TemplateBuilderLiveTest.java b/providers/bluelock-vcloud-zone01/src/test/java/org/jclouds/bluelock/vcloud/zone01/compute/BluelockVCloudZone01TemplateBuilderLiveTest.java index 0b68d69d59..d0908b0ec0 100644 --- a/providers/bluelock-vcloud-zone01/src/test/java/org/jclouds/bluelock/vcloud/zone01/compute/BluelockVCloudZone01TemplateBuilderLiveTest.java +++ b/providers/bluelock-vcloud-zone01/src/test/java/org/jclouds/bluelock/vcloud/zone01/compute/BluelockVCloudZone01TemplateBuilderLiveTest.java @@ -55,6 +55,8 @@ public class BluelockVCloudZone01TemplateBuilderLiveTest extends BaseTemplateBui return !input.version.equals("") || !input.is64Bit; case RHEL: return !input.version.equals(""); + case WINDOWS: + return !input.version.equals(""); default: return true; }