You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2018/06/20 13:31:08 UTC

jclouds git commit: JCLOUDS-1427: Fix Elastic IP deserialization when IP has tags

Repository: jclouds
Updated Branches:
  refs/heads/2.1.x cace304ed -> ef4869848


JCLOUDS-1427: Fix Elastic IP deserialization when IP has tags


Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/ef486984
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/ef486984
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/ef486984

Branch: refs/heads/2.1.x
Commit: ef48698488440d9342f9c6f0d415605dd5cfd853
Parents: cace304
Author: Lucia Monte <lu...@abiquo.com>
Authored: Wed Jun 20 11:42:24 2018 +0200
Committer: Ignasi Barrera <na...@apache.org>
Committed: Wed Jun 20 15:30:55 2018 +0200

----------------------------------------------------------------------
 .../ec2/domain/PublicIpInstanceIdPair.java      | 24 ++++++++--
 .../xml/DescribeAddressesResponseHandler.java   | 49 +++++++++++++++++---
 .../LoadPublicIpForInstanceOrNullTest.java      |  6 +--
 .../DescribeAddressesResponseHandlerTest.java   | 28 +++++++++--
 .../resources/describe_addresses_with_tags.xml  | 24 ++++++++++
 5 files changed, 112 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/ef486984/apis/ec2/src/main/java/org/jclouds/ec2/domain/PublicIpInstanceIdPair.java
----------------------------------------------------------------------
diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/domain/PublicIpInstanceIdPair.java b/apis/ec2/src/main/java/org/jclouds/ec2/domain/PublicIpInstanceIdPair.java
index a44276c..f2f673e 100644
--- a/apis/ec2/src/main/java/org/jclouds/ec2/domain/PublicIpInstanceIdPair.java
+++ b/apis/ec2/src/main/java/org/jclouds/ec2/domain/PublicIpInstanceIdPair.java
@@ -18,8 +18,12 @@ package org.jclouds.ec2.domain;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
+import java.util.Map;
+
 import org.jclouds.javax.annotation.Nullable;
 
+import com.google.common.collect.ImmutableMap;
+
 /**
  * 
  * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-ItemType-DescribeAddressesResponseInfoType.html"
@@ -31,11 +35,14 @@ public class PublicIpInstanceIdPair implements Comparable<PublicIpInstanceIdPair
    @Nullable
    private final String instanceId;
    private final String publicIp;
+   private final Map<String, String> tags;
 
-   public PublicIpInstanceIdPair(String region, String publicIp, @Nullable String instanceId) {
+   public PublicIpInstanceIdPair(final String region, final String publicIp, @Nullable final String instanceId,
+         @Nullable final Map<String, String> tags) {
       this.region = checkNotNull(region, "region");
       this.instanceId = instanceId;
       this.publicIp = checkNotNull(publicIp, "publicIp");
+      this.tags = tags == null ? ImmutableMap.<String, String> of() : ImmutableMap.copyOf(tags);
    }
 
    /**
@@ -53,8 +60,8 @@ public class PublicIpInstanceIdPair implements Comparable<PublicIpInstanceIdPair
     * {@inheritDoc}
     */
    @Override
