Repository: jclouds
Updated Branches:
  refs/heads/master c96cfb617 -> f46b38dd8


JCLOUDS-1114: Adding support for "Placement.Tenancy" and "Placement.HostId" AWS 
EC2 parameters


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

Branch: refs/heads/master
Commit: ccd1ef2b4da33e6d4daa7fd38779388cabf61009
Parents: c96cfb6
Author: Sergey Torgashov <[email protected]>
Authored: Tue May 17 17:51:28 2016 +0300
Committer: Ignasi Barrera <[email protected]>
Committed: Fri May 20 00:07:47 2016 +0200

----------------------------------------------------------------------
 .../aws/ec2/compute/AWSEC2TemplateOptions.java  | 55 +++++++++++++++++++-
 ...curityGroupsAsNeededAndReturnRunOptions.java |  4 ++
 .../aws/ec2/options/AWSRunInstancesOptions.java | 32 ++++++++++++
 .../org/jclouds/aws/ec2/options/Tenancy.java    | 37 +++++++++++++
 .../AWSEC2ComputeServiceApiMockTest.java        | 35 +++++++++++++
 .../options/AWSEC2TemplateOptionsTest.java      | 39 ++++++++++++++
 .../aws/ec2/features/AWSInstanceApiTest.java    | 19 ++++---
 .../ec2/options/AWSRunInstancesOptionsTest.java | 49 +++++++++++++++++
 8 files changed, 260 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/ccd1ef2b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateOptions.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateOptions.java
 
b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateOptions.java
index 760a0aa..d711ad7 100644
--- 
a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateOptions.java
+++ 
b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateOptions.java
@@ -28,6 +28,7 @@ import java.util.Map;
 import java.util.Set;
 
 import org.jclouds.aws.ec2.options.RequestSpotInstancesOptions;
+import org.jclouds.aws.ec2.options.Tenancy;
 import org.jclouds.compute.options.TemplateOptions;
 import org.jclouds.domain.LoginCredentials;
 import org.jclouds.ec2.compute.options.EC2TemplateOptions;
@@ -89,6 +90,10 @@ public class AWSEC2TemplateOptions extends 
EC2TemplateOptions implements Cloneab
             eTo.spotOptions(getSpotOptions());
          if (getPrivateIpAddress() != null)
             eTo.privateIpAddress(getPrivateIpAddress());
+         if (getTenancy() != null)
+            eTo.tenancy(getTenancy());
+         if (getDedicatedHostId() != null)
+            eTo.dedicatedHostId(getDedicatedHostId());
       }
    }
 
@@ -102,6 +107,8 @@ public class AWSEC2TemplateOptions extends 
EC2TemplateOptions implements Cloneab
    private String iamInstanceProfileArn;
    private String iamInstanceProfileName;
    private String privateIpAddress;
+   private Tenancy tenancy;
+   private String dedicatedHostId;
 
    @Override
    public boolean equals(Object o) {
@@ -116,13 +123,15 @@ public class AWSEC2TemplateOptions extends 
EC2TemplateOptions implements Cloneab
                && equal(this.spotPrice, that.spotPrice) && 
equal(this.spotOptions, that.spotOptions)
                && equal(this.groupIds, that.groupIds) && 
equal(this.iamInstanceProfileArn, that.iamInstanceProfileArn)
                && equal(this.iamInstanceProfileName, 
that.iamInstanceProfileName)
-               && equal(this.privateIpAddress, that.privateIpAddress);
+               && equal(this.privateIpAddress, that.privateIpAddress)
+               && equal(this.tenancy, that.tenancy) && 
equal(this.dedicatedHostId, that.dedicatedHostId);
    }
 
    @Override
    public int hashCode() {
       return Objects.hashCode(super.hashCode(), monitoringEnabled, 
placementGroup, noPlacementGroup, subnetId,
-               spotPrice, spotOptions, groupIds, iamInstanceProfileArn, 
iamInstanceProfileName, privateIpAddress);
+               spotPrice, spotOptions, groupIds, iamInstanceProfileArn, 
iamInstanceProfileName, privateIpAddress,
+               tenancy, dedicatedHostId);
    }
 
    @Override
