Merge pull request #1172 from dralves/gce-networks

gce - networks api
This commit is contained in:
Adrian Cole 2013-01-13 15:28:54 -08:00
commit c7ae36b852
14 changed files with 913 additions and 7 deletions

View File

@ -22,6 +22,7 @@ import com.google.common.annotations.Beta;
import org.jclouds.googlecompute.features.DiskApi;
import org.jclouds.googlecompute.features.KernelApi;
import org.jclouds.googlecompute.features.MachineTypeApi;
import org.jclouds.googlecompute.features.NetworkApi;
import org.jclouds.googlecompute.features.OperationApi;
import org.jclouds.googlecompute.features.ProjectApi;
import org.jclouds.googlecompute.features.ZoneApi;
@ -68,12 +69,14 @@ public interface GoogleComputeApi {
@Path("/projects/{project}")
MachineTypeApi getMachineTypeApiForProject(@PathParam("project") String projectName);
/**
* Provides synchronous access to Project features
* Provides synchronous access to Network features
*
* @param projectName the name of the project
*/
@Delegate
ProjectApi getProjectApi();
@Path("/projects/{project}")
NetworkApi getNetworkApiForProject(@PathParam("project") String projectName);
/**
* Provides synchronous access to Operation features
@ -84,6 +87,12 @@ public interface GoogleComputeApi {
@Path("/projects/{project}")
OperationApi getOperationApiForProject(@PathParam("project") String projectName);
/**
* Provides synchronous access to Project features
*/
@Delegate
ProjectApi getProjectApi();
/**
* Provides synchronous access to Zone features
*

View File

@ -22,6 +22,7 @@ import com.google.common.annotations.Beta;
import org.jclouds.googlecompute.features.DiskAsyncApi;
import org.jclouds.googlecompute.features.KernelAsyncApi;
import org.jclouds.googlecompute.features.MachineTypeAsyncApi;
import org.jclouds.googlecompute.features.NetworkAsyncApi;
import org.jclouds.googlecompute.features.OperationAsyncApi;
import org.jclouds.googlecompute.features.ProjectAsyncApi;
import org.jclouds.googlecompute.features.ZoneAsyncApi;
@ -54,8 +55,6 @@ public interface GoogleComputeAsyncApi {
*
* @param projectName the name of the project
*/
@Delegate
@Path("/projects/{project}")
KernelAsyncApi getKernelApiForProject(@PathParam("project") String projectName);
/**
@ -68,10 +67,13 @@ public interface GoogleComputeAsyncApi {
MachineTypeAsyncApi getMachineTypeApiForProject(@PathParam("project") String projectName);
/**
* Provides asynchronous access to Project features
* Provides asynchronous access to Network features
*
* @param projectName the name of the project
*/
@Delegate
ProjectAsyncApi getProjectApi();
@Path("/projects/{project}")
NetworkAsyncApi getNetworkApiForProject(@PathParam("project") String projectName);
/**
* Provides asynchronous access to Operation features
@ -82,6 +84,12 @@ public interface GoogleComputeAsyncApi {
@Path("/projects/{project}")
OperationAsyncApi getOperationApiForProject(@PathParam("project") String projectName);
/**
* Provides asynchronous access to Project features
*/
@Delegate
ProjectAsyncApi getProjectApi();
/**
* Provides asynchronous access to Zone features
*

View File

@ -33,6 +33,8 @@ import org.jclouds.googlecompute.features.KernelApi;
import org.jclouds.googlecompute.features.KernelAsyncApi;
import org.jclouds.googlecompute.features.MachineTypeApi;
import org.jclouds.googlecompute.features.MachineTypeAsyncApi;
import org.jclouds.googlecompute.features.NetworkApi;
import org.jclouds.googlecompute.features.NetworkAsyncApi;
import org.jclouds.googlecompute.features.OperationApi;
import org.jclouds.googlecompute.features.OperationAsyncApi;
import org.jclouds.googlecompute.features.ProjectApi;
@ -67,6 +69,7 @@ public class GoogleComputeRestClientModule extends RestClientModule<GoogleComput
.put(DiskApi.class, DiskAsyncApi.class)
.put(KernelApi.class, KernelAsyncApi.class)
.put(MachineTypeApi.class, MachineTypeAsyncApi.class)
.put(NetworkApi.class, NetworkAsyncApi.class)
.put(OperationApi.class, OperationAsyncApi.class)
.put(ProjectApi.class, ProjectAsyncApi.class)
.put(ZoneApi.class, ZoneAsyncApi.class)

View File

@ -0,0 +1,138 @@
/*
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.googlecompute.domain;
import com.google.common.annotations.Beta;
import com.google.common.base.Objects;
import com.google.common.base.Optional;
import java.beans.ConstructorProperties;
import java.net.URI;
import java.util.Date;
import static com.google.common.base.Optional.fromNullable;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Represents a network used to enable instance communication.
*
* @author David Alves
* @see <a href="https://developers.google.com/compute/docs/reference/v1beta13/networks"/>
*/
@Beta
public final class Network extends Resource {
private final String IPv4Range;
private final Optional<String> gatewayIPv4;
@ConstructorProperties({
"id", "creationTimestamp", "selfLink", "name", "description", "IPv4Range",
"gatewayIPv4"
})
protected Network(String id, Date creationTimestamp, URI selfLink, String name, String description,
String IPv4Range, String gatewayIPv4) {
super(Kind.NETWORK, checkNotNull(id, "id of %s", name), fromNullable(creationTimestamp), checkNotNull(selfLink,
"selfLink of %s", name), checkNotNull(name, "name"), fromNullable(description));
this.IPv4Range = checkNotNull(IPv4Range);
this.gatewayIPv4 = fromNullable(gatewayIPv4);
}
/**
* @return Required; The range of internal addresses that are legal on this network. This range is a CIDR
* specification, for example: 192.168.0.0/16.
*/
public String getIPv4Range() {
return IPv4Range;
}
/**
* This must be within the range specified by IPv4Range, and is typically the first usable address in that range.
* If not specified, the default value is the first usable address in IPv4Range.
*
* @return an optional address that is used for default routing to other networks.
*/
public Optional<String> getGatewayIPv4() {
return gatewayIPv4;
}
/**
* {@inheritDoc}
*/
protected Objects.ToStringHelper string() {
return super.string()
.omitNullValues()
.add("IPv4Range", IPv4Range)
.add("gatewayIPv4", gatewayIPv4.orNull());
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
return string().toString();
}
public static Builder builder() {
return new Builder();
}
public Builder toBuilder() {
return new Builder().fromNetwork(this);
}
public static final class Builder extends Resource.Builder<Builder> {
private String IPv4Range;
private String gatewayIPv4;
/**
* @see Network#getIPv4Range()
*/
public Builder IPv4Range(String IPv4Range) {
this.IPv4Range = IPv4Range;
return this;
}
/**
* @see Network#getGatewayIPv4()
*/
public Builder gatewayIPv4(String gatewayIPv4) {
this.gatewayIPv4 = gatewayIPv4;
return this;
}
@Override
protected Builder self() {
return this;
}
public Network build() {
return new Network(super.id, super.creationTimestamp, super.selfLink, super.name,
super.description, IPv4Range, gatewayIPv4);
}
public Builder fromNetwork(Network in) {
return super.fromResource(in);
}
}
}

View File

@ -0,0 +1,113 @@
/*
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.googlecompute.features;
import org.jclouds.collect.PagedIterable;
import org.jclouds.googlecompute.domain.ListPage;
import org.jclouds.googlecompute.domain.Network;
import org.jclouds.googlecompute.domain.Operation;
import org.jclouds.googlecompute.options.ListOptions;
import org.jclouds.javax.annotation.Nullable;
/**
* Provides synchronous access to Networks via their REST API.
*
* @author David Alves
* @see NetworkAsyncApi
* @see <a href="https://developers.google.com/compute/docs/reference/v1beta13/networks"/>
*/
public interface NetworkApi {
/**
* Returns the specified persistent network resource.
*
* @param networkName name of the persistent network resource to return.
* @return a Network resource.
*/
Network get(String networkName);
/**
* Creates a persistent network resource in the specified project with the specified range.
*
* @param networkName the network name
* @param IPv4Range the range of the network to be inserted.
* @return an Operation resource. To check on the status of an operation, poll the Operations resource returned to
* you, and look for the status field.
*/
Operation createInIPv4Range(String networkName, String IPv4Range);
/**
* Creates a persistent network resource in the specified project with the specified range and specified gateway.
*
* @param networkName the network name
* @param IPv4Range the range of the network to be inserted.
* @param gatewayIPv4 the range of the network to be inserted.
* @return an Operation resource. To check on the status of an operation, poll the Operations resource returned to
* you, and look for the status field.
*/
Operation createInIPv4RangeWithGateway(String networkName, String IPv4Range, String gatewayIPv4);
/**
* Deletes the specified persistent network resource.
*
* @param networkName name of the persistent network resource to delete.
* @return an Operation resource. To check on the status of an operation, poll the Operations resource returned to
* you, and look for the status field.
*/
Operation delete(String networkName);
/**
* @see NetworkApi#listAtMarker(String, org.jclouds.googlecompute.options.ListOptions)
*/
ListPage<Network> listFirstPage();
/**
* @see NetworkApi#listAtMarker(String, org.jclouds.googlecompute.options.ListOptions)
*/
ListPage<Network> listAtMarker(@Nullable String marker);
/**
* Retrieves the list of persistent network resources contained within the specified project.
* By default the list as a maximum size of 100, if no options are provided or ListOptions#getMaxResults() has not
* been set.
*
*
* @param marker marks the beginning of the next list page
* @param listOptions listing options
* @return a page of the list
* @see ListOptions
* @see org.jclouds.googlecompute.domain.ListPage
*/
ListPage<Network> listAtMarker(@Nullable String marker, ListOptions listOptions);
/**
* @see NetworkApi#list(org.jclouds.googlecompute.options.ListOptions)
*/
PagedIterable<Network> list();
/**
* A paged version of NetworkApi#list()
*
* @return a Paged, Fluent Iterable that is able to fetch additional pages when required
* @see PagedIterable
* @see NetworkApi#listAtMarker(String, org.jclouds.googlecompute.options.ListOptions)
*/
PagedIterable<Network> list(@Nullable ListOptions listOptions);
}

View File

@ -0,0 +1,169 @@
/*
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.googlecompute.features;
import com.google.common.util.concurrent.ListenableFuture;
import org.jclouds.collect.PagedIterable;
import org.jclouds.googlecompute.domain.ListPage;
import org.jclouds.googlecompute.domain.Network;
import org.jclouds.googlecompute.domain.Operation;
import org.jclouds.googlecompute.functions.internal.ParseNetworks;
import org.jclouds.googlecompute.options.ListOptions;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.oauth.v2.config.OAuthScopes;
import org.jclouds.oauth.v2.filters.OAuthAuthenticator;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.MapBinder;
import org.jclouds.rest.annotations.PayloadParam;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.ResponseParser;
import org.jclouds.rest.annotations.SkipEncoding;
import org.jclouds.rest.annotations.Transform;
import org.jclouds.rest.binders.BindToJsonPayload;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import static org.jclouds.Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404;
import static org.jclouds.Fallbacks.EmptyPagedIterableOnNotFoundOr404;
import static org.jclouds.Fallbacks.NullOnNotFoundOr404;
import static org.jclouds.googlecompute.GoogleComputeConstants.COMPUTE_READONLY_SCOPE;
import static org.jclouds.googlecompute.GoogleComputeConstants.COMPUTE_SCOPE;
/**
* Provides asynchronous access to Networks via their REST API.
*
* @author David Alves
* @see NetworkApi
*/
@SkipEncoding({'/', '='})
@RequestFilters(OAuthAuthenticator.class)
public interface NetworkAsyncApi {
/**
* @see NetworkApi#get(String)
*/
@GET
@Consumes(MediaType.APPLICATION_JSON)
@Path("/networks/{network}")
@OAuthScopes(COMPUTE_READONLY_SCOPE)
@Fallback(NullOnNotFoundOr404.class)
ListenableFuture<Network> get(@PathParam("network") String networkName);
/**
* @see NetworkApi#createInIPv4Range(String, String)
*/
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("/networks")
@OAuthScopes({COMPUTE_SCOPE})
@MapBinder(BindToJsonPayload.class)
ListenableFuture<Operation> createInIPv4Range(@PayloadParam("name") String networkName,
@PayloadParam("IPv4Range") String IPv4Range);
/**
* @see NetworkApi#createInIPv4RangeWithGateway(String, String, String)
*/
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("/networks")
@OAuthScopes({COMPUTE_SCOPE})
@MapBinder(BindToJsonPayload.class)
ListenableFuture<Operation> createInIPv4RangeWithGateway(@PayloadParam("name") String networkName,
@PayloadParam("IPv4Range") String IPv4Range,
@PayloadParam("gatewayIPv4") String gatewayIPv4);
/**
* @see NetworkApi#delete(String)
*/
@DELETE
@Consumes(MediaType.APPLICATION_JSON)
@Path("/networks/{network}")
@OAuthScopes(COMPUTE_SCOPE)
@Fallback(NullOnNotFoundOr404.class)
ListenableFuture<Operation> delete(@PathParam("network") String networkName);
/**
* @see NetworkApi#listFirstPage()
*/
@GET
@Consumes(MediaType.APPLICATION_JSON)
@Path("/networks")
@OAuthScopes(COMPUTE_READONLY_SCOPE)
@ResponseParser(ParseNetworks.class)
@Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class)
ListenableFuture<ListPage<Network>> listFirstPage();
/**
* @see NetworkApi#listAtMarker(String)
*/
@GET
@Consumes(MediaType.APPLICATION_JSON)
@Path("/networks")
@OAuthScopes(COMPUTE_READONLY_SCOPE)
@ResponseParser(ParseNetworks.class)
@Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class)
ListenableFuture<ListPage<Network>> listAtMarker(@QueryParam("pageToken") @Nullable String marker);
/**
* @see NetworkApi#listAtMarker(String, org.jclouds.googlecompute.options.ListOptions)
*/
@GET
@Consumes(MediaType.APPLICATION_JSON)
@Path("/networks")
@OAuthScopes(COMPUTE_READONLY_SCOPE)
@ResponseParser(ParseNetworks.class)
@Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class)
ListenableFuture<ListPage<Network>> listAtMarker(@QueryParam("pageToken") @Nullable String marker,
ListOptions options);
/**
* @see NetworkApi#list()
*/
@GET
@Consumes(MediaType.APPLICATION_JSON)
@Path("/networks")
@OAuthScopes(COMPUTE_READONLY_SCOPE)
@ResponseParser(ParseNetworks.class)
@Transform(ParseNetworks.ToPagedIterable.class)
@Fallback(EmptyPagedIterableOnNotFoundOr404.class)
ListenableFuture<? extends PagedIterable<Network>> list();
/**
* @see NetworkApi#list(org.jclouds.googlecompute.options.ListOptions)
*/
@GET
@Consumes(MediaType.APPLICATION_JSON)
@Path("/networks")
@OAuthScopes(COMPUTE_READONLY_SCOPE)
@ResponseParser(ParseNetworks.class)
@Transform(ParseNetworks.ToPagedIterable.class)
@Fallback(EmptyPagedIterableOnNotFoundOr404.class)
ListenableFuture<? extends PagedIterable<Network>> list(ListOptions options);
}