-   public int compareTo(PublicIpInstanceIdPair o) {
-      return (this == o) ? 0 : getPublicIp().compareTo(o.getPublicIp());
+   public int compareTo(final PublicIpInstanceIdPair o) {
+      return this == o ? 0 : getPublicIp().compareTo(o.getPublicIp());
    }
 
    /**
@@ -70,6 +77,10 @@ public class PublicIpInstanceIdPair implements Comparable<PublicIpInstanceIdPair
    public String getPublicIp() {
       return publicIp;
    }
+   
+   public Map<String, String> getTags() {
+      return tags;
+   }
 
    @Override
    public int hashCode() {
@@ -78,6 +89,7 @@ public class PublicIpInstanceIdPair implements Comparable<PublicIpInstanceIdPair
       result = prime * result + ((instanceId == null) ? 0 : instanceId.hashCode());
       result = prime * result + ((publicIp == null) ? 0 : publicIp.hashCode());
       result = prime * result + ((region == null) ? 0 : region.hashCode());
+      result = prime * result + ((tags == null) ? 0 : tags.hashCode());
       return result;
    }
 
@@ -105,7 +117,11 @@ public class PublicIpInstanceIdPair implements Comparable<PublicIpInstanceIdPair
             return false;
       } else if (!region.equals(other.region))
          return false;
+      if (tags == null) {
+         if (other.tags != null)
+            return false;
+      } else if (!tags.equals(other.tags))
+         return false;
       return true;
    }
-
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ef486984/apis/ec2/src/main/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandler.java
----------------------------------------------------------------------
diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandler.java b/apis/ec2/src/main/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandler.java
index 593dac0..1d4470d 100644
--- a/apis/ec2/src/main/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandler.java
+++ b/apis/ec2/src/main/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandler.java
@@ -16,6 +16,9 @@
  */
 package org.jclouds.ec2.xml;
 
+import static org.jclouds.util.SaxUtils.equalsOrSuffix;
+
+import java.util.Map;
 import java.util.Set;
 
 import javax.annotation.Resource;
@@ -26,12 +29,12 @@ import org.jclouds.ec2.domain.PublicIpInstanceIdPair;
 import org.jclouds.http.functions.ParseSax.HandlerForGeneratedRequestWithResult;
 import org.jclouds.location.Region;
 import org.jclouds.logging.Logger;
+import org.xml.sax.Attributes;
 
 import com.google.common.base.Supplier;
 import com.google.common.collect.Sets;
 
-public class DescribeAddressesResponseHandler extends
-         HandlerForGeneratedRequestWithResult<Set<PublicIpInstanceIdPair>> {
+public class DescribeAddressesResponseHandler extends HandlerForGeneratedRequestWithResult<Set<PublicIpInstanceIdPair>> {
 
    @Resource
    protected Logger logger = Logger.NULL;
@@ -42,14 +45,38 @@ public class DescribeAddressesResponseHandler extends
    @Region
    Supplier<String> defaultRegion;
    private String instanceId;
+   private final TagSetHandler tagSetHandler;
+   private boolean inTagSet;
+   private Map<String, String> tagResults;
+
+   @Inject
+   DescribeAddressesResponseHandler(final TagSetHandler tagSetHandler) {
+      this.tagSetHandler = tagSetHandler;
+   }
+
+   @Override
+   public void startElement(final String uri, final String name, final String qName, final Attributes attrs) {
+      if (equalsOrSuffix(qName, "tagSet")) {
+         inTagSet = true;
+      }
+      if (inTagSet) {
+         tagSetHandler.startElement(uri, name, qName, attrs);
+      }
+   }
 
    protected String currentOrNull() {
       String returnVal = currentText.toString().trim();
       return returnVal.equals("") ? null : returnVal;
    }
 
-   public void endElement(String uri, String name, String qName) {
-      if (qName.equals("publicIp")) {
+   @Override
+   public void endElement(final String uri, final String name, final String qName) {
+      if (equalsOrSuffix(qName, "tagSet")) {
+         inTagSet = false;
+         tagResults = tagSetHandler.getResult();
+      } else if (inTagSet) {
+         tagSetHandler.endElement(uri, name, qName);
+      } else if (qName.equals("publicIp")) {
          ipAddress = currentOrNull();
       } else if (qName.equals("instanceId")) {
          instanceId = currentOrNull();
@@ -57,15 +84,23 @@ public class DescribeAddressesResponseHandler extends
          String region = AWSUtils.findRegionInArgsOrNull(getRequest());
          if (region == null)
             region = defaultRegion.get();
-         pairs.add(new PublicIpInstanceIdPair(region, ipAddress, instanceId));
+
+         pairs.add(new PublicIpInstanceIdPair(region, ipAddress, instanceId, tagResults));
          ipAddress = null;
          instanceId = null;
+         tagResults = null;
       }
+
       currentText.setLength(0);
    }
 
-   public void characters(char[] ch, int start, int length) {
-      currentText.append(ch, start, length);
+   @Override
+   public void characters(final char[] ch, final int start, final int length) {
+      if (inTagSet) {
+         tagSetHandler.characters(ch, start, length);
+      } else {
+         currentText.append(ch, start, length);
+      }
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ef486984/apis/ec2/src/test/java/org/jclouds/ec2/compute/loaders/LoadPublicIpForInstanceOrNullTest.java
----------------------------------------------------------------------
diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/compute/loaders/LoadPublicIpForInstanceOrNullTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/compute/loaders/LoadPublicIpForInstanceOrNullTest.java
index fde64ca..c4dd09e 100644
--- a/apis/ec2/src/test/java/org/jclouds/ec2/compute/loaders/LoadPublicIpForInstanceOrNullTest.java
+++ b/apis/ec2/src/test/java/org/jclouds/ec2/compute/loaders/LoadPublicIpForInstanceOrNullTest.java
@@ -41,8 +41,8 @@ public class LoadPublicIpForInstanceOrNullTest {
 
       expect(client.getElasticIPAddressApi()).andReturn((Optional) Optional.of(ipClient)).atLeastOnce();
       expect(ipClient.describeAddressesInRegion("region")).andReturn(
-               ImmutableSet.<PublicIpInstanceIdPair> of(new PublicIpInstanceIdPair("region", "1.1.1.1", "i-blah")))
-               .atLeastOnce();
+            ImmutableSet.<PublicIpInstanceIdPair> of(new PublicIpInstanceIdPair("region", "1.1.1.1", "i-blah", null)))
+            .atLeastOnce();
 
       replay(client);
       replay(ipClient);
@@ -85,7 +85,7 @@ public class LoadPublicIpForInstanceOrNullTest {
       expect(client.getElasticIPAddressApi()).andReturn((Optional) Optional.of(ipClient)).atLeastOnce();
 
       expect(ipClient.describeAddressesInRegion("region")).andReturn(
-               ImmutableSet.<PublicIpInstanceIdPair> of(new PublicIpInstanceIdPair("region", "1.1.1.1", null)))
+            ImmutableSet.<PublicIpInstanceIdPair> of(new PublicIpInstanceIdPair("region", "1.1.1.1", null, null)))
                .atLeastOnce();
 
       replay(client);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ef486984/apis/ec2/src/test/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandlerTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandlerTest.java
index 65c61c2..b9684d0 100644
--- a/apis/ec2/src/test/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandlerTest.java
+++ b/apis/ec2/src/test/java/org/jclouds/ec2/xml/DescribeAddressesResponseHandlerTest.java
@@ -20,13 +20,15 @@ import static org.testng.Assert.assertEquals;
 
 import java.io.InputStream;
 import java.net.UnknownHostException;
+import java.util.Collections;
 import java.util.Set;
 
 import org.jclouds.ec2.domain.PublicIpInstanceIdPair;
 import org.jclouds.http.functions.ParseSax;
 import org.testng.annotations.Test;
 
-import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
 
 /**
  * Tests behavior of {@code DescribeAddressesResponseHandler}
@@ -43,13 +45,29 @@ public class DescribeAddressesResponseHandlerTest extends BaseEC2HandlerTest {
       addDefaultRegionToHandler(handler);
 
       Set<PublicIpInstanceIdPair> result = factory.create(handler).parse(is);
+      
+      assertEquals(result, ImmutableSet.of(new PublicIpInstanceIdPair(defaultRegion, "67.202.55.255", "i-f15ebb98",
+            Collections.<String, String> emptyMap()), new PublicIpInstanceIdPair(defaultRegion, "67.202.55.233", null,
+            Collections.<String, String> emptyMap())));
+   }
+   
+   public void testApplyInputStreamWithTags() throws UnknownHostException {
+
+      InputStream is = getClass().getResourceAsStream("/describe_addresses_with_tags.xml");
+
+      DescribeAddressesResponseHandler handler = injector.getInstance(DescribeAddressesResponseHandler.class);
+      addDefaultRegionToHandler(handler);
+
+      Set<PublicIpInstanceIdPair> result = factory.create(handler).parse(is);
 
-      assertEquals(result, ImmutableList.of(new PublicIpInstanceIdPair(defaultRegion,
-               "67.202.55.255", "i-f15ebb98"), new PublicIpInstanceIdPair(defaultRegion,
-               "67.202.55.233", null)));
+      assertEquals(result.size(), 3);
+      assertEquals(result, ImmutableSet.of(new PublicIpInstanceIdPair(defaultRegion, "67.202.55.255", "i-f15ebb98",
+            Collections.<String, String> emptyMap()), new PublicIpInstanceIdPair(defaultRegion, "67.202.55.233", null,
+            Collections.<String, String> emptyMap()), new PublicIpInstanceIdPair(defaultRegion, "54.76.27.192", null,
+            ImmutableMap.of("Name", "value-fa97d19c", "Empty", ""))));
    }
 
-   private void addDefaultRegionToHandler(ParseSax.HandlerWithResult<?> handler) {
+   private void addDefaultRegionToHandler(final ParseSax.HandlerWithResult<?> handler) {
       handler.setContext(request);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ef486984/apis/ec2/src/test/resources/describe_addresses_with_tags.xml
----------------------------------------------------------------------
diff --git a/apis/ec2/src/test/resources/describe_addresses_with_tags.xml b/apis/ec2/src/test/resources/describe_addresses_with_tags.xml
new file mode 100644
index 0000000..f7fd83c
--- /dev/null
+++ b/apis/ec2/src/test/resources/describe_addresses_with_tags.xml
@@ -0,0 +1,24 @@
+<DescribeAddressesResponse xmlns="http://ec2.amazonaws.com/doc/2009-11-30/">
+    <addressesSet>
+        <item>
+            <instanceId>i-f15ebb98</instanceId>
+            <publicIp>67.202.55.255</publicIp>
+        </item>
+        <item>
+            <publicIp>67.202.55.233</publicIp>
+        </item>
+        <item>
+            <publicIp>54.76.27.192</publicIp>
+            <tagSet>
+                <item>
+                    <key>Name</key>
+                    <value>value-fa97d19c</value>
+                </item>
+                <item>
+                    <key>Empty</key>
+                    <value/>
+                </item>
+            </tagSet>
+        </item>
+    </addressesSet>
+</DescribeAddressesResponse>
\ No newline at end of file