| /* |
| * 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.vcloud.director.v1_5.features; |
| |
| import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ADMIN_NETWORK; |
| import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ENTITY; |
| import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ERROR; |
| import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.METADATA; |
| import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.METADATA_VALUE; |
| import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.NETWORK; |
| import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ORG; |
| import static org.testng.Assert.assertEquals; |
| import static org.testng.Assert.assertNull; |
| import static org.testng.Assert.fail; |
| |
| import java.net.URI; |
| |
| import org.jclouds.http.HttpRequest; |
| import org.jclouds.http.HttpResponse; |
| import org.jclouds.vcloud.director.v1_5.VCloudDirectorException; |
| import org.jclouds.vcloud.director.v1_5.domain.Error; |
| import org.jclouds.vcloud.director.v1_5.domain.Link; |
| import org.jclouds.vcloud.director.v1_5.domain.Metadata; |
| import org.jclouds.vcloud.director.v1_5.domain.MetadataEntry; |
| import org.jclouds.vcloud.director.v1_5.domain.network.DhcpService; |
| import org.jclouds.vcloud.director.v1_5.domain.network.IpAddresses; |
| import org.jclouds.vcloud.director.v1_5.domain.network.IpRange; |
| import org.jclouds.vcloud.director.v1_5.domain.network.IpRanges; |
| import org.jclouds.vcloud.director.v1_5.domain.network.IpScope; |
| import org.jclouds.vcloud.director.v1_5.domain.network.Network.FenceMode; |
| import org.jclouds.vcloud.director.v1_5.domain.network.NetworkConfiguration; |
| import org.jclouds.vcloud.director.v1_5.domain.network.NetworkFeatures; |
| import org.jclouds.vcloud.director.v1_5.domain.network.SyslogServerSettings; |
| import org.jclouds.vcloud.director.v1_5.domain.org.OrgNetwork; |
| import org.jclouds.vcloud.director.v1_5.internal.VCloudDirectorAdminApiExpectTest; |
| import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorApi; |
| import org.testng.annotations.Test; |
| |
| import com.google.common.collect.ImmutableSet; |
| import com.google.common.net.HttpHeaders; |
| |
| /** |
| * Test the {@link NetworkApi} via its side effects. |
| * |
| * @author danikov |
| */ |
| @Test(groups = { "unit", "user" }, singleThreaded = true, testName = "NetworkApiExpectTest") |
| public class NetworkApiExpectTest extends VCloudDirectorAdminApiExpectTest { |
| |
| static String network = "55a677cf-ab3f-48ae-b880-fab90421980c"; |
| static String networkUrn = "urn:vcloud:network:" + network; |
| static URI networkHref = URI.create(endpoint + "/network/" + network); |
| |
| HttpRequest get = HttpRequest.builder() |
| .method("GET") |
| .endpoint(networkHref) |
| .addHeader("Accept", "*/*") |
| .addHeader("x-vcloud-authorization", token) |
| .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token) |
| .build(); |
| |
| HttpResponse getResponse = HttpResponse.builder() |
| .statusCode(200) |
| .payload(payloadFromResourceWithContentType("/network/network.xml", ORG + ";version=1.5")) |
| .build(); |
| |
| @Test |
| public void testGetNetworkHref() { |
| VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, get, getResponse); |
| assertEquals(api.getNetworkApi().get(networkHref), network()); |
| } |
| |
| @Test |
| public void testGetNetworkHrefInvalidId() { |
| |
| VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, |
| get.toBuilder().endpoint(endpoint + "/network/NOTAUUID").build(), |
| HttpResponse.builder() |
| .statusCode(400) |
| .payload(payloadFromResourceWithContentType("/network/error400.xml", ERROR + ";version=1.5")) |
| .build()); |
| |
| Error expected = Error.builder() |
| .message("validation error : EntityRef has incorrect type, expected type is com.vmware.vcloud.entity.network.") |
| .majorErrorCode(400) |
| .minorErrorCode("BAD_REQUEST") |
| .build(); |
| |
| try { |
| api.getNetworkApi().get(URI.create(endpoint + "/network/NOTAUUID")); |
| fail("Should give HTTP 400 error"); |
| } catch (VCloudDirectorException vde) { |
| assertEquals(vde.getError(), expected); |
| } catch (Exception e) { |
| fail("Should have thrown a VCloudDirectorException"); |
| } |
| } |
| |
| @Test |
| public void testGetNetworkHrefCatalogId() { |
| VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, |
| get.toBuilder().endpoint(endpoint + "/network/9e08c2f6-077a-42ce-bece-d5332e2ebb5c").build(), |
| HttpResponse.builder() |
| .statusCode(403) |
| .payload(payloadFromResourceWithContentType("/network/error403-catalog.xml", ERROR + ";version=1.5")) |
| .build()); |
| |
| assertNull(api.getNetworkApi().get(URI.create(endpoint + "/network/9e08c2f6-077a-42ce-bece-d5332e2ebb5c"))); |
| } |
| |
| @Test |
| public void testGetNetworkHrefFakeId() { |
| VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, |
| get.toBuilder().endpoint(endpoint + "/network/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee").build(), |
| HttpResponse.builder() |
| .statusCode(403) |
| .payload(payloadFromResourceWithContentType("/network/error403-fake.xml", ERROR + ";version=1.5")) |
| .build()); |
| |
| assertNull(api.getNetworkApi().get(URI.create(endpoint + "/network/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"))); |
| } |
| |
| HttpRequest resolveNetwork = HttpRequest.builder() |
| .method("GET") |
| .endpoint(endpoint + "/entity/" + networkUrn) |
| .addHeader("Accept", "*/*") |
| .addHeader("x-vcloud-authorization", token) |
| .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token) |
| .build(); |
| |
| String networkEntity = asString(createXMLBuilder("Entity").a("xmlns", "http://www.vmware.com/vcloud/v1.5") |
| .a("name", networkUrn) |
| .a("id", networkUrn) |
| .a("type", ENTITY) |
| .a("href", endpoint + "/entity/" + networkUrn) |
| .e("Link").a("rel", "alternate").a("type", NETWORK).a("href", networkHref.toString()).up() |
| // TODO: remove this when VCloudDirectorApiExpectTest no longer inherits from VCloudDirectorAdminApiExpectTest |
| .e("Link").a("rel", "alternate").a("type", ADMIN_NETWORK).a("href", networkHref.toString()).up()); |
| |
| HttpResponse resolveNetworkResponse = HttpResponse.builder() |
| .statusCode(200) |
| .payload(payloadFromStringWithContentType(networkEntity, ENTITY + ";version=1.5")) |
| .build(); |
| |
| @Test |
| public void testGetNetworkUrn() { |
| VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, resolveNetwork, resolveNetworkResponse, get, getResponse); |
| assertEquals(api.getNetworkApi().get(networkUrn), network()); |
| } |
| |
| |
| HttpRequest getMetadata = HttpRequest.builder() |
| .method("GET") |
| .endpoint(networkHref + "/metadata") |
| .addHeader("Accept", "*/*") |
| .addHeader("x-vcloud-authorization", token) |
| .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build(); |
| |
| HttpResponse getMetadataResponse = HttpResponse.builder() |
| .statusCode(200) |
| .payload(payloadFromResourceWithContentType("/network/metadata.xml", METADATA)) |
| .build(); |
| |
| @Test |
| public void testGetNetworkMetadataHref() { |
| VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, getMetadata, getMetadataResponse); |
| assertEquals(api.getNetworkApi().getMetadataApi(networkHref).get(), metadata()); |
| } |
| |
| static Metadata metadata() { |
| return Metadata.builder() |
| .type("application/vnd.vmware.vcloud.metadata+xml") |
| .href(URI.create(endpoint + "/network/" + network + "/metadata")) |
| .link(Link.builder() |
| .rel("up") |
| .type("application/vnd.vmware.vcloud.network+xml") |
| .href(networkHref) |
| .build()) |
| .entries(ImmutableSet.of(metadataEntry())) |
| .build(); |
| } |
| |
| private static MetadataEntry metadataEntry() { |
| return MetadataEntry.builder().entry("key", "value").build(); |
| } |
| |
| HttpRequest getMetadataValue = HttpRequest.builder() |
| .method("GET") |
| .endpoint(networkHref + "/metadata/KEY") |
| .addHeader("Accept", "*/*") |
| .addHeader("x-vcloud-authorization", token) |
| .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build(); |
| |
| HttpResponse getMetadataValueResponse = HttpResponse.builder() |
| .statusCode(200) |
| .payload(payloadFromResourceWithContentType("/network/metadataValue.xml", METADATA_VALUE)) |
| .build(); |
| |
| @Test |
| public void testGetNetworkMetadataEntryHref() { |
| VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, getMetadataValue, getMetadataValueResponse); |
| assertEquals(api.getNetworkApi().getMetadataApi(networkHref).get("KEY"), "value"); |
| } |
| |
| public static OrgNetwork network() { |
| return OrgNetwork.builder() |
| .name("ilsolation01-Jclouds") |
| .id("urn:vcloud:network:f3ba8256-6f48-4512-aad6-600e85b4dc38") |
| .type("application/vnd.vmware.vcloud.orgNetwork+xml") |
| .href(URI.create("https://vcloudbeta.bluelock.com/api/network/f3ba8256-6f48-4512-aad6-600e85b4dc38")) |
| .link(Link.builder() |
| .rel("up") |
| .type("application/vnd.vmware.vcloud.org+xml") |
| .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) |
| .build()) |
| .link(Link.builder() |
| .rel("down") |
| .type("application/vnd.vmware.vcloud.metadata+xml") |
| .href(URI.create("https://vcloudbeta.bluelock.com/api/network/f3ba8256-6f48-4512-aad6-600e85b4dc38/metadata")) |
| .build()) |
| .description("") |
| .configuration(NetworkConfiguration.builder() |
| .ipScope(IpScope.builder() |
| .isInherited(false) |
| .gateway("192.168.1.1") |
| .netmask("255.255.255.0") |
| .dns1("173.240.111.52") |
| .dns2("173.240.111.53") |
| .ipRanges(IpRanges.builder() |
| .ipRange(IpRange.builder() |
| .startAddress("192.168.1.100") |
| .endAddress("192.168.1.199") |
| .build()) |
| .build()) |
| .build()) |
| .fenceMode(FenceMode.ISOLATED) |
| .retainNetInfoAcrossDeployments(false) |
| .features(NetworkFeatures.builder() |
| .service(DhcpService.builder() |
| .enabled(false) |
| .defaultLeaseTime(3600) |
| .maxLeaseTime(7200) |
| .ipRange(IpRange.builder() |
| .startAddress("192.168.1.2") |
| .endAddress("192.168.1.99") |
| .build()) |
| .build()) |
| .build()) |
| .syslogServerSettings(SyslogServerSettings.builder().build()) |
| .build()) |
| .allowedExternalIpAddresses(IpAddresses.builder().build()) |
| .build(); |
| } |
| } |