blob: 2cd1038880a18f2858c48a7eaf4bd60bc44c5279 [file] [log] [blame]
/*
* 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();
}
}