nacx requested changes on this pull request.

Thanks, @geomacy! Most comments I added are minor and the PR looks GREAT. 
Thanks for taking the time to write proper mock and live tests (and for the 
meaningful assert messages; they help a lot when things fail :)).
Thanks for starting the work on these much-needed APIs!

> @@ -132,4 +133,11 @@
    @Delegate
    Optional<? extends AWSSubnetApi> getAWSSubnetApiForRegion(
            @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) 
@Nullable String region);
+
+
+   /**
+    * Provides synchronous access to InternetGateway services.
+    */
+   @Delegate
+   Optional<? extends InternetGatewayApi> getInternetGatewayApi();

Should we better provide the `InRegion` variant for consistency with other APIs?

> + *     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.binders;
+
+import org.jclouds.aws.util.AWSUtils;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.rest.Binder;
+
+/**
+ * Binds the String [] to form parameters named with InstanceId.index

InternetGatewayId.index

> +   }
+
+   InternetGateway() {}
+
+   public static Builder builder() {
+      return new AutoValue_InternetGateway.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+
+      public abstract Builder id(String id);
+      public abstract Builder attachmentSet(List<InternetGatewayAttachment> 
attachmentSet);
+      public abstract Builder tags(Map<String, String> tags);
+
+      @Nullable public abstract String id();

Remove this method. If you need to access it from the builder, you could add a 
`toBuilder` method to the InternetGateway object.

> +   InternetGateway() {}
+
+   public static Builder builder() {
+      return new AutoValue_InternetGateway.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+
+      public abstract Builder id(String id);
+      public abstract Builder attachmentSet(List<InternetGatewayAttachment> 
attachmentSet);
+      public abstract Builder tags(Map<String, String> tags);
+
+      @Nullable public abstract String id();
+      @Nullable public abstract List<InternetGatewayAttachment> 
attachmentSet();
+      @Nullable public abstract Map<String, String> tags();

Hide these methods by removing the public modifier, like `autoBuid`

> +   public static Builder builder() {
+      return new AutoValue_InternetGatewayAttachment.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+
+      public abstract Builder state(State state);
+
+      public abstract Builder vpcId(String vpcId);
+
+      @Nullable
+      public abstract State state();
+
+      @Nullable
+      public abstract String vpcId();

Remove these two accessors from the builder.

> +   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+
+      public abstract Builder state(State state);
+
+      public abstract Builder vpcId(String vpcId);
+
+      @Nullable
+      public abstract State state();
+
+      @Nullable
+      public abstract String vpcId();
+
+      abstract InternetGatewayAttachment autoBuild();

We don't really need this since we are not customizing the default builder 
behavior. Let's remove this and leave only the abstract build() method.

> +    *
+    * @param region Region where the VPC exists
+    * @param internetGatewayId ID of the gateway to detach
+    * @param vpcId The ID of the VPC
+    * @param options Options for the request
+    */
+   @Named("DetachInternetGateway")
+   @POST
+   @FormParams(keys = ACTION, values = "DetachInternetGateway")
+   @XMLResponseParser(ReturnValueHandler.class)
+   @Fallback(FalseOnNotFoundOr404.class)
+   Boolean detachInternetGateway(
+      @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) 
@Nullable String region,
+      @FormParam("InternetGatewayId") String internetGatewayId,
+      @FormParam("VpcId") String vpcId,
+      InternetGatewayOptions... options);

I know it is already a pattern in AWS, but it is legacy and wrong: I'd change 
the varargs parameter with an overloaded variant: one method with the options 
parameter and one without it. We actually don't support passing more than one 
options object, so the varargs parameter is not a good method signature. It's 
not the right way to model optional parameters.

