http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalDomainApiLiveTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalDomainApiLiveTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalDomainApiLiveTest.java new file mode 100644 index 0000000..03fbe3d --- /dev/null +++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalDomainApiLiveTest.java @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.cloudstack.features; + +import static com.google.common.collect.Iterables.find; +import static org.jclouds.cloudstack.options.UpdateDomainOptions.Builder.name; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNull; + +import org.jclouds.cloudstack.domain.Domain; +import org.jclouds.cloudstack.internal.BaseCloudStackApiLiveTest; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import com.google.common.base.Predicate; + +/** + * Tests behavior of {@code GlobalDomainApi} + */ +@Test(groups = "live", singleThreaded = true, testName = "GlobalDomainApiLiveTest") +public class GlobalDomainApiLiveTest extends BaseCloudStackApiLiveTest { + + private GlobalDomainApi domainClient; + private Domain rootDomain; + + @BeforeMethod + public void before() { + domainClient = globalAdminClient.getDomainClient(); + rootDomain = find(domainClient.listDomains(), new Predicate<Domain>() { + @Override + public boolean apply(Domain domain) { + return domain != null && domain.getName().equals("ROOT"); + } + }); + } + + @Test(expectedExceptions = IllegalStateException.class) + public void testCreateUpdateDeleteDomain() throws InterruptedException { + skipIfNotDomainAdmin(); + + Domain domain = null; + try { + domain = domainClient.createDomain(prefix + "-domain"); + checkDomain(domain, rootDomain, prefix + "-domain"); + + Domain updated = domainClient.updateDomain(domain.getId(), name(prefix + "-domain-2")); + checkDomain(updated, rootDomain, prefix + "-domain-2"); + assertEquals(updated.getId(), domain.getId()); + + } finally { + if (domain != null) { + domainClient.deleteDomainAndAttachedResources(domain.getId()); + } + } + Thread.sleep(5000); + assertNull(domainClient.getDomainById(domain.getId())); + } + + private void checkDomain(Domain domain, Domain rootDomain, String expectedName) { + assertEquals(domain.getParentDomainId(), rootDomain.getId()); + assertEquals(domain.getName(), expectedName); + assertEquals(domain.getParentDomainName(), rootDomain.getName()); + } +}
http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalHostApiExpectTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalHostApiExpectTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalHostApiExpectTest.java new file mode 100644 index 0000000..9fd82db --- /dev/null +++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalHostApiExpectTest.java @@ -0,0 +1,375 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.cloudstack.features; + +import static org.testng.Assert.assertEquals; + +import java.util.Calendar; +import java.util.Date; +import java.util.Set; +import java.util.TimeZone; + +import org.jclouds.cloudstack.CloudStackContext; +import org.jclouds.cloudstack.domain.AllocationState; +import org.jclouds.cloudstack.domain.Cluster; +import org.jclouds.cloudstack.domain.Host; +import org.jclouds.cloudstack.internal.BaseCloudStackExpectTest; +import org.jclouds.cloudstack.options.AddClusterOptions; +import org.jclouds.cloudstack.options.AddHostOptions; +import org.jclouds.cloudstack.options.AddSecondaryStorageOptions; +import org.jclouds.cloudstack.options.DeleteHostOptions; +import org.jclouds.cloudstack.options.UpdateClusterOptions; +import org.jclouds.cloudstack.options.UpdateHostOptions; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableSet; + +/** + * Test the CloudStack GlobalHostApi + */ +@Test(groups = "unit", testName = "GlobalConfigurationApiExpectTest") +public class GlobalHostApiExpectTest extends BaseCloudStackExpectTest<GlobalHostApi> { + + @Test + public void testListHostsWhenResponseIs2xx() { + HttpRequest request = HttpRequest.builder() + .method("GET") + .endpoint("http://localhost:8080/client/api?response=json&command=listHosts&listAll=true&apiKey=identity&signature=NnYyyEy30G3V2dcIt7w4WZ68AU8%3D") + .addHeader("Accept", "application/json").build(); + HttpResponse response = HttpResponse.builder() + .payload(payloadFromResource("/listhostsresponse.json")) + .statusCode(200).build(); + + Set<Host> actual = requestSendsResponse(request, response).listHosts(); + + Date lastPinged = makeDate(1970, Calendar.JANUARY, 16, 0, 54, 43, "GMT+02:00"); + Date created = makeDate(2011, Calendar.NOVEMBER, 26, 23, 28, 36, "GMT+02:00"); + Host host1 = Host.builder().id("1").name("cs2-xevsrv.alucloud.local").state(Host.State.UP).type(Host.Type.ROUTING).ipAddress("10.26.26.107").zoneId("1").zoneName("Dev Zone 1").podId("1").podName("Dev Pod 1").version("2.2.12.20110928142833").hypervisor("XenServer").cpuNumber(24).cpuSpeed(2266).cpuAllocated("2.76%").cpuUsed("0.1%").cpuWithOverProvisioning(54384.0F).networkKbsRead(4443).networkKbsWrite(15048).memoryTotal(100549733760L).memoryAllocated(3623878656L).memoryUsed(3623878656L).capabilities("xen-3.0-x86_64 , xen-3.0-x86_32p , hvm-3.0-x86_32 , hvm-3.0-x86_32p , hvm-3.0-x86_64").lastPinged(lastPinged).managementServerId("223098941760041").clusterId("1").clusterName("Xen Clust 1").clusterType(Host.ClusterType.CLOUD_MANAGED).localStorageActive(false).created(created).events("PrepareUnmanaged; HypervisorVersionChanged; ManagementServerDown; PingTimeout; AgentDisconnected; MaintenanceRequested; HostDown; AgentConnected; StartAgentRebalance; ShutdownRequested; Ping").hasEnough Capacity(false).allocationState(AllocationState.ENABLED).build(); + + Date disconnected = makeDate(2011, Calendar.NOVEMBER, 26, 23, 33, 38, "GMT+02:00"); + lastPinged = makeDate(1970, Calendar.JANUARY, 16, 0, 42, 30, "GMT+02:00"); + created = makeDate(2011, Calendar.NOVEMBER, 26, 23, 33, 38, "GMT+02:00"); + Host host2 = Host.builder().id("2").name("nfs://10.26.26.165/mnt/nfs/cs_sec").state(Host.State.ALERT).disconnected(disconnected).type(Host.Type.SECONDARY_STORAGE).ipAddress("nfs").zoneId("1").zoneName("Dev Zone 1").version("2.2.12.20110928142833").hypervisor("None").lastPinged(lastPinged).localStorageActive(false).created(created).events("ManagementServerDown; AgentDisconnected; Remove; MaintenanceRequested; AgentConnected; Ping").hasEnoughCapacity(false).allocationState(AllocationState.ENABLED).build(); + + lastPinged = makeDate(1970, Calendar.JANUARY, 16, 0, 54, 43, "GMT+02:00"); + created = makeDate(2011, Calendar.NOVEMBER, 26, 23, 35, 51, "GMT+02:00"); + Host host3 = Host.builder().id("3").name("s-1-VM").state(Host.State.UP).type(Host.Type.SECONDARY_STORAGE_VM).ipAddress("10.26.26.81").zoneId("1").zoneName("Dev Zone 1").podId("1").podName("Dev Pod 1").version("2.2.12.20110928142833").lastPinged(lastPinged).managementServerId("223098941760041").localStorageActive(false).created(created).events("PrepareUnmanaged; HypervisorVersionChanged; ManagementServerDown; PingTimeout; AgentDisconnected; MaintenanceRequested; HostDown; AgentConnected; StartAgentRebalance; ShutdownRequested; Ping").hasEnoughCapacity(false).allocationState(AllocationState.ENABLED).build(); + + lastPinged = makeDate(1970, Calendar.JANUARY, 16, 0, 54, 43, "GMT+02:00"); + created = makeDate(2011, Calendar.NOVEMBER, 26, 23, 36, 46, "GMT+02:00"); + Host host4 = Host.builder().id("4").name("v-2-VM").state(Host.State.UP).type(Host.Type.CONSOLE_PROXY).ipAddress("10.26.26.96").zoneId("1").zoneName("Dev Zone 1").podId("1").podName("Dev Pod 1").version("2.2.12.20110928142833").lastPinged(lastPinged).managementServerId("223098941760041").localStorageActive(false).created(created).events("PrepareUnmanaged; HypervisorVersionChanged; ManagementServerDown; PingTimeout; AgentDisconnected; MaintenanceRequested; HostDown; AgentConnected; StartAgentRebalance; ShutdownRequested; Ping").hasEnoughCapacity(false).allocationState(AllocationState.ENABLED).build(); + + Set<Host> expected = ImmutableSet.of(host1, host2, host3, host4); + + assertEquals(actual, expected); + } + + @Test + public void testListHostsEmptyOn404() { + HttpRequest request = HttpRequest.builder() + .method("GET") + .endpoint("http://localhost:8080/client/api?response=json&command=listHosts&listAll=true&apiKey=identity&signature=NnYyyEy30G3V2dcIt7w4WZ68AU8%3D") + .addHeader("Accept", "application/json").build(); + HttpResponse response = HttpResponse.builder().statusCode(404).build(); + GlobalHostApi client = requestSendsResponse(request, response); + + assertEquals(client.listHosts(), ImmutableSet.of()); + } + + HttpRequest addHost = HttpRequest.builder().method("GET") + .endpoint("http://localhost:8080/client/api") + .addQueryParam("response", "json") + .addQueryParam("command", "addHost") + .addQueryParam("zoneid", "1") + .addQueryParam("url", "http%3A//example.com") + .addQueryParam("hypervisor", "XenServer") + .addQueryParam("username", "fred") + .addQueryParam("password", "sekrit") + .addQueryParam("hosttags", "") + .addQueryParam("allocationstate", "Enabled") + .addQueryParam("clusterid", "1") + .addQueryParam("clustername", "Xen%20Clust%201") + .addQueryParam("podid", "1") + .addQueryParam("apiKey", "identity") + .addQueryParam("signature", "ExGaljKKQIlVbWk5hd0BnnjmBzs=") + .addHeader("Accept", "application/json").build(); + + @Test + public void testAddHostWhenResponseIs2xx() { + HttpResponse response = HttpResponse.builder() + .payload(payloadFromResource("/addhostresponse.json")) + .statusCode(200).build(); + + Date lastPinged = makeDate(1970, Calendar.JANUARY, 16, 0, 54, 43, "GMT+02:00"); + Date created = makeDate(2011, Calendar.NOVEMBER, 26, 23, 28, 36, "GMT+02:00"); + Host expected = Host.builder().id("1").name("cs2-xevsrv.alucloud.local").state(Host.State.UP).type(Host.Type.ROUTING).ipAddress("10.26.26.107").zoneId("1").zoneName("Dev Zone 1").podId("1").podName("Dev Pod 1").version("2.2.12.20110928142833").hypervisor("XenServer").cpuNumber(24).cpuSpeed(2266).cpuAllocated("2.76%").cpuUsed("0.1%").cpuWithOverProvisioning(54384.0F).networkKbsRead(4443).networkKbsWrite(15048).memoryTotal(100549733760L).memoryAllocated(3623878656L).memoryUsed(3623878656L).capabilities("xen-3.0-x86_64 , xen-3.0-x86_32p , hvm-3.0-x86_32 , hvm-3.0-x86_32p , hvm-3.0-x86_64").lastPinged(lastPinged).managementServerId("223098941760041").clusterId("1").clusterName("Xen Clust 1").clusterType(Host.ClusterType.CLOUD_MANAGED).localStorageActive(false).created(created).events("PrepareUnmanaged; HypervisorVersionChanged; ManagementServerDown; PingTimeout; AgentDisconnected; MaintenanceRequested; HostDown; AgentConnected; StartAgentRebalance; ShutdownRequested; Ping").hasEno ughCapacity(false).allocationState(AllocationState.ENABLED).build(); + + Host actual = requestSendsResponse(addHost, response).addHost("1", "http://example.com", "XenServer", "fred", "sekrit", + AddHostOptions.Builder.hostTags(ImmutableSet.<String>of()).allocationState(AllocationState.ENABLED).clusterId("1").clusterName("Xen Clust 1").podId("1")); + + assertEquals(actual, expected); + } + + @Test + public void testUpdateHostWhenResponseIs2xx() { + HttpRequest request = HttpRequest.builder() + .method("GET") + .endpoint("http://localhost:8080/client/api?response=json&command=updateHost&id=1&allocationstate=Enabled&hosttags=&oscategoryid=5&apiKey=identity&signature=qTxNq9yQG8S108giqS/ROFzgev8%3D") + .addHeader("Accept", "application/json").build(); + HttpResponse response = HttpResponse.builder() + .payload(payloadFromResource("/updatehostresponse.json")) + .statusCode(200).build(); + + Date lastPinged = makeDate(1970, Calendar.JANUARY, 16, 0, 54, 43, "GMT+02:00"); + Date created = makeDate(2011, Calendar.NOVEMBER, 26, 23, 28, 36, "GMT+02:00"); + Host expected = Host.builder().id("1").name("cs2-xevsrv.alucloud.local").state(Host.State.UP).type(Host.Type.ROUTING).ipAddress("10.26.26.107").zoneId("1").zoneName("Dev Zone 1").podId("1").podName("Dev Pod 1").version("2.2.12.20110928142833").hypervisor("XenServer").cpuNumber(24).cpuSpeed(2266).cpuAllocated("2.76%").cpuUsed("0.1%").cpuWithOverProvisioning(54384.0F).networkKbsRead(4443).networkKbsWrite(15048).memoryTotal(100549733760L).memoryAllocated(3623878656L).memoryUsed(3623878656L).capabilities("xen-3.0-x86_64 , xen-3.0-x86_32p , hvm-3.0-x86_32 , hvm-3.0-x86_32p , hvm-3.0-x86_64").lastPinged(lastPinged).managementServerId("223098941760041").clusterId("1").clusterName("Xen Clust 1").clusterType(Host.ClusterType.CLOUD_MANAGED).localStorageActive(false).created(created).events("PrepareUnmanaged; HypervisorVersionChanged; ManagementServerDown; PingTimeout; AgentDisconnected; MaintenanceRequested; HostDown; AgentConnected; StartAgentRebalance; ShutdownRequested; Ping").hasEno ughCapacity(false).allocationState(AllocationState.ENABLED).build(); + + Host actual = requestSendsResponse(request, response).updateHost("1", UpdateHostOptions.Builder.allocationState(AllocationState.ENABLED).hostTags(ImmutableSet.<String>of()).osCategoryId("5")); + + assertEquals(actual, expected); + } + + HttpRequest updateHostPassword = HttpRequest.builder().method("GET") + .endpoint("http://localhost:8080/client/api") + .addQueryParam("response", "json") + .addQueryParam("command", "updateHostPassword") + .addQueryParam("hostid", "1") + .addQueryParam("username", "fred") + .addQueryParam("password", "sekrit") + .addQueryParam("apiKey", "identity") + .addQueryParam("signature", "g9nMKDWoiU72y0HhaRFekZCgfJc=") + .addHeader("Accept", "application/json").build(); + + @Test + public void testUpdateHostPasswordWhenResponseIs2xx() { + HttpResponse response = HttpResponse.builder() + .statusCode(200).build(); + requestSendsResponse(updateHostPassword, response).updateHostPassword("1", "fred", "sekrit"); + } + + @Test + public void testDeleteHostWhenResponseIs2xx() { + HttpRequest request = HttpRequest.builder() + .method("GET") + .endpoint("http://localhost:8080/client/api?response=json&command=deleteHost&id=1&forced=true&forcedestroylocalstorage=true&apiKey=identity&signature=ZdvO1BWBkdPiDAjsVlKtqDe6N7k%3D") + .addHeader("Accept", "application/json") + .build(); + HttpResponse response = HttpResponse.builder() + .statusCode(200).build(); + + requestSendsResponse(request, response).deleteHost("1", DeleteHostOptions.Builder.forced(true).forceDestroyLocalStorage(true)); + } + + @Test + public void testPrepareHostForMaintenanceWhenResponseIs2xx() { + HttpRequest request = HttpRequest.builder() + .method("GET") + .endpoint("http://localhost:8080/client/api?response=json&command=prepareHostForMaintenance&id=1&apiKey=identity&signature=9tDwdox/xAKmZr9kVrR6Ttnxf3U%3D") + .addHeader("Accept", "application/json").build(); + HttpResponse response = HttpResponse.builder() + .payload(payloadFromResource("/preparehostformaintenanceresponse.json")) + .statusCode(200).build(); + + String actual = requestSendsResponse(request, response).prepareHostForMaintenance("1"); + assertEquals(actual, "2036"); + } + + @Test + public void testCancelHostMaintenanceWhenResponseIs2xx() { + HttpRequest request = HttpRequest.builder() + .method("GET") + .endpoint("http://localhost:8080/client/api?response=json&command=cancelHostMaintenance&id=1&apiKey=identity&signature=9RduzuBoyRZKNTzAoVqUo9gRTfk%3D") + .addHeader("Accept", "application/json").build(); + HttpResponse response = HttpResponse.builder() + .payload(payloadFromResource("/cancelhostmaintenanceresponse.json")) + .statusCode(200).build(); + + String actual = requestSendsResponse(request, response).cancelHostMaintenance("1"); + assertEquals(actual, "2036"); + } + + @Test + public void testReconnectHostWhenResponseIs2xx() { + HttpRequest request = HttpRequest.builder() + .method("GET") + .endpoint("http://localhost:8080/client/api?response=json&command=reconnectHost&id=1&apiKey=identity&signature=wJEF02vwdyOnJOTa%2BWMMK906aRU%3D") + .addHeader("Accept", "application/json").build(); + HttpResponse response = HttpResponse.builder() + .payload(payloadFromResource("/reconnecthostresponse.json")) + .statusCode(200).build(); + + String actual = requestSendsResponse(request, response).reconnectHost("1"); + assertEquals(actual, "2036"); + } + + @Test + public void testAddSecondaryStorageWhenResponseIs2xx() { + HttpRequest request = HttpRequest.builder() + .method("GET") + .endpoint("http://localhost:8080/client/api?response=json&command=addSecondaryStorage&url=nfs%3A//10.26.26.165/mnt/nfs/cs_sec&zoneid=1&apiKey=identity&signature=MccRKx1yPP43ImiO70WlhVDlAIA%3D") + .addHeader("Accept", "application/json").build(); + HttpResponse response = HttpResponse.builder() + .payload(payloadFromResource("/addsecondarystorageresponse.json")) + .statusCode(200).build(); + + Date disconnected = makeDate(2011, Calendar.NOVEMBER, 26, 23, 33, 38, "GMT+02:00"); + Date lastPinged = makeDate(1970, Calendar.JANUARY, 16, 0, 42, 30, "GMT+02:00"); + Date created = makeDate(2011, Calendar.NOVEMBER, 26, 23, 33, 38, "GMT+02:00"); + Host expected = Host.builder().id("2").name("nfs://10.26.26.165/mnt/nfs/cs_sec").state(Host.State.ALERT).disconnected(disconnected).type(Host.Type.SECONDARY_STORAGE).ipAddress("nfs").zoneId("1").zoneName("Dev Zone 1").version("2.2.12.20110928142833").hypervisor("None").lastPinged(lastPinged).localStorageActive(false).created(created).events("ManagementServerDown; AgentDisconnected; Remove; MaintenanceRequested; AgentConnected; Ping").hasEnoughCapacity(false).allocationState(AllocationState.ENABLED).build(); + + Host actual = requestSendsResponse(request, response).addSecondaryStorage("nfs://10.26.26.165/mnt/nfs/cs_sec", AddSecondaryStorageOptions.Builder.zoneId("1")); + + assertEquals(actual, expected); + } + + @Test + public void testListClustersWhenResponseIs2xx() { + HttpRequest request = HttpRequest.builder() + .method("GET") + .endpoint("http://localhost:8080/client/api?response=json&command=listClusters&listAll=true&apiKey=identity&signature=lbimqg0OKIq8sgQBpNmi4oQNFog%3D") + .addHeader("Accept", "application/json").build(); + HttpResponse response = HttpResponse.builder() + .payload(payloadFromResource("/listclustersresponse.json")) + .statusCode(200).build(); + + Set<Cluster> actual = requestSendsResponse(request, response).listClusters(); + + Cluster cluster1 = Cluster.builder().id("1").name("Xen Clust 1").podId("1").podName("Dev Pod 1").zoneId("1").zoneName("Dev Zone 1").hypervisor("XenServer").clusterType(Host.ClusterType.CLOUD_MANAGED).allocationState(AllocationState.ENABLED).managedState(Cluster.ManagedState.MANAGED).build(); + Cluster cluster2 = Cluster.builder().id("2").name("Xen Clust 1").podId("2").podName("Dev Pod 2").zoneId("2").zoneName("Dev Zone 2").hypervisor("XenServer").clusterType(Host.ClusterType.CLOUD_MANAGED).allocationState(AllocationState.ENABLED).managedState(Cluster.ManagedState.MANAGED).build(); + ImmutableSet<Cluster> expected = ImmutableSet.of(cluster1, cluster2); + + assertEquals(actual, expected); + } + + @Test + public void testListClustersEmptyOn404() { + HttpRequest request = HttpRequest.builder() + .method("GET") + .endpoint("http://localhost:8080/client/api?response=json&command=listClusters&listAll=true&apiKey=identity&signature=lbimqg0OKIq8sgQBpNmi4oQNFog%3D") + .addHeader("Accept", "application/json").build(); + HttpResponse response = HttpResponse.builder().statusCode(404).build(); + GlobalHostApi client = requestSendsResponse(request, response); + + assertEquals(client.listClusters(), ImmutableSet.of()); + } + + HttpRequest addCluster = HttpRequest.builder().method("GET") + .endpoint("http://localhost:8080/client/api") + .addQueryParam("response", "json") + .addQueryParam("command", "addCluster") + .addQueryParam("zoneid", "1") + .addQueryParam("clustername", "Xen Clust 1") + .addQueryParam("clustertype", "CloudManaged") + .addQueryParam("hypervisor", "XenServer") + .addQueryParam("allocationstate", "Enabled") + .addQueryParam("podid", "1") + .addQueryParam("url", "http://example.com/cluster") + .addQueryParam("username", "fred") + .addQueryParam("password", "sekrit") + .addQueryParam("apiKey", "identity") + .addQueryParam("signature", "2uIQ5qF0bVycXK111wxvogWp1Yw=") + .addHeader("Accept", "application/json").build(); + + @Test + public void testAddClusterWhenResponseIs2xx() { + HttpResponse response = HttpResponse.builder() + .payload(payloadFromResource("/addclusterresponse.json")) + .statusCode(200).build(); + + Cluster expected = Cluster.builder().id("1").name("Xen Clust 1").podId("1").podName("Dev Pod 1").zoneId("1").zoneName("Dev Zone 1").hypervisor("XenServer").clusterType(Host.ClusterType.CLOUD_MANAGED).allocationState(AllocationState.ENABLED).managedState(Cluster.ManagedState.MANAGED).build(); + + Cluster actual = requestSendsResponse(addCluster, response).addCluster("1", "Xen Clust 1", Host.ClusterType.CLOUD_MANAGED, "XenServer", AddClusterOptions.Builder.allocationState(AllocationState.ENABLED).podId("1").url("http://example.com/cluster").username("fred").password("sekrit")); + + assertEquals(actual, expected); + } + + HttpRequest updateCluster = HttpRequest.builder().method("GET") + .endpoint("http://localhost:8080/client/api") + .addQueryParam("response", "json") + .addQueryParam("command", "updateCluster") + .addQueryParam("id", "1") + .addQueryParam("allocationstate", "Enabled") + .addQueryParam("clustername", "Xen Clust 1") + .addQueryParam("clustertype", "CloudManaged") + .addQueryParam("hypervisor", "XenServer") + .addQueryParam("managedstate", "Managed") + .addQueryParam("apiKey", "identity") + .addQueryParam("signature", "/wbuYKwInciSXWkUf05lEfJZShQ=") + .addHeader("Accept", "application/json").build(); + + @Test + public void testUpdateClusterWhenResponseIs2xx() { + HttpResponse response = HttpResponse.builder() + .payload(payloadFromResource("/updateclusterresponse.json")) + .statusCode(200).build(); + + Cluster expected = Cluster.builder().id("1").name("Xen Clust 1").podId("1").podName("Dev Pod 1").zoneId("1").zoneName("Dev Zone 1").hypervisor("XenServer").clusterType(Host.ClusterType.CLOUD_MANAGED).allocationState(AllocationState.ENABLED).managedState(Cluster.ManagedState.MANAGED).build(); + + Cluster actual = requestSendsResponse(updateCluster, response).updateCluster("1", UpdateClusterOptions.Builder.allocationState(AllocationState.ENABLED).clusterName("Xen Clust 1").clusterType(Host.ClusterType.CLOUD_MANAGED).hypervisor("XenServer").managedState(Cluster.ManagedState.MANAGED)); + + assertEquals(actual, expected); + } + + HttpRequest updateClusterPassword = HttpRequest.builder().method("GET") + .endpoint("http://localhost:8080/client/api") + .addQueryParam("response", "json") + .addQueryParam("command", "updateHostPassword") + .addQueryParam("clusterid", "1") + .addQueryParam("username", "fred") + .addQueryParam("password", "sekrit") + .addQueryParam("apiKey", "identity") + .addQueryParam("signature", "xwc83%2BoYK0cuAiFQAlg/7/1IVHE=") + .addHeader("Accept", "application/json").build(); + + @Test + public void testUpdateClusterPasswordWhenResponseIs2xx() { + HttpResponse response = HttpResponse.builder() + .statusCode(200).build(); + requestSendsResponse(updateClusterPassword, response).updateClusterPassword("1", "fred", "sekrit"); + } + + @Test + public void testDeleteClusterWhenResponseIs2xx() { + HttpRequest request = HttpRequest.builder() + .method("GET") + .endpoint("http://localhost:8080/client/api?response=json&command=deleteCluster&id=1&apiKey=identity&signature=CKH26MFgKGY7Sosd17LjBMNa3AI%3D") + .addHeader("Accept", "application/json").build(); + HttpResponse response = HttpResponse.builder() + .statusCode(200).build(); + + requestSendsResponse(request, response).deleteCluster("1"); + } + + private Date makeDate(int year, int month, int date, int hour, int minute, int second, String timeZoneName) { + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(timeZoneName)); + cal.set(Calendar.YEAR, year); + cal.set(Calendar.MONTH, month); + cal.set(Calendar.DATE, date); + cal.set(Calendar.HOUR_OF_DAY, hour); + cal.set(Calendar.MINUTE, minute); + cal.set(Calendar.SECOND, second); + cal.set(Calendar.MILLISECOND, 0); + return cal.getTime(); + } + + @Override + protected GlobalHostApi clientFrom(CloudStackContext context) { + return context.getGlobalApi().getHostClient(); + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalHostApiLiveTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalHostApiLiveTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalHostApiLiveTest.java new file mode 100644 index 0000000..1ed94fd --- /dev/null +++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalHostApiLiveTest.java @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.cloudstack.features; + +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotEquals; +import static org.testng.Assert.assertNotNull; + +import java.util.Set; + +import org.jclouds.cloudstack.domain.AllocationState; +import org.jclouds.cloudstack.domain.Cluster; +import org.jclouds.cloudstack.domain.Host; +import org.jclouds.cloudstack.internal.BaseCloudStackApiLiveTest; +import org.testng.annotations.Test; + +import com.google.common.base.Strings; + +/** + * Tests behavior of {@code GlobalHostApi} + */ +@Test(groups = "live", singleThreaded = true, testName = "GlobalHostApiLiveTest") +public class GlobalHostApiLiveTest extends BaseCloudStackApiLiveTest { + + @Test(groups = "live", enabled = true) + public void testListHosts() throws Exception { + skipIfNotGlobalAdmin(); + + Set<Host> hosts = globalAdminClient.getHostClient().listHosts(); + assert !hosts.isEmpty() : hosts; + + for (Host host : hosts) { + checkHost(host); + } + } + + private void checkHost(Host host) { + if (host.getType() == Host.Type.ROUTING) { + assert host.getCpuNumber() > 0; + assert host.getAverageLoad() >= 0; + assert host.getHypervisor() != null; + } + assert host.getEvents() != null; + if (host.getType() == Host.Type.SECONDARY_STORAGE_VM) { + assert host.getName().startsWith("s-"); + } + if (host.getType() == Host.Type.CONSOLE_PROXY) { + assert host.getName().startsWith("v-"); + } + } + + @Test(groups = "live", enabled = true) + public void testListClusters() throws Exception { + skipIfNotGlobalAdmin(); + + Set<Cluster> clusters = globalAdminClient.getHostClient().listClusters(); + assert !clusters.isEmpty() : clusters; + + for (Cluster cluster : clusters) { + checkCluster(cluster); + } + } + + private void checkCluster(Cluster cluster) { + assertNotNull(cluster.getId()); + assertFalse(Strings.isNullOrEmpty(cluster.getName())); + assertNotEquals(AllocationState.UNKNOWN, cluster.getAllocationState()); + assertNotEquals(Host.ClusterType.UNKNOWN, cluster.getClusterType()); + assertFalse(Strings.isNullOrEmpty(cluster.getHypervisor())); + assertNotEquals(Cluster.ManagedState.UNRECOGNIZED, cluster.getManagedState()); + assertNotNull(cluster.getPodId()); + assertFalse(Strings.isNullOrEmpty(cluster.getPodName())); + assertNotNull(cluster.getZoneId()); + assertFalse(Strings.isNullOrEmpty(cluster.getZoneName())); + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalHostApiTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalHostApiTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalHostApiTest.java new file mode 100644 index 0000000..8b1d986 --- /dev/null +++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalHostApiTest.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.cloudstack.features; + +import static org.jclouds.reflect.Reflection2.method; + +import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404; +import org.jclouds.cloudstack.internal.BaseCloudStackApiTest; +import org.jclouds.cloudstack.options.ListHostsOptions; +import org.jclouds.http.functions.ParseFirstJsonValueNamed; +import org.jclouds.rest.internal.GeneratedHttpRequest; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableList; +import com.google.common.reflect.Invokable; +/** + * Tests behavior of {@code GlobalHostApi} + */ +@Test(groups = "unit", testName = "GlobalHostApiTest") +public class GlobalHostApiTest extends BaseCloudStackApiTest<GlobalHostApi> { + + public void testListHosts() throws Exception { + Invokable<?, ?> method = method(GlobalHostApi.class, "listHosts", ListHostsOptions[].class); + GeneratedHttpRequest httpRequest = processor.createRequest(method, ImmutableList.of()); + + assertRequestLineEquals(httpRequest, + "GET http://localhost:8080/client/api?response=json&command=listHosts&listAll=true HTTP/1.1"); + assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n"); + assertPayloadEquals(httpRequest, null, null, false); + + assertResponseParserClassEquals(method, httpRequest, ParseFirstJsonValueNamed.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class); + + checkFilters(httpRequest); + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalOfferingApiLiveTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalOfferingApiLiveTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalOfferingApiLiveTest.java new file mode 100644 index 0000000..48117c0 --- /dev/null +++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalOfferingApiLiveTest.java @@ -0,0 +1,152 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.cloudstack.features; + +import static com.google.common.collect.Iterables.getFirst; +import static org.jclouds.cloudstack.domain.NetworkOfferingAvailabilityType.OPTIONAL; +import static org.jclouds.cloudstack.domain.NetworkOfferingAvailabilityType.REQUIRED; +import static org.jclouds.cloudstack.options.CreateDiskOfferingOptions.Builder.diskSizeInGB; +import static org.jclouds.cloudstack.options.CreateServiceOfferingOptions.Builder.highlyAvailable; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; + +import org.jclouds.cloudstack.domain.DiskOffering; +import org.jclouds.cloudstack.domain.NetworkOffering; +import org.jclouds.cloudstack.domain.NetworkOfferingAvailabilityType; +import org.jclouds.cloudstack.domain.ServiceOffering; +import org.jclouds.cloudstack.domain.StorageType; +import org.jclouds.cloudstack.internal.BaseCloudStackApiLiveTest; +import org.jclouds.cloudstack.options.UpdateDiskOfferingOptions; +import org.jclouds.cloudstack.options.UpdateNetworkOfferingOptions; +import org.jclouds.cloudstack.options.UpdateServiceOfferingOptions; +import org.jclouds.logging.Logger; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableSet; + +/** + * Tests behavior of {@code GlobalOfferingApi} + */ +@Test(groups = "live", singleThreaded = true, testName = "GlobalOfferingApiLiveTest") +public class GlobalOfferingApiLiveTest extends BaseCloudStackApiLiveTest { + + @Test(groups = "live", enabled = true) + public void testCreateServiceOffering() throws Exception { + skipIfNotGlobalAdmin(); + + String name = prefix + "-test-create-service-offering"; + String displayText = name + "-display"; + ServiceOffering offering = null; + try { + offering = globalAdminClient.getOfferingApi(). + createServiceOffering(name, displayText, 2, 1024, 2048, highlyAvailable(true).storageType(StorageType.LOCAL)); + Logger.CONSOLE.info("Created Service Offering: " + offering); + + assertEquals(offering.getName(), name); + assertEquals(offering.getDisplayText(), displayText); + checkServiceOffering(offering); + + offering = globalAdminClient.getOfferingApi() + .updateServiceOffering(offering.getId(), + UpdateServiceOfferingOptions.Builder.name(name + "-2").displayText(displayText + "-2")); + + assertEquals(offering.getName(), name + "-2"); + assertEquals(offering.getDisplayText(), displayText + "-2"); + checkServiceOffering(offering); + + } finally { + if (offering != null) { + globalAdminClient.getOfferingApi().deleteServiceOffering(offering.getId()); + } + } + } + + private void checkServiceOffering(ServiceOffering offering) { + assertNotNull(offering.getId()); + assertEquals(offering.getCpuNumber(), 2); + assertEquals(offering.getCpuSpeed(), 1024); + assertEquals(offering.getMemory(), 2048); + assertTrue(offering.supportsHA()); + assertEquals(offering.getStorageType(), StorageType.LOCAL); + } + + @Test(groups = "live", enabled = true) + public void testCreateDiskOffering() throws Exception { + skipIfNotGlobalAdmin(); + + String name = prefix + "-test-create-disk-offering"; + String displayText = name + "-display"; + DiskOffering offering = null; + try { + offering = globalAdminClient.getOfferingApi(). + createDiskOffering(name, displayText, + diskSizeInGB(100).customized(true).tags(ImmutableSet.<String>of("dummy-tag"))); + + assertEquals(offering.getName(), name); + assertEquals(offering.getDisplayText(), displayText); + checkDiskOffering(offering); + + offering = globalAdminClient.getOfferingApi(). + updateDiskOffering(offering.getId(), + UpdateDiskOfferingOptions.Builder.name(name + "-2").displayText(displayText + "-2")); + + assertEquals(offering.getName(), name + "-2"); + assertEquals(offering.getDisplayText(), displayText + "-2"); + checkDiskOffering(offering); + + } finally { + if (offering != null) { + globalAdminClient.getOfferingApi().deleteDiskOffering(offering.getId()); + } + } + } + + private void checkDiskOffering(DiskOffering offering) { + assertTrue(offering.isCustomized()); + assertEquals(offering.getDiskSize(), 100); + assertTrue(offering.getTags().contains("dummy-tag")); + } + + @Test(groups = "live", enabled = true) + public void testUpdateNetworkOffering() throws Exception { + skipIfNotGlobalAdmin(); + + NetworkOffering offering = getFirst(globalAdminClient.getOfferingApi().listNetworkOfferings(), null); + assertNotNull(offering, "Unable to test, no network offering found."); + + String name = offering.getName(); + NetworkOfferingAvailabilityType availability = offering.getAvailability(); + + try { + NetworkOfferingAvailabilityType newValue = OPTIONAL; + if (availability == OPTIONAL) { + newValue = REQUIRED; + } + NetworkOffering updated = globalAdminClient.getOfferingApi().updateNetworkOffering(offering.getId(), + UpdateNetworkOfferingOptions.Builder.name(prefix + name).availability(newValue)); + + assertEquals(updated.getName(), prefix + name); + assertEquals(updated.getAvailability(), newValue); + + } finally { + globalAdminClient.getOfferingApi().updateNetworkOffering(offering.getId(), + UpdateNetworkOfferingOptions.Builder.name(name).availability(availability)); + } + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalOfferingApiTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalOfferingApiTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalOfferingApiTest.java new file mode 100644 index 0000000..b7243a4 --- /dev/null +++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalOfferingApiTest.java @@ -0,0 +1,167 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.cloudstack.features; +import static org.jclouds.reflect.Reflection2.method; + +import org.jclouds.Fallbacks.NullOnNotFoundOr404; +import org.jclouds.cloudstack.internal.BaseCloudStackApiTest; +import org.jclouds.cloudstack.options.CreateDiskOfferingOptions; +import org.jclouds.cloudstack.options.CreateServiceOfferingOptions; +import org.jclouds.cloudstack.options.UpdateDiskOfferingOptions; +import org.jclouds.cloudstack.options.UpdateNetworkOfferingOptions; +import org.jclouds.cloudstack.options.UpdateServiceOfferingOptions; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.functions.ParseFirstJsonValueNamed; +import org.jclouds.http.functions.ReleasePayloadAndReturn; +import org.jclouds.rest.internal.GeneratedHttpRequest; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableList; +import com.google.common.reflect.Invokable; + +/** + * Tests behavior of {@code GlobalOfferingApi} + */ +@Test(groups = "unit", testName = "GlobalOfferingApiTest") +public class GlobalOfferingApiTest extends BaseCloudStackApiTest<GlobalOfferingApi> { + + HttpRequest createServiceOffering = HttpRequest.builder().method("GET") + .endpoint("http://localhost:8080/client/api") + .addQueryParam("response", "json") + .addQueryParam("command", "createServiceOffering") + .addQueryParam("name", "name") + .addQueryParam("displaytext", "displayText") + .addQueryParam("cpunumber", "1") + .addQueryParam("cpuspeed", "2") + .addQueryParam("memory", "3").build(); + + public void testCreateServiceOffering() throws Exception { + Invokable<?, ?> method = method(GlobalOfferingApi.class, "createServiceOffering", + String.class, String.class, int.class, int.class, int.class, CreateServiceOfferingOptions[].class); + GeneratedHttpRequest httpRequest = processor.createRequest(method, ImmutableList.<Object> of("name", "displayText", 1, 2, 3)); + + assertRequestLineEquals(httpRequest, createServiceOffering.getRequestLine()); + assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n"); + assertPayloadEquals(httpRequest, null, null, false); + + assertResponseParserClassEquals(method, httpRequest, ParseFirstJsonValueNamed.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, NullOnNotFoundOr404.class); + + checkFilters(httpRequest); + } + + public void testUpdateServiceOffering() throws Exception { + Invokable<?, ?> method = method(GlobalOfferingApi.class, "updateServiceOffering", + String.class, UpdateServiceOfferingOptions[].class); + GeneratedHttpRequest httpRequest = processor.createRequest(method, ImmutableList.<Object> of(1L)); + + assertRequestLineEquals(httpRequest, + "GET http://localhost:8080/client/api?response=json&command=updateServiceOffering&id=1 HTTP/1.1"); + assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n"); + assertPayloadEquals(httpRequest, null, null, false); + + assertResponseParserClassEquals(method, httpRequest, ParseFirstJsonValueNamed.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, NullOnNotFoundOr404.class); + + checkFilters(httpRequest); + } + + public void testDeleteServiceOffering() throws Exception { + Invokable<?, ?> method = method(GlobalOfferingApi.class, "deleteServiceOffering", String.class); + GeneratedHttpRequest httpRequest = processor.createRequest(method, ImmutableList.<Object> of(1L)); + + assertRequestLineEquals(httpRequest, + "GET http://localhost:8080/client/api?response=json&command=deleteServiceOffering&id=1 HTTP/1.1"); + assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n"); + assertPayloadEquals(httpRequest, null, null, false); + + assertResponseParserClassEquals(method, httpRequest, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, NullOnNotFoundOr404.class); + + checkFilters(httpRequest); + } + + public void testCreateDiskOffering() throws Exception { + Invokable<?, ?> method = method(GlobalOfferingApi.class, "createDiskOffering", + String.class, String.class, CreateDiskOfferingOptions[].class); + GeneratedHttpRequest httpRequest = processor.createRequest(method, ImmutableList.<Object> of("name", "displayText")); + + assertRequestLineEquals(httpRequest, + "GET http://localhost:8080/client/api?response=json&command=createDiskOffering&name=name&displaytext=displayText HTTP/1.1"); + assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n"); + assertPayloadEquals(httpRequest, null, null, false); + + assertResponseParserClassEquals(method, httpRequest, ParseFirstJsonValueNamed.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, NullOnNotFoundOr404.class); + + checkFilters(httpRequest); + } + + public void testUpdateDiskOffering() throws Exception { + Invokable<?, ?> method = method(GlobalOfferingApi.class, "updateDiskOffering", + String.class, UpdateDiskOfferingOptions[].class); + GeneratedHttpRequest httpRequest = processor.createRequest(method, ImmutableList.<Object> of(1L)); + + assertRequestLineEquals(httpRequest, + "GET http://localhost:8080/client/api?response=json&command=updateDiskOffering&id=1 HTTP/1.1"); + assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n"); + assertPayloadEquals(httpRequest, null, null, false); + + assertResponseParserClassEquals(method, httpRequest, ParseFirstJsonValueNamed.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, NullOnNotFoundOr404.class); + + checkFilters(httpRequest); + } + + public void testDeleteDiskOffering() throws Exception { + Invokable<?, ?> method = method(GlobalOfferingApi.class, "deleteDiskOffering", String.class); + GeneratedHttpRequest httpRequest = processor.createRequest(method, ImmutableList.<Object> of(1L)); + + assertRequestLineEquals(httpRequest, + "GET http://localhost:8080/client/api?response=json&command=deleteDiskOffering&id=1 HTTP/1.1"); + assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n"); + assertPayloadEquals(httpRequest, null, null, false); + + assertResponseParserClassEquals(method, httpRequest, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, NullOnNotFoundOr404.class); + + checkFilters(httpRequest); + } + + public void testUpdateNetworkOffering() throws Exception { + Invokable<?, ?> method = method(GlobalOfferingApi.class, "updateNetworkOffering", + String.class, UpdateNetworkOfferingOptions[].class); + GeneratedHttpRequest httpRequest = processor.createRequest(method, ImmutableList.<Object> of(1L)); + + assertRequestLineEquals(httpRequest, + "GET http://localhost:8080/client/api?response=json&command=updateNetworkOffering&id=1 HTTP/1.1"); + assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n"); + assertPayloadEquals(httpRequest, null, null, false); + + assertResponseParserClassEquals(method, httpRequest, ParseFirstJsonValueNamed.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, NullOnNotFoundOr404.class); + + checkFilters(httpRequest); + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalPodApiExpectTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalPodApiExpectTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalPodApiExpectTest.java new file mode 100644 index 0000000..34eb37b --- /dev/null +++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalPodApiExpectTest.java @@ -0,0 +1,206 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.cloudstack.features; + +import static org.testng.Assert.assertEquals; + +import java.net.URI; + +import org.jclouds.cloudstack.CloudStackContext; +import org.jclouds.cloudstack.domain.AllocationState; +import org.jclouds.cloudstack.domain.Pod; +import org.jclouds.cloudstack.internal.BaseCloudStackExpectTest; +import org.jclouds.cloudstack.options.CreatePodOptions; +import org.jclouds.cloudstack.options.UpdatePodOptions; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.ImmutableSet; + +/** + * Test the CloudStack PodClient + */ +@Test(groups = "unit", testName = "GlobalPodApiExpectTest") +public class GlobalPodApiExpectTest extends BaseCloudStackExpectTest<GlobalPodApi> { + + public void testListPodsWhenResponseIs2xx() { + GlobalPodApi client = requestSendsResponse( + HttpRequest.builder() + .method("GET") + .endpoint( + URI.create("http://localhost:8080/client/api?response=json&" + + "command=listPods&listAll=true&apiKey=identity&signature=MuowIOuZqOpKTPVQOfrDZEmpepw%3D")) + .headers( + ImmutableMultimap.<String, String>builder() + .put("Accept", "application/json") + .build()) + .build(), + HttpResponse.builder() + .statusCode(200) + .payload(payloadFromResource("/listpodsresponse.json")) + .build()); + + Pod pod1 = Pod.builder() + .id("1") + .name("Dev Pod 1") + .zoneId("1") + .zoneName("Dev Zone 1") + .gateway("10.26.26.254") + .netmask("255.255.255.0") + .startIp("10.26.26.50") + .endIp("10.26.26.100") + .allocationState(AllocationState.ENABLED) + .build(); + Pod pod2 = Pod.builder() + .id("2") + .name("Dev Pod 2") + .zoneId("2") + .zoneName("Dev Zone 2") + .gateway("10.22.22.254") + .netmask("255.255.255.0") + .startIp("10.22.22.25") + .endIp("10.22.22.50") + .allocationState(AllocationState.ENABLED) + .build(); + + assertEquals(client.listPods(), ImmutableSet.of(pod1, pod2)); + } + + public void testListPodsWhenResponseIs404() { + GlobalPodApi client = requestSendsResponse( + HttpRequest.builder() + .method("GET") + .endpoint( + URI.create("http://localhost:8080/client/api?response=json&" + + "command=listPods&listAll=true&apiKey=identity&signature=MuowIOuZqOpKTPVQOfrDZEmpepw%3D")) + .headers( + ImmutableMultimap.<String, String>builder() + .put("Accept", "application/json") + .build()) + .build(), + HttpResponse.builder() + .statusCode(404) + .build()); + + assertEquals(client.listPods(), ImmutableSet.of()); + } + + HttpRequest createPod = HttpRequest.builder().method("GET") + .endpoint("http://localhost:8080/client/api") + .addQueryParam("response", "json") + .addQueryParam("command", "createPod") + .addQueryParam("name", "richard-pod") + .addQueryParam("zoneid", "10") + .addQueryParam("startip", "172.20.0.1") + .addQueryParam("endip", "172.20.0.250") + .addQueryParam("gateway", "172.20.0.254") + .addQueryParam("netmask", "255.255.255.0") + .addQueryParam("allocationstate", "Enabled") + .addQueryParam("apiKey", "identity") + .addQueryParam("signature", "fwsoQ77BmNQWfuqv4nVlPcKvKbU=") + .addHeader("Accept", "application/json").build(); + + public void testCreatePodWhenResponseIs2xx() { + GlobalPodApi client = requestSendsResponse(createPod, + HttpResponse.builder() + .statusCode(200) + .payload(payloadFromResource("/createpodresponse.json")) + .build()); + + Pod expected = Pod.builder() + .id("6") + .name("richard-pod") + .zoneId("10") + .zoneName("richard-zone") + .gateway("172.20.0.254") + .netmask("255.255.255.0") + .startIp("172.20.0.1") + .endIp("172.20.0.250") + .allocationState(AllocationState.ENABLED) + .build(); + + Pod actual = client.createPod("richard-pod", "10", "172.20.0.1", "172.20.0.250", "172.20.0.254", "255.255.255.0", + CreatePodOptions.Builder.allocationState(AllocationState.ENABLED)); + + assertEquals(actual, expected); + } + + public void testUpdatePodWhenResponseIs2xx() { + GlobalPodApi client = requestSendsResponse( + HttpRequest.builder() + .method("GET") + .endpoint( + URI.create("http://localhost:8080/client/api?response=json&command=updatePod&id=7&netmask=255.255.255.128&name=richard-updatepod&startip=172.21.0.129&endip=172.21.0.250&gateway=172.21.0.254&allocationstate=Disabled&apiKey=identity&signature=QpdbRyyF/xJ78ioJWhPKXEWhthY%3D")) + .headers( + ImmutableMultimap.<String, String>builder() + .put("Accept", "application/json") + .build()) + .build(), + HttpResponse.builder() + .statusCode(200) + .payload(payloadFromResource("/updatepodresponse.json")) + .build()); + + Pod expected = Pod.builder() + .id("7") + .name("richard-updatedpod") + .zoneId("11") + .zoneName("richard-zone") + .gateway("172.21.0.254") + .netmask("255.255.255.128") + .startIp("172.21.0.129") + .endIp("172.21.0.250") + .allocationState(AllocationState.DISABLED) + .build(); + + Pod actual = client.updatePod("7", UpdatePodOptions.Builder + .netmask("255.255.255.128") + .name("richard-updatepod") + .startIp("172.21.0.129") + .endIp("172.21.0.250") + .gateway("172.21.0.254") + .allocationState(AllocationState.DISABLED) + ); + + assertEquals(actual, expected); + } + + public void testDeletePodWhenResponseIs2xx() { + GlobalPodApi client = requestSendsResponse( + HttpRequest.builder() + .method("GET") + .endpoint( + URI.create("http://localhost:8080/client/api?response=json&command=deletePod&id=3&apiKey=identity&signature=rm4ItuAL1Ztnj%2BHFFvBFzvHAIog%3D")) + .headers( + ImmutableMultimap.<String, String>builder() + .put("Accept", "application/json") + .build()) + .build(), + HttpResponse.builder() + .statusCode(200) + .build()); + + client.deletePod("3"); + } + + @Override + protected GlobalPodApi clientFrom(CloudStackContext context) { + return context.getGlobalApi().getPodClient(); + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalPodApiLiveTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalPodApiLiveTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalPodApiLiveTest.java new file mode 100644 index 0000000..7749c26 --- /dev/null +++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalPodApiLiveTest.java @@ -0,0 +1,129 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.cloudstack.features; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; + +import java.util.Set; + +import org.jclouds.cloudstack.domain.AllocationState; +import org.jclouds.cloudstack.domain.NetworkType; +import org.jclouds.cloudstack.domain.Pod; +import org.jclouds.cloudstack.domain.Zone; +import org.jclouds.cloudstack.internal.BaseCloudStackApiLiveTest; +import org.jclouds.cloudstack.options.CreatePodOptions; +import org.jclouds.cloudstack.options.ListPodsOptions; +import org.jclouds.cloudstack.options.UpdatePodOptions; +import org.testng.annotations.AfterGroups; +import org.testng.annotations.Test; + +import com.google.common.base.Strings; +import com.google.common.collect.Iterables; + +/** + * Tests behavior of {@code GlobalPodApi} + */ +@Test(groups = "live", singleThreaded = true, testName = "GlobalPodApiLiveTest") +public class GlobalPodApiLiveTest extends BaseCloudStackApiLiveTest { + + private Zone zone; + private Pod pod; + + public void testListPods() throws Exception { + skipIfNotGlobalAdmin(); + + Set<Pod> response = globalAdminClient.getPodClient().listPods(); + assert null != response; + long podCount = response.size(); + assertTrue(podCount >= 0); + + for (Pod pod : response) { + Pod newDetails = Iterables.getOnlyElement(globalAdminClient.getPodClient().listPods( + ListPodsOptions.Builder.id(pod.getId()))); + assertEquals(pod, newDetails); + assertEquals(pod, globalAdminClient.getPodClient().getPod(pod.getId())); + assertNotNull(pod.getId()); + assertFalse(Strings.isNullOrEmpty(pod.getName())); + assertNotNull(pod.getZoneId()); + assertFalse(Strings.isNullOrEmpty(pod.getZoneName())); + assertFalse(Strings.isNullOrEmpty(pod.getGateway())); + assertFalse(Strings.isNullOrEmpty(pod.getNetmask())); + assertFalse(Strings.isNullOrEmpty(pod.getStartIp())); + assertFalse(Strings.isNullOrEmpty(pod.getEndIp())); + assertNotEquals(pod.getAllocationState(), AllocationState.UNKNOWN); + } + } + + @Test + public void testCreatePod() { + skipIfNotGlobalAdmin(); + + zone = globalAdminClient.getZoneApi().createZone(prefix + "-zone-for-pod", NetworkType.BASIC, "8.8.8.8", "10.10.10.10"); + pod = globalAdminClient.getPodClient().createPod(prefix + "-pod", zone.getId(), "172.20.0.1", "172.20.0.250", "172.20.0.254", "255.255.255.0", + CreatePodOptions.Builder.allocationState(AllocationState.ENABLED)); + + assertNotNull(pod); + assertEquals(pod.getName(), prefix + "-pod"); + assertEquals(pod.getZoneId(), zone.getId()); + assertEquals(pod.getZoneName(), prefix + "-zone-for-pod"); + assertEquals(pod.getStartIp(), "172.20.0.1"); + assertEquals(pod.getEndIp(), "172.20.0.250"); + assertEquals(pod.getGateway(), "172.20.0.254"); + assertEquals(pod.getNetmask(), "255.255.255.0"); + assertEquals(pod.getAllocationState(), AllocationState.ENABLED); + } + + @Test(dependsOnMethods = "testCreatePod") + public void testUpdatePod() { + Pod updated = globalAdminClient.getPodClient().updatePod(pod.getId(), UpdatePodOptions.Builder + .name(prefix + "-updatedpod") + .startIp("172.21.0.129") + .endIp("172.21.0.250") + .gateway("172.21.0.254") + .netmask("255.255.255.128") + .allocationState(AllocationState.DISABLED) + ); + + assertNotNull(updated); + assertEquals(updated.getName(), prefix + "-updatedpod"); + assertEquals(updated.getZoneId(), zone.getId()); + assertEquals(updated.getZoneName(), prefix + "-zone-for-pod"); + assertEquals(updated.getStartIp(), "172.21.0.129"); + assertEquals(updated.getEndIp(), "172.21.0.250"); + assertEquals(updated.getGateway(), "172.21.0.254"); + assertEquals(updated.getNetmask(), "255.255.255.128"); + assertEquals(updated.getAllocationState(), AllocationState.DISABLED); + } + + @AfterGroups(groups = "live") + @Override + protected void tearDownContext() { + if (pod != null) { + globalAdminClient.getPodClient().deletePod(pod.getId()); + pod = null; + } + if (zone != null) { + globalAdminClient.getZoneApi().deleteZone(zone.getId()); + zone = null; + } + super.tearDownContext(); + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalStoragePoolApiLiveTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalStoragePoolApiLiveTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalStoragePoolApiLiveTest.java new file mode 100644 index 0000000..9d0bdfa --- /dev/null +++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalStoragePoolApiLiveTest.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.cloudstack.features; + +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; + +import java.util.Set; + +import org.jclouds.cloudstack.domain.StoragePool; +import org.jclouds.cloudstack.internal.BaseCloudStackApiLiveTest; +import org.testng.annotations.Test; + +import com.google.common.base.Strings; + +/** + * Tests behavior of {@code GlobalStoragePoolApi} + */ +@Test(groups = "live", singleThreaded = true, testName = "GlobalStoragePoolApiLiveTest") +public class GlobalStoragePoolApiLiveTest extends BaseCloudStackApiLiveTest { + + @Test(groups = "live", enabled = true) + public void testListStoragePools() throws Exception { + skipIfNotGlobalAdmin(); + + Set<StoragePool> result = globalAdminClient.getStoragePoolClient().listStoragePools(); + assertNotNull(result); + assertTrue(!result.isEmpty()); + for (StoragePool pool : result) { + assertNotNull(pool.getId()); + assertFalse(Strings.isNullOrEmpty(pool.getName())); + assertFalse(Strings.isNullOrEmpty(pool.getPath())); + assertNotNull(pool.getTags()); + assertNotEquals(StoragePool.State.UNRECOGNIZED, pool.getState()); + assertNotEquals(StoragePool.Type.UNRECOGNIZED, pool.getType()); + assertNotNull(pool.getZoneId()); + assertFalse(Strings.isNullOrEmpty(pool.getZoneName())); + assertNotNull(pool.getPodId()); + assertFalse(Strings.isNullOrEmpty(pool.getPodName())); + assertNotNull(pool.getClusterId()); + assertFalse(Strings.isNullOrEmpty(pool.getClusterName())); + assertNotNull(pool.getCreated()); + assertTrue(pool.getDiskSizeTotal() > 0); + } + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalStoragePoolApiTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalStoragePoolApiTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalStoragePoolApiTest.java new file mode 100644 index 0000000..bf278ed --- /dev/null +++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalStoragePoolApiTest.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.cloudstack.features; + +import static org.jclouds.reflect.Reflection2.method; + +import org.jclouds.cloudstack.internal.BaseCloudStackApiTest; +import org.jclouds.cloudstack.options.ListStoragePoolsOptions; +import org.jclouds.fallbacks.MapHttp4xxCodesToExceptions; +import org.jclouds.http.functions.ParseFirstJsonValueNamed; +import org.jclouds.rest.internal.GeneratedHttpRequest; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableList; +import com.google.common.reflect.Invokable; +/** + * Tests behavior of {@code GlobalStoragePoolApi} + */ +@Test(groups = "unit", testName = "GlobalStoragePoolApiTest") +public class GlobalStoragePoolApiTest extends BaseCloudStackApiTest<GlobalStoragePoolApi> { + + public void testListStoragePools() throws NoSuchMethodException { + Invokable<?, ?> method = method(GlobalStoragePoolApi.class, "listStoragePools", ListStoragePoolsOptions[].class); + GeneratedHttpRequest httpRequest = processor.createRequest(method, ImmutableList.of()); + + assertRequestLineEquals(httpRequest, + "GET http://localhost:8080/client/api?response=json&command=listStoragePools&listAll=true HTTP/1.1"); + assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n"); + assertPayloadEquals(httpRequest, null, null, false); + + assertResponseParserClassEquals(method, httpRequest, ParseFirstJsonValueNamed.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, MapHttp4xxCodesToExceptions.class); + + checkFilters(httpRequest); + } + + public void testListStoragePoolsOptions() throws NoSuchMethodException { + Invokable<?, ?> method = method(GlobalStoragePoolApi.class, "listStoragePools", ListStoragePoolsOptions[].class); + GeneratedHttpRequest httpRequest = processor.createRequest(method, ImmutableList.<Object> of(ListStoragePoolsOptions.Builder.clusterId("3").id("4").ipAddress("192.168.42.42").keyword("fred").name("bob").path("/mnt/store42").podId("4").zoneId("5"))); + + assertRequestLineEquals(httpRequest, + "GET http://localhost:8080/client/api?response=json&command=listStoragePools&listAll=true&clusterid=3&id=4&ipaddress=192.168.42.42&keyword=fred&name=bob&path=/mnt/store42&podid=4&zoneid=5 HTTP/1.1"); + assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n"); + assertPayloadEquals(httpRequest, null, null, false); + + assertResponseParserClassEquals(method, httpRequest, ParseFirstJsonValueNamed.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, MapHttp4xxCodesToExceptions.class); + + checkFilters(httpRequest); + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalUsageApiLiveTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalUsageApiLiveTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalUsageApiLiveTest.java new file mode 100644 index 0000000..14e48e7 --- /dev/null +++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalUsageApiLiveTest.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.cloudstack.features; + +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; + +import java.util.Calendar; +import java.util.Date; +import java.util.Set; +import java.util.TimeZone; + +import org.jclouds.cloudstack.domain.JobResult; +import org.jclouds.cloudstack.domain.UsageRecord; +import org.jclouds.cloudstack.internal.BaseCloudStackApiLiveTest; +import org.jclouds.cloudstack.options.GenerateUsageRecordsOptions; +import org.jclouds.cloudstack.options.ListUsageRecordsOptions; +import org.testng.annotations.Test; + +/** + * Tests behavior of {@code GlobalUsageApi} + */ +@Test(groups = "live", singleThreaded = true, testName = "GlobalUsageApiLiveTest") +public class GlobalUsageApiLiveTest extends BaseCloudStackApiLiveTest { + + @Test(groups = "live", enabled = true) + public void testListUsage() { + skipIfNotGlobalAdmin(); + + Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + Date end = c.getTime(); + c.add(Calendar.MONTH, -1); + Date start = c.getTime(); + + JobResult result = globalAdminClient.getUsageClient().generateUsageRecords(start, end, GenerateUsageRecordsOptions.NONE); + assertNotNull(result); + assertTrue(result.isSuccess(), result.getDisplayText()); + + Set<UsageRecord> records = globalAdminClient.getUsageClient().listUsageRecords(start, end, ListUsageRecordsOptions.NONE); + assertNotNull(records); + assertTrue(records.size() >= 0); + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/86fd5cf2/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalUsageApiTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalUsageApiTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalUsageApiTest.java new file mode 100644 index 0000000..2adf3e1 --- /dev/null +++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/features/GlobalUsageApiTest.java @@ -0,0 +1,139 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.cloudstack.features; + +import static org.jclouds.reflect.Reflection2.method; + +import java.util.Calendar; +import java.util.Date; + +import org.jclouds.cloudstack.internal.BaseCloudStackApiTest; +import org.jclouds.cloudstack.options.GenerateUsageRecordsOptions; +import org.jclouds.cloudstack.options.ListUsageRecordsOptions; +import org.jclouds.fallbacks.MapHttp4xxCodesToExceptions; +import org.jclouds.http.functions.ParseFirstJsonValueNamed; +import org.jclouds.rest.internal.GeneratedHttpRequest; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableList; +import com.google.common.reflect.Invokable; +/** + * Tests behavior of {@code GlobalUsageApi} + */ +@Test(groups = "unit", testName = "GlobalUsageApiTest") +public class GlobalUsageApiTest extends BaseCloudStackApiTest<GlobalUsageApi> { + + public void testGenerateUsageRecords() throws Exception { + Calendar c = Calendar.getInstance(); + c.set(Calendar.YEAR, 2012); + c.set(Calendar.MONTH, Calendar.JANUARY); + c.set(Calendar.DAY_OF_MONTH, 1); + Date start = c.getTime(); + c.set(Calendar.DAY_OF_MONTH, 31); + Date end = c.getTime(); + + Invokable<?, ?> method = method(GlobalUsageApi.class, "generateUsageRecords", + Date.class, Date.class, GenerateUsageRecordsOptions[].class); + GeneratedHttpRequest httpRequest = processor.createRequest(method, ImmutableList.<Object> of(start, end)); + + assertRequestLineEquals(httpRequest, + "GET http://localhost:8080/client/api?response=json&command=generateUsageRecords&startdate=2012-01-01&enddate=2012-01-31 HTTP/1.1"); + assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n"); + assertPayloadEquals(httpRequest, null, null, false); + + assertResponseParserClassEquals(method, httpRequest, ParseFirstJsonValueNamed.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, MapHttp4xxCodesToExceptions.class); + + checkFilters(httpRequest); + } + + public void testGenerateUsageRecordsOptions() throws Exception { + Calendar c = Calendar.getInstance(); + c.set(Calendar.YEAR, 2012); + c.set(Calendar.MONTH, Calendar.JANUARY); + c.set(Calendar.DAY_OF_MONTH, 1); + Date start = c.getTime(); + c.set(Calendar.DAY_OF_MONTH, 31); + Date end = c.getTime(); + + Invokable<?, ?> method = method(GlobalUsageApi.class, "generateUsageRecords", + Date.class, Date.class, GenerateUsageRecordsOptions[].class); + GeneratedHttpRequest httpRequest = processor.createRequest(method, ImmutableList.<Object> of(start, end, GenerateUsageRecordsOptions.Builder.domainId("42"))); + + assertRequestLineEquals(httpRequest, + "GET http://localhost:8080/client/api?response=json&command=generateUsageRecords&startdate=2012-01-01&enddate=2012-01-31&domainid=42 HTTP/1.1"); + assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n"); + assertPayloadEquals(httpRequest, null, null, false); + + assertResponseParserClassEquals(method, httpRequest, ParseFirstJsonValueNamed.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, MapHttp4xxCodesToExceptions.class); + + checkFilters(httpRequest); + } + + public void testListUsageRecords() throws Exception { + Calendar c = Calendar.getInstance(); + c.set(Calendar.YEAR, 2012); + c.set(Calendar.MONTH, Calendar.JANUARY); + c.set(Calendar.DAY_OF_MONTH, 1); + Date start = c.getTime(); + c.set(Calendar.DAY_OF_MONTH, 31); + Date end = c.getTime(); + + Invokable<?, ?> method = method(GlobalUsageApi.class, "listUsageRecords", + Date.class, Date.class, ListUsageRecordsOptions[].class); + GeneratedHttpRequest httpRequest = processor.createRequest(method, ImmutableList.<Object> of(start, end)); + + assertRequestLineEquals(httpRequest, + "GET http://localhost:8080/client/api?response=json&command=listUsageRecords&listAll=true&startdate=2012-01-01&enddate=2012-01-31 HTTP/1.1"); + assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n"); + assertPayloadEquals(httpRequest, null, null, false); + + assertResponseParserClassEquals(method, httpRequest, ParseFirstJsonValueNamed.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, MapHttp4xxCodesToExceptions.class); + + checkFilters(httpRequest); + } + + public void testListUsageRecordsOptions() throws Exception { + Calendar c = Calendar.getInstance(); + c.set(Calendar.YEAR, 2012); + c.set(Calendar.MONTH, Calendar.JANUARY); + c.set(Calendar.DAY_OF_MONTH, 1); + Date start = c.getTime(); + c.set(Calendar.DAY_OF_MONTH, 31); + Date end = c.getTime(); + + Invokable<?, ?> method = method(GlobalUsageApi.class, "listUsageRecords", + Date.class, Date.class, ListUsageRecordsOptions[].class); + GeneratedHttpRequest httpRequest = processor.createRequest(method, ImmutableList.<Object> of(start, end, ListUsageRecordsOptions.Builder.accountInDomain("fred", "42").accountId("41").keyword("bob"))); + + assertRequestLineEquals(httpRequest, + "GET http://localhost:8080/client/api?response=json&command=listUsageRecords&listAll=true&startdate=2012-01-01&enddate=2012-01-31&account=fred&domainid=42&accountid=41&keyword=bob HTTP/1.1"); + assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n"); + assertPayloadEquals(httpRequest, null, null, false); + + assertResponseParserClassEquals(method, httpRequest, ParseFirstJsonValueNamed.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, MapHttp4xxCodesToExceptions.class); + + checkFilters(httpRequest); + } +}