View File

@ -0,0 +1,68 @@
/*
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.googlecompute.functions.internal;
import com.google.common.base.Function;
import com.google.inject.TypeLiteral;
import org.jclouds.collect.IterableWithMarker;
import org.jclouds.googlecompute.GoogleComputeApi;
import org.jclouds.googlecompute.domain.ListPage;
import org.jclouds.googlecompute.domain.Network;
import org.jclouds.googlecompute.options.ListOptions;
import org.jclouds.http.functions.ParseJson;
import org.jclouds.json.Json;
import javax.inject.Inject;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* @author David Alves
*/
public class ParseNetworks extends ParseJson<ListPage<Network>> {
@Inject
public ParseNetworks(Json json) {
super(json, new TypeLiteral<ListPage<Network>>() {});
}
public static class ToPagedIterable extends BaseToPagedIterable<Network, ToPagedIterable> {
private final GoogleComputeApi api;
@Inject
protected ToPagedIterable(GoogleComputeApi api) {
this.api = checkNotNull(api, "api");
}
@Override
protected Function<Object, IterableWithMarker<Network>> fetchNextPage(final String projectName,
final String marker,
final ListOptions options) {
return new Function<Object, IterableWithMarker<Network>>() {
@Override
public IterableWithMarker<Network> apply(Object input) {
return api.getNetworkApiForProject(projectName).listAtMarker(marker, options);
}
};
}
}
}