@@ -142,6 +151,8 @@ public class AWSEC2TemplateOptions extends 
EC2TemplateOptions implements Cloneab
       toString.add("iamInstanceProfileArn", iamInstanceProfileArn);
       toString.add("iamInstanceProfileName", iamInstanceProfileName);
       toString.add("privateIpAddress", privateIpAddress);
+      toString.add("tenancy", tenancy);
+      toString.add("dedicatedHostId", dedicatedHostId);
       return toString;
    }
 
@@ -208,6 +219,22 @@ public class AWSEC2TemplateOptions extends 
EC2TemplateOptions implements Cloneab
    }
 
    /**
+    * Specifies the tenancy used to run instances with
+    */
+   public AWSEC2TemplateOptions tenancy(Tenancy tenancy) {
+      this.tenancy = checkNotNull(tenancy, "tenancy must be defined");
+      return this;
+   }
+
+   /**
+    * Specifies the ID of the dedicated host on which the instance should 
resist.
+    */
+   public AWSEC2TemplateOptions dedicatedHostId(String hostId) {
+      this.dedicatedHostId = checkNotNull(emptyToNull(hostId), "hostId must be 
defined");
+      return this;
+   }
+
+   /**
     * Specifies the maximum spot price to use
     */
    public AWSEC2TemplateOptions spotPrice(Float spotPrice) {
@@ -463,6 +490,22 @@ public class AWSEC2TemplateOptions extends 
EC2TemplateOptions implements Cloneab
       }
 
       /**
+       * @see AWSEC2TemplateOptions#tenancy
+       */
+      public static AWSEC2TemplateOptions tenancy(Tenancy tenancy) {
+         AWSEC2TemplateOptions options = new AWSEC2TemplateOptions();
+         return options.tenancy(tenancy);
+      }
+
+      /**
+       * @see AWSEC2TemplateOptions#dedicatedHostId
+       */
+      public static AWSEC2TemplateOptions dedicatedHostId(String hostId) {
+         AWSEC2TemplateOptions options = new AWSEC2TemplateOptions();
+         return options.dedicatedHostId(hostId);
+      }
+
+      /**
        * @see AWSEC2TemplateOptions#spotPrice
        */
       public static AWSEC2TemplateOptions spotPrice(Float spotPrice) {
@@ -812,4 +855,12 @@ public class AWSEC2TemplateOptions extends 
EC2TemplateOptions implements Cloneab
    public String getPrivateIpAddress() {
       return privateIpAddress;
    }
+
+   public Tenancy getTenancy() {
+      return tenancy;
+   }
+
+   public String getDedicatedHostId() {
+      return dedicatedHostId;
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ccd1ef2b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.java
 
b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.java
index 151e00e..371271c 100644
--- 
a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.java
+++ 
b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.java
@@ -102,6 +102,10 @@ public class 
CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions
          
instanceOptions.withIAMInstanceProfileName(awsTemplateOptions.getIAMInstanceProfileName());
       if (awsTemplateOptions.getPrivateIpAddress() != null)
          
instanceOptions.withPrivateIpAddress(awsTemplateOptions.getPrivateIpAddress());
+      if (awsTemplateOptions.getTenancy() != null)
+         instanceOptions.withTenancy(awsTemplateOptions.getTenancy());
+      if (awsTemplateOptions.getDedicatedHostId() != null)
+         
instanceOptions.withDedicatedHostId(awsTemplateOptions.getDedicatedHostId());
 
       return instanceOptions;
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ccd1ef2b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptions.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptions.java
 
b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptions.java
index e8d5bb7..f9734ab 100644
--- 
a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptions.java
+++ 
b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptions.java
@@ -61,6 +61,22 @@ public class AWSRunInstancesOptions extends 
RunInstancesOptions {
    }
 
    /**
+    * Specifies the tenancy of the instance within which to launch the 
instance(s).
+    */
+   public AWSRunInstancesOptions withTenancy(Tenancy tenancy) {
+      formParameters.put("Placement.Tenancy", checkNotNull(tenancy, 
"tenancy").toString());
+      return this;
+   }
+
+   /**
+    * Specifies the ID of the dedicated host on which the instance should 
resist.
+    */
+   public AWSRunInstancesOptions withDedicatedHostId(String hostId) {
+      formParameters.put("Placement.HostId", checkNotNull(hostId, "hostId"));
+      return this;
+   }
+
+   /**
     * Enables monitoring for the instance.
     */
    public AWSRunInstancesOptions enableMonitoring() {
@@ -143,6 +159,22 @@ public class AWSRunInstancesOptions extends 
RunInstancesOptions {
       }
 
       /**
+       * @see AWSRunInstancesOptions#withTenancy(Tenancy)
+       */
+      public static AWSRunInstancesOptions withTenancy(Tenancy tenancy) {
+         AWSRunInstancesOptions options = new AWSRunInstancesOptions();
+         return options.withTenancy(tenancy);
+      }
+
+      /**
+       * @see AWSRunInstancesOptions#withDedicatedHostId(String)
+       */
+      public static AWSRunInstancesOptions withDedicatedHostId(String hostId) {
+         AWSRunInstancesOptions options = new AWSRunInstancesOptions();
+         return options.withDedicatedHostId(hostId);
+      }
+
+      /**
        * @see AWSRunInstancesOptions#enableMonitoring()
        */
       public static AWSRunInstancesOptions enableMonitoring() {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ccd1ef2b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/Tenancy.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/Tenancy.java 
b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/Tenancy.java
new file mode 100644
index 0000000..ec5468a
--- /dev/null
+++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/Tenancy.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.aws.ec2.options;
+
+/**
+ * Contains valid values for the 'Placement.Tenancy' parameter in the Form API 
for the RunInstances operation.
+ */
+public enum Tenancy {
+   DEFAULT("default"),
+   DEDICATED("dedicated"),
+   HOST("host");
+
+   private final String value;
+
+   Tenancy(String value) {
+      this.value = value;
+   }
+
+   @Override
+   public String toString() {
+      return value;
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ccd1ef2b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeServiceApiMockTest.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeServiceApiMockTest.java
 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeServiceApiMockTest.java
index f647578..09f1d10 100644
--- 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeServiceApiMockTest.java
+++ 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeServiceApiMockTest.java
@@ -20,6 +20,7 @@ import static 
org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.blockUnt
 import static org.testng.Assert.assertEquals;
 
 import org.jclouds.aws.ec2.internal.BaseAWSEC2ApiMockTest;
+import org.jclouds.aws.ec2.options.Tenancy;
 import org.jclouds.compute.ComputeService;
 import org.jclouds.compute.domain.NodeMetadata;
 import org.jclouds.compute.domain.Template;
@@ -232,6 +233,40 @@ public class AWSEC2ComputeServiceApiMockTest extends 
BaseAWSEC2ApiMockTest {
       assertPosted(DEFAULT_REGION, 
"Action=CreateTags&Tag.1.Key=Name&Tag.1.Value=test-2baa5550&ResourceId.1=i-2baa5550");
    }
 
+   public void createNodeWithDedicatedTenancyAndHostId() throws Exception {
+      enqueueRegions(DEFAULT_REGION);
+      enqueueXml(DEFAULT_REGION, "/amzn_images.xml");
+      enqueueXml(DEFAULT_REGION, "/describe_images_cc.xml");
+      enqueueXml(DEFAULT_REGION, "/availabilityZones.xml");
+      enqueueXml(DEFAULT_REGION, "/created_securitygroup.xml");
+      enqueueXml(DEFAULT_REGION, "/new_securitygroup.xml");
+      enqueueXml(DEFAULT_REGION, "/new_securitygroup.xml");
+      enqueueXml(DEFAULT_REGION, 
"/authorize_securitygroup_ingress_response.xml");
+      enqueueXml(DEFAULT_REGION, "/new_instance.xml");
+      enqueueXml(DEFAULT_REGION, "/describe_instances_running-1.xml");
+      enqueueXml(DEFAULT_REGION, "/describe_images.xml");
+      enqueue(DEFAULT_REGION, new MockResponse()); // create tags
+
+      ComputeService computeService = computeService();
+
+      NodeMetadata node = 
Iterables.getOnlyElement(computeService.createNodesInGroup("test", 1,
+            
blockUntilRunning(false).noKeyPair().tenancy(Tenancy.HOST).dedicatedHostId("TestHostId")));
+      assertEquals(node.getId(), "us-east-1/i-2baa5550");
+
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(DEFAULT_REGION, 
"Action=DescribeImages&Filter.1.Name=owner-id&Filter.1.Value.1=137112412989&Filter.1.Value.2=801119661308&Filter.1.Value.3=063491364108&Filter.1.Value.4=099720109477&Filter.1.Value.5=411009282317&Filter.2.Name=state&Filter.2.Value.1=available&Filter.3.Name=image-type&Filter.3.Value.1=machine");
+      assertPosted(DEFAULT_REGION, 
"Action=DescribeImages&Filter.1.Name=virtualization-type&Filter.1.Value.1=hvm&Filter.2.Name=architecture&Filter.2.Value.1=x86_64&Filter.3.Name=owner-id&Filter.3.Value.1=137112412989&Filter.3.Value.2=099720109477&Filter.4.Name=hypervisor&Filter.4.Value.1=xen&Filter.5.Name=state&Filter.5.Value.1=available&Filter.6.Name=image-type&Filter.6.Value.1=machine&Filter.7.Name=root-device-type&Filter.7.Value.1=ebs");
+      assertPosted(DEFAULT_REGION, "Action=DescribeAvailabilityZones");
+      assertPosted(DEFAULT_REGION, 
"Action=CreateSecurityGroup&GroupName=jclouds%23test&GroupDescription=jclouds%23test");
+      assertPosted(DEFAULT_REGION, 
"Action=DescribeSecurityGroups&GroupName.1=jclouds%23test");
+      assertPosted(DEFAULT_REGION, 
"Action=DescribeSecurityGroups&GroupName.1=jclouds%23test");
+      assertPosted(DEFAULT_REGION, 
"Action=AuthorizeSecurityGroupIngress&GroupId=sg-3c6ef654&IpPermissions.0.IpProtocol=tcp&IpPermissions.0.FromPort=22&IpPermissions.0.ToPort=22&IpPermissions.0.IpRanges.0.CidrIp=0.0.0.0/0&IpPermissions.1.IpProtocol=tcp&IpPermissions.1.FromPort=0&IpPermissions.1.ToPort=65535&IpPermissions.1.Groups.0.UserId=993194456877&IpPermissions.1.Groups.0.GroupId=sg-3c6ef654&IpPermissions.2.IpProtocol=udp&IpPermissions.2.FromPort=0&IpPermissions.2.ToPort=65535&IpPermissions.2.Groups.0.UserId=993194456877&IpPermissions.2.Groups.0.GroupId=sg-3c6ef654");
+      assertPosted(DEFAULT_REGION, 
"Action=RunInstances&ImageId=ami-8ce4b5c9&MinCount=1&MaxCount=1&InstanceType=" 
+ getDefaultParavirtualInstanceType() + 
"&SecurityGroupId.1=sg-3c6ef654&UserData=I2Nsb3VkLWNvbmZpZwpyZXBvX3VwZ3JhZGU6IG5vbmUK&Placement.Tenancy=host&Placement.HostId=TestHostId");
+      assertPosted(DEFAULT_REGION, 
"Action=DescribeInstances&InstanceId.1=i-2baa5550");
+      assertPosted(DEFAULT_REGION, 
"Action=DescribeImages&ImageId.1=ami-aecd60c7");
+      assertPosted(DEFAULT_REGION, 
"Action=CreateTags&Tag.1.Key=Name&Tag.1.Value=test-2baa5550&ResourceId.1=i-2baa5550");
+   }
+
    public void listNodesWhereImageDoesntExist() throws Exception {
       enqueueRegions(DEFAULT_REGION);
       enqueueXml(DEFAULT_REGION, "/describe_instances_running-1.xml");

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ccd1ef2b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/options/AWSEC2TemplateOptionsTest.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/options/AWSEC2TemplateOptionsTest.java
 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/options/AWSEC2TemplateOptionsTest.java
index 93f0184..3828948 100644
--- 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/options/AWSEC2TemplateOptionsTest.java
+++ 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/options/AWSEC2TemplateOptionsTest.java
@@ -18,6 +18,7 @@ package org.jclouds.aws.ec2.compute.options;
 
 import static 
org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.authorizePublicKey;
 import static 
org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.blockOnPort;
+import static 
org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.dedicatedHostId;
 import static 
org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.enableMonitoring;
 import static 
org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.iamInstanceProfileArn;
 import static 
org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.iamInstanceProfileName;
@@ -28,11 +29,13 @@ import static 
org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.noKeyPai
 import static 
org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.privateIpAddress;
 import static 
org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.securityGroupIds;
 import static 
org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.securityGroups;
+import static 
org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.tenancy;
 import static org.testng.Assert.assertEquals;
 
 import java.io.IOException;
 
 import org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions;
+import org.jclouds.aws.ec2.options.Tenancy;
 import org.jclouds.compute.options.TemplateOptions;
 import org.testng.annotations.Test;
 
@@ -425,4 +428,40 @@ public class AWSEC2TemplateOptionsTest {
    public void testPrivateIpAddressNPE() {
       privateIpAddress(null);
    }
+
+   @Test
+   public void testTenancy() {
+      AWSEC2TemplateOptions options = new AWSEC2TemplateOptions();
+      options.tenancy(Tenancy.DEDICATED);
+      assertEquals(options.getTenancy(), Tenancy.DEDICATED);
+   }
+
+   @Test
+   public void testTenancyStatic() {
+      AWSEC2TemplateOptions options = tenancy(Tenancy.HOST);
+      assertEquals(options.getTenancy(), Tenancy.HOST);
+   }
+
+   @Test(expectedExceptions = NullPointerException.class)
+   public void testTenancyNPE() {
+      tenancy(null);
+   }
+
+   @Test
+   public void testDedicatedHostId() {
+      AWSEC2TemplateOptions options = new AWSEC2TemplateOptions();
+      options.dedicatedHostId("hostId-1234");
+      assertEquals(options.getDedicatedHostId(), "hostId-1234");
+   }
+
+   @Test
+   public void testDedicatedHostIdStatic() {
+      AWSEC2TemplateOptions options = dedicatedHostId("hostId-5678");
+      assertEquals(options.getDedicatedHostId(), "hostId-5678");
+   }
+
+   @Test(expectedExceptions = NullPointerException.class)
+   public void testDedicatedHostIdStaticNPE() {
+      dedicatedHostId(null);
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ccd1ef2b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSInstanceApiTest.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSInstanceApiTest.java
 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSInstanceApiTest.java
index 6630aac..b62dab6 100644
--- 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSInstanceApiTest.java
+++ 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSInstanceApiTest.java
@@ -23,6 +23,7 @@ import java.util.Map;
 
 import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
 import org.jclouds.aws.ec2.options.AWSRunInstancesOptions;
+import org.jclouds.aws.ec2.options.Tenancy;
 import org.jclouds.aws.ec2.xml.AWSDescribeInstancesResponseHandler;
 import org.jclouds.aws.ec2.xml.AWSRunInstancesResponseHandler;
 import org.jclouds.ec2.domain.BlockDevice;
@@ -121,19 +122,21 @@ public class AWSInstanceApiTest extends 
BaseAWSEC2ApiTest<AWSInstanceApi> {
             String.class, int.class, int.class, RunInstancesOptions[].class);
       GeneratedHttpRequest request = processor.createRequest(
             method,
-            Lists.<Object> newArrayList("us-east-1",
-            "us-east-1a",
-            "ami-voo",
-            1,
-            5,
-            new 
AWSRunInstancesOptions().withKernelId("kernelId").enableMonitoring()
-                  .withSecurityGroups("group1", "group2")));
+            Lists.<Object> newArrayList(
+                  "us-east-1",
+                  "us-east-1a",
+                  "ami-voo",
+                  1,
+                  5,
+                  new 
AWSRunInstancesOptions().withKernelId("kernelId").enableMonitoring()
+                        .withSecurityGroups("group1", "group2")
+                        
.withTenancy(Tenancy.HOST).withDedicatedHostId("hostId")));
 
       assertRequestLineEquals(request, "POST 
https://ec2.us-east-1.amazonaws.com/ HTTP/1.1");
       assertNonPayloadHeadersEqual(request, "Host: 
ec2.us-east-1.amazonaws.com\n");
       assertPayloadEquals(
             request,
-            
"Action=RunInstances&ImageId=ami-voo&MinCount=1&MaxCount=5&KernelId=kernelId&Monitoring.Enabled=true&SecurityGroup.1=group1&SecurityGroup.2=group2&Placement.AvailabilityZone=us-east-1a",
+            
"Action=RunInstances&ImageId=ami-voo&MinCount=1&MaxCount=5&KernelId=kernelId&Monitoring.Enabled=true&SecurityGroup.1=group1&SecurityGroup.2=group2&Placement.Tenancy=host&Placement.HostId=hostId&Placement.AvailabilityZone=us-east-1a",
             "application/x-www-form-urlencoded", false);
       assertResponseParserClassEquals(method, request, ParseSax.class);
       assertSaxResponseParserClassEquals(method, 
AWSRunInstancesResponseHandler.class);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ccd1ef2b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptionsTest.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptionsTest.java
 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptionsTest.java
index 7a84452..dc60f99 100644
--- 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptionsTest.java
+++ 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptionsTest.java
@@ -19,6 +19,7 @@ package org.jclouds.aws.ec2.options;
 import static 
org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.asType;
 import static 
org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.enableMonitoring;
 import static 
org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withBlockDeviceMappings;
+import static 
org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withDedicatedHostId;
 import static 
org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withIAMInstanceProfileArn;
 import static 
org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withIAMInstanceProfileName;
 import static 
org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withKernelId;
@@ -28,6 +29,7 @@ import static 
org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withRam
 import static 
org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withSecurityGroup;
 import static 
org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withSecurityGroupId;
 import static 
org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withSubnetId;
+import static 
org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withTenancy;
 import static 
org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withUserData;
 import static org.testng.Assert.assertEquals;
 
@@ -383,4 +385,51 @@ public class AWSRunInstancesOptionsTest {
       withPrivateIpAdress(null);
    }
 
+   @Test
+   public void testNullWithTenancy() {
+      AWSRunInstancesOptions options = new AWSRunInstancesOptions();
+      assertEquals(options.buildFormParameters().get("Placement.Tenancy"), 
ImmutableList.of());
+   }
+
+   @Test
+   public void testWithTenancy() {
+      AWSRunInstancesOptions options = new AWSRunInstancesOptions();
+      options.withTenancy(Tenancy.DEDICATED);
+      assertEquals(options.buildFormParameters().get("Placement.Tenancy"), 
ImmutableList.of("dedicated"));
+   }
+
+   @Test
+   public void testWithTenancyStatic() {
+      AWSRunInstancesOptions options = withTenancy(Tenancy.HOST);
+      assertEquals(options.buildFormParameters().get("Placement.Tenancy"), 
ImmutableList.of("host"));
+   }
+
+   @Test(expectedExceptions = NullPointerException.class)
+   public void testWithTenancyStaticNPE() {
+      withTenancy(null);
+   }
+
+   @Test
+   public void testNullWithDedicatedHostId() {
+      AWSRunInstancesOptions options = new AWSRunInstancesOptions();
+      assertEquals(options.buildFormParameters().get("Placement.HostId"), 
ImmutableList.of());
+   }
+
+   @Test
+   public void testWithDedicatedHostId() {
+      AWSRunInstancesOptions options = new AWSRunInstancesOptions();
+      options.withDedicatedHostId("hostId-1234");
+      assertEquals(options.buildFormParameters().get("Placement.HostId"), 
ImmutableList.of("hostId-1234"));
+   }
+
+   @Test
+   public void testWithDedicatedHostIdStatic() {
+      AWSRunInstancesOptions options = withDedicatedHostId("hostId-5678");
+      assertEquals(options.buildFormParameters().get("Placement.HostId"), 
ImmutableList.of("hostId-5678"));
+   }
+
+   @Test(expectedExceptions = NullPointerException.class)
+   public void testWithDedicatedHostIdStaticNPE() {
+      withDedicatedHostId(null);
+   }
 }

Reply via email to