adminNetwork updateNetwork w/tests

This commit is contained in:
danikov 2012-03-14 16:52:41 +00:00
parent 5fdc6dd522
commit d28eed358a
11 changed files with 300 additions and 17 deletions

View File

@ -90,7 +90,7 @@ public class ExternalNetwork extends Network {
}
public T fromExternalNetwork(ExternalNetwork in) {
return fromNetworkType(in)
return fromNetwork(in)
.providerInfo(in.getProviderInfo());
}
}

View File

@ -20,6 +20,9 @@ package org.jclouds.vcloud.director.v1_5.domain;
import static com.google.common.base.Objects.equal;
import java.util.Arrays;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlSeeAlso;
@ -28,6 +31,22 @@ import com.google.common.base.Objects.ToStringHelper;
@XmlSeeAlso( {OrgNetwork.class, ExternalNetwork.class} )
public abstract class Network extends EntityType {
public static final class FenceMode {
public static final String BRIDGED = "bridged";
public static final String ISOLATED = "isolated";
public static final String NAT_ROUTED = "natRouted";
/**
* All acceptable {@link Network#getFenceMode()} values.
* <p/>
* This list must be updated whenever a new mode is added.
*/
public static final List<String> ALL = Arrays.asList(
BRIDGED, ISOLATED, NAT_ROUTED
);
}
public abstract static class Builder<T extends Builder<T>> extends EntityType.Builder<T> {
protected NetworkConfiguration networkConfiguration;
@ -39,7 +58,7 @@ public abstract class Network extends EntityType {
return self();
}
public T fromNetworkType(Network in) {
public T fromNetwork(Network in) {
return fromEntityType(in).configuration(in.getConfiguration());
}
}
@ -55,7 +74,6 @@ public abstract class Network extends EntityType {
@SuppressWarnings("unchecked")
public static <T extends Network> T toSubType(Network clazz) {
assert clazz instanceof Network;
return (T)clazz;
}

View File

@ -78,7 +78,7 @@ public class NetworkConfiguration {
}
/**
* @see NetworkConfiguration#getRetainNetInfoAcrossDeployments()
* @see NetworkConfiguration#retainNetInfoAcrossDeployments()
*/
public Builder retainNetInfoAcrossDeployments(boolean retainNetInfoAcrossDeployments) {
this.retainNetInfoAcrossDeployments = retainNetInfoAcrossDeployments;
@ -115,7 +115,7 @@ public class NetworkConfiguration {
public Builder fromConfiguration(NetworkConfiguration in) {
return ipScope(in.getIpScope()).parentNetwork(in.getParentNetwork()).fenceMode(in.getFenceMode())
.retainNetInfoAcrossDeployments(in.getRetainNetInfoAcrossDeployments())
.retainNetInfoAcrossDeployments(in.retainNetInfoAcrossDeployments())
.features(in.getNetworkFeatures())
.syslogServerSettings(in.getSyslogServerSettings())
.routerInfo(in.getRouterInfo());
@ -133,7 +133,7 @@ public class NetworkConfiguration {
this.routerInfo = routerInfo;
}
private NetworkConfiguration() {
protected NetworkConfiguration() {
// for JAXB
}
@ -182,7 +182,7 @@ public class NetworkConfiguration {
* @return whether the network resources such as IP/MAC of router will be retained
* across deployments. Default is false.
*/
public boolean getRetainNetInfoAcrossDeployments() {
public Boolean retainNetInfoAcrossDeployments() {
return retainNetInfoAcrossDeployments;
}

View File

@ -22,12 +22,19 @@ import java.net.URI;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Produces;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.annotations.ExceptionParser;
import org.jclouds.rest.annotations.JAXBResponseParser;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.binders.BindToXMLPayload;
import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
import org.jclouds.vcloud.director.v1_5.domain.ExternalNetwork;
import org.jclouds.vcloud.director.v1_5.domain.OrgNetwork;
import org.jclouds.vcloud.director.v1_5.domain.Task;
import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest;
import org.jclouds.vcloud.director.v1_5.functions.ThrowVCloudErrorOn4xx;
@ -50,7 +57,13 @@ public interface AdminNetworkAsyncClient extends NetworkAsyncClient {
@Override
ListenableFuture<ExternalNetwork> getNetwork(@EndpointParam URI networkRef);
// PUT /admin/network/{id}
@PUT
@Consumes(VCloudDirectorMediaType.TASK)
@Produces(VCloudDirectorMediaType.ADMIN_ORG_NETWORK)
@JAXBResponseParser
@ExceptionParser(ThrowVCloudErrorOn4xx.class)
ListenableFuture<Task> updateNetwork(@EndpointParam URI networkRef,
@BinderParam(BindToXMLPayload.class) OrgNetwork network);
// POST /admin/network/{id}/action/reset

View File

@ -23,6 +23,8 @@ import java.util.concurrent.TimeUnit;
import org.jclouds.concurrent.Timeout;
import org.jclouds.vcloud.director.v1_5.domain.Network;
import org.jclouds.vcloud.director.v1_5.domain.OrgNetwork;
import org.jclouds.vcloud.director.v1_5.domain.Task;
/**
* Provides synchronous access to admin {@link Network} objects.
@ -42,13 +44,25 @@ public interface AdminNetworkClient extends NetworkClient {
* GET /admin/network/{id}
* </pre>
*
* @param catalogUri the reference for the catalog
* @return a catalog
* @param networkRef the reference for the network
* @return the network
*/
@Override
Network getNetwork(URI networkRef);
// PUT /admin/network/{id}
/**
* Modifies an org network
*
* <pre>
* PUT /admin/network/{id}
* </pre>
*
* @param networkRef the reference for the network
* @param network the updated network
* @return a task. This operation is asynchronous and the user should monitor the
* returned task status in order to check when it is completed.
*/
Task updateNetwork(URI networkRef, OrgNetwork network);
// POST /admin/network/{id}/action/reset

View File

@ -372,7 +372,14 @@ public class Checks {
}
public static void checkNetworkConfiguration(NetworkConfiguration config) {
// required
assertNotNull(config.getFenceMode(), String.format(NOT_NULL_OBJECT_FMT,
"fenceMode", "NetworkConfiguration"));
assertTrue(Network.FenceMode.ALL.contains(config.getFenceMode()), String.format(REQUIRED_VALUE_OBJECT_FMT,
"fenceMode", "NetworkConfiguration", config.getFenceMode(), Iterables.toString(Network.FenceMode.ALL)));
// Check optional fields
// NOTE retainNetInfoAcrossDeployments cannot be checked
if (config.getIpScope() != null) {
checkIpScope(config.getIpScope());
}

View File

@ -27,6 +27,7 @@ import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
import org.jclouds.vcloud.director.v1_5.domain.Link;
import org.jclouds.vcloud.director.v1_5.domain.OrgNetwork;
import org.jclouds.vcloud.director.v1_5.domain.Reference;
import org.jclouds.vcloud.director.v1_5.domain.Task;
import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorRestClientExpectTest;
import org.testng.annotations.Test;
@ -61,6 +62,22 @@ public class AdminNetworkClientExpectTest extends BaseVCloudDirectorRestClientEx
}
// PUT /admin/network/{id}
@Test
public void testUpdateNetwork() {
VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse,
new VcloudHttpRequestPrimer()
.apiCommand("GET", "/admin/network/b466c0c5-8a5c-4335-b703-a2e2e6b5f3e1")
.xmlFilePayload("/network/admin/updateNetworkSource.xml", VCloudDirectorMediaType.ORG_NETWORK)
.acceptMedia(VCloudDirectorMediaType.TASK)
.httpRequestBuilder().build(),
new VcloudHttpResponsePrimer()
.xmlFilePayload("/network/admin/updateNetworkTask.xml", VCloudDirectorMediaType.TASK)
.httpResponseBuilder().build());
Task expected = updateNetworkTask();
assertEquals(client.getAdminNetworkClient().updateNetwork(networkRef.getHref(), updateNetwork()), expected);
}
// POST /admin/network/{id}/action/reset
@ -100,4 +117,43 @@ public class AdminNetworkClientExpectTest extends BaseVCloudDirectorRestClientEx
.build())
.build();
}
public final OrgNetwork updateNetwork() {
return orgNetwork().toNewBuilder()
.build();
}
public final Task updateNetworkTask() {
return Task.builder()
.status("running")
.startTime(dateService.iso8601DateParse("2012-03-14T12:39:23.720-04:00"))
.operationName("networkUpdateNetwork")
.operation("Updating Network ilsolation01-Jclouds(f3ba8256-6f48-4512-aad6-600e85b4dc38)")
.expiryTime(dateService.iso8601DateParse("2012-06-12T12:39:23.720-04:00"))
.name("task")
.id("urn:vcloud:task:49d2e180-7921-4902-ac39-b4ff5406bb94")
.type("application/vnd.vmware.vcloud.task+xml")
.href(URI.create("https://vcloudbeta.bluelock.com/api/task/49d2e180-7921-4902-ac39-b4ff5406bb94"))
.link(Link.builder()
.rel("task:cancel")
.href(URI.create("https://vcloudbeta.bluelock.com/api/task/49d2e180-7921-4902-ac39-b4ff5406bb94/action/cancel"))
.build())
.owner(Reference.builder()
.type("application/vnd.vmware.vcloud.network+xml")
.name("ilsolation01-Jclouds")
.href(URI.create("https://vcloudbeta.bluelock.com/api/network/f3ba8256-6f48-4512-aad6-600e85b4dc38"))
.build())
.user(Reference.builder()
.type("application/vnd.vmware.admin.user+xml")
.name("dan@cloudsoftcorp.com")
.href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/ae75edd2-12de-414c-8e85-e6ea10442c08"))
.build())
.org(Reference.builder()
.type("application/vnd.vmware.vcloud.org+xml")
.name("JClouds")
.href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
.build())
.build();
}
}

View File

@ -18,17 +18,27 @@
*/
package org.jclouds.vcloud.director.v1_5.features;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.*;
import static com.google.common.base.Objects.equal;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_UPDATABLE;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_REQ_LIVE;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.REF_REQ_LIVE;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.REQUIRED_VALUE_OBJECT_FMT;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.TASK_COMPLETE_TIMELY;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
import java.net.URI;
import org.jclouds.vcloud.director.v1_5.domain.Checks;
import org.jclouds.vcloud.director.v1_5.domain.ExternalNetwork;
import org.jclouds.vcloud.director.v1_5.domain.IpScope;
import org.jclouds.vcloud.director.v1_5.domain.Network;
import org.jclouds.vcloud.director.v1_5.domain.NetworkConfiguration;
import org.jclouds.vcloud.director.v1_5.domain.NetworkFeatures;
import org.jclouds.vcloud.director.v1_5.domain.OrgNetwork;
import org.jclouds.vcloud.director.v1_5.domain.Reference;
import org.jclouds.vcloud.director.v1_5.domain.RouterInfo;
import org.jclouds.vcloud.director.v1_5.domain.SyslogServerSettings;
import org.jclouds.vcloud.director.v1_5.domain.Task;
import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorClientLiveTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@ -62,7 +72,8 @@ public class AdminNetworkLiveTest extends BaseVCloudDirectorClientLiveTest {
@Test(testName = "GET /admin/network/{id}")
public void testGetNetwork() {
assertNotNull(networkRef, String.format(REF_REQ_LIVE, NETWORK));
//TODO: test both org and external networks
assertNotNull(networkRef, String.format(OBJ_REQ_LIVE, NETWORK));
network = networkClient.getNetwork(networkRef.getHref());
if(network instanceof ExternalNetwork) {
@ -75,7 +86,125 @@ public class AdminNetworkLiveTest extends BaseVCloudDirectorClientLiveTest {
}
}
// PUT /admin/network/{id}
// TODO: this test is far from exhaustive
@Test(testName = "PUT /admin/network/{id}" )
public void testUpdateNetwork() {
//TODO: ensure network instanceof OrgNetwork, may require queries
assertTrue(network instanceof OrgNetwork, String.format(REF_REQ_LIVE, "OrgNetwork"));
OrgNetwork oldNetwork = Network.<OrgNetwork>toSubType(network).toNewBuilder()
.tasks(null)
.build();
OrgNetwork updateNetwork = getMutatedOrgNetwork(oldNetwork);
try {
Task updateNetworkTask = networkClient.updateNetwork(network.getHref(), updateNetwork);
Checks.checkTask(updateNetworkTask);
assertTrue(retryTaskSuccess.apply(updateNetworkTask), String.format(TASK_COMPLETE_TIMELY, "updateNetworkTask"));
network = networkClient.getNetwork(network.getHref());
Checks.checkOrgNetwork(Network.<OrgNetwork>toSubType(network));
assertTrue(equal(network.getConfiguration().getIpScope(),
updateNetwork.getConfiguration().getIpScope()),
String.format(OBJ_FIELD_UPDATABLE, NETWORK+".configuration", "ipScope"));
assertTrue(equal(network.getConfiguration().getParentNetwork(),
updateNetwork.getConfiguration().getParentNetwork()),
String.format(OBJ_FIELD_UPDATABLE, NETWORK+".configuration", "parentNetwork"));
assertTrue(equal(network.getConfiguration().getFenceMode(),
updateNetwork.getConfiguration().getFenceMode()),
String.format(OBJ_FIELD_UPDATABLE, NETWORK+".configuration", "fenceMode"));
assertTrue(equal(network.getConfiguration().retainNetInfoAcrossDeployments(),
updateNetwork.getConfiguration().retainNetInfoAcrossDeployments()),
String.format(OBJ_FIELD_UPDATABLE, NETWORK+".configuration", "retainNetInfoAcrossDeployments"));
assertTrue(equal(network.getConfiguration().getNetworkFeatures(),
updateNetwork.getConfiguration().getNetworkFeatures()),
String.format(OBJ_FIELD_UPDATABLE, NETWORK+".configuration", "networkFeatures"));
assertTrue(equal(network.getConfiguration().getSyslogServerSettings(),
updateNetwork.getConfiguration().getSyslogServerSettings()),
String.format(OBJ_FIELD_UPDATABLE, NETWORK+".configuration", "syslogServerSettings"));
assertTrue(equal(network.getConfiguration().getRouterInfo(),
updateNetwork.getConfiguration().getRouterInfo()),
String.format(OBJ_FIELD_UPDATABLE, NETWORK+".configuration", "routerInfo"));
// FIXME: fails
// assertTrue(equal(Network.<OrgNetwork>toSubType(network).getNetworkPool(),
// updateNetwork.getNetworkPool()),
// String.format(OBJ_FIELD_UPDATABLE, NETWORK, "networkPool"));
// assertTrue(equal(Network.<OrgNetwork>toSubType(network).getAllowedExternalIpAddresses(),
// updateNetwork.getAllowedExternalIpAddresses()),
// String.format(OBJ_FIELD_UPDATABLE, NETWORK, "allowedExternalIpAddresses"));
} finally {
Task updateNetworkTask = networkClient.updateNetwork(network.getHref(), oldNetwork);
Checks.checkTask(updateNetworkTask);
assertTrue(retryTaskSuccess.apply(updateNetworkTask), String.format(TASK_COMPLETE_TIMELY, "updateNetworkTask"));
network = networkClient.getNetwork(network.getHref());
}
}
private static OrgNetwork getMutatedOrgNetwork(OrgNetwork network) {
OrgNetwork.Builder<?> networkBuilder = OrgNetwork.builder().fromNetwork(network)
.tasks(null)
// .name("new "+network.getName())
.description("new "+network.getDescription())
.configuration(getMutatedNetworkConfiguration(network.getConfiguration()));
// FIXME: fails
// if (network.getNetworkPool() != null) {
// networkBuilder.networkPool(null);
// } // TODO: else?
// if (network.getAllowedExternalIpAddresses() != null) {
// networkBuilder.allowedExternalIpAddresses(null);
// } // TODO: else?
return networkBuilder.build();
}
private static NetworkConfiguration getMutatedNetworkConfiguration(NetworkConfiguration config) {
NetworkConfiguration.Builder configBuilder = config.toBuilder();
if (config.getIpScope() != null) {
configBuilder.ipScope(IpScope.builder().fromIpScope(config.getIpScope())
// TODO: mutate to test more
.build());
}
if (config.getParentNetwork() != null) {
// configBuilder.parentNetwork(null);
} // TODO: else?
// configBuilder.fenceMode(config.getFenceMode() == Network.FenceMode.BRIDGED ?
// Network.FenceMode.BRIDGED : Network.FenceMode.ISOLATED);
if (config.getSyslogServerSettings() != null) {
configBuilder.syslogServerSettings(SyslogServerSettings.builder()
.fromSyslogServerSettings(config.getSyslogServerSettings())
// TODO: mutate to test more
.build());
}
if (config.retainNetInfoAcrossDeployments() != null) {
// configBuilder.retainNetInfoAcrossDeployments(!config.retainNetInfoAcrossDeployments());
} else {
// configBuilder.retainNetInfoAcrossDeployments(false);
}
if (config.getNetworkFeatures() != null) {
configBuilder.features(NetworkFeatures.builder().fromNetworkFeatures(config.getNetworkFeatures())
// TODO: mutate to test more
.build());
}
if (config.getRouterInfo() != null) {
configBuilder.routerInfo(RouterInfo.builder().fromRouterInfo(config.getRouterInfo())
// TODO: mutate to test more
.build());
}
return configBuilder.build();
}
// POST /admin/network/{id}/action/reset
}

View File

@ -92,7 +92,7 @@ public abstract class BaseVCloudDirectorClientLiveTest extends BaseVersionedServ
@Inject
protected void initTaskSuccess(TaskSuccess taskSuccess) {
retryTaskSuccess = new RetryablePredicate<Task>(taskSuccess, TASK_TIMEOUT_SECONDS * 1000L);
retryTaskSuccess = new RetryablePredicate<Task>(taskSuccess, TASK_TIMEOUT_SECONDS * 10000L);
}
@Inject

View File

@ -0,0 +1,39 @@
<OrgNetwork name="ilsolation01-Jclouds" id="urn:vcloud:network:f3ba8256-6f48-4512-aad6-600e85b4dc38" type="application/vnd.vmware.vcloud.orgNetwork+xml" href="https://vcloudbeta.bluelock.com/api/admin/network/f3ba8256-6f48-4512-aad6-600e85b4dc38" xmlns="http://www.vmware.com/vcloud/v1.5">
<Link rel="alternate" type="application/vnd.vmware.vcloud.orgNetwork+xml" href="https://vcloudbeta.bluelock.com/api/network/f3ba8256-6f48-4512-aad6-600e85b4dc38"/>
<Link rel="edit" type="application/vnd.vmware.admin.orgNetwork+xml" href="https://vcloudbeta.bluelock.com/api/admin/network/f3ba8256-6f48-4512-aad6-600e85b4dc38"/>
<Link rel="up" type="application/vnd.vmware.admin.organization+xml" href="https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"/>
<Link rel="repair" type="application/vnd.vmware.admin.orgNetwork+xml" href="https://vcloudbeta.bluelock.com/api/admin/network/f3ba8256-6f48-4512-aad6-600e85b4dc38/action/reset"/>
<Link rel="down" type="application/vnd.vmware.vcloud.metadata+xml" href="https://vcloudbeta.bluelock.com/api/admin/network/f3ba8256-6f48-4512-aad6-600e85b4dc38/metadata"/>
<Description></Description>
<Configuration>
<IpScope>
<IsInherited>false</IsInherited>
<Gateway>192.168.1.1</Gateway>
<Netmask>255.255.255.0</Netmask>
<Dns1>173.240.111.52</Dns1>
<Dns2>173.240.111.53</Dns2>
<IpRanges>
<IpRange>
<StartAddress>192.168.1.100</StartAddress>
<EndAddress>192.168.1.199</EndAddress>
</IpRange>
</IpRanges>
</IpScope>
<FenceMode>isolated</FenceMode>
<RetainNetInfoAcrossDeployments>false</RetainNetInfoAcrossDeployments>
<Features>
<DhcpService>
<IsEnabled>false</IsEnabled>
<DefaultLeaseTime>3600</DefaultLeaseTime>
<MaxLeaseTime>7200</MaxLeaseTime>
<IpRange>
<StartAddress>192.168.1.2</StartAddress>
<EndAddress>192.168.1.99</EndAddress>
</IpRange>
</DhcpService>
</Features>
<SyslogServerSettings/>
</Configuration>
<NetworkPool type="application/vnd.vmware.admin.networkPool+xml" name="vcdni01" href="https://vcloudbeta.bluelock.com/api/admin/extension/networkPool/e86bfdb5-b3e0-4ece-9125-e764ac64c95c"/>
<AllowedExternalIpAddresses/>
</OrgNetwork>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Task xmlns="http://www.vmware.com/vcloud/v1.5" status="running" startTime="2012-03-14T12:39:23.720-04:00" operationName="networkUpdateNetwork" operation="Updating Network ilsolation01-Jclouds(f3ba8256-6f48-4512-aad6-600e85b4dc38)" expiryTime="2012-06-12T12:39:23.720-04:00" name="task" id="urn:vcloud:task:49d2e180-7921-4902-ac39-b4ff5406bb94" type="application/vnd.vmware.vcloud.task+xml" href="https://vcloudbeta.bluelock.com/api/task/49d2e180-7921-4902-ac39-b4ff5406bb94" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vmware.com/vcloud/v1.5 http://vcloudbeta.bluelock.com/api/v1.5/schema/master.xsd">
<Link rel="task:cancel" href="https://vcloudbeta.bluelock.com/api/task/49d2e180-7921-4902-ac39-b4ff5406bb94/action/cancel"/>
<Owner type="application/vnd.vmware.vcloud.network+xml" name="ilsolation01-Jclouds" href="https://vcloudbeta.bluelock.com/api/network/f3ba8256-6f48-4512-aad6-600e85b4dc38"/>
<User type="application/vnd.vmware.admin.user+xml" name="dan@cloudsoftcorp.com" href="https://vcloudbeta.bluelock.com/api/admin/user/ae75edd2-12de-414c-8e85-e6ea10442c08"/>
<Organization type="application/vnd.vmware.vcloud.org+xml" name="JClouds" href="https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"/>
</Task>