> + *     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;
+
+import org.jclouds.ec2.options.internal.BaseEC2RequestOptions;
+
+/**
+ * Contains options supported in the Form API for the InternetGateway 
operations. <h2>
+ * Usage</h2> The recommended way to instantiate such an object is to 
statically import
+ * CreateInternetGateway.Builder.* and invoke a static creation method 
followed by an instance mutator

InternetGatewayOptions.Builder

> +import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSet.Builder;
+import com.google.inject.Inject;
+
+/**
+ * @see <a 
href="http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcs.html";>xml</a>
+ */
+public class DescribeInternetGatewaysResponseHandler extends
+      
ParseSax.HandlerForGeneratedRequestWithResult<FluentIterable<InternetGateway>> {
+   private final InternetGatewayHandler gatewayHandler;
+   private boolean inAttachmentSet;
+   private boolean inTagSet;
+   private Builder<InternetGateway> gateways = ImmutableSet.builder();
+
+   @Inject
+   public DescribeInternetGatewaysResponseHandler(InternetGatewayHandler 
gatewayHandler) {

Reduce the injection constructor visibility by removing the public modifier.

> +import org.xml.sax.Attributes;
+
+/**
+ * @see <a 
href="http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_InternetGateway.html";>InternetGateway
 docs</a>
+ */
+public class InternetGatewayHandler extends 
ParseSax.HandlerForGeneratedRequestWithResult<InternetGateway> {
+   private StringBuilder currentText = new StringBuilder();
+   private InternetGateway.Builder builder = InternetGateway.builder();
+   private final TagSetHandler tagSetHandler;
+   private final InternetGatewayAttachmentSetHandler attachmentSetHandler;
+   private boolean inTagSet;
+   private boolean inAttachmentSet;
+
+
+   @Inject
+   public InternetGatewayHandler(TagSetHandler tagSetHandler, 
InternetGatewayAttachmentSetHandler attachmentHandler) {

Remove the public modifier.

> +import org.jclouds.ec2.features.TagApi;
+import org.jclouds.logging.Logger;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * Tests behavior of {@link InternetGatewayApi}
+ */
+@Test(groups = "live", singleThreaded = true)
+public class InternetGatewayApiLiveTest extends 
BaseComputeServiceContextLiveTest {
+
+   private Logger logger = Logger.CONSOLE;

Test classes are not instantiated by Guice so the jclouds logger won't be 
properly initialized. In tests we use the 
`java.util.logging.Logger.getAnonymousLogger()`.

> +import org.jclouds.aws.ec2.options.InternetGatewayOptions;
+import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest;
+import org.jclouds.ec2.features.TagApi;
+import org.jclouds.logging.Logger;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * Tests behavior of {@link InternetGatewayApi}
+ */
+@Test(groups = "live", singleThreaded = true)
+public class InternetGatewayApiLiveTest extends 
BaseComputeServiceContextLiveTest {

[minor] If you don't need access to the portable ComputeService, better extend 
the `BaseApiLiveTest`.

> +import org.jclouds.aws.ec2.options.CreateVpcOptions;
+import org.jclouds.aws.ec2.options.InternetGatewayOptions;
+import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest;
+import org.jclouds.ec2.features.TagApi;
+import org.jclouds.logging.Logger;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * Tests behavior of {@link InternetGatewayApi}
+ */
+@Test(groups = "live", singleThreaded = true)

I think we can remove the single threaded flag. All tests are linked anyway.

> +
+   public void deleteInternetGateway() throws Exception {
+      enqueueRegions(DEFAULT_REGION);
+      enqueueXml(DEFAULT_REGION, "/delete_internet_gateway.xml");
+
+      final boolean deleted = 
gatewayApi().deleteInternetGateway(DEFAULT_REGION, "igw-fada7c9c");
+      assertTrue(deleted);
+
+      assertPosted(DEFAULT_REGION, "Action=DescribeRegions");
+      assertPosted(DEFAULT_REGION, 
"Action=DeleteInternetGateway&InternetGatewayId=igw-fada7c9c");
+   }
+
+   private InternetGatewayApi gatewayApi() {
+      return api().getInternetGatewayApi().get();
+   }
+}

Add the tests that exercise the fallbacks defined in the API methods by 
enqueuing 404 responses.

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/jclouds/jclouds/pull/1097#pullrequestreview-37216892

Reply via email to