Issue 934: templateOptions.tags,userMetadata for vcloud

This commit is contained in:
Adrian Cole 2012-08-01 16:56:19 -07:00
parent d00efae8a7
commit bb5927515e
7 changed files with 51 additions and 14 deletions

View File

@ -21,6 +21,7 @@ package org.jclouds.vcloud.compute.functions;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Predicates.not; import static com.google.common.base.Predicates.not;
import static com.google.common.collect.Iterables.filter; 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.getCredentialsFrom;
import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.getIpsFromVApp; import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.getIpsFromVApp;
import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.toComputeOs; 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 org.jclouds.vcloud.domain.VApp;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Splitter;
import static com.google.common.base.Strings.*;
/** /**
* @author Adrian Cole * @author Adrian Cole
@ -74,6 +77,9 @@ public class VAppToNodeMetadata implements Function<VApp, NodeMetadata> {
builder.ids(from.getHref().toASCIIString()); builder.ids(from.getHref().toASCIIString());
builder.uri(from.getHref()); builder.uri(from.getHref());
builder.name(from.getName()); 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.hostname(from.getName());
builder.location(findLocationForResourceInVDC.apply(from.getVDC())); builder.location(findLocationForResourceInVDC.apply(from.getVDC()));
builder.group(nodeNamingConvention.groupInUniqueNameOrNull(from.getName())); builder.group(nodeNamingConvention.groupInUniqueNameOrNull(from.getName()));

View File

@ -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.find;
import static com.google.common.collect.Iterables.get; import static com.google.common.collect.Iterables.get;
import static org.jclouds.compute.util.ComputeServiceUtils.getCores; 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.compute.util.VCloudComputeUtils.getCredentialsFrom;
import static org.jclouds.vcloud.options.InstantiateVAppTemplateOptions.Builder.addNetworkConfig; import static org.jclouds.vcloud.options.InstantiateVAppTemplateOptions.Builder.addNetworkConfig;
import java.net.URI; import java.net.URI;
import java.util.Map;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.inject.Inject; import javax.inject.Inject;
@ -57,6 +59,7 @@ import org.jclouds.vcloud.domain.network.NetworkConfig;
import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Joiner;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.cache.LoadingCache; import com.google.common.cache.LoadingCache;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
@ -189,8 +192,10 @@ public class InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployA
String description = VCloudTemplateOptions.class.cast(template.getOptions()).getDescription(); String description = VCloudTemplateOptions.class.cast(template.getOptions()).getDescription();
if (description == null) if (description == null) {
description = vAppTemplate.getName(); Map<String, String> md = metadataAndTagsAsCommaDelimitedValue(template.getOptions());
description = Joiner.on('\n').withKeyValueSeparator("=").join(md);
}
options.description(description); options.description(description);
options.deploy(false); options.deploy(false);

View File

@ -18,12 +18,10 @@
*/ */
package org.jclouds.vcloud.compute; package org.jclouds.vcloud.compute;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.internal.BaseComputeServiceLiveTest; import org.jclouds.compute.internal.BaseComputeServiceLiveTest;
import org.jclouds.sshj.config.SshjSshClientModule; import org.jclouds.sshj.config.SshjSshClientModule;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.inject.Module; import com.google.inject.Module;
/** /**
@ -55,11 +53,4 @@ public class VCloudComputeServiceLiveTest extends BaseComputeServiceLiveTest {
return new SshjSshClientModule(); return new SshjSshClientModule();
} }
// vcloud does not support metadata
@Override
protected void checkUserMetadataInNodeEquals(NodeMetadata node, ImmutableMap<String, String> userMetadata) {
assert node.getUserMetadata().equals(ImmutableMap.<String, String> of()) : String.format(
"node userMetadata did not match %s %s", userMetadata, node);
}
} }

View File

@ -43,13 +43,16 @@ import org.jclouds.vcloud.compute.config.VCloudComputeServiceDependenciesModule;
import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.ReferenceType;
import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.Status;
import org.jclouds.vcloud.domain.VApp; import org.jclouds.vcloud.domain.VApp;
import org.jclouds.vcloud.domain.internal.VAppImpl;
import org.jclouds.vcloud.xml.VAppHandler; import org.jclouds.vcloud.xml.VAppHandler;
import org.jclouds.vcloud.xml.ovf.VCloudResourceAllocationSettingDataHandler; import org.jclouds.vcloud.xml.ovf.VCloudResourceAllocationSettingDataHandler;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.base.Suppliers; import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.inject.AbstractModule; import com.google.inject.AbstractModule;
@ -113,11 +116,41 @@ public class VAppToNodeMetadataTest {
VApp result = factory.create(injector.getInstance(VAppHandler.class)).parse(is); VApp result = factory.create(injector.getInstance(VAppHandler.class)).parse(is);
VAppToNodeMetadata converter = injector.getInstance(VAppToNodeMetadata.class); VAppToNodeMetadata converter = injector.getInstance(VAppToNodeMetadata.class);
NodeMetadata node = converter.apply(result); NodeMetadata node = converter.apply(result);
assertEquals(node.getUserMetadata(), ImmutableMap.<String, String>of());
assertEquals(node.getTags(), ImmutableSet.<String>of());
assertEquals(node.getLocation(), location); assertEquals(node.getLocation(), location);
assertEquals(node.getPrivateAddresses(), ImmutableSet.of("172.16.7.230")); assertEquals(node.getPrivateAddresses(), ImmutableSet.of("172.16.7.230"));
assertEquals(node.getPublicAddresses(), ImmutableSet.of()); 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<String, String> metadata = ImmutableMap.<String, String>of("foo", "bar");
ImmutableSet<String> tags = ImmutableSet.<String>of("tag1", "tag2");
String description = Joiner
.on('\n')
.withKeyValueSeparator("=")
.join(ImmutableMap.<String, String> 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() { public void testGracefulWhenNoIPs() {
Location location = new LocationBuilder().id("https://1.1.1.1/api/v1.0/vdc/1").description("description") Location location = new LocationBuilder().id("https://1.1.1.1/api/v1.0/vdc/1").description("description")
.scope(LocationScope.PROVIDER).build(); .scope(LocationScope.PROVIDER).build();

View File

@ -70,7 +70,7 @@ public class InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployA
String instantiateXML = XMLBuilder.create("InstantiateVAppTemplateParams") String instantiateXML = XMLBuilder.create("InstantiateVAppTemplateParams")
.a("xmlns", ns).a("xmlns:ovf", "http://schemas.dmtf.org/ovf/envelope/1") .a("xmlns", ns).a("xmlns:ovf", "http://schemas.dmtf.org/ovf/envelope/1")
.a("deploy", "false").a("name", name).a("powerOn", "false") .a("deploy", "false").a("name", name).a("powerOn", "false")
.e("Description").t("UbuntuServer-x64-2GB").up() .e("Description").up()
.e("InstantiationParams") .e("InstantiationParams")
.e("NetworkConfigSection") .e("NetworkConfigSection")
.e("ovf:Info").t("Configuration parameters for logical networks").up() .e("ovf:Info").t("Configuration parameters for logical networks").up()
@ -127,7 +127,7 @@ public class InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployA
String instantiateXML = XMLBuilder.create("InstantiateVAppTemplateParams") String instantiateXML = XMLBuilder.create("InstantiateVAppTemplateParams")
.a("xmlns", ns).a("xmlns:ovf", "http://schemas.dmtf.org/ovf/envelope/1") .a("xmlns", ns).a("xmlns:ovf", "http://schemas.dmtf.org/ovf/envelope/1")
.a("deploy", "false").a("name", name).a("powerOn", "false") .a("deploy", "false").a("name", name).a("powerOn", "false")
.e("Description").t("UbuntuServer-x64-2GB").up() .e("Description").up()
.e("InstantiationParams") .e("InstantiationParams")
.e("NetworkConfigSection") .e("NetworkConfigSection")
.e("ovf:Info").t("Configuration parameters for logical networks").up() .e("ovf:Info").t("Configuration parameters for logical networks").up()

View File

@ -10,7 +10,7 @@
<Link rel="controlAccess" type="application/vnd.vmware.vcloud.controlAccess+xml" href="https://1.1.1.1/api/v1.0/vApp/vapp-1/action/controlAccess"/> <Link rel="controlAccess" type="application/vnd.vmware.vcloud.controlAccess+xml" href="https://1.1.1.1/api/v1.0/vApp/vapp-1/action/controlAccess"/>
<Link rel="up" type="application/vnd.vmware.vcloud.vdc+xml" href="https://1.1.1.1/api/v1.0/vdc/1"/> <Link rel="up" type="application/vnd.vmware.vcloud.vdc+xml" href="https://1.1.1.1/api/v1.0/vdc/1"/>
<Link rel="edit" type="application/vnd.vmware.vcloud.vApp+xml" href="https://1.1.1.1/api/v1.0/vApp/vapp-1"/> <Link rel="edit" type="application/vnd.vmware.vcloud.vApp+xml" href="https://1.1.1.1/api/v1.0/vApp/vapp-1"/>
<Description/> <Description>Example FTP Server vApp</Description>
<LeaseSettingsSection type="application/vnd.vmware.vcloud.leaseSettingsSection+xml" href="https://1.1.1.1/api/v1.0/vApp/vapp-1/leaseSettingsSection/" ovf:required="false"> <LeaseSettingsSection type="application/vnd.vmware.vcloud.leaseSettingsSection+xml" href="https://1.1.1.1/api/v1.0/vApp/vapp-1/leaseSettingsSection/" ovf:required="false">
<ovf:Info>Lease settings section</ovf:Info> <ovf:Info>Lease settings section</ovf:Info>
<Link rel="edit" type="application/vnd.vmware.vcloud.leaseSettingsSection+xml" href="https://1.1.1.1/api/v1.0/vApp/vapp-1/leaseSettingsSection/"/> <Link rel="edit" type="application/vnd.vmware.vcloud.leaseSettingsSection+xml" href="https://1.1.1.1/api/v1.0/vApp/vapp-1/leaseSettingsSection/"/>

View File

@ -55,6 +55,8 @@ public class BluelockVCloudZone01TemplateBuilderLiveTest extends BaseTemplateBui
return !input.version.equals("") || !input.is64Bit; return !input.version.equals("") || !input.is64Bit;
case RHEL: case RHEL:
return !input.version.equals(""); return !input.version.equals("");
case WINDOWS:
return !input.version.equals("");
default: default:
return true; return true;
} }