You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ni...@apache.org on 2014/03/18 03:52:00 UTC
[07/20] fixing https://issues.apache.org/jira/browse/STRATOS-520 -
adding Openstack-nova module to dependencies
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/5857efca/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/QuotaClassApiExpectTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/QuotaClassApiExpectTest.java b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/QuotaClassApiExpectTest.java
new file mode 100644
index 0000000..4611ea9
--- /dev/null
+++ b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/QuotaClassApiExpectTest.java
@@ -0,0 +1,105 @@
+/*
+ * 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.openstack.nova.v2_0.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import java.net.URI;
+
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.openstack.nova.v2_0.domain.QuotaClass;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiExpectTest;
+import org.jclouds.rest.ResourceNotFoundException;
+import org.testng.annotations.Test;
+
+/**
+ * Tests HostAdministrationApi guice wiring and parsing
+ *
+ * @author Adam Lowe
+ */
+@Test(groups = "unit", testName = "QuotaClassApiExpectTest")
+public class QuotaClassApiExpectTest extends BaseNovaApiExpectTest {
+
+ public void testGetQuotas() throws Exception {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-quota-class-sets/jcloudstestquotas");
+ QuotaClassApi api = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(200).payload(payloadFromResource("/quota_class.json")).build()).getQuotaClassExtensionForZone("az-1.region-a.geo-1").get();
+
+ assertEquals(api.get("jcloudstestquotas"), getTestQuotas());
+ }
+
+ public void testGetQuotasFailsTenantNotFound() throws Exception {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-quota-class-sets/jcloudstestquotas");
+ QuotaClassApi api = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(404).build()).getQuotaClassExtensionForZone("az-1.region-a.geo-1").get();
+ assertNull(api.get("jcloudstestquotas"));
+ }
+
+ public void testUpdateQuotas() throws Exception {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-quota-class-sets/myclass");
+ QuotaClassApi api = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ HttpRequest.builder().endpoint(endpoint).method("PUT")
+ .addHeader("X-Auth-Token", authToken)
+ .payload(payloadFromResourceWithContentType("/quota_class.json", MediaType.APPLICATION_JSON))
+ .build(),
+ HttpResponse.builder().statusCode(200).build()).getQuotaClassExtensionForZone("az-1.region-a.geo-1").get();
+
+ assertTrue(api.update("myclass", getTestQuotas()));
+ }
+
+ @Test(expectedExceptions = ResourceNotFoundException.class)
+ public void testUpdateQuotasFailsNotFound() throws Exception {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-quota-class-sets/jcloudstestquotas");
+ QuotaClassApi api = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ HttpRequest.builder().endpoint(endpoint).method("PUT")
+ .addHeader("X-Auth-Token", authToken)
+ .payload(payloadFromResourceWithContentType("/quota_class.json", MediaType.APPLICATION_JSON))
+ .build(),
+ HttpResponse.builder().statusCode(404).build()).getQuotaClassExtensionForZone("az-1.region-a.geo-1").get();
+
+ api.update("jcloudstestquotas", getTestQuotas());
+ }
+
+ public static QuotaClass getTestQuotas() {
+ return QuotaClass.builder()
+ .metadataItems(128)
+ .injectedFileContentBytes(10240)
+ .injectedFiles(5)
+ .gigabytes(1000)
+ .ram(4096)
+ .floatingIps(10)
+ .securityGroups(10)
+ .securityGroupRules(20)
+ .instances(5)
+ .keyPairs(100)
+ .volumes(5)
+ .cores(10)
+ .id("jcloudstestquotas").build();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/5857efca/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/QuotaClassApiLiveTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/QuotaClassApiLiveTest.java b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/QuotaClassApiLiveTest.java
new file mode 100644
index 0000000..43fd342
--- /dev/null
+++ b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/QuotaClassApiLiveTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.openstack.nova.v2_0.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+import org.jclouds.openstack.nova.v2_0.domain.QuotaClass;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiLiveTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.Iterables;
+
+/**
+ * Tests behavior of QuotaApi
+ *
+ * @author Adam Lowe
+ */
+@Test(groups = "live", testName = "QuotaClassApiLiveTest", singleThreaded = true)
+public class QuotaClassApiLiveTest extends BaseNovaApiLiveTest {
+ private Optional<? extends QuotaClassApi> apiOption;
+ private String zone;
+
+ @BeforeClass(groups = {"integration", "live"})
+ @Override
+ public void setup() {
+ super.setup();
+ zone = Iterables.getLast(api.getConfiguredZones(), "nova");
+ apiOption = api.getQuotaClassExtensionForZone(zone);
+ }
+
+ public void testUpdateAndGetQuotaClass() {
+ if (apiOption.isPresent()) {
+ QuotaClassApi api = apiOption.get();
+
+ QuotaClass firstVersion =
+ QuotaClassApiExpectTest.getTestQuotas().toBuilder()
+ .id("jcloudstestquotas")
+ .cores(10)
+ .instances(5)
+ .ram(4096)
+ .volumes(5)
+ .build();
+
+ assertTrue(api.update(firstVersion.getId(), firstVersion));
+
+ assertEquals(api.get(firstVersion.getId()), firstVersion);
+
+ // Change it again (since we may have run this test before and we can't delete the QuotaClass)
+ QuotaClass secondVersion = firstVersion.toBuilder().ram(8192).build();
+
+ assertTrue(api.update(secondVersion.getId(), secondVersion));
+
+ assertEquals(api.get(secondVersion.getId()), secondVersion);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/5857efca/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/SecurityGroupApiExpectTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/SecurityGroupApiExpectTest.java b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/SecurityGroupApiExpectTest.java
new file mode 100644
index 0000000..1fa8416
--- /dev/null
+++ b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/SecurityGroupApiExpectTest.java
@@ -0,0 +1,235 @@
+/*
+ * 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.openstack.nova.v2_0.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import java.net.URI;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.net.domain.IpProtocol;
+import org.jclouds.openstack.nova.v2_0.NovaApi;
+import org.jclouds.openstack.nova.v2_0.domain.Ingress;
+import org.jclouds.openstack.nova.v2_0.domain.SecurityGroup;
+import org.jclouds.openstack.nova.v2_0.domain.SecurityGroupRule;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiExpectTest;
+import org.jclouds.openstack.nova.v2_0.parse.ParseSecurityGroupListTest;
+import org.jclouds.openstack.nova.v2_0.parse.ParseSecurityGroupTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * Tests annotation parsing of {@code SecurityGroupAsyncApi}
+ *
+ * @author Michael Arnold
+ */
+@Test(groups = "unit", testName = "SecurityGroupApiExpectTest")
+public class SecurityGroupApiExpectTest extends BaseNovaApiExpectTest {
+ public void testListSecurityGroupsWhenResponseIs2xx() throws Exception {
+ HttpRequest list = HttpRequest.builder().method("GET").endpoint(
+ URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-security-groups")).headers(
+ ImmutableMultimap.<String, String> builder().put("Accept", "application/json").put("X-Auth-Token",
+ authToken).build()).build();
+
+ HttpResponse listResponse = HttpResponse.builder().statusCode(200).payload(
+ payloadFromResource("/securitygroup_list.json")).build();
+
+ NovaApi apiWhenSecurityGroupsExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, list,
+ listResponse);
+
+ assertEquals(apiWhenSecurityGroupsExist.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1", "az-2.region-a.geo-1", "az-3.region-a.geo-1"));
+
+ assertEquals(apiWhenSecurityGroupsExist.getSecurityGroupExtensionForZone("az-1.region-a.geo-1").get()
+ .list().toString(), new ParseSecurityGroupListTest().expected().toString());
+ }
+
+ public void testListSecurityGroupsWhenReponseIs404IsEmpty() throws Exception {
+ HttpRequest listListSecurityGroups = HttpRequest.builder().method("GET").endpoint(
+ URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-security-groups")).headers(
+ ImmutableMultimap.<String, String> builder().put("Accept", "application/json").put("X-Auth-Token",
+ authToken).build()).build();
+
+ HttpResponse listListSecurityGroupsResponse = HttpResponse.builder().statusCode(404).build();
+
+ NovaApi apiWhenNoSecurityGroupsExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, listListSecurityGroups,
+ listListSecurityGroupsResponse);
+
+ assertTrue(apiWhenNoSecurityGroupsExist.getSecurityGroupExtensionForZone("az-1.region-a.geo-1").get()
+ .list().isEmpty());
+ }
+
+ public void testGetSecurityGroupWhenResponseIs2xx() throws Exception {
+
+ HttpRequest getSecurityGroup = HttpRequest.builder().method("GET").endpoint(
+ URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-security-groups/0")).headers(
+ ImmutableMultimap.<String, String> builder().put("Accept", "application/json").put("X-Auth-Token",
+ authToken).build()).build();
+
+ HttpResponse getSecurityGroupResponse = HttpResponse.builder().statusCode(200).payload(
+ payloadFromResource("/securitygroup_details.json")).build();
+
+ NovaApi apiWhenSecurityGroupsExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, getSecurityGroup,
+ getSecurityGroupResponse);
+
+ assertEquals(apiWhenSecurityGroupsExist.getSecurityGroupExtensionForZone("az-1.region-a.geo-1").get()
+ .get("0").toString(), new ParseSecurityGroupTest().expected().toString());
+ }
+
+ public void testGetSecurityGroupWhenResponseIs404() throws Exception {
+ HttpRequest getSecurityGroup = HttpRequest.builder().method("GET").endpoint(
+ URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-security-groups/0")).headers(
+ ImmutableMultimap.<String, String> builder().put("Accept", "application/json").put("X-Auth-Token",
+ authToken).build()).build();
+
+ HttpResponse getSecurityGroupResponse = HttpResponse.builder().statusCode(404).build();
+
+ NovaApi apiWhenNoSecurityGroupsExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, getSecurityGroup,
+ getSecurityGroupResponse);
+
+ assertNull(apiWhenNoSecurityGroupsExist.getSecurityGroupExtensionForZone("az-1.region-a.geo-1").get()
+ .get("0"));
+
+ }
+
+ public void testCreateSecurityGroupWhenResponseIs2xx() throws Exception {
+ HttpRequest create = HttpRequest.builder().method("POST").endpoint(
+ URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-security-groups")).headers(
+ ImmutableMultimap.<String, String> builder().put("Accept", "application/json").put("X-Auth-Token",
+ authToken).build())
+ .payload(
+ payloadFromStringWithContentType(
+ "{\"security_group\":{\"name\":\"jclouds-test\",\"description\":\"jclouds-test\"}}",
+ "application/json")).build();
+
+ HttpResponse createResponse = HttpResponse.builder().statusCode(200).payload(
+ payloadFromResource("/securitygroup_created.json")).build();
+
+ NovaApi apiWhenSecurityGroupsExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, create,
+ createResponse);
+
+ assertEquals(apiWhenSecurityGroupsExist.getSecurityGroupExtensionForZone("az-1.region-a.geo-1").get()
+ .createWithDescription("jclouds-test", "jclouds-test").toString(),
+ createExpected().toString());
+ }
+
+ public void testDeleteSecurityGroupWhenResponseIs2xx() throws Exception {
+ HttpRequest delete = HttpRequest.builder().method("DELETE").endpoint(
+ URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-security-groups/160"))
+ .headers(
+ ImmutableMultimap.<String, String> builder().put("Accept", "application/json")
+ .put("X-Auth-Token", authToken).build()).build();
+
+ HttpResponse deleteResponse = HttpResponse.builder().statusCode(202).build();
+
+ NovaApi apiWhenServersExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, delete,
+ deleteResponse);
+
+ assertTrue(apiWhenServersExist.getSecurityGroupExtensionForZone("az-1.region-a.geo-1").get()
+ .delete("160"));
+
+ }
+
+ public void testCreateSecurityGroupRuleForCidrBlockWhenResponseIs2xx() throws Exception {
+ HttpRequest createRule = HttpRequest
+ .builder()
+ .method("POST")
+ .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-security-group-rules")
+ .addHeader("Accept", "application/json")
+ .addHeader("X-Auth-Token", authToken)
+ .payload(
+ payloadFromStringWithContentType(
+ "{\"security_group_rule\":{\"parent_group_id\":\"161\",\"cidr\":\"0.0.0.0/0\",\"ip_protocol\":\"tcp\",\"from_port\":\"80\",\"to_port\":\"8080\"}}",
+ "application/json")).build();
+
+ HttpResponse createRuleResponse = HttpResponse.builder().statusCode(200).payload(
+ payloadFromResource("/securitygrouprule_created.json")).build();
+
+ NovaApi apiWhenSecurityGroupsExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, createRule,
+ createRuleResponse);
+
+ assertEquals(apiWhenSecurityGroupsExist.getSecurityGroupExtensionForZone("az-1.region-a.geo-1").get()
+ .createRuleAllowingCidrBlock("161",
+ Ingress.builder().ipProtocol(IpProtocol.TCP).fromPort(80).toPort(8080).build(), "0.0.0.0/0")
+ .toString(), createRuleExpected().toString());
+ }
+
+ public void testCreateSecurityGroupRuleForSecurityGroupIdWhenResponseIs2xx() throws Exception {
+ HttpRequest createRule = HttpRequest
+ .builder()
+ .method("POST")
+ .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-security-group-rules")
+ .addHeader("Accept", "application/json")
+ .addHeader("X-Auth-Token", authToken)
+ .payload(
+ payloadFromStringWithContentType(
+ "{\"security_group_rule\":{\"group_id\":\"999\",\"parent_group_id\":\"161\",\"ip_protocol\":\"tcp\",\"from_port\":\"80\",\"to_port\":\"8080\"}}",
+ "application/json")).build();
+
+ HttpResponse createRuleResponse = HttpResponse.builder().statusCode(200).payload(
+ payloadFromResource("/securitygrouprule_created.json")).build();
+
+ NovaApi apiWhenSecurityGroupsExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, createRule,
+ createRuleResponse);
+
+ assertEquals(apiWhenSecurityGroupsExist.getSecurityGroupExtensionForZone("az-1.region-a.geo-1").get()
+ .createRuleAllowingSecurityGroupId("161",
+ Ingress.builder().ipProtocol(IpProtocol.TCP).fromPort(80).toPort(8080).build(), "999")
+ .toString(), createRuleExpected().toString());
+ }
+
+ public void testDeleteSecurityGroupRuleWhenResponseIs2xx() throws Exception {
+ HttpRequest deleteRule = HttpRequest.builder().method("DELETE").endpoint(
+ URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-security-group-rules/161"))
+ .headers(
+ ImmutableMultimap.<String, String> builder().put("Accept", "*/*")
+ .put("X-Auth-Token", authToken).build()).build();
+
+ HttpResponse deleteRuleResponse = HttpResponse.builder().statusCode(202).build();
+
+ NovaApi apiWhenSecurityGroupsExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, deleteRule,
+ deleteRuleResponse);
+
+ assertTrue(apiWhenSecurityGroupsExist.getSecurityGroupExtensionForZone("az-1.region-a.geo-1").get()
+ .deleteRule("161"));
+
+ }
+
+ private SecurityGroup createExpected() {
+ return SecurityGroup.builder().description("jclouds-test").id("160").name("jclouds-test").rules(
+ ImmutableSet.<SecurityGroupRule> of()).tenantId("dev_16767499955063").build();
+ }
+
+ private SecurityGroupRule createRuleExpected() {
+ return SecurityGroupRule.builder().fromPort(80).id("218").ipProtocol(
+ IpProtocol.TCP).ipRange("0.0.0.0/0").parentGroupId("161").toPort(8080).build();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/5857efca/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/SecurityGroupApiLiveTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/SecurityGroupApiLiveTest.java b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/SecurityGroupApiLiveTest.java
new file mode 100644
index 0000000..c0fb2df
--- /dev/null
+++ b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/SecurityGroupApiLiveTest.java
@@ -0,0 +1,100 @@
+/*
+ * 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.openstack.nova.v2_0.extensions;
+
+import static org.testng.Assert.assertNotNull;
+
+import java.util.Set;
+
+import org.jclouds.net.domain.IpProtocol;
+import org.jclouds.openstack.nova.v2_0.domain.Ingress;
+import org.jclouds.openstack.nova.v2_0.domain.SecurityGroup;
+import org.jclouds.openstack.nova.v2_0.domain.SecurityGroupRule;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiLiveTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * Tests behavior of {@code SecurityGroupApi}
+ *
+ * @author Michael Arnold
+ */
+@Test(groups = "live", testName = "SecurityGroupApiLiveTest", singleThreaded = true)
+public class SecurityGroupApiLiveTest extends BaseNovaApiLiveTest {
+
+ public static final String SECURITY_GROUP_NAME = "testsg";
+
+ public void list() throws Exception {
+ for (String zoneId : api.getConfiguredZones()) {
+ SecurityGroupApi securityGroupApi = api.getSecurityGroupExtensionForZone(zoneId).get();
+ Set<? extends SecurityGroup> securityGroupsList = securityGroupApi.list().toSet();
+ assertNotNull(securityGroupsList);
+ }
+ }
+
+ public void createGetAndDeleteSecurityGroup() throws Exception {
+ for (String zoneId : api.getConfiguredZones()) {
+ SecurityGroupApi securityGroupApi = api.getSecurityGroupExtensionForZone(zoneId).get();
+ SecurityGroup securityGroup = null;
+ String id;
+ try {
+ securityGroup = securityGroupApi
+ .createWithDescription(SECURITY_GROUP_NAME, "test security group");
+ assertNotNull(securityGroup);
+ id = securityGroup.getId();
+ SecurityGroup theGroup = securityGroupApi.get(id);
+ assertNotNull(theGroup);
+ } finally {
+ if (securityGroup != null) {
+ securityGroupApi.delete(securityGroup.getId());
+ }
+ }
+ }
+ }
+
+ public void createAndDeleteSecurityGroupRule() throws Exception {
+ for (String zoneId : api.getConfiguredZones()) {
+ SecurityGroupApi securityGroupApi = api.getSecurityGroupExtensionForZone(zoneId).get();
+ SecurityGroup securityGroup = null;
+
+ try {
+ securityGroup = securityGroupApi.createWithDescription(SECURITY_GROUP_NAME, "test security group");
+ assertNotNull(securityGroup);
+
+ for (int port : ImmutableSet.of(22, 8080)) {
+ SecurityGroupRule rule = securityGroupApi.createRuleAllowingCidrBlock(securityGroup.getId(), Ingress
+ .builder().ipProtocol(IpProtocol.TCP).fromPort(port).toPort(port).build(), "0.0.0.0/0");
+ assertNotNull(rule);
+
+ SecurityGroupRule rule2 = securityGroupApi.createRuleAllowingSecurityGroupId(securityGroup.getId(),
+ Ingress.builder().ipProtocol(IpProtocol.TCP).fromPort(port).toPort(port).build(), securityGroup
+ .getId());
+
+ assertNotNull(rule2);
+ }
+ securityGroup = securityGroupApi.get(securityGroup.getId());
+
+ } finally {
+ if (securityGroup != null) {
+ securityGroupApi.delete(securityGroup.getId());
+ }
+ }
+ }
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/5857efca/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/ServerWithSecurityGroupsApiExpectTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/ServerWithSecurityGroupsApiExpectTest.java b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/ServerWithSecurityGroupsApiExpectTest.java
new file mode 100644
index 0000000..3eb9524
--- /dev/null
+++ b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/ServerWithSecurityGroupsApiExpectTest.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.openstack.nova.v2_0.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
+
+import java.net.URI;
+
+import org.jclouds.http.HttpResponse;
+import org.jclouds.openstack.nova.v2_0.domain.ServerWithSecurityGroups;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiExpectTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * Tests parsing and guice wiring of ServerWithSecurityGroupsApi
+ *
+ * @author Adam Lowe
+ */
+@Test(groups = "unit", testName = "ServerWithSecurityGroupsApiExpectTest")
+public class ServerWithSecurityGroupsApiExpectTest extends BaseNovaApiExpectTest {
+
+ public void testGetServerWithSecurityGroups() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-create-server-ext/8d0a6ca5-8849-4b3d-b86e-f24c92490ebb");
+ ServerWithSecurityGroupsApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(200).payload(payloadFromResource("/server_with_security_groups.json")).build()
+ ).getServerWithSecurityGroupsExtensionForZone("az-1.region-a.geo-1").get();
+
+ ServerWithSecurityGroups server = api.get("8d0a6ca5-8849-4b3d-b86e-f24c92490ebb");
+ assertEquals(server.getId(), "8d0a6ca5-8849-4b3d-b86e-f24c92490ebb");
+ assertEquals(server.getSecurityGroupNames(), ImmutableSet.of("default", "group1"));
+ }
+
+ public void testGetServerWithSecurityGroupsFailNotFound() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-create-server-ext/8d0a6ca5-8849-4b3d-b86e-f24c92490ebb");
+ ServerWithSecurityGroupsApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(404).build()
+ ).getServerWithSecurityGroupsExtensionForZone("az-1.region-a.geo-1").get();
+ assertNull(api.get("8d0a6ca5-8849-4b3d-b86e-f24c92490ebb"));
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/5857efca/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/ServerWithSecurityGroupsApiLiveTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/ServerWithSecurityGroupsApiLiveTest.java b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/ServerWithSecurityGroupsApiLiveTest.java
new file mode 100644
index 0000000..a448253
--- /dev/null
+++ b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/ServerWithSecurityGroupsApiLiveTest.java
@@ -0,0 +1,80 @@
+/*
+ * 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.openstack.nova.v2_0.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import org.jclouds.openstack.nova.v2_0.domain.Server;
+import org.jclouds.openstack.nova.v2_0.domain.ServerWithSecurityGroups;
+import org.jclouds.openstack.nova.v2_0.features.ServerApi;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiLiveTest;
+import org.jclouds.openstack.v2_0.domain.Resource;
+import org.testng.annotations.BeforeGroups;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+
+/**
+ * Tests behavior of ServerWithSecurityGroupsApi
+ *
+ * @author Adam Lowe
+ */
+@Test(groups = "live", testName = "ServerWithSecurityGroupsApiLiveTest", singleThreaded = true)
+public class ServerWithSecurityGroupsApiLiveTest extends BaseNovaApiLiveTest {
+ private ServerApi serverApi;
+ private Optional<? extends ServerWithSecurityGroupsApi> apiOption;
+ private String zone;
+
+ @BeforeGroups(groups = {"integration", "live"})
+ @Override
+ public void setup() {
+ super.setup();
+ zone = Iterables.getLast(api.getConfiguredZones(), "nova");
+ serverApi = api.getServerApiForZone(zone);
+ apiOption = api.getServerWithSecurityGroupsExtensionForZone(zone);
+ }
+
+ public void testGetServer() {
+ if (apiOption.isPresent()) {
+
+ for (Resource server : serverApi.list().concat()) {
+ ServerWithSecurityGroups serverWithGroups = apiOption.get().get(server.getId());
+ assertEquals(serverWithGroups.getId(), server.getId());
+ assertEquals(serverWithGroups.getName(), server.getName());
+ assertNotNull(serverWithGroups.getSecurityGroupNames());
+ }
+
+ // Create a new server to verify the groups work as expected
+ Server testServer = null;
+ try {
+ testServer = createServerInZone(zone);
+
+ ServerWithSecurityGroups results = apiOption.get().get(testServer.getId());
+ assertEquals(results.getId(), testServer.getId());
+ assertEquals(results.getSecurityGroupNames(), ImmutableSet.of("default"));
+ } finally {
+ if (testServer != null) {
+ serverApi.delete(testServer.getId());
+ }
+ }
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/5857efca/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/SimpleTenantUsageApiExpectTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/SimpleTenantUsageApiExpectTest.java b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/SimpleTenantUsageApiExpectTest.java
new file mode 100644
index 0000000..cfb2393
--- /dev/null
+++ b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/SimpleTenantUsageApiExpectTest.java
@@ -0,0 +1,99 @@
+/*
+ * 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.openstack.nova.v2_0.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import java.net.URI;
+import java.util.Set;
+
+import org.jclouds.date.DateService;
+import org.jclouds.date.internal.SimpleDateFormatDateService;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.openstack.nova.v2_0.domain.SimpleServerUsage;
+import org.jclouds.openstack.nova.v2_0.domain.SimpleTenantUsage;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiExpectTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+
+/**
+ * Tests SimpleTenantUsageApi guice wiring and parsing
+ *
+ * @author Adam Lowe
+ */
+@Test(groups = "unit", testName = "SimpleTenantUsageApiExpectTest")
+public class SimpleTenantUsageApiExpectTest extends BaseNovaApiExpectTest {
+ private DateService dateService = new SimpleDateFormatDateService();
+
+ public void testList() throws Exception {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-simple-tenant-usage");
+ SimpleTenantUsageApi api = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ HttpRequest.builder().method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("X-Auth-Token", authToken)
+ .endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/simple_tenant_usages.json")).build())
+ .getSimpleTenantUsageExtensionForZone("az-1.region-a.geo-1").get();
+
+ Set<? extends SimpleTenantUsage> results = api.list().toSet();
+
+ SimpleTenantUsage usage = Iterables.getOnlyElement(results);
+ assertEquals(usage.getTenantId(), "f8535069c3fb404cb61c873b1a0b4921");
+ assertEquals(usage.getTotalHours(), 4.888888888888889e-07);
+ assertEquals(usage.getTotalLocalGbUsage(), 1.9555555555555557e-05);
+ assertEquals(usage.getTotalMemoryMbUsage(), 0.0015018666666666667);
+ assertEquals(usage.getTotalVcpusUsage(), 7.333333333333333e-07);
+ assertEquals(usage.getStart(), dateService.iso8601DateParse("2012-04-18 12:18:39.702411"));
+ assertEquals(usage.getStop(), dateService.iso8601DateParse("2012-04-18 12:18:39.702499"));
+ assertNotNull(usage.getServerUsages());
+ assertTrue(usage.getServerUsages().isEmpty());
+ }
+
+ public void testGet() throws Exception {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-simple-tenant-usage/test-1234");
+ SimpleTenantUsageApi api = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ HttpRequest.builder().method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("X-Auth-Token", authToken)
+ .endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/simple_tenant_usage.json")).build())
+ .getSimpleTenantUsageExtensionForZone("az-1.region-a.geo-1").get();
+
+ SimpleTenantUsage usage = api.get("test-1234");
+ assertEquals(usage.getTenantId(), "f8535069c3fb404cb61c873b1a0b4921");
+
+ SimpleTenantUsage expected = SimpleTenantUsage.builder().tenantId("f8535069c3fb404cb61c873b1a0b4921").totalHours(4.833333333333333E-7).totalLocalGbUsage(1.933333333333333E-05)
+ .start(dateService.iso8601DateParse("2012-04-18 13:32:07.255743")).stop(dateService.iso8601DateParse("2012-04-18 13:32:07.255743"))
+ .totalMemoryMbUsage(0.0014847999999999999).totalVcpusUsage(7.249999999999999E-07).serverUsages(
+ ImmutableSet.of(
+ SimpleServerUsage.builder().hours(2.4166666666666665e-07).uptime(91149).flavorLocalGb(50).instanceName("test1").tenantId("f8535069c3fb404cb61c873b1a0b4921").flavorVcpus(2).flavorMemoryMb(4096).instanceStatus(SimpleServerUsage.Status.ACTIVE).flavorName("m1.medium").instanceCreated(this.dateService.iso8601SecondsDateParse("2012-04-17T12:12:58")).build(),
+ SimpleServerUsage.builder().hours(2.4166666666666665e-07).uptime(84710).flavorLocalGb(30).instanceName("mish_test").tenantId("f8535069c3fb404cb61c873b1a0b4921").flavorVcpus(1).flavorMemoryMb(2048).instanceStatus(SimpleServerUsage.Status.ACTIVE).flavorName("m1.small").instanceCreated(this.dateService.iso8601SecondsDateParse("2012-04-17T14:00:17")).build()
+ )).build();
+
+ assertEquals(usage, expected);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/5857efca/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/SimpleTenantUsageApiLiveTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/SimpleTenantUsageApiLiveTest.java b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/SimpleTenantUsageApiLiveTest.java
new file mode 100644
index 0000000..f658d26
--- /dev/null
+++ b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/SimpleTenantUsageApiLiveTest.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.openstack.nova.v2_0.extensions;
+
+import static org.testng.Assert.assertNotNull;
+
+import java.util.Set;
+
+import org.jclouds.openstack.nova.v2_0.domain.SimpleTenantUsage;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiLiveTest;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Optional;
+
+/**
+ * Tests behavior of SimpleTenantUsageApi
+ *
+ * @author Adam Lowe
+ */
+@Test(groups = "live", testName = "SimpleTenantUsageApiLiveTest")
+public class SimpleTenantUsageApiLiveTest extends BaseNovaApiLiveTest {
+
+ public void testList() throws Exception {
+ for (String zoneId : api.getConfiguredZones()) {
+ Optional<? extends SimpleTenantUsageApi> optApi = api.getSimpleTenantUsageExtensionForZone(zoneId);
+ if (optApi.isPresent() && identity.endsWith(":admin")) {
+ SimpleTenantUsageApi api = optApi.get();
+ Set<? extends SimpleTenantUsage> usages = api.list().toSet();
+ assertNotNull(usages);
+ for (SimpleTenantUsage usage : usages) {
+ SimpleTenantUsage details = api.get(usage.getTenantId());
+ assertNotNull(details);
+ }
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/5857efca/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VirtualInterfaceApiExpectTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VirtualInterfaceApiExpectTest.java b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VirtualInterfaceApiExpectTest.java
new file mode 100644
index 0000000..ab9be8d
--- /dev/null
+++ b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VirtualInterfaceApiExpectTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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.openstack.nova.v2_0.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+import java.net.URI;
+
+import org.jclouds.http.HttpResponse;
+import org.jclouds.openstack.nova.v2_0.domain.VirtualInterface;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiExpectTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.Iterables;
+
+/**
+ * Tests parsing and guice wiring of VirtualInterfaceApi
+ *
+ * @author Adam Lowe
+ */
+@Test(groups = "live", testName = "VirtualInterfaceApiLiveTest")
+public class VirtualInterfaceApiExpectTest extends BaseNovaApiExpectTest {
+
+ public void testListVirtualInterfaces() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/os-virtual-interfaces");
+ VirtualInterfaceApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(200).payload(payloadFromResource("/virtual_interfaces_list.json")).build()
+ ).getVirtualInterfaceExtensionForZone("az-1.region-a.geo-1").get();
+
+ VirtualInterface vif = Iterables.getOnlyElement(api.listOnServer("1"));
+ assertEquals(vif.getId(), "02315827-b05c-4668-9c05-75c68838074a");
+ assertEquals(vif.getMacAddress(), "fa:16:3e:09:71:34");
+ }
+
+ public void testListVirtualInterfacesFailNotFound() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/1/os-virtual-interfaces");
+ VirtualInterfaceApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(404).build()
+ ).getVirtualInterfaceExtensionForZone("az-1.region-a.geo-1").get();
+
+ assertTrue(api.listOnServer("1").isEmpty());
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/5857efca/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VirtualInterfaceApiLiveTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VirtualInterfaceApiLiveTest.java b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VirtualInterfaceApiLiveTest.java
new file mode 100644
index 0000000..4f36035
--- /dev/null
+++ b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VirtualInterfaceApiLiveTest.java
@@ -0,0 +1,68 @@
+/*
+ * 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.openstack.nova.v2_0.extensions;
+
+import static org.testng.Assert.assertNotNull;
+
+import java.util.Set;
+
+import org.jclouds.openstack.nova.v2_0.domain.Server;
+import org.jclouds.openstack.nova.v2_0.domain.VirtualInterface;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiLiveTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.Iterables;
+
+/**
+ * Tests behavior of VirtualInterfaceApi
+ *
+ * @author Adam Lowe
+ */
+@Test(groups = "live", testName = "VirtualInterfaceApiLiveTest", singleThreaded = true)
+public class VirtualInterfaceApiLiveTest extends BaseNovaApiLiveTest {
+ private Optional<? extends VirtualInterfaceApi> apiOption;
+ private String zone;
+
+
+ @BeforeClass(groups = {"integration", "live"})
+ @Override
+ public void setup() {
+ super.setup();
+ zone = Iterables.getLast(api.getConfiguredZones(), "nova");
+ apiOption = api.getVirtualInterfaceExtensionForZone(zone);
+ }
+
+ public void testListVirtualInterfaces() {
+ if (apiOption.isPresent()) {
+ Server testServer = null;
+ try {
+ testServer = createServerInZone(zone);
+ Set<? extends VirtualInterface> results = apiOption.get().listOnServer(testServer.getId()).toSet();
+ for (VirtualInterface vif : results) {
+ assertNotNull(vif.getId());
+ assertNotNull(vif.getMacAddress());
+ }
+ } finally {
+ if (testServer != null) {
+ api.getServerApiForZone(zone).delete(testServer.getId());
+ }
+ }
+ }
+}
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/5857efca/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApiExpectTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApiExpectTest.java b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApiExpectTest.java
new file mode 100644
index 0000000..c177ce2
--- /dev/null
+++ b/dependencies/jclouds/openstack-nova/1.7.1-stratos/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApiExpectTest.java
@@ -0,0 +1,460 @@
+/*
+ * 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.openstack.nova.v2_0.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import java.net.URI;
+import java.util.Set;
+
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.date.DateService;
+import org.jclouds.date.internal.SimpleDateFormatDateService;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.openstack.nova.v2_0.domain.Volume;
+import org.jclouds.openstack.nova.v2_0.domain.VolumeAttachment;
+import org.jclouds.openstack.nova.v2_0.domain.VolumeSnapshot;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiExpectTest;
+import org.jclouds.openstack.nova.v2_0.options.CreateVolumeOptions;
+import org.jclouds.openstack.nova.v2_0.options.CreateVolumeSnapshotOptions;
+import org.jclouds.rest.AuthorizationException;
+import org.jclouds.rest.ResourceNotFoundException;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+
+/**
+ * Tests VolumeApi guice wiring and parsing
+ *
+ * @author Adam Lowe
+ */
+@Test(groups = "unit", testName = "VolumeApiExpectTest")
+public class VolumeApiExpectTest extends BaseNovaApiExpectTest {
+ private DateService dateService = new SimpleDateFormatDateService();
+
+ public void testListVolumes() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-volumes");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(200).payload(payloadFromResource("/volume_list.json")).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ Set<? extends Volume> volumes = api.list().toSet();
+ assertEquals(volumes, ImmutableSet.of(testVolume()));
+ }
+
+ public void testListVolumesFail() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-volumes");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(404).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ Set<? extends Volume> volumes = api.list().toSet();
+ assertTrue(volumes.isEmpty());
+ }
+
+ public void testListVolumesInDetail() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-volumes/detail");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(200).payload(payloadFromResource("/volume_list_detail.json")).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ Set<? extends Volume> volumes = api.listInDetail().toSet();
+ assertEquals(volumes, ImmutableSet.of(testVolume()));
+ }
+
+ public void testListVolumesInDetailFail() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-volumes/detail");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(404).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ Set<? extends Volume> volumes = api.listInDetail().toSet();
+ assertTrue(volumes.isEmpty());
+ }
+
+ public void testCreateVolume() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-volumes");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint)
+ .method("POST")
+ .payload(payloadFromStringWithContentType("{\"volume\":{\"display_name\":\"jclouds-test-volume\",\"display_description\":\"description of test volume\",\"size\":1}}", MediaType.APPLICATION_JSON))
+ .build(),
+ HttpResponse.builder().statusCode(200).payload(payloadFromResource("/volume_details.json")).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ Volume volume = api.create(1, CreateVolumeOptions.Builder.name("jclouds-test-volume").description("description of test volume"));
+ assertEquals(volume, testVolume());
+ }
+
+ @Test(expectedExceptions = ResourceNotFoundException.class)
+ public void testCreateVolumeFail() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-volumes");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint)
+ .endpoint(endpoint)
+ .method("POST")
+ .payload(payloadFromStringWithContentType("{\"volume\":{\"display_name\":\"jclouds-test-volume\",\"display_description\":\"description of test volume\",\"size\":1}}", MediaType.APPLICATION_JSON))
+ .build(),
+ HttpResponse.builder().statusCode(404).payload(payloadFromResource("/volume_details.json")).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ api.create(1, CreateVolumeOptions.Builder.name("jclouds-test-volume").description("description of test volume"));
+ }
+
+ public void testGetVolume() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-volumes/1");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(200).payload(payloadFromResource("/volume_details.json")).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ Volume volume = api.get("1");
+ assertEquals(volume, testVolume());
+ // double-check equals()
+ assertEquals(volume.getStatus(), Volume.Status.IN_USE);
+ assertEquals(volume.getDescription(), "This is a test volume");
+ assertEquals(volume.getZone(), "nova");
+ assertEquals(volume.getName(), "test");
+ assertEquals(volume.getStatus(), Volume.Status.IN_USE);
+ assertEquals(Iterables.getOnlyElement(volume.getAttachments()), testAttachment());
+ }
+
+ public void testGetVolumeFail() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-volumes/1");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(404).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ assertNull(api.get("1"));
+ }
+
+ public void testDeleteVolume() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-volumes/1");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).method("DELETE").build(),
+ HttpResponse.builder().statusCode(200).payload(payloadFromResource("/attachment_details.json")).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ assertTrue(api.delete("1"));
+ }
+
+ public void testDeleteVolumeFail() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-volumes/1");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).method("DELETE").build(),
+ HttpResponse.builder().statusCode(404).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ assertFalse(api.delete("1"));
+ }
+
+ public void testListAttachments() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/instance-1/os-volume_attachments");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(200).payload(payloadFromResource("/attachment_list.json")).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ Set<? extends VolumeAttachment> attachments = api.listAttachmentsOnServer("instance-1").toSet();
+ assertEquals(attachments, ImmutableSet.of(testAttachment()));
+ // double-check individual fields
+ VolumeAttachment attachment = Iterables.getOnlyElement(attachments);
+ assertEquals(attachment.getDevice(), "/dev/vdc");
+ assertEquals(attachment.getServerId(), "b4785058-cb80-491b-baa3-e4ee6546450e");
+ assertEquals(attachment.getId(), "1");
+ assertEquals(attachment.getVolumeId(), "1");
+ }
+
+ @Test(expectedExceptions = AuthorizationException.class)
+ public void testListAttachmentsFail() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/instance-2/os-volume_attachments");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(401).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ api.listAttachmentsOnServer("instance-2");
+ }
+
+ public void testGetAttachment() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/instance-1/os-volume_attachments/1");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(200).payload(payloadFromResource("/attachment_details.json")).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ VolumeAttachment attachment = api.getAttachmentForVolumeOnServer("1", "instance-1");
+ assertEquals(attachment, testAttachment());
+ }
+
+ public void testGetAttachmentFail() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/instance-1/os-volume_attachments/1");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(404).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ assertNull(api.getAttachmentForVolumeOnServer("1", "instance-1"));
+ }
+
+ public void testAttachVolume() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/instance-1/os-volume_attachments");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).method("POST")
+ .payload(payloadFromStringWithContentType("{\"volumeAttachment\":{\"volumeId\":\"1\",\"device\":\"/dev/vdc\"}}", MediaType.APPLICATION_JSON)).endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(200).payload(payloadFromResource("/attachment_details.json")).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ VolumeAttachment result = api.attachVolumeToServerAsDevice("1", "instance-1", "/dev/vdc");
+ assertEquals(result, testAttachment());
+ }
+
+ @Test(expectedExceptions = ResourceNotFoundException.class)
+ public void testAttachVolumeFail() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/instance-1/os-volume_attachments");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).method("POST")
+ .payload(payloadFromStringWithContentType("{\"volumeAttachment\":{\"volumeId\":\"1\",\"device\":\"/dev/vdc\"}}", MediaType.APPLICATION_JSON)).endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(404).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ api.attachVolumeToServerAsDevice("1", "instance-1","/dev/vdc");
+ }
+
+ public void testDetachVolume() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/instance-1/os-volume_attachments/1");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).method("DELETE").build(),
+ HttpResponse.builder().statusCode(200).payload(payloadFromResource("/attachment_details.json")).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ assertTrue(api.detachVolumeFromServer("1", "instance-1"));
+ }
+
+ public void testDetachVolumeFail() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers/instance-1/os-volume_attachments/1");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).method("DELETE").build(),
+ HttpResponse.builder().statusCode(404).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ assertFalse(api.detachVolumeFromServer("1", "instance-1"));
+ }
+
+ public void testListSnapshots() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-snapshots");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(200).payload(payloadFromResource("/snapshot_list.json")).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ Set<? extends VolumeSnapshot> snapshots = api.listSnapshots().toSet();
+ assertEquals(snapshots, ImmutableSet.of(testSnapshot()));
+ }
+
+ public void testListSnapshotsFail() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-snapshots");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(404).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ Set<? extends VolumeSnapshot> snapshots = api.listSnapshots().toSet();
+ assertTrue(snapshots.isEmpty());
+ }
+
+ public void testGetSnapshot() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-snapshots/1");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(200).payload(payloadFromResource("/snapshot_details.json")).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ VolumeSnapshot snapshot = api.getSnapshot("1");
+ assertEquals(snapshot, testSnapshot());
+ }
+
+ public void testGetSnapshotFail() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-snapshots/1");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(404).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ assertNull(api.getSnapshot("1"));
+ }
+
+ public void testListSnapshotsInDetail() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-snapshots/detail");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(200).payload(payloadFromResource("/snapshot_list_detail.json")).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ Set<? extends VolumeSnapshot> snapshots = api.listSnapshotsInDetail().toSet();
+ assertEquals(snapshots, ImmutableSet.of(testSnapshot()));
+
+ // double-check individual fields
+ VolumeSnapshot snappy = Iterables.getOnlyElement(snapshots);
+ assertEquals(snappy.getId(), "7");
+ assertEquals(snappy.getVolumeId(), "9");
+ assertEquals(snappy.getStatus(), Volume.Status.AVAILABLE);
+ assertEquals(snappy.getDescription(), "jclouds live test snapshot");
+ assertEquals(snappy.getName(), "jclouds-live-test");
+ assertEquals(snappy.getSize(), 1);
+ }
+
+ public void testListSnapshotsInDetailFail() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-snapshots/detail");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(404).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ Set<? extends VolumeSnapshot> snapshots = api.listSnapshotsInDetail().toSet();
+ assertTrue(snapshots.isEmpty());
+ }
+
+ public void testCreateSnapshot() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-snapshots");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint)
+ .method("POST")
+ .payload(payloadFromStringWithContentType("{\"snapshot\":{\"display_name\":\"jclouds-live-test\",\"volume_id\":\"13\",\"display_description\":\"jclouds live test snapshot\",\"force\":\"true\"}}", MediaType.APPLICATION_JSON))
+ .build(),
+ HttpResponse.builder().statusCode(200).payload(payloadFromResource("/snapshot_details.json")).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ VolumeSnapshot snapshot = api.createSnapshot("13", CreateVolumeSnapshotOptions.Builder.name("jclouds-live-test").description("jclouds live test snapshot").force());
+ assertEquals(snapshot, testSnapshot());
+ }
+
+ @Test(expectedExceptions = AuthorizationException.class)
+ public void testCreateSnapshotFail() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-snapshots");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint)
+ .method("POST")
+ .payload(payloadFromStringWithContentType("{\"snapshot\":{\"display_name\":\"jclouds-live-test\",\"volume_id\":\"13\",\"display_description\":\"jclouds live test snapshot\",\"force\":\"true\"}}", MediaType.APPLICATION_JSON))
+ .build(),
+ HttpResponse.builder().statusCode(401).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ api.createSnapshot("13", CreateVolumeSnapshotOptions.Builder.name("jclouds-live-test").description("jclouds live test snapshot").force());
+ }
+
+ public void testDeleteSnapshot() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-snapshots/1");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).method("DELETE").build(),
+ HttpResponse.builder().statusCode(200).payload(payloadFromResource("/snapshot_details.json")).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ assertTrue(api.deleteSnapshot("1"));
+ }
+
+ @Test(expectedExceptions = AuthorizationException.class)
+ public void testDeleteSnapshotFail() {
+ URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-snapshots/1");
+ VolumeApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse,
+ authenticatedGET().endpoint(endpoint).method("DELETE").build(),
+ HttpResponse.builder().statusCode(401).build()
+ ).getVolumeExtensionForZone("az-1.region-a.geo-1").get();
+
+ api.deleteSnapshot("1");
+ }
+
+ protected Volume testVolume() {
+ return Volume.builder().status(Volume.Status.IN_USE).description("This is a test volume").zone("nova").name("test")
+ .attachments(ImmutableSet.of(testAttachment())).size(1).id("1").created(dateService.iso8601SecondsDateParse("2012-04-23 12:16:45")).build();
+ }
+
+ protected VolumeAttachment testAttachment() {
+ return VolumeAttachment.builder().device("/dev/vdc").serverId("b4785058-cb80-491b-baa3-e4ee6546450e").id("1").volumeId("1").build();
+ }
+
+ protected VolumeSnapshot testSnapshot() {
+ return VolumeSnapshot.builder().id("7").volumeId("9").description("jclouds live test snapshot").status(Volume.Status.AVAILABLE)
+ .name("jclouds-live-test").size(1).created(dateService.iso8601SecondsDateParse("2012-04-24 13:34:42")).build();
+ }
+}