diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgAsyncClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgAsyncClient.java index c88edee6e4..c4fc90fec0 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgAsyncClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgAsyncClient.java @@ -18,15 +18,33 @@ */ package org.jclouds.vcloud.director.v1_5.features; +import java.net.URI; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +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.OrgVAppTemplateLeaseSettings; import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest; +import org.jclouds.vcloud.director.v1_5.functions.ThrowVCloudErrorOn4xx; + +import com.google.common.util.concurrent.ListenableFuture; /** * @see GroupClient * @author danikov */ @RequestFilters(AddVCloudAuthorizationToRequest.class) -public interface AdminOrgAsyncClient { +public interface AdminOrgAsyncClient extends OrgAsyncClient { // GET /admin/org/{id} @@ -52,12 +70,28 @@ public interface AdminOrgAsyncClient { // PUT /admin/org/{id}/settings/passwordPolicy -// GET /admin/org/{id}/settings/vAppLeaseSettings + /** + * @see AdminOrgClient#getVAppTemplateLeaseSettings(URI) + */ + @GET + @Path("/settings/vAppTemplateLeaseSettings") + @Consumes + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture getVAppTemplateLeaseSettings( + @EndpointParam URI orgRef); + + /** + * @see AdminOrgClient#updateVAppTemplateLeaseSettings(URI, OrgVAppTemplateLeaseSettings) + */ + @PUT + @Path("/settings/vAppTemplateLeaseSettings") + @Consumes(VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS) + @Produces(VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS) + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture updateVAppTemplateLeaseSettings( + @EndpointParam URI orgRef, + @BinderParam(BindToXMLPayload.class) OrgVAppTemplateLeaseSettings group); -// PUT /admin/org/{id}/settings/vAppLeaseSettings - -// GET /admin/org/{id}/settings/vAppTemplateLeaseSettings - -// PUT /admin/org/{id}/settings/vAppTemplateLeaseSettings - } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClient.java index b584713fbf..a1bf2d399c 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClient.java @@ -18,9 +18,12 @@ */ package org.jclouds.vcloud.director.v1_5.features; +import java.net.URI; import java.util.concurrent.TimeUnit; import org.jclouds.concurrent.Timeout; +import org.jclouds.vcloud.director.v1_5.domain.Group; +import org.jclouds.vcloud.director.v1_5.domain.OrgVAppTemplateLeaseSettings; /** * Provides synchronous access to {@link Group} objects. @@ -29,7 +32,7 @@ import org.jclouds.concurrent.Timeout; * @author danikov */ @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS) -public interface AdminOrgClient { +public interface AdminOrgClient extends OrgClient { // GET /admin/org/{id} @@ -59,8 +62,29 @@ public interface AdminOrgClient { // PUT /admin/org/{id}/settings/vAppLeaseSettings -// GET /admin/org/{id}/settings/vAppTemplateLeaseSettings + /** + * Retrieves expiration and storage policy for vApp templates in an organization. + * + *
+    * GET /admin/org/{id}/settings/vAppTemplateLeaseSettings
+    * 
+ * + * @param orgRef the reference for the admin org + * @return the lease settings + */ + OrgVAppTemplateLeaseSettings getVAppTemplateLeaseSettings(URI orgRef); -// PUT /admin/org/{id}/settings/vAppTemplateLeaseSettings + /** + * Updates vApp template policy settings for organization. + * + *
+    * PUT /admin/org/{id}/settings/vAppTemplateLeaseSettings
+    * 
+ * @param orgRef the reference for the admin org + * @param newSettings the requested updated settings + * @return the resultant settings + */ + OrgVAppTemplateLeaseSettings updateVAppTemplateLeaseSettings(URI orgRef, + OrgVAppTemplateLeaseSettings newSettings); } diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClientExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClientExpectTest.java index e6f295ea15..0554271b2a 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClientExpectTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClientExpectTest.java @@ -18,8 +18,13 @@ */ package org.jclouds.vcloud.director.v1_5.features; +import static org.testng.Assert.assertEquals; + import java.net.URI; +import org.jclouds.vcloud.director.v1_5.VCloudDirectorClient; +import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; +import org.jclouds.vcloud.director.v1_5.domain.OrgVAppTemplateLeaseSettings; import org.jclouds.vcloud.director.v1_5.domain.Reference; import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorRestClientExpectTest; import org.testng.annotations.Test; @@ -66,7 +71,51 @@ public class AdminOrgClientExpectTest extends BaseVCloudDirectorRestClientExpect // PUT /admin/org/{id}/settings/vAppLeaseSettings -// GET /admin/org/{id}/settings/vAppTemplateLeaseSettings - -// PUT /admin/org/{id}/settings/vAppTemplateLeaseSettings + @Test(enabled = false) + public void testGetVAppTemplateLeaseSettings() { + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + new VcloudHttpRequestPrimer() + .apiCommand("GET", "/admin/org/???/settings/vAppTemplateLeaseSettings") + .acceptAnyMedia() + .httpRequestBuilder().build(), + new VcloudHttpResponsePrimer() + .xmlFilePayload("/org/admin/vAppTemplateLeaseSettings.xml", + VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS) + .httpResponseBuilder().build()); + + OrgVAppTemplateLeaseSettings expected = orgVAppTemplateLeaseSettings(); + + assertEquals(client.getAdminOrgClient().getVAppTemplateLeaseSettings(orgRef.getURI()), expected); + } + + public static final OrgVAppTemplateLeaseSettings orgVAppTemplateLeaseSettings() { + return OrgVAppTemplateLeaseSettings.builder() + + .build(); + } + + @Test(enabled = false) + public void testUpdateOrgVAppTemplateLeaseSettings() { + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + new VcloudHttpRequestPrimer() + .apiCommand("PUT", "/admin/org/???/settings/vAppTemplateLeaseSettings") + .xmlFilePayload("/org/admin/updateVAppLeaseSettingsSource.xml", + VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS) + .acceptMedia(VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS) + .httpRequestBuilder().build(), + new VcloudHttpResponsePrimer() + .xmlFilePayload("/org/admin/updateVAppLeaseSettings.xml", + VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS) + .httpResponseBuilder().build()); + + OrgVAppTemplateLeaseSettings expected = updateOrgVAppTemplateLeaseSettings(); + + assertEquals(client.getAdminOrgClient().updateVAppTemplateLeaseSettings(orgRef.getURI(), expected), expected); + } + + public static final OrgVAppTemplateLeaseSettings updateOrgVAppTemplateLeaseSettings() { + return orgVAppTemplateLeaseSettings().toBuilder() + + .build(); + } } diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClientLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClientLiveTest.java index 3c6d1f77cb..b5105f4552 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClientLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClientLiveTest.java @@ -18,15 +18,20 @@ */ package org.jclouds.vcloud.director.v1_5.features; -import java.net.URI; - +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.REF_REQ_LIVE; +import static org.testng.Assert.assertNotNull; import org.jclouds.vcloud.director.v1_5.domain.AdminOrg; -import org.jclouds.vcloud.director.v1_5.domain.Reference; +import org.jclouds.vcloud.director.v1_5.domain.Error; +import org.jclouds.vcloud.director.v1_5.domain.Group; +import org.jclouds.vcloud.director.v1_5.domain.Checks; +import org.jclouds.vcloud.director.v1_5.domain.OrgVAppTemplateLeaseSettings; import org.jclouds.vcloud.director.v1_5.domain.ReferenceType; import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorClientLiveTest; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; +import com.google.common.collect.Iterables; + /** * Tests live behavior of {@link AdminGroupClient}. * @@ -35,7 +40,7 @@ import org.testng.annotations.Test; @Test(groups = { "live", "admin", "org" }, singleThreaded = true, testName = "AdminOrgClientLiveTest") public class AdminOrgClientLiveTest extends BaseVCloudDirectorClientLiveTest { - public static final String GROUP = "admin org"; + public static final String ORG = "admin org"; /* * Convenience references to API clients. @@ -48,14 +53,14 @@ public class AdminOrgClientLiveTest extends BaseVCloudDirectorClientLiveTest { */ private ReferenceType orgRef; private AdminOrg org; + OrgVAppTemplateLeaseSettings vAppTemplateLeaseSettings; @Override @BeforeClass(inheritGroups = true) public void setupRequiredClients() { orgClient = context.getApi().getAdminOrgClient(); - orgRef = Reference.builder() - .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/???")) - .build(); + orgRef = Iterables.getFirst(orgClient.getOrgList().getOrgs(), null).toAdminReference(endpoint); + assertNotNull(orgRef, String.format(REF_REQ_LIVE, "admin org")); } // GET /admin/org/{id} @@ -86,7 +91,46 @@ public class AdminOrgClientLiveTest extends BaseVCloudDirectorClientLiveTest { // PUT /admin/org/{id}/settings/vAppLeaseSettings -// GET /admin/org/{id}/settings/vAppTemplateLeaseSettings - -// PUT /admin/org/{id}/settings/vAppTemplateLeaseSettings + @Test(testName = "GET /admin/org/{id}/settings/vAppTemplateLeaseSettings") + public void testGetVAppTemplateLeaseSettings() { + vAppTemplateLeaseSettings = orgClient.getVAppTemplateLeaseSettings(orgRef.getURI()); + + Checks.checkVAppTemplateLeaseSettings(vAppTemplateLeaseSettings); + } + + @Test(testName = "PUT /admin/org/{id}/settings/vAppTemplateLeaseSettings", + dependsOnMethods = { "testGetVAppTemplateLeaseSettings" }, enabled = false) // FIXME: fails with 403 forbidden + public void testUpdateVAppTemplateLeaseSettings() { + boolean deleteOnStorageLeaseExpiration = vAppTemplateLeaseSettings.deleteOnStorageLeaseExpiration(); + Integer storageLeaseSeconds = vAppTemplateLeaseSettings.getStorageLeaseSeconds(); + + try { + vAppTemplateLeaseSettings = vAppTemplateLeaseSettings.toBuilder() + .deleteOnStorageLeaseExpiration(!deleteOnStorageLeaseExpiration) + .storageLeaseSeconds(storageLeaseSeconds+1) + .build(); + + vAppTemplateLeaseSettings = orgClient.updateVAppTemplateLeaseSettings( + orgRef.getURI(), vAppTemplateLeaseSettings); + + assertTrue(equal(vAppTemplateLeaseSettings.deleteOnStorageLeaseExpiration(), !deleteOnStorageLeaseExpiration), + String.format(OBJ_FIELD_UPDATABLE, + "vAppTemplateLeaseSettings", "deleteOnStorageLeaseExpiration")); + assertTrue(equal(vAppTemplateLeaseSettings.getStorageLeaseSeconds(), storageLeaseSeconds+1), + String.format(OBJ_FIELD_UPDATABLE, + "vAppTemplateLeaseSettings", "storageLeaseSeconds")); + + //TODO negative tests? + + Checks.checkVAppTemplateLeaseSettings(vAppTemplateLeaseSettings); + } finally { + vAppTemplateLeaseSettings = vAppTemplateLeaseSettings.toBuilder() + .deleteOnStorageLeaseExpiration(deleteOnStorageLeaseExpiration) + .storageLeaseSeconds(storageLeaseSeconds) + .build(); + + vAppTemplateLeaseSettings = orgClient.updateVAppTemplateLeaseSettings( + orgRef.getURI(), vAppTemplateLeaseSettings); + } + } } diff --git a/labs/vcloud-director/src/test/resources/org/admin/updateVAppLeaseSettings.xml b/labs/vcloud-director/src/test/resources/org/admin/updateVAppLeaseSettings.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/labs/vcloud-director/src/test/resources/org/admin/updateVAppLeaseSettingsSource.xml b/labs/vcloud-director/src/test/resources/org/admin/updateVAppLeaseSettingsSource.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/labs/vcloud-director/src/test/resources/org/admin/vAppLeaseSettings.xml b/labs/vcloud-director/src/test/resources/org/admin/vAppLeaseSettings.xml new file mode 100644 index 0000000000..e69de29bb2