View File

@ -0,0 +1,169 @@
/*
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.googlecompute.features;
import org.jclouds.googlecompute.internal.BaseGoogleComputeApiExpectTest;
import org.jclouds.googlecompute.parse.ParseNetworkListTest;
import org.jclouds.googlecompute.parse.ParseNetworkTest;
import org.jclouds.googlecompute.parse.ParseOperationTest;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpResponse;
import org.testng.annotations.Test;
import javax.ws.rs.core.MediaType;
import static org.jclouds.googlecompute.GoogleComputeConstants.COMPUTE_READONLY_SCOPE;
import static org.jclouds.googlecompute.GoogleComputeConstants.COMPUTE_SCOPE;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import static org.testng.AssertJUnit.assertNull;
/**
* @author David Alves
*/
@Test(groups = "unit")
public class NetworkApiExpectTest extends BaseGoogleComputeApiExpectTest {
public void testGetNetworkResponseIs2xx() throws Exception {
HttpRequest get = HttpRequest
.builder()
.method("GET")
.endpoint("https://www.googleapis.com/compute/v1beta13/projects/myproject/networks/default")
.addHeader("Accept", "application/json")
.addHeader("Authorization", "Bearer " + TOKEN).build();
HttpResponse operationResponse = HttpResponse.builder().statusCode(200)
.payload(payloadFromResource("/network_get.json")).build();
NetworkApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE),
TOKEN_RESPONSE, get, operationResponse).getNetworkApiForProject("myproject");
assertEquals(api.get("default"),
new ParseNetworkTest().expected());
}
public void testGetNetworkResponseIs4xx() throws Exception {
HttpRequest get = HttpRequest
.builder()
.method("GET")
.endpoint("https://www.googleapis.com/compute/v1beta13/projects/myproject/networks/default")
.addHeader("Accept", "application/json")
.addHeader("Authorization", "Bearer " + TOKEN).build();
HttpResponse operationResponse = HttpResponse.builder().statusCode(404).build();
NetworkApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE),
TOKEN_RESPONSE, get, operationResponse).getNetworkApiForProject("myproject");
assertNull(api.get("default"));
}
public void testInsertNetworkResponseIs2xx() {
HttpRequest insert = HttpRequest
.builder()
.method("POST")
.endpoint("https://www.googleapis.com/compute/v1beta13/projects/myproject/networks")
.addHeader("Accept", "application/json")
.addHeader("Authorization", "Bearer " + TOKEN)
.payload(payloadFromResourceWithContentType("/network_insert.json", MediaType.APPLICATION_JSON))
.build();
HttpResponse insertNetworkResponse = HttpResponse.builder().statusCode(200)
.payload(payloadFromResource("/operation.json")).build();
NetworkApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE),
TOKEN_RESPONSE, insert,
insertNetworkResponse).getNetworkApiForProject("myproject");
assertEquals(api.createInIPv4Range("test-network", "10.0.1.0/8"), new ParseOperationTest().expected());
}
public void testDeleteNetworkResponseIs2xx() {
HttpRequest delete = HttpRequest
.builder()
.method("DELETE")
.endpoint("https://www.googleapis" +
".com/compute/v1beta13/projects/myproject/networks/default")
.addHeader("Accept", "application/json")
.addHeader("Authorization", "Bearer " + TOKEN).build();
HttpResponse deleteResponse = HttpResponse.builder().statusCode(200)
.payload(payloadFromResource("/operation.json")).build();
NetworkApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE),
TOKEN_RESPONSE, delete, deleteResponse).getNetworkApiForProject("myproject");
assertEquals(api.delete("default"),
new ParseOperationTest().expected());
}
public void testDeleteNetworkResponseIs4xx() {
HttpRequest delete = HttpRequest
.builder()
.method("DELETE")
.endpoint("https://www.googleapis" +
".com/compute/v1beta13/projects/myproject/networks/default")
.addHeader("Accept", "application/json")
.addHeader("Authorization", "Bearer " + TOKEN).build();
HttpResponse deleteResponse = HttpResponse.builder().statusCode(404).build();
NetworkApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE),
TOKEN_RESPONSE, delete, deleteResponse).getNetworkApiForProject("myproject");
assertNull(api.delete("default"));
}
public void testListNetworksResponseIs2xx() {
HttpRequest list = HttpRequest
.builder()
.method("GET")
.endpoint("https://www.googleapis" +
".com/compute/v1beta13/projects/myproject/networks")
.addHeader("Accept", "application/json")
.addHeader("Authorization", "Bearer " + TOKEN).build();
HttpResponse operationResponse = HttpResponse.builder().statusCode(200)
.payload(payloadFromResource("/network_list.json")).build();
NetworkApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE),
TOKEN_RESPONSE, list, operationResponse).getNetworkApiForProject("myproject");
assertEquals(api.listFirstPage().toString(),
new ParseNetworkListTest().expected().toString());
}
public void testListNetworksResponseIs4xx() {
HttpRequest list = HttpRequest
.builder()
.method("GET")
.endpoint("https://www.googleapis" +
".com/compute/v1beta13/projects/myproject/networks")
.addHeader("Accept", "application/json")
.addHeader("Authorization", "Bearer " + TOKEN).build();
HttpResponse operationResponse = HttpResponse.builder().statusCode(404).build();
NetworkApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE),
TOKEN_RESPONSE, list, operationResponse).getNetworkApiForProject("myproject");
assertTrue(api.list().concat().isEmpty());
}
}

