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

Reply via email to