Adding tags/userMetadata to NodeMetadata transform
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/e3b78b7f Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/e3b78b7f Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/e3b78b7f Branch: refs/heads/jclouds-756 Commit: e3b78b7f0fa53a9278a53b1b01c8c32db53794d5 Parents: 43bb86f Author: Andrew Bayer <[email protected]> Authored: Tue Oct 21 15:10:30 2014 -0700 Committer: Andrew Bayer <[email protected]> Committed: Tue Oct 21 15:10:30 2014 -0700 ---------------------------------------------------------------------- .../functions/VirtualMachineToNodeMetadata.java | 38 +++++++---- .../CloudStackComputeServiceAdapter.java | 37 +++++++---- .../VirtualMachineToNodeMetadataTest.java | 12 +++- .../parse/ListVirtualMachinesResponseTest.java | 22 ++++++- .../resources/listvirtualmachinesresponse.json | 67 +++++++++++++++++++- 5 files changed, 145 insertions(+), 31 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/e3b78b7f/apis/cloudstack/src/main/java/org/jclouds/cloudstack/compute/functions/VirtualMachineToNodeMetadata.java ---------------------------------------------------------------------- diff --git a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/compute/functions/VirtualMachineToNodeMetadata.java b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/compute/functions/VirtualMachineToNodeMetadata.java index cb78ece..5421396 100644 --- a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/compute/functions/VirtualMachineToNodeMetadata.java +++ b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/compute/functions/VirtualMachineToNodeMetadata.java @@ -20,17 +20,28 @@ import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.Iterables.filter; import static com.google.common.collect.Iterables.transform; import static com.google.common.collect.Sets.newHashSet; +import static org.jclouds.compute.util.ComputeServiceUtils.addMetadataAndParseTagsFromValuesOfEmptyString; import static org.jclouds.location.predicates.LocationPredicates.idEquals; import static org.jclouds.util.InetAddresses2.isPrivateIPAddress; -import java.util.Map; -import java.util.Set; - import javax.inject.Inject; import javax.inject.Singleton; +import java.util.Map; +import java.util.Set; +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.common.base.Throwables; +import com.google.common.cache.LoadingCache; +import com.google.common.collect.FluentIterable; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Iterables; +import com.google.common.util.concurrent.UncheckedExecutionException; import org.jclouds.cloudstack.domain.IPForwardingRule; import org.jclouds.cloudstack.domain.NIC; +import org.jclouds.cloudstack.domain.Tag; import org.jclouds.cloudstack.domain.VirtualMachine; import org.jclouds.collect.Memoized; import org.jclouds.compute.domain.HardwareBuilder; @@ -44,17 +55,6 @@ import org.jclouds.domain.Location; import org.jclouds.rest.ResourceNotFoundException; import org.jclouds.util.Throwables2; -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.base.Supplier; -import com.google.common.base.Throwables; -import com.google.common.cache.LoadingCache; -import com.google.common.collect.FluentIterable; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Iterables; -import com.google.common.util.concurrent.UncheckedExecutionException; - @Singleton public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, NodeMetadata> { @@ -119,6 +119,16 @@ public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, No builder.operatingSystem(image.getOperatingSystem()); } + if (!from.getTags().isEmpty()) { + ImmutableMap.Builder<String, String> tagsBuilder = ImmutableMap.<String, String>builder(); + + for (Tag tag : from.getTags()) { + tagsBuilder.put(tag.getKey(), tag.getValue()); + } + + addMetadataAndParseTagsFromValuesOfEmptyString(builder, tagsBuilder.build()); + } + builder.hardware(new HardwareBuilder() .ids(from.getServiceOfferingId() + "") .name(from.getServiceOfferingName() + "") http://git-wip-us.apache.org/repos/asf/jclouds/blob/e3b78b7f/apis/cloudstack/src/main/java/org/jclouds/cloudstack/compute/strategy/CloudStackComputeServiceAdapter.java ---------------------------------------------------------------------- diff --git a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/compute/strategy/CloudStackComputeServiceAdapter.java b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/compute/strategy/CloudStackComputeServiceAdapter.java index 29f5c85..3e666a7 100644 --- a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/compute/strategy/CloudStackComputeServiceAdapter.java +++ b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/compute/strategy/CloudStackComputeServiceAdapter.java @@ -26,17 +26,24 @@ import static org.jclouds.cloudstack.options.DeployVirtualMachineOptions.Builder import static org.jclouds.cloudstack.options.ListTemplatesOptions.Builder.id; import static org.jclouds.cloudstack.predicates.TemplatePredicates.isReady; import static org.jclouds.cloudstack.predicates.ZonePredicates.supportsSecurityGroups; +import static org.jclouds.compute.util.ComputeServiceUtils.metadataAndTagsAsValuesOfEmptyString; import static org.jclouds.ssh.SshKeys.fingerprintPrivateKey; -import java.util.List; -import java.util.Map; -import java.util.Set; - import javax.annotation.Resource; import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; +import java.util.List; +import java.util.Map; +import java.util.Set; +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.common.cache.LoadingCache; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSet.Builder; +import com.google.common.collect.Sets; +import com.google.common.primitives.Ints; import org.jclouds.cloudstack.CloudStackApi; import org.jclouds.cloudstack.compute.options.CloudStackTemplateOptions; import org.jclouds.cloudstack.domain.AsyncCreateResponse; @@ -50,6 +57,7 @@ import org.jclouds.cloudstack.domain.PublicIPAddress; import org.jclouds.cloudstack.domain.SecurityGroup; import org.jclouds.cloudstack.domain.ServiceOffering; import org.jclouds.cloudstack.domain.SshKeyPair; +import org.jclouds.cloudstack.domain.Tag; import org.jclouds.cloudstack.domain.Template; import org.jclouds.cloudstack.domain.VirtualMachine; import org.jclouds.cloudstack.domain.Zone; @@ -60,6 +68,7 @@ import org.jclouds.cloudstack.functions.CreateFirewallRulesForIP; import org.jclouds.cloudstack.functions.CreatePortForwardingRulesForIP; import org.jclouds.cloudstack.functions.StaticNATVirtualMachineInNetwork; import org.jclouds.cloudstack.functions.StaticNATVirtualMachineInNetwork.Factory; +import org.jclouds.cloudstack.options.CreateTagsOptions; import org.jclouds.cloudstack.options.DeployVirtualMachineOptions; import org.jclouds.cloudstack.options.ListFirewallRulesOptions; import org.jclouds.cloudstack.options.ListTemplatesOptions; @@ -72,14 +81,6 @@ import org.jclouds.domain.Credentials; import org.jclouds.domain.LoginCredentials; import org.jclouds.logging.Logger; -import com.google.common.base.Predicate; -import com.google.common.base.Supplier; -import com.google.common.cache.LoadingCache; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.ImmutableSet.Builder; -import com.google.common.collect.Sets; -import com.google.common.primitives.Ints; - /** * defines the connection between the {@link CloudStackApi} implementation * and the jclouds {@link ComputeService} @@ -243,7 +244,17 @@ public class CloudStackComputeServiceAdapter implements } try { - if (templateOptions.shouldSetupStaticNat()) { + Map<String, String> common = metadataAndTagsAsValuesOfEmptyString(template.getOptions()); + if (!common.isEmpty()) { + logger.debug(">> adding tags %s to virtualmachine(%s)", common, vm.getId()); + CreateTagsOptions tagOptions = CreateTagsOptions.Builder.resourceIds(vm.getId()) + .resourceType(Tag.ResourceType.USER_VM) + .tags(common); + AsyncCreateResponse tagJob = client.getTagApi().createTags(tagOptions); + awaitCompletion(tagJob.getJobId()); + logger.debug("<< tags added"); + } + if (templateOptions.shouldSetupStaticNat()) { Capabilities capabilities = client.getConfigurationApi().listCapabilities(); // TODO: possibly not all network ids, do we want to do this for (String networkId : options.getNetworkIds()) { http://git-wip-us.apache.org/repos/asf/jclouds/blob/e3b78b7f/apis/cloudstack/src/test/java/org/jclouds/cloudstack/compute/functions/VirtualMachineToNodeMetadataTest.java ---------------------------------------------------------------------- diff --git a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/compute/functions/VirtualMachineToNodeMetadataTest.java b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/compute/functions/VirtualMachineToNodeMetadataTest.java index 6c055f7..01bf3b3 100644 --- a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/compute/functions/VirtualMachineToNodeMetadataTest.java +++ b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/compute/functions/VirtualMachineToNodeMetadataTest.java @@ -21,6 +21,7 @@ import static org.testng.Assert.assertEquals; import java.net.UnknownHostException; import java.util.Set; +import com.google.common.collect.ImmutableMap; import org.jclouds.cloudstack.domain.GuestIPType; import org.jclouds.cloudstack.domain.IPForwardingRule; import org.jclouds.cloudstack.domain.NIC; @@ -81,7 +82,11 @@ public class VirtualMachineToNodeMetadataTest { .privateAddresses(ImmutableSet.of("10.1.1.18")).publicAddresses(ImmutableSet.of("1.1.1.1")) .hardware(addHypervisor(ServiceOfferingToHardwareTest.one, "XenServer")) .imageId(TemplateToImageTest.one.getId()) - .operatingSystem(TemplateToImageTest.one.getOperatingSystem()).build().toString()); + .operatingSystem(TemplateToImageTest.one.getOperatingSystem()) + .tags(ImmutableSet.of("another-tag")) + .userMetadata(ImmutableMap.of("some-tag", "some-value")) + .build().toString() + ); } @@ -177,7 +182,10 @@ public class VirtualMachineToNodeMetadataTest { .privateAddresses(ImmutableSet.of("10.1.1.18")) .hardware(addHypervisor(ServiceOfferingToHardwareTest.one, "XenServer")) .imageId(TemplateToImageTest.one.getId()) - .operatingSystem(TemplateToImageTest.one.getOperatingSystem()).build().toString()); + .operatingSystem(TemplateToImageTest.one.getOperatingSystem()) + .tags(ImmutableSet.of("another-tag")) + .userMetadata(ImmutableMap.of("some-tag", "some-value")) + .build().toString()); } protected Hardware addHypervisor(Hardware in, String hypervisor) { http://git-wip-us.apache.org/repos/asf/jclouds/blob/e3b78b7f/apis/cloudstack/src/test/java/org/jclouds/cloudstack/parse/ListVirtualMachinesResponseTest.java ---------------------------------------------------------------------- diff --git a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/parse/ListVirtualMachinesResponseTest.java b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/parse/ListVirtualMachinesResponseTest.java index d6b737b..4b0094b 100644 --- a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/parse/ListVirtualMachinesResponseTest.java +++ b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/parse/ListVirtualMachinesResponseTest.java @@ -20,6 +20,7 @@ import java.util.Set; import org.jclouds.cloudstack.domain.GuestIPType; import org.jclouds.cloudstack.domain.NIC; +import org.jclouds.cloudstack.domain.Tag; import org.jclouds.cloudstack.domain.TrafficType; import org.jclouds.cloudstack.domain.VirtualMachine; import org.jclouds.date.internal.SimpleDateFormatDateService; @@ -69,7 +70,26 @@ public class ListVirtualMachinesResponseTest extends BaseSetParserTest<VirtualMa .jobStatus(0) .nics(ImmutableSet.of(NIC.builder().id("72").networkId("204").netmask("255.255.255.0").gateway("10.1.1.1") .IPAddress("10.1.1.18").trafficType(TrafficType.GUEST).guestIPType(GuestIPType.VIRTUAL) - .isDefault(true).build())).hypervisor("XenServer").build()); + .isDefault(true).build())) + .hypervisor("XenServer") + .tags(ImmutableSet.of( + Tag.builder().account("adrian") + .resourceId("54") + .resourceType(Tag.ResourceType.USER_VM) + .key("some-tag") + .value("some-value") + .domain("ROOT") + .domainId("1") + .build(), + Tag.builder().account("adrian") + .resourceId("54") + .resourceType(Tag.ResourceType.USER_VM) + .key("another-tag") + .value("") + .domain("ROOT") + .domainId("1") + .build())) + .build()); } } http://git-wip-us.apache.org/repos/asf/jclouds/blob/e3b78b7f/apis/cloudstack/src/test/resources/listvirtualmachinesresponse.json ---------------------------------------------------------------------- diff --git a/apis/cloudstack/src/test/resources/listvirtualmachinesresponse.json b/apis/cloudstack/src/test/resources/listvirtualmachinesresponse.json index 0d27100..f5c0b04 100644 --- a/apis/cloudstack/src/test/resources/listvirtualmachinesresponse.json +++ b/apis/cloudstack/src/test/resources/listvirtualmachinesresponse.json @@ -1 +1,66 @@ -{ "listvirtualmachinesresponse" : { "virtualmachine" : [ {"id":54,"name":"i-3-54-VM","displayname":"i-3-54-VM","account":"adrian","domainid":1,"domain":"ROOT","created":"2011-02-16T14:28:37-0800","state":"Starting","haenable":false,"zoneid":1,"zonename":"San Jose 1","templateid":2,"templatename":"CentOS 5.3(64-bit) no GUI (XenServer)","templatedisplaytext":"CentOS 5.3(64-bit) no GUI (XenServer)","passwordenabled":false,"serviceofferingid":1,"serviceofferingname":"Small Instance","cpunumber":1,"cpuspeed":500,"memory":512,"guestosid":11,"rootdeviceid":0,"rootdevicetype":"NetworkFilesystem","securitygroup":[],"jobid":63,"jobstatus":0,"nic":[{"id":72,"networkid":204,"netmask":"255.255.255.0","gateway":"10.1.1.1","ipaddress":"10.1.1.18","traffictype":"Guest","type":"Virtual","isdefault":true}],"hypervisor":"XenServer"} ] } } \ No newline at end of file +{ "listvirtualmachinesresponse": { + "virtualmachine": [ + { + "id": 54, + "name": "i-3-54-VM", + "displayname": "i-3-54-VM", + "account": "adrian", + "domainid": 1, + "domain": "ROOT", + "created": "2011-02-16T14:28:37-0800", + "state": "Starting", + "haenable": false, + "zoneid": 1, + "zonename": "San Jose 1", + "templateid": 2, + "templatename": "CentOS 5.3(64-bit) no GUI (XenServer)", + "templatedisplaytext": "CentOS 5.3(64-bit) no GUI (XenServer)", + "passwordenabled": false, + "serviceofferingid": 1, + "serviceofferingname": "Small Instance", + "cpunumber": 1, + "cpuspeed": 500, + "memory": 512, + "guestosid": 11, + "rootdeviceid": 0, + "rootdevicetype": "NetworkFilesystem", + "securitygroup": [], + "jobid": 63, + "jobstatus": 0, + "nic": [ + { + "id": 72, + "networkid": 204, + "netmask": "255.255.255.0", + "gateway": "10.1.1.1", + "ipaddress": "10.1.1.18", + "traffictype": "Guest", + "type": "Virtual", + "isdefault": true + } + ], + "hypervisor": "XenServer", + "tags": [ + { + "account": "adrian", + "domain": "ROOT", + "domainid": "1", + "key": "some-tag", + "resourceid": "54", + "resourcetype": "UserVm", + "value": "some-value" + }, + { + "account": "adrian", + "domain": "ROOT", + "domainid": "1", + "key": "another-tag", + "resourceid": "54", + "resourcetype": "UserVm", + "value": "" + } + + ] + } + ] +} } \ No newline at end of file