View File

@ -0,0 +1,94 @@
/*
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.googlecompute.features;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import org.jclouds.collect.PagedIterable;
import org.jclouds.googlecompute.domain.Network;
import org.jclouds.googlecompute.internal.BaseGoogleComputeApiLiveTest;
import org.jclouds.googlecompute.options.ListOptions;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.util.List;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
/**
* @author David Alves
*/
public class NetworkApiLiveTest extends BaseGoogleComputeApiLiveTest {
private static final String NETWORK_NAME = "network-api-live-test-network";
private static final String IPV4_RANGE = "10.0.0.0/8";
private static final int TIME_WAIT = 10;
@BeforeClass(groups = {"integration", "live"})
public void setupContext() {
super.setupContext();
}
private NetworkApi api() {
return context.getApi().getNetworkApiForProject(getUserProject());
}
@Test(groups = "live")
public void testInsertNetwork() {
assertOperationDoneSucessfully(api().createInIPv4Range(NETWORK_NAME, IPV4_RANGE), TIME_WAIT);
}
@Test(groups = "live", dependsOnMethods = "testInsertNetwork")
public void testGetNetwork() {
Network network = api().get(NETWORK_NAME);
assertNotNull(network);
assertNetworkEquals(network);
}
@Test(groups = "live", dependsOnMethods = "testGetNetwork")
public void testListNetwork() {
PagedIterable<Network> networks = api().list(new ListOptions.Builder()
.filter("name eq " + NETWORK_NAME));
List<Network> networksAsList = Lists.newArrayList(networks.concat());
assertEquals(networksAsList.size(), 1);
assertNetworkEquals(Iterables.getOnlyElement(networksAsList));
}
@Test(groups = "live", dependsOnMethods = "testListNetwork")
public void testDeleteNetwork() {
assertOperationDoneSucessfully(api().delete(NETWORK_NAME), TIME_WAIT);
}
private void assertNetworkEquals(Network result) {
assertEquals(result.getName(), NETWORK_NAME);
assertEquals(result.getIPv4Range(), IPV4_RANGE);
}
}

