http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/AddressApiLiveTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/AddressApiLiveTest.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/AddressApiLiveTest.java new file mode 100644 index 0000000..c11d04e --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/AddressApiLiveTest.java @@ -0,0 +1,71 @@ +/* + * 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.googlecomputeengine.features; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; + +import java.util.List; + +import org.jclouds.collect.PagedIterable; +import org.jclouds.googlecomputeengine.domain.Address; +import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest; +import org.jclouds.googlecomputeengine.options.ListOptions; +import org.testng.annotations.Test; + +import com.google.common.collect.Lists; + +public class AddressApiLiveTest extends BaseGoogleComputeEngineApiLiveTest { + + private static final String ADDRESS_NAME = "address-api-live-test-address"; + private static final int TIME_WAIT = 30; + + private AddressApi api() { + return api.getAddressApiForProject(userProject.get()); + } + + @Test(groups = "live") + public void testInsertAddress() { + + assertRegionOperationDoneSucessfully(api().createInRegion(DEFAULT_REGION_NAME, ADDRESS_NAME), TIME_WAIT); + } + + @Test(groups = "live", dependsOnMethods = "testInsertAddress") + public void testGetAddress() { + Address address = api().getInRegion(DEFAULT_REGION_NAME, ADDRESS_NAME); + assertNotNull(address); + assertEquals(address.getName(), ADDRESS_NAME); + } + + @Test(groups = "live", dependsOnMethods = "testGetAddress") + public void testListAddress() { + + PagedIterable<Address> addresss = api().listInRegion(DEFAULT_REGION_NAME, new ListOptions.Builder() + .filter("name eq " + ADDRESS_NAME)); + + List<Address> addresssAsList = Lists.newArrayList(addresss.concat()); + + assertEquals(addresssAsList.size(), 1); + + } + + @Test(groups = "live", dependsOnMethods = "testListAddress") + public void testDeleteAddress() { + + assertRegionOperationDoneSucessfully(api().deleteInRegion(DEFAULT_REGION_NAME, ADDRESS_NAME), TIME_WAIT); + } +}
http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiExpectTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiExpectTest.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiExpectTest.java new file mode 100644 index 0000000..6aaf8fa --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiExpectTest.java @@ -0,0 +1,226 @@ +/* + * 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.googlecomputeengine.features; + +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.assertNull; + +import javax.ws.rs.core.MediaType; + +import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiExpectTest; +import org.jclouds.googlecomputeengine.parse.ParseDiskListTest; +import org.jclouds.googlecomputeengine.parse.ParseDiskTest; +import org.jclouds.googlecomputeengine.parse.ParseOperationTest; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.testng.annotations.Test; + +@Test(groups = "unit") +public class DiskApiExpectTest extends BaseGoogleComputeEngineApiExpectTest { + public static final String IMAGE_URL = "https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/images/foo"; + + public void testGetDiskResponseIs2xx() throws Exception { + HttpRequest get = HttpRequest + .builder() + .method("GET") + .endpoint("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/disks/testimage1") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/disk_get.json")).build(); + + DiskApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, get, operationResponse).getDiskApiForProject("myproject"); + + assertEquals(api.getInZone("us-central1-a", "testimage1"), + new ParseDiskTest().expected()); + } + + public void testGetDiskResponseIs4xx() throws Exception { + HttpRequest get = HttpRequest + .builder() + .method("GET") + .endpoint("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/disks/testimage1") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(404).build(); + + DiskApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, get, operationResponse).getDiskApiForProject("myproject"); + + assertNull(api.getInZone("us-central1-a", "testimage1")); + } + + public void testInsertDiskResponseIs2xx() { + HttpRequest insert = HttpRequest + .builder() + .method("POST") + .endpoint("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/disks") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN) + .payload(payloadFromResourceWithContentType("/disk_insert.json", MediaType.APPLICATION_JSON)) + .build(); + + HttpResponse insertDiskResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/zone_operation.json")).build(); + + DiskApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, insert, + insertDiskResponse).getDiskApiForProject("myproject"); + + assertEquals(api.createInZone("testimage1", 1, "us-central1-a"), new ParseOperationTest().expected()); + } + + public void testInsertDiskFromImageResponseIs2xx() { + HttpRequest insert = HttpRequest + .builder() + .method("POST") + .endpoint("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/disks" + + "?sourceImage=" + IMAGE_URL.replaceAll(":", "%3A")) + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN) + .payload(payloadFromResourceWithContentType("/disk_insert.json", MediaType.APPLICATION_JSON)) + .build(); + + HttpResponse insertDiskResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/zone_operation.json")).build(); + + DiskApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, insert, + insertDiskResponse).getDiskApiForProject("myproject"); + + assertEquals(api.createFromImageWithSizeInZone(IMAGE_URL, "testimage1", 1, "us-central1-a"), new ParseOperationTest().expected()); + } + + public void testCreateSnapshotResponseIs2xx() { + HttpRequest createSnapshotRequest = HttpRequest + .builder() + .method("POST") + .endpoint("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/disks" + + "/testimage1/createSnapshot") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN) + .payload(payloadFromResourceWithContentType("/disk_create_snapshot.json", MediaType.APPLICATION_JSON)) + .build(); + + HttpResponse createSnapshotResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/zone_operation.json")).build(); + + DiskApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, createSnapshotRequest, + createSnapshotResponse).getDiskApiForProject("myproject"); + + assertEquals(api.createSnapshotInZone("us-central1-a", "testimage1", "test-snap"), new ParseOperationTest().expected()); + } + + public void testCreateSnapshotResponseIs4xx() { + HttpRequest createSnapshotRequest = HttpRequest + .builder() + .method("POST") + .endpoint("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/disks" + + "/testimage1/createSnapshot") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN) + .payload(payloadFromResourceWithContentType("/disk_create_snapshot.json", MediaType.APPLICATION_JSON)) + .build(); + + HttpResponse createSnapshotResponse = HttpResponse.builder().statusCode(404).build(); + + DiskApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, createSnapshotRequest, + createSnapshotResponse).getDiskApiForProject("myproject"); + + assertNull(api.createSnapshotInZone("us-central1-a", "testimage1", "test-snap")); + } + + public void testDeleteDiskResponseIs2xx() { + HttpRequest delete = HttpRequest + .builder() + .method("DELETE") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-a/disks/testimage1") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse deleteResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/zone_operation.json")).build(); + + DiskApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, delete, deleteResponse).getDiskApiForProject("myproject"); + + assertEquals(api.deleteInZone("us-central1-a", "testimage1"), + new ParseOperationTest().expected()); + } + + public void testDeleteDiskResponseIs4xx() { + HttpRequest delete = HttpRequest + .builder() + .method("DELETE") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-a/disks/testimage1") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse deleteResponse = HttpResponse.builder().statusCode(404).build(); + + DiskApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, delete, deleteResponse).getDiskApiForProject("myproject"); + + assertNull(api.deleteInZone("us-central1-a", "testimage1")); + } + + public void testListDisksResponseIs2xx() { + HttpRequest list = HttpRequest + .builder() + .method("GET") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-a/disks") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/disk_list.json")).build(); + + DiskApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, list, operationResponse).getDiskApiForProject("myproject"); + + assertEquals(api.listFirstPageInZone("us-central1-a").toString(), + new ParseDiskListTest().expected().toString()); + } + + public void testListDisksResponseIs4xx() { + HttpRequest list = HttpRequest + .builder() + .method("GET") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-a/disks") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(404).build(); + + DiskApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, list, operationResponse).getDiskApiForProject("myproject"); + + assertTrue(api.listInZone("us-central1-a").concat().isEmpty()); + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiLiveTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiLiveTest.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiLiveTest.java new file mode 100644 index 0000000..bd26621 --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiLiveTest.java @@ -0,0 +1,85 @@ +/* + * 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.googlecomputeengine.features; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; + +import java.util.List; + +import org.jclouds.collect.PagedIterable; +import org.jclouds.googlecomputeengine.domain.Disk; +import org.jclouds.googlecomputeengine.domain.Project; +import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest; +import org.jclouds.googlecomputeengine.options.ListOptions; +import org.testng.annotations.Test; + +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; + +public class DiskApiLiveTest extends BaseGoogleComputeEngineApiLiveTest { + + public static final String DISK_NAME = "disk-api-live-test-disk"; + public static final int TIME_WAIT = 30; + public static final int sizeGb = 1; + + private DiskApi api() { + return api.getDiskApiForProject(userProject.get()); + } + + @Test(groups = "live") + public void testInsertDisk() { + Project project = api.getProjectApi().get(userProject.get()); + assertZoneOperationDoneSucessfully(api().createInZone(DISK_NAME, sizeGb, DEFAULT_ZONE_NAME), TIME_WAIT); + + } + + @Test(groups = "live", dependsOnMethods = "testInsertDisk") + public void testGetDisk() { + + Disk disk = api().getInZone(DEFAULT_ZONE_NAME, DISK_NAME); + assertNotNull(disk); + assertDiskEquals(disk); + } + + @Test(groups = "live", dependsOnMethods = "testGetDisk") + public void testListDisk() { + + PagedIterable<Disk> disks = api().listInZone(DEFAULT_ZONE_NAME, new ListOptions.Builder() + .filter("name eq " + DISK_NAME)); + + List<Disk> disksAsList = Lists.newArrayList(disks.concat()); + + assertEquals(disksAsList.size(), 1); + + assertDiskEquals(Iterables.getOnlyElement(disksAsList)); + + } + + @Test(groups = "live", dependsOnMethods = "testListDisk") + public void testDeleteDisk() { + + assertZoneOperationDoneSucessfully(api().deleteInZone(DEFAULT_ZONE_NAME, DISK_NAME), TIME_WAIT); + } + + private void assertDiskEquals(Disk result) { + assertEquals(result.getName(), DISK_NAME); + assertEquals(result.getSizeGb(), sizeGb); + assertEquals(result.getZone(), getDefaultZoneUrl(userProject.get())); + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/FirewallApiExpectTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/FirewallApiExpectTest.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/FirewallApiExpectTest.java new file mode 100644 index 0000000..7a5759b --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/FirewallApiExpectTest.java @@ -0,0 +1,301 @@ +/* + * 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.googlecomputeengine.features; + +import static com.google.common.base.Joiner.on; +import static com.google.common.collect.Iterables.transform; +import static java.lang.String.format; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE; +import static org.jclouds.io.Payloads.newStringPayload; +import static org.jclouds.util.Strings2.toStringAndClose; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.assertNull; + +import java.io.IOException; +import java.net.URI; +import java.util.Set; + +import javax.ws.rs.core.MediaType; + +import org.jclouds.googlecomputeengine.domain.Firewall; +import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiExpectTest; +import org.jclouds.googlecomputeengine.options.FirewallOptions; +import org.jclouds.googlecomputeengine.parse.ParseFirewallListTest; +import org.jclouds.googlecomputeengine.parse.ParseFirewallTest; +import org.jclouds.googlecomputeengine.parse.ParseOperationTest; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.jclouds.io.Payload; +import org.jclouds.net.domain.IpProtocol; +import org.testng.annotations.Test; + +import com.google.common.base.Function; +import com.google.common.collect.ImmutableSet; + +@Test(groups = "unit") +public class FirewallApiExpectTest extends BaseGoogleComputeEngineApiExpectTest { + + public static final HttpRequest GET_FIREWALL_REQUEST = HttpRequest + .builder() + .method("GET") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/global/firewalls/jclouds-test") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + public static HttpResponse GET_FIREWALL_RESPONSE = HttpResponse.builder().statusCode(200) + .payload(staticPayloadFromResource("/firewall_get.json")).build(); + + public void testGetFirewallResponseIs2xx() throws Exception { + + FirewallApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, GET_FIREWALL_REQUEST, GET_FIREWALL_RESPONSE).getFirewallApiForProject("myproject"); + + assertEquals(api.get("jclouds-test"), new ParseFirewallTest().expected()); + } + + + public static Payload firewallPayloadFirewallOfName(String firewallName, + String networkName, + Set<String> sourceRanges, + Set<String> sourceTags, + Set<String> targetTags, + Set<String> portRanges) throws IOException { + Function<String, String> addQuotes = new Function<String, String>() { + @Override + public String apply(String input) { + return "\"" + input + "\""; + } + }; + + String ports = on(",").skipNulls().join(transform(portRanges, addQuotes)); + + Payload payload = newStringPayload( + format(toStringAndClose(FirewallApiExpectTest.class.getResourceAsStream("/firewall_insert.json")), + firewallName, + networkName, + on(",").skipNulls().join(transform(sourceRanges, addQuotes)), + on(",").skipNulls().join(transform(sourceTags, addQuotes)), + on(",").skipNulls().join(transform(targetTags, addQuotes)), + ports, + ports)); + payload.getContentMetadata().setContentType(MediaType.APPLICATION_JSON); + return payload; + } + + + public void testGetFirewallResponseIs4xx() throws Exception { + HttpRequest get = HttpRequest + .builder() + .method("GET") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/global/firewalls/jclouds-test") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(404).build(); + + FirewallApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, get, operationResponse).getFirewallApiForProject("myproject"); + + assertNull(api.get("jclouds-test")); + } + + public void testInsertFirewallResponseIs2xx() throws IOException { + + HttpRequest request = HttpRequest + .builder() + .method("POST") + .endpoint("https://www.googleapis.com/compute/v1/projects/myproject/global/firewalls") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN) + .payload(firewallPayloadFirewallOfName( + "myfw", + "default", + ImmutableSet.<String>of("10.0.1.0/32"), + ImmutableSet.<String>of("tag1"), + ImmutableSet.<String>of("tag2"), + ImmutableSet.<String>of("22", "23-24"))) + .build(); + + HttpResponse insertFirewallResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/operation.json")).build(); + + FirewallApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, request, insertFirewallResponse).getFirewallApiForProject("myproject"); + + assertEquals(api.createInNetwork("myfw", URI.create("https://www.googleapis" + + ".com/compute/v1/projects/myproject/global/networks/default"), + new FirewallOptions() + .addAllowedRule(Firewall.Rule.builder() + .IpProtocol(IpProtocol.TCP) + .addPort(22) + .addPortRange(23, 24).build()) + .addSourceTag("tag1") + .addSourceRange("10.0.1.0/32") + .addTargetTag("tag2")), new ParseOperationTest().expected()); + + } + + public void testUpdateFirewallResponseIs2xx() throws IOException { + HttpRequest update = HttpRequest + .builder() + .method("PUT") + .endpoint("https://www.googleapis.com/compute/v1/projects/myproject/global/firewalls/myfw") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN) + .payload(firewallPayloadFirewallOfName( + "myfw", + "default", + ImmutableSet.<String>of("10.0.1.0/32"), + ImmutableSet.<String>of("tag1"), + ImmutableSet.<String>of("tag2"), + ImmutableSet.<String>of("22", "23-24"))) + .build(); + + HttpResponse updateFirewallResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/operation.json")).build(); + + FirewallApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, update, + updateFirewallResponse).getFirewallApiForProject("myproject"); + + assertEquals(api.update("myfw", + new FirewallOptions() + .name("myfw") + .network(URI.create("https://www.googleapis" + + ".com/compute/v1/projects/myproject/global/networks/default")) + .addAllowedRule(Firewall.Rule.builder() + .IpProtocol(IpProtocol.TCP) + .addPort(22) + .addPortRange(23, 24).build()) + .addSourceTag("tag1") + .addSourceRange("10.0.1.0/32") + .addTargetTag("tag2")), new ParseOperationTest().expected()); + } + + public void testPatchFirewallResponseIs2xx() throws IOException { + HttpRequest update = HttpRequest + .builder() + .method("PATCH") + .endpoint("https://www.googleapis.com/compute/v1/projects/myproject/global/firewalls/myfw") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN) + .payload(firewallPayloadFirewallOfName( + "myfw", + "default", + ImmutableSet.<String>of("10.0.1.0/32"), + ImmutableSet.<String>of("tag1"), + ImmutableSet.<String>of("tag2"), + ImmutableSet.<String>of("22", "23-24"))) + .build(); + + HttpResponse updateFirewallResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/operation.json")).build(); + + FirewallApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, update, + updateFirewallResponse).getFirewallApiForProject("myproject"); + + assertEquals(api.patch("myfw", + new FirewallOptions() + .name("myfw") + .network(URI.create("https://www.googleapis" + + ".com/compute/v1/projects/myproject/global/networks/default")) + .addAllowedRule(Firewall.Rule.builder() + .IpProtocol(IpProtocol.TCP) + .addPort(22) + .addPortRange(23, 24).build()) + .addSourceTag("tag1") + .addSourceRange("10.0.1.0/32") + .addTargetTag("tag2")), new ParseOperationTest().expected()); + } + + public void testDeleteFirewallResponseIs2xx() { + HttpRequest delete = HttpRequest + .builder() + .method("DELETE") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/global/firewalls/default-allow-internal") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse deleteResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/operation.json")).build(); + + FirewallApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, delete, deleteResponse).getFirewallApiForProject("myproject"); + + assertEquals(api.delete("default-allow-internal"), + new ParseOperationTest().expected()); + } + + public void testDeleteFirewallResponseIs4xx() { + HttpRequest delete = HttpRequest + .builder() + .method("DELETE") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/global/firewalls/default-allow-internal") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse deleteResponse = HttpResponse.builder().statusCode(404).build(); + + FirewallApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, delete, deleteResponse).getFirewallApiForProject("myproject"); + + assertNull(api.delete("default-allow-internal")); + } + + public void testListFirewallsResponseIs2xx() { + HttpRequest list = HttpRequest + .builder() + .method("GET") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/global/firewalls") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/firewall_list.json")).build(); + + FirewallApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, list, operationResponse).getFirewallApiForProject("myproject"); + + assertEquals(api.listFirstPage().toString(), + new ParseFirewallListTest().expected().toString()); + } + + public void testListFirewallsResponseIs4xx() { + HttpRequest list = HttpRequest + .builder() + .method("GET") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/global/firewalls") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(404).build(); + + FirewallApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, list, operationResponse).getFirewallApiForProject("myproject"); + + assertTrue(api.list().concat().isEmpty()); + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/FirewallApiLiveTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/FirewallApiLiveTest.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/FirewallApiLiveTest.java new file mode 100644 index 0000000..669046f --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/FirewallApiLiveTest.java @@ -0,0 +1,164 @@ +/* + * 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.googlecomputeengine.features; + +import static com.google.common.collect.Iterables.getOnlyElement; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; + +import java.util.List; + +import org.jclouds.collect.PagedIterable; +import org.jclouds.googlecomputeengine.domain.Firewall; +import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest; +import org.jclouds.googlecomputeengine.options.FirewallOptions; +import org.jclouds.googlecomputeengine.options.ListOptions; +import org.jclouds.net.domain.IpProtocol; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; + +@Test(groups = "live", testName = "FirewallApiLiveTest") +public class FirewallApiLiveTest extends BaseGoogleComputeEngineApiLiveTest { + + private static final String FIREWALL_NAME = "firewall-api-live-test-firewall"; + private static final String FIREWALL_NETWORK_NAME = "firewall-api-live-test-network"; + private static final String IPV4_RANGE = "10.0.0.0/8"; + private static final int TIME_WAIT = 30; + + private FirewallApi api() { + return api.getFirewallApiForProject(userProject.get()); + } + + @Test(groups = "live") + public void testInsertFirewall() { + + // need to create the network first + assertGlobalOperationDoneSucessfully(api.getNetworkApiForProject(userProject.get()).createInIPv4Range + (FIREWALL_NETWORK_NAME, IPV4_RANGE), TIME_WAIT); + + FirewallOptions firewall = new FirewallOptions() + .addAllowedRule( + Firewall.Rule.builder() + .IpProtocol(IpProtocol.TCP) + .addPort(22).build()) + .addSourceRange("10.0.0.0/8") + .addSourceTag("tag1") + .addTargetTag("tag2"); + + assertGlobalOperationDoneSucessfully(api().createInNetwork(FIREWALL_NAME, getNetworkUrl(userProject.get(), + FIREWALL_NETWORK_NAME), firewall), TIME_WAIT); + + } + + @Test(groups = "live", dependsOnMethods = "testInsertFirewall") + public void testUpdateFirewall() { + + FirewallOptions firewall = new FirewallOptions() + .name(FIREWALL_NAME) + .network(getNetworkUrl(userProject.get(), FIREWALL_NETWORK_NAME)) + .addSourceRange("10.0.0.0/8") + .addSourceTag("tag1") + .addTargetTag("tag2") + .allowedRules(ImmutableSet.of( + Firewall.Rule.builder() + .IpProtocol(IpProtocol.TCP) + .addPort(23) + .build())); + + + assertGlobalOperationDoneSucessfully(api().update(FIREWALL_NAME, firewall), TIME_WAIT); + + } + + @Test(groups = "live", dependsOnMethods = "testUpdateFirewall") + public void testPatchFirewall() { + + FirewallOptions firewall = new FirewallOptions() + .name(FIREWALL_NAME) + .network(getNetworkUrl(userProject.get(), FIREWALL_NETWORK_NAME)) + .allowedRules(ImmutableSet.of( + Firewall.Rule.builder() + .IpProtocol(IpProtocol.TCP) + .addPort(22) + .build(), + Firewall.Rule.builder() + .IpProtocol(IpProtocol.TCP) + .addPort(23) + .build())) + .addSourceRange("10.0.0.0/8") + .addSourceTag("tag1") + .addTargetTag("tag2"); + + assertGlobalOperationDoneSucessfully(api().update(FIREWALL_NAME, firewall), TIME_WAIT); + + } + + @Test(groups = "live", dependsOnMethods = "testPatchFirewall") + public void testGetFirewall() { + + FirewallOptions patchedFirewall = new FirewallOptions() + .name(FIREWALL_NAME) + .network(getNetworkUrl(userProject.get(), FIREWALL_NETWORK_NAME)) + .allowedRules(ImmutableSet.of( + Firewall.Rule.builder() + .IpProtocol(IpProtocol.TCP) + .addPort(22) + .build(), + Firewall.Rule.builder() + .IpProtocol(IpProtocol.TCP) + .addPort(23) + .build())) + .addSourceRange("10.0.0.0/8") + .addSourceTag("tag1") + .addTargetTag("tag2"); + + Firewall firewall = api().get(FIREWALL_NAME); + assertNotNull(firewall); + assertFirewallEquals(firewall, patchedFirewall); + } + + @Test(groups = "live", dependsOnMethods = "testGetFirewall") + public void testListFirewall() { + + PagedIterable<Firewall> firewalls = api().list(new ListOptions.Builder() + .filter("name eq " + FIREWALL_NAME)); + + List<Firewall> firewallsAsList = Lists.newArrayList(firewalls.concat()); + + assertEquals(firewallsAsList.size(), 1); + + } + + @Test(groups = "live", dependsOnMethods = "testListFirewall") + public void testDeleteFirewall() { + + assertGlobalOperationDoneSucessfully(api().delete(FIREWALL_NAME), TIME_WAIT); + assertGlobalOperationDoneSucessfully(api.getNetworkApiForProject(userProject.get()).delete + (FIREWALL_NETWORK_NAME), TIME_WAIT); + } + + private void assertFirewallEquals(Firewall result, FirewallOptions expected) { + assertEquals(result.getName(), expected.getName()); + assertEquals(getOnlyElement(result.getSourceRanges()), getOnlyElement(expected.getSourceRanges())); + assertEquals(getOnlyElement(result.getSourceTags()), getOnlyElement(expected.getSourceTags())); + assertEquals(getOnlyElement(result.getTargetTags()), getOnlyElement(expected.getTargetTags())); + assertEquals(result.getAllowed(), expected.getAllowed()); + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/GlobalOperationApiExpectTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/GlobalOperationApiExpectTest.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/GlobalOperationApiExpectTest.java new file mode 100644 index 0000000..7fac1d7 --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/GlobalOperationApiExpectTest.java @@ -0,0 +1,158 @@ +/* + * 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.googlecomputeengine.features; + +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNull; +import static org.testng.Assert.assertTrue; + +import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiExpectTest; +import org.jclouds.googlecomputeengine.options.ListOptions; +import org.jclouds.googlecomputeengine.parse.ParseOperationListTest; +import org.jclouds.googlecomputeengine.parse.ParseOperationTest; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.testng.annotations.Test; + +@Test(groups = "unit") +public class GlobalOperationApiExpectTest extends BaseGoogleComputeEngineApiExpectTest { + + private static final String OPERATIONS_URL_PREFIX = "https://www.googleapis" + + ".com/compute/v1/projects/myproject/global/operations"; + + public static final HttpRequest GET_GLOBAL_OPERATION_REQUEST = HttpRequest + .builder() + .method("GET") + .endpoint(OPERATIONS_URL_PREFIX + "/operation-1354084865060-4cf88735faeb8-bbbb12cb") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + public static final HttpResponse GET_GLOBAL_OPERATION_RESPONSE = HttpResponse.builder().statusCode(200) + .payload(staticPayloadFromResource("/global_operation.json")).build(); + + public void testGetOperationResponseIs2xx() throws Exception { + + GlobalOperationApi operationApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, GET_GLOBAL_OPERATION_REQUEST, GET_GLOBAL_OPERATION_RESPONSE).getGlobalOperationApiForProject("myproject"); + + assertEquals(operationApi.get("operation-1354084865060-4cf88735faeb8-bbbb12cb"), + new ParseOperationTest().expected()); + } + + public void testGetOperationResponseIs4xx() throws Exception { + + HttpResponse operationResponse = HttpResponse.builder().statusCode(404).build(); + + GlobalOperationApi globalOperationApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, GET_GLOBAL_OPERATION_REQUEST, operationResponse).getGlobalOperationApiForProject("myproject"); + + assertNull(globalOperationApi.get("operation-1354084865060-4cf88735faeb8-bbbb12cb")); + } + + public void testDeleteOperationResponseIs2xx() throws Exception { + HttpRequest delete = HttpRequest + .builder() + .method("DELETE") + .endpoint(OPERATIONS_URL_PREFIX + "/operation-1352178598164-4cdcc9d031510-4aa46279") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(204).build(); + + GlobalOperationApi globalOperationApi = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, delete, operationResponse).getGlobalOperationApiForProject("myproject"); + + globalOperationApi.delete("operation-1352178598164-4cdcc9d031510-4aa46279"); + } + + public void testDeleteOperationResponseIs4xx() throws Exception { + HttpRequest delete = HttpRequest + .builder() + .method("DELETE") + .endpoint(OPERATIONS_URL_PREFIX + "/operation-1352178598164-4cdcc9d031510-4aa46279") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(404).build(); + + GlobalOperationApi globalOperationApi = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, delete, operationResponse).getGlobalOperationApiForProject("myproject"); + + globalOperationApi.delete("operation-1352178598164-4cdcc9d031510-4aa46279"); + } + + public void testLisOperationWithNoOptionsResponseIs2xx() { + HttpRequest get = HttpRequest + .builder() + .method("GET") + .endpoint(OPERATIONS_URL_PREFIX) + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/global_operation_list.json")).build(); + + GlobalOperationApi globalOperationApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, get, operationResponse).getGlobalOperationApiForProject("myproject"); + + assertEquals(globalOperationApi.listFirstPage().toString(), + new ParseOperationListTest().expected().toString()); + } + + public void testListOperationWithPaginationOptionsResponseIs2xx() { + HttpRequest get = HttpRequest + .builder() + .method("GET") + .endpoint(OPERATIONS_URL_PREFIX + + "?pageToken=CglPUEVSQVRJT04SOzU5MDQyMTQ4Nzg1Mi5vcG" + + "VyYXRpb24tMTM1MjI0NDI1ODAzMC00Y2RkYmU2YTJkNmIwLWVkMzIyMzQz&" + + "filter=" + + "status%20eq%20done&" + + "maxResults=3") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/global_operation_list.json")).build(); + + GlobalOperationApi globalOperationApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, get, operationResponse).getGlobalOperationApiForProject("myproject"); + + assertEquals(globalOperationApi.listAtMarker("CglPUEVSQVRJT04SOzU5MDQyMTQ4Nzg1Mi5vcGVyYXRpb24tMTM1Mj" + + "I0NDI1ODAzMC00Y2RkYmU2YTJkNmIwLWVkMzIyMzQz", + new ListOptions.Builder().filter("status eq done").maxResults(3)).toString(), + new ParseOperationListTest().expected().toString()); + } + + public void testListOperationWithPaginationOptionsResponseIs4xx() { + HttpRequest get = HttpRequest + .builder() + .method("GET") + .endpoint(OPERATIONS_URL_PREFIX) + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(404).build(); + + GlobalOperationApi globalOperationApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, get, operationResponse).getGlobalOperationApiForProject("myproject"); + + assertTrue(globalOperationApi.list().concat().isEmpty()); + } + + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/GlobalOperationApiLiveTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/GlobalOperationApiLiveTest.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/GlobalOperationApiLiveTest.java new file mode 100644 index 0000000..704df02 --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/GlobalOperationApiLiveTest.java @@ -0,0 +1,91 @@ +/* + * 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.googlecomputeengine.features; + +import static org.jclouds.googlecomputeengine.features.ProjectApiLiveTest.addItemToMetadata; +import static org.jclouds.googlecomputeengine.features.ProjectApiLiveTest.deleteItemFromMetadata; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; + +import java.util.concurrent.atomic.AtomicInteger; + +import org.jclouds.collect.IterableWithMarker; +import org.jclouds.collect.PagedIterable; +import org.jclouds.googlecomputeengine.domain.Operation; +import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest; +import org.jclouds.googlecomputeengine.options.ListOptions; +import org.testng.annotations.Test; + +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; + +public class GlobalOperationApiLiveTest extends BaseGoogleComputeEngineApiLiveTest { + + private static final String METADATA_ITEM_KEY = "operationLiveTestTestProp"; + private static final String METADATA_ITEM_VALUE = "operationLiveTestTestValue"; + private Operation addOperation; + private Operation deleteOperation; + + private GlobalOperationApi api() { + return api.getGlobalOperationApiForProject(userProject.get()); + } + + + @Test(groups = "live") + public void testCreateOperations() { + //create some operations by adding and deleting metadata items + // this will make sure there is stuff to listFirstPage + addOperation = assertGlobalOperationDoneSucessfully(addItemToMetadata(api.getProjectApi(), + userProject.get(), METADATA_ITEM_KEY, METADATA_ITEM_VALUE), 20); + deleteOperation = assertGlobalOperationDoneSucessfully(deleteItemFromMetadata(api + .getProjectApi(), userProject.get(), METADATA_ITEM_KEY), 20); + + assertNotNull(addOperation); + assertNotNull(deleteOperation); + } + + @Test(groups = "live", dependsOnMethods = "testCreateOperations") + public void testGetOperation() { + Operation operation = api().get(addOperation.getName()); + assertNotNull(operation); + assertOperationEquals(operation, this.addOperation); + } + + @Test(groups = "live", dependsOnMethods = "testCreateOperations") + public void testListOperationsWithFiltersAndPagination() { + PagedIterable<Operation> operations = api().list(new ListOptions.Builder() + .filter("operationType eq setMetadata") + .maxResults(1)); + + // make sure that in spite of having only one result per page we get at least two results + final AtomicInteger counter = new AtomicInteger(); + operations.firstMatch(new Predicate<IterableWithMarker<Operation>>() { + + @Override + public boolean apply(IterableWithMarker<Operation> input) { + counter.addAndGet(Iterables.size(input)); + return counter.get() == 2; + } + }); + } + + private void assertOperationEquals(Operation result, Operation expected) { + assertEquals(result.getName(), expected.getName()); + } + + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiExpectTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiExpectTest.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiExpectTest.java new file mode 100644 index 0000000..1deb178 --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiExpectTest.java @@ -0,0 +1,159 @@ +/* + * 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.googlecomputeengine.features; + +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.assertNull; + +import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiExpectTest; +import org.jclouds.googlecomputeengine.parse.ParseImageListTest; +import org.jclouds.googlecomputeengine.parse.ParseImageTest; +import org.jclouds.googlecomputeengine.parse.ParseOperationTest; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.testng.annotations.Test; + +@Test(groups = "unit") +public class ImageApiExpectTest extends BaseGoogleComputeEngineApiExpectTest { + + public static final HttpRequest LIST_PROJECT_IMAGES_REQUEST = HttpRequest + .builder() + .method("GET") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/global/images") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + public static final HttpResponse LIST_PROJECT_IMAGES_RESPONSE = HttpResponse.builder().statusCode(200) + .payload(staticPayloadFromResource("/image_list.json")).build(); + + public static final HttpRequest LIST_CENTOS_IMAGES_REQUEST = HttpRequest + .builder() + .method("GET") + .endpoint("https://www.googleapis.com/compute/v1/projects/centos-cloud/global/images") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + public static final HttpResponse LIST_CENTOS_IMAGES_RESPONSE = HttpResponse.builder().statusCode(200) + .payload(staticPayloadFromResource("/image_list_centos.json")).build(); + + public static final HttpRequest LIST_DEBIAN_IMAGES_REQUEST = HttpRequest + .builder() + .method("GET") + .endpoint("https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + public static final HttpResponse LIST_DEBIAN_IMAGES_RESPONSE = + HttpResponse.builder().statusCode(200) + .payload(staticPayloadFromResource("/image_list_debian.json")).build(); + + public void testGetImageResponseIs2xx() throws Exception { + HttpRequest get = HttpRequest + .builder() + .method("GET") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/centos-cloud/global/images/centos-6-2-v20120326") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/image_get.json")).build(); + + ImageApi imageApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, get, operationResponse).getImageApiForProject("centos-cloud"); + + assertEquals(imageApi.get("centos-6-2-v20120326"), + new ParseImageTest().expected()); + } + + public void testGetImageResponseIs4xx() throws Exception { + HttpRequest get = HttpRequest + .builder() + .method("GET") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/centos-cloud/global/images/centos-6-2-v20120326") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(404).build(); + + ImageApi imageApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, get, operationResponse).getImageApiForProject("centos-cloud"); + + assertNull(imageApi.get("centos-6-2-v20120326")); + } + + public void testDeleteImageResponseIs2xx() { + HttpRequest delete = HttpRequest + .builder() + .method("DELETE") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/global/images/centos-6-2-v20120326") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse deleteResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/operation.json")).build(); + + ImageApi imageApi = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, delete, deleteResponse).getImageApiForProject("myproject"); + + assertEquals(imageApi.delete("centos-6-2-v20120326"), + new ParseOperationTest().expected()); + } + + public void testDeleteImageResponseIs4xx() { + HttpRequest delete = HttpRequest + .builder() + .method("DELETE") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/global/images/centos-6-2-v20120326") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse deleteResponse = HttpResponse.builder().statusCode(404).build(); + + ImageApi imageApi = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, delete, deleteResponse).getImageApiForProject("myproject"); + + assertNull(imageApi.delete("centos-6-2-v20120326")); + } + + public void testListImagesResponseIs2xx() { + + ImageApi imageApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, LIST_PROJECT_IMAGES_REQUEST, LIST_PROJECT_IMAGES_RESPONSE).getImageApiForProject + ("myproject"); + + assertEquals(imageApi.listFirstPage().toString(), + new ParseImageListTest().expected().toString()); + } + + public void testListImagesResponseIs4xx() { + + HttpResponse operationResponse = HttpResponse.builder().statusCode(404).build(); + + ImageApi imageApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, LIST_PROJECT_IMAGES_REQUEST, operationResponse).getImageApiForProject("myproject"); + + assertTrue(imageApi.list().concat().isEmpty()); + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiLiveTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiLiveTest.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiLiveTest.java new file mode 100644 index 0000000..a4922b4 --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiLiveTest.java @@ -0,0 +1,74 @@ +/* + * 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.googlecomputeengine.features; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertSame; +import static org.testng.Assert.assertTrue; + +import java.util.Iterator; +import java.util.List; + +import org.jclouds.collect.IterableWithMarker; +import org.jclouds.collect.PagedIterable; +import org.jclouds.googlecomputeengine.domain.Image; +import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest; +import org.jclouds.googlecomputeengine.options.ListOptions; +import org.testng.annotations.Test; + +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; + +public class ImageApiLiveTest extends BaseGoogleComputeEngineApiLiveTest { + + private Image image; + + private ImageApi api() { + return api.getImageApiForProject("centos-cloud"); + } + + @Test(groups = "live") + public void testListImage() { + + PagedIterable<Image> images = api().list(new ListOptions.Builder().maxResults(1)); + + Iterator<IterableWithMarker<Image>> pageIterator = images.iterator(); + assertTrue(pageIterator.hasNext()); + + IterableWithMarker<Image> singlePageIterator = pageIterator.next(); + List<Image> imageAsList = Lists.newArrayList(singlePageIterator); + + assertSame(imageAsList.size(), 1); + + this.image = Iterables.getOnlyElement(imageAsList); + } + + + @Test(groups = "live", dependsOnMethods = "testListImage") + public void testGetImage() { + Image image = api().get(this.image.getName()); + assertNotNull(image); + assertImageEquals(image, this.image); + } + + private void assertImageEquals(Image result, Image expected) { + assertEquals(result.getName(), expected.getName()); + } + +} + http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiExpectTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiExpectTest.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiExpectTest.java new file mode 100644 index 0000000..f460de6 --- /dev/null +++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiExpectTest.java @@ -0,0 +1,410 @@ +/* + * 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.googlecomputeengine.features; + +import static java.net.URI.create; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE; +import static org.jclouds.googlecomputeengine.features.ProjectApiExpectTest.GET_PROJECT_REQUEST; +import static org.jclouds.googlecomputeengine.features.ProjectApiExpectTest.GET_PROJECT_RESPONSE; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.assertNull; + +import java.net.URI; + +import javax.ws.rs.core.MediaType; + +import org.jclouds.googlecomputeengine.domain.Instance; +import org.jclouds.googlecomputeengine.domain.InstanceTemplate; +import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiExpectTest; +import org.jclouds.googlecomputeengine.options.AttachDiskOptions; +import org.jclouds.googlecomputeengine.options.AttachDiskOptions.DiskMode; +import org.jclouds.googlecomputeengine.options.AttachDiskOptions.DiskType; +import org.jclouds.googlecomputeengine.parse.ParseInstanceListTest; +import org.jclouds.googlecomputeengine.parse.ParseInstanceSerialOutputTest; +import org.jclouds.googlecomputeengine.parse.ParseInstanceTest; +import org.jclouds.googlecomputeengine.parse.ParseOperationTest; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableMap; + +@Test(groups = "unit") +public class InstanceApiExpectTest extends BaseGoogleComputeEngineApiExpectTest { + + public static final HttpRequest GET_INSTANCE_REQUEST = HttpRequest + .builder() + .method("GET") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-a/instances/test-1") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + + public static final HttpResponse GET_INSTANCE_RESPONSE = HttpResponse.builder().statusCode(200) + .payload(staticPayloadFromResource("/instance_get.json")).build(); + + public static final HttpRequest LIST_INSTANCES_REQUEST = HttpRequest + .builder() + .method("GET") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-a/instances") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + public static final HttpResponse LIST_INSTANCES_RESPONSE = HttpResponse.builder().statusCode(200) + .payload(staticPayloadFromResource("/instance_list.json")).build(); + + public static final HttpRequest LIST_CENTRAL1B_INSTANCES_REQUEST = HttpRequest + .builder() + .method("GET") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-b/instances") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + public static final HttpResponse LIST_CENTRAL1B_INSTANCES_RESPONSE = HttpResponse.builder().statusCode(200) + .payload(staticPayloadFromResource("/instance_list_central1b_empty.json")).build(); + + public static final HttpResponse CREATE_INSTANCE_RESPONSE = HttpResponse.builder().statusCode(200) + .payload(staticPayloadFromResource("/zone_operation.json")).build(); + + + public void testGetInstanceResponseIs2xx() throws Exception { + + InstanceApi api = requestsSendResponses( + requestForScopes(COMPUTE_READONLY_SCOPE), TOKEN_RESPONSE, + GET_INSTANCE_REQUEST, GET_INSTANCE_RESPONSE).getInstanceApiForProject("myproject"); + + assertEquals(api.getInZone("us-central1-a", "test-1"), new ParseInstanceTest().expected()); + } + + public void testGetInstanceResponseIs4xx() throws Exception { + + HttpResponse operationResponse = HttpResponse.builder().statusCode(404).build(); + + InstanceApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, GET_INSTANCE_REQUEST, operationResponse).getInstanceApiForProject("myproject"); + + assertNull(api.getInZone("us-central1-a", "test-1")); + } + + public void testGetInstanceSerialPortOutput() throws Exception { + HttpRequest get = HttpRequest + .builder() + .method("GET") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-a/instances/test-1/serialPort") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/instance_serial_port.json")).build(); + + + InstanceApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, get, operationResponse).getInstanceApiForProject("myproject"); + + assertEquals(api.getSerialPortOutputInZone("us-central1-a", "test-1"), new ParseInstanceSerialOutputTest().expected()); + } + + public void testInsertInstanceResponseIs2xxNoOptions() { + HttpRequest insert = HttpRequest + .builder() + .method("POST") + .endpoint("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN) + .payload(payloadFromResourceWithContentType("/instance_insert_simple.json", MediaType.APPLICATION_JSON)) + .build(); + + InstanceApi api = requestsSendResponses(ImmutableMap.of(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, GET_PROJECT_REQUEST, GET_PROJECT_RESPONSE, + requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, insert, + CREATE_INSTANCE_RESPONSE)).getInstanceApiForProject("myproject"); + + InstanceTemplate options = InstanceTemplate.builder().forMachineType("us-central1-a/n1-standard-1") + .addNetworkInterface(URI.create("https://www.googleapis" + + ".com/compute/v1/projects/myproject/global/networks/default")); + + assertEquals(api.createInZone("test-1", "us-central1-a", options), new ParseOperationTest().expected()); + } + + public void testInsertInstanceResponseIs2xxAllOptions() { + HttpRequest insert = HttpRequest + .builder() + .method("POST") + .endpoint("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN) + .payload(payloadFromResourceWithContentType("/instance_insert.json", MediaType.APPLICATION_JSON)) + .build(); + + HttpResponse insertInstanceResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/zone_operation.json")).build(); + + InstanceApi api = requestsSendResponses(ImmutableMap.of(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, GET_PROJECT_REQUEST, GET_PROJECT_RESPONSE, + requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, insert, insertInstanceResponse)).getInstanceApiForProject("myproject"); + + InstanceTemplate options = InstanceTemplate.builder().forMachineType("us-central1-a/n1-standard-1") + .addNetworkInterface(URI.create("https://www.googleapis" + + ".com/compute/v1/projects/myproject/global/networks/default"), Instance.NetworkInterface.AccessConfig.Type.ONE_TO_ONE_NAT) + .description("desc") + .addDisk(InstanceTemplate.PersistentDisk.Mode.READ_WRITE, + create("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/disks/test"), + true) + .addServiceAccount(Instance.ServiceAccount.builder().email("default").addScopes("myscope").build()) + .addMetadata("aKey", "aValue"); + + assertEquals(api.createInZone("test-0", "us-central1-a", options), + new ParseOperationTest().expected()); + } + + public void testDeleteInstanceResponseIs2xx() { + HttpRequest delete = HttpRequest + .builder() + .method("DELETE") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-a/instances/test-1") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse deleteResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/zone_operation.json")).build(); + + InstanceApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, delete, deleteResponse).getInstanceApiForProject("myproject"); + + assertEquals(api.deleteInZone("us-central1-a", "test-1"), + new ParseOperationTest().expected()); + } + + public void testDeleteInstanceResponseIs4xx() { + HttpRequest delete = HttpRequest + .builder() + .method("DELETE") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-a/instances/test-1") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse deleteResponse = HttpResponse.builder().statusCode(404).build(); + + InstanceApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, delete, deleteResponse).getInstanceApiForProject("myproject"); + + assertNull(api.deleteInZone("us-central1-a", "test-1")); + } + + public void testListInstancesResponseIs2xx() { + + InstanceApi api = requestsSendResponses( + requestForScopes(COMPUTE_READONLY_SCOPE), TOKEN_RESPONSE, + LIST_INSTANCES_REQUEST, LIST_INSTANCES_RESPONSE).getInstanceApiForProject("myproject"); + + assertEquals(api.listFirstPageInZone("us-central1-a").toString(), + new ParseInstanceListTest().expected().toString()); + } + + public void testListInstancesResponseIs4xx() { + HttpRequest list = HttpRequest + .builder() + .method("GET") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-a/instances") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(404).build(); + + InstanceApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, list, operationResponse).getInstanceApiForProject("myproject"); + + assertTrue(api.listInZone("us-central1-a").concat().isEmpty()); + } + + public void testSetInstanceMetadataResponseIs2xx() { + HttpRequest setMetadata = HttpRequest + .builder() + .method("POST") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-a/instances/test-1/setMetadata") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN) + .payload(payloadFromResourceWithContentType("/instance_set_metadata.json", MediaType.APPLICATION_JSON)) + .build(); + + HttpResponse setMetadataResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/zone_operation.json")).build(); + + InstanceApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, setMetadata, setMetadataResponse).getInstanceApiForProject("myproject"); + + assertEquals(api.setMetadataInZone("us-central1-a", "test-1", ImmutableMap.of("foo", "bar"), "efgh"), + new ParseOperationTest().expected()); + } + + public void testSetInstanceMetadataResponseIs4xx() { + HttpRequest setMetadata = HttpRequest + .builder() + .method("POST") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-a/instances/test-1/setMetadata") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN) + .payload(payloadFromResourceWithContentType("/instance_set_metadata.json", MediaType.APPLICATION_JSON)) + .build(); + + HttpResponse setMetadataResponse = HttpResponse.builder().statusCode(404).build(); + + InstanceApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, setMetadata, setMetadataResponse).getInstanceApiForProject("myproject"); + + assertNull(api.setMetadataInZone("us-central1-a", "test-1", ImmutableMap.of("foo", "bar"), "efgh")); + } + + public void testResetInstanceResponseIs2xx() { + HttpRequest reset = HttpRequest + .builder() + .method("POST") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-a/instances/test-1/reset") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse resetResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/zone_operation.json")).build(); + + InstanceApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, reset, resetResponse).getInstanceApiForProject("myproject"); + + assertEquals(api.resetInZone("us-central1-a", "test-1"), + new ParseOperationTest().expected()); + } + + public void testResetInstanceResponseIs4xx() { + HttpRequest reset = HttpRequest + .builder() + .method("POST") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-a/instances/test-1/reset") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse resetResponse = HttpResponse.builder().statusCode(404).build(); + + InstanceApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, reset, resetResponse).getInstanceApiForProject("myproject"); + + assertNull(api.resetInZone("us-central1-a", "test-1")); + } + + public void testAttachDiskResponseIs2xx() { + HttpRequest attach = HttpRequest + .builder() + .method("POST") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-a/instances/test-1/attachDisk") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN) + .payload(payloadFromResourceWithContentType("/instance_attach_disk.json", MediaType.APPLICATION_JSON)) + .build(); + + HttpResponse attachResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/zone_operation.json")).build(); + + InstanceApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, attach, attachResponse).getInstanceApiForProject("myproject"); + + assertEquals(api.attachDiskInZone("us-central1-a", "test-1", + new AttachDiskOptions() + .mode(DiskMode.READ_ONLY) + .source(URI.create("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/disks/testimage1")) + .type(DiskType.PERSISTENT)), + new ParseOperationTest().expected()); + } + + public void testAttachDiskResponseIs4xx() { + HttpRequest attach = HttpRequest + .builder() + .method("POST") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-a/instances/test-1/attachDisk") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN) + .payload(payloadFromResourceWithContentType("/instance_attach_disk.json", MediaType.APPLICATION_JSON)) + .build(); + + HttpResponse attachResponse = HttpResponse.builder().statusCode(404).build(); + + InstanceApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, attach, attachResponse).getInstanceApiForProject("myproject"); + + assertNull(api.attachDiskInZone("us-central1-a", "test-1", + new AttachDiskOptions() + .mode(DiskMode.READ_ONLY) + .source(URI.create("https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/disks/testimage1")) + .type(DiskType.PERSISTENT))); + + } + + public void testDetachDiskResponseIs2xx() { + HttpRequest detach = HttpRequest + .builder() + .method("POST") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-a/instances/test-1/detachDisk" + + "?deviceName=test-disk-1") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN) + .build(); + + HttpResponse detachResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/zone_operation.json")).build(); + + InstanceApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, detach, detachResponse).getInstanceApiForProject("myproject"); + + assertEquals(api.detachDiskInZone("us-central1-a", "test-1", "test-disk-1"), + new ParseOperationTest().expected()); + } + + public void testDetachDiskResponseIs4xx() { + HttpRequest detach = HttpRequest + .builder() + .method("POST") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/zones/us-central1-a/instances/test-1/detachDisk" + + "?deviceName=test-disk-1") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN) + .build(); + + HttpResponse detachResponse = HttpResponse.builder().statusCode(404).build(); + + InstanceApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, detach, detachResponse).getInstanceApiForProject("myproject"); + + assertNull(api.detachDiskInZone("us-central1-a", "test-1", "test-disk-1")); + } + +}