View File

@ -0,0 +1,53 @@
/*
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.googlecompute.parse;
import com.google.common.collect.ImmutableSet;
import org.jclouds.googlecompute.domain.ListPage;
import org.jclouds.googlecompute.domain.Network;
import org.jclouds.googlecompute.domain.Resource;
import org.jclouds.googlecompute.internal.BaseGoogleComputeParseTest;
import javax.ws.rs.Consumes;
import javax.ws.rs.core.MediaType;
import java.net.URI;
/**
* @author David Alves
*/
public class ParseNetworkListTest extends BaseGoogleComputeParseTest<ListPage<Network>> {
@Override
public String resource() {
return "/network_list.json";
}
@Override
@Consumes(MediaType.APPLICATION_JSON)
public ListPage<Network> expected() {
return ListPage.<Network>builder()
.kind(Resource.Kind.NETWORK_LIST)
.id("projects/myproject/networks")
.selfLink(URI.create("https://www.googleapis.com/compute/v1beta13/projects/myproject/networks"))
.items(ImmutableSet.of(new ParseNetworkTest().expected()))
.build();
}
}

View File

@ -0,0 +1,53 @@
/*
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.googlecompute.parse;
import org.jclouds.date.internal.SimpleDateFormatDateService;
import org.jclouds.googlecompute.domain.Network;
import org.jclouds.googlecompute.internal.BaseGoogleComputeParseTest;
import javax.ws.rs.Consumes;
import javax.ws.rs.core.MediaType;
import java.net.URI;
/**
* @author David Alves
*/
public class ParseNetworkTest extends BaseGoogleComputeParseTest<Network> {
@Override
public String resource() {
return "/network_get.json";
}
@Override
@Consumes(MediaType.APPLICATION_JSON)
public Network expected() {
return Network.builder()
.id("13024414170909937976")
.creationTimestamp(new SimpleDateFormatDateService().iso8601DateParse("2012-10-24T20:13:19.967"))
.selfLink(URI.create("https://www.googleapis.com/compute/v1beta13/projects/myproject/networks/default"))
.name("default")
.description("Default network for the project")
.IPv4Range("10.240.0.0/16")
.gatewayIPv4("10.240.0.1")
.build();
}
}

View File

@ -0,0 +1,10 @@
{
"kind": "compute#network",
"id": "13024414170909937976",
"creationTimestamp": "2012-10-24T20:13:19.967",
"selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/networks/default",
"name": "default",
"description": "Default network for the project",
"IPv4Range": "10.240.0.0/16",
"gatewayIPv4": "10.240.0.1"
}

View File

@ -0,0 +1 @@
{"name":"test-network","IPv4Range":"10.0.1.0/8"}

View File

@ -0,0 +1,18 @@
{
"kind": "compute#networkList",
"id": "projects/myproject/networks",
"selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/networks",
"items": [
{
"kind": "compute#network",
"id": "13024414170909937976",
"creationTimestamp": "2012-10-24T20:13:19.967",
"selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/networks/default",
"name": "default",
"description": "Default network for the project",
"IPv4Range": "10.240.0.0/16",
"gatewayIPv4": "10.240.0.1"
}
]
}