You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by im...@apache.org on 2014/11/27 07:46:06 UTC
[57/79] stratos git commit: adding cloudstack dependancy
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/compute/extensions/CloudStackSecurityGroupExtensionExpectTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/extensions/CloudStackSecurityGroupExtensionExpectTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/extensions/CloudStackSecurityGroupExtensionExpectTest.java
new file mode 100644
index 0000000..07372a0
--- /dev/null
+++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/extensions/CloudStackSecurityGroupExtensionExpectTest.java
@@ -0,0 +1,699 @@
+/*
+ * 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.compute.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import org.jclouds.cloudstack.CloudStackContext;
+import org.jclouds.cloudstack.compute.functions.ZoneToLocationTest;
+import org.jclouds.cloudstack.internal.BaseCloudStackComputeServiceContextExpectTest;
+import org.jclouds.compute.ComputeService;
+import org.jclouds.compute.domain.SecurityGroup;
+import org.jclouds.compute.domain.SecurityGroupBuilder;
+import org.jclouds.compute.extensions.SecurityGroupExtension;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.net.domain.IpPermission;
+import org.jclouds.net.domain.IpProtocol;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.LinkedHashMultimap;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Sets;
+import com.google.common.util.concurrent.UncheckedExecutionException;
+import com.google.inject.Module;
+
+@Test(groups = "unit", testName = "CloudStackSecurityGroupExtensionExpectTest")
+public class CloudStackSecurityGroupExtensionExpectTest extends BaseCloudStackComputeServiceContextExpectTest<ComputeService> {
+
+ protected final HttpResponse addRuleResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/authorizesecuritygroupingressresponse.json"))
+ .build();
+
+ protected final HttpResponse revokeRuleResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/revokesecuritygroupingressresponse.json"))
+ .build();
+
+ protected final HttpRequest queryAsyncJobResultAuthorizeIngress = HttpRequest.builder().method("GET")
+ .endpoint("http://localhost:8080/client/api")
+ .addQueryParam("response", "json")
+ .addQueryParam("command", "queryAsyncJobResult")
+ .addQueryParam("jobid", "13330fc9-8b3e-4582-aa3e-90883c041010")
+ .addQueryParam("apiKey", "APIKEY")
+ .addQueryParam("signature", "y4gk3ckWAMPDNZM26LUK0gAhfiE%3D")
+ .addHeader("Accept", "application/json")
+ .build();
+
+ protected final HttpResponse queryAsyncJobResultAuthorizeIngressResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/queryasyncjobresultresponse-authorizeingress.json"))
+ .build();
+
+ protected final HttpRequest getWithRule = HttpRequest.builder().method("GET")
+ .endpoint("http://localhost:8080/client/api")
+ .addQueryParam("response", "json")
+ .addQueryParam("command", "listSecurityGroups")
+ .addQueryParam("listAll", "true")
+ .addQueryParam("id", "13")
+ .addQueryParam("apiKey", "APIKEY")
+ .addQueryParam("signature", "TmlGaO2ICM%2BiXQr88%2BZCyWUniSw%3D")
+ .addHeader("Accept", "application/json")
+ .build();
+
+ protected final HttpResponse getEmptyResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/getsecuritygroupresponse_extension_byid_empty.json"))
+ .build();
+
+ @Override
+ protected Properties setupProperties() {
+ Properties overrides = super.setupProperties();
+ overrides.setProperty("jclouds.zones", "MTV-Zone1");
+ return overrides;
+ }
+
+ public void testListSecurityGroups() {
+ HttpRequest listSecurityGroups = HttpRequest.builder().method("GET")
+ .endpoint("http://localhost:8080/client/api")
+ .addQueryParam("response", "json")
+ .addQueryParam("command", "listSecurityGroups")
+ .addQueryParam("listAll", "true")
+ .addQueryParam("apiKey", "APIKEY")
+ .addQueryParam("signature", "o%2Bd8xxWT1Pa%2BI57SG2caFAblBYA%3D")
+ .addHeader("Accept", "application/json")
+ .build();
+
+ HttpResponse listSecurityGroupsResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/listsecuritygroupsresponse.json"))
+ .build();
+
+ Map<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder()
+ .put(listTemplates, listTemplatesResponse)
+ .put(listOsTypes, listOsTypesResponse)
+ .put(listOsCategories, listOsCategoriesResponse)
+ .put(listZones, listZonesResponse)
+ .put(listServiceOfferings, listServiceOfferingsResponse)
+ .put(listAccounts, listAccountsResponse)
+ .put(listNetworks, listNetworksResponse)
+ .put(getZone, getZoneResponse)
+ .put(listSecurityGroups, listSecurityGroupsResponse)
+ .build();
+
+ SecurityGroupExtension extension = requestsSendResponses(requestResponseMap).getSecurityGroupExtension().get();
+
+ Set<SecurityGroup> groups = extension.listSecurityGroups();
+ assertEquals(groups.size(), 5);
+ }
+
+ public void testListSecurityGroupsForNode() {
+ HttpRequest listSecurityGroups = HttpRequest.builder().method("GET")
+ .endpoint("http://localhost:8080/client/api")
+ .addQueryParam("response", "json")
+ .addQueryParam("command", "listSecurityGroups")
+ .addQueryParam("listAll", "true")
+ .addQueryParam("virtualmachineid", "some-node")
+ .addQueryParam("apiKey", "APIKEY")
+ .addQueryParam("signature", "x4f9fGMjIHXl5biaaFK5oOEONcg%3D")
+ .addHeader("Accept", "application/json")
+ .build();
+
+ HttpResponse listSecurityGroupsResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/listsecuritygroupsresponse.json"))
+ .build();
+
+ Map<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder()
+ .put(listTemplates, listTemplatesResponse)
+ .put(listOsTypes, listOsTypesResponse)
+ .put(listOsCategories, listOsCategoriesResponse)
+ .put(listZones, listZonesResponse)
+ .put(listServiceOfferings, listServiceOfferingsResponse)
+ .put(listAccounts, listAccountsResponse)
+ .put(listNetworks, listNetworksResponse)
+ .put(getZone, getZoneResponse)
+ .put(listSecurityGroups, listSecurityGroupsResponse)
+ .build();
+
+ SecurityGroupExtension extension = requestsSendResponses(requestResponseMap).getSecurityGroupExtension().get();
+
+ Set<SecurityGroup> groups = extension.listSecurityGroupsForNode("some-node");
+ assertEquals(groups.size(), 5);
+ }
+
+ public void testGetSecurityGroupById() {
+ HttpRequest listSecurityGroups = HttpRequest.builder().method("GET")
+ .endpoint("http://localhost:8080/client/api")
+ .addQueryParam("response", "json")
+ .addQueryParam("command", "listSecurityGroups")
+ .addQueryParam("listAll", "true")
+ .addQueryParam("id", "13")
+ .addQueryParam("apiKey", "APIKEY")
+ .addQueryParam("signature", "TmlGaO2ICM%2BiXQr88%2BZCyWUniSw%3D")
+ .addHeader("Accept", "application/json")
+ .build();
+
+ HttpResponse listSecurityGroupsResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/getsecuritygroupresponse_extension_byid.json"))
+ .build();
+
+ Map<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder()
+ .put(listTemplates, listTemplatesResponse)
+ .put(listOsTypes, listOsTypesResponse)
+ .put(listOsCategories, listOsCategoriesResponse)
+ .put(listZones, listZonesResponse)
+ .put(listServiceOfferings, listServiceOfferingsResponse)
+ .put(listAccounts, listAccountsResponse)
+ .put(listNetworks, listNetworksResponse)
+ .put(getZone, getZoneResponse)
+ .put(listSecurityGroups, listSecurityGroupsResponse)
+ .build();
+
+ SecurityGroupExtension extension = requestsSendResponses(requestResponseMap).getSecurityGroupExtension().get();
+
+ SecurityGroup group = extension.getSecurityGroupById("13");
+ assertEquals(group.getId(), "13");
+ assertEquals(group.getIpPermissions().size(), 2);
+ }
+
+ public void testCreateSecurityGroup() {
+ HttpRequest listSecurityGroups = HttpRequest.builder().method("GET")
+ .endpoint("http://localhost:8080/client/api")
+ .addQueryParam("response", "json")
+ .addQueryParam("command", "listSecurityGroups")
+ .addQueryParam("listAll", "true")
+ .addQueryParam("securitygroupname", "jclouds-test")
+ .addQueryParam("apiKey", "APIKEY")
+ .addQueryParam("signature", "zGp2rfHY6fBIGkgODRxyNzFfPFI%3D")
+ .addHeader("Accept", "application/json")
+ .build();
+
+ HttpResponse listSecurityGroupsResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/getsecuritygroupresponse.json"))
+ .build();
+
+ Map<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder()
+ .put(listTemplates, listTemplatesResponse)
+ .put(listOsTypes, listOsTypesResponse)
+ .put(listOsCategories, listOsCategoriesResponse)
+ .put(listZones, listZonesResponse)
+ .put(listServiceOfferings, listServiceOfferingsResponse)
+ .put(listAccounts, listAccountsResponse)
+ .put(listNetworks, listNetworksResponse)
+ .put(getZoneWithSecurityGroups, getZoneWithSecurityGroupsResponse)
+ .put(listSecurityGroups, listSecurityGroupsResponse)
+ .put(createSecurityGroup, createSecurityGroupResponse)
+ .build();
+
+ SecurityGroupExtension extension = requestsSendResponses(requestResponseMap).getSecurityGroupExtension().get();
+
+ SecurityGroup group = extension.createSecurityGroup("test", ZoneToLocationTest.two);
+ assertEquals(group.getId(), "30");
+ assertEquals(group.getIpPermissions().size(), 0);
+ }
+
+ @Test(expectedExceptions = UncheckedExecutionException.class,
+ expectedExceptionsMessageRegExp = "java.lang.IllegalArgumentException: .* does not support security groups")
+ public void testCreateSecurityGroupBadZone() {
+ HttpRequest listSecurityGroups = HttpRequest.builder().method("GET")
+ .endpoint("http://localhost:8080/client/api")
+ .addQueryParam("response", "json")
+ .addQueryParam("command", "listSecurityGroups")
+ .addQueryParam("listAll", "true")
+ .addQueryParam("securitygroupname", "jclouds-test")
+ .addQueryParam("apiKey", "APIKEY")
+ .addQueryParam("signature", "zGp2rfHY6fBIGkgODRxyNzFfPFI%3D")
+ .addHeader("Accept", "application/json")
+ .build();
+
+ HttpResponse listSecurityGroupsResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/getsecuritygroupresponse.json"))
+ .build();
+
+ Map<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder()
+ .put(listTemplates, listTemplatesResponse)
+ .put(listOsTypes, listOsTypesResponse)
+ .put(listOsCategories, listOsCategoriesResponse)
+ .put(listZones, listZonesResponse)
+ .put(listServiceOfferings, listServiceOfferingsResponse)
+ .put(listAccounts, listAccountsResponse)
+ .put(listNetworks, listNetworksResponse)
+ .put(getZone, getZoneResponse)
+ .put(listSecurityGroups, listSecurityGroupsResponse)
+ .put(createSecurityGroup, createSecurityGroupResponse)
+ .build();
+
+ SecurityGroupExtension extension = requestsSendResponses(requestResponseMap).getSecurityGroupExtension().get();
+
+ SecurityGroup group = extension.createSecurityGroup("test", ZoneToLocationTest.one);
+ assertEquals(group.getId(), "30");
+ assertEquals(group.getIpPermissions().size(), 0);
+ }
+
+ public void testRemoveSecurityGroup() {
+ HttpRequest listSecurityGroups = HttpRequest.builder().method("GET")
+ .endpoint("http://localhost:8080/client/api")
+ .addQueryParam("response", "json")
+ .addQueryParam("command", "listSecurityGroups")
+ .addQueryParam("listAll", "true")
+ .addQueryParam("id", "13")
+ .addQueryParam("apiKey", "APIKEY")
+ .addQueryParam("signature", "TmlGaO2ICM%2BiXQr88%2BZCyWUniSw%3D")
+ .addHeader("Accept", "application/json")
+ .build();
+
+ HttpResponse listSecurityGroupsResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/getsecuritygroupresponse_extension_byid_empty.json"))
+ .build();
+
+ HttpRequest deleteSecurityGroup = HttpRequest.builder().method("GET")
+ .endpoint("http://localhost:8080/client/api")
+ .addQueryParam("response", "json")
+ .addQueryParam("command", "deleteSecurityGroup")
+ .addQueryParam("id", "13")
+ .addQueryParam("apiKey", "APIKEY")
+ .addQueryParam("signature", "S1A2lYR/ibf4%2BHGFxVLdZvXZujQ%3D")
+ .addHeader("Accept", "application/json")
+ .build();
+
+ HttpResponse deleteSecurityGroupResponse = HttpResponse.builder()
+ .statusCode(200)
+ .payload(payloadFromResource("/deletesecuritygroupresponse.json"))
+ .build();
+
+ Map<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder()
+ .put(listTemplates, listTemplatesResponse)
+ .put(listOsTypes, listOsTypesResponse)
+ .put(listOsCategories, listOsCategoriesResponse)
+ .put(listZones, listZonesResponse)
+ .put(listServiceOfferings, listServiceOfferingsResponse)
+ .put(listAccounts, listAccountsResponse)
+ .put(listNetworks, listNetworksResponse)
+ .put(listSecurityGroups, listSecurityGroupsResponse)
+ .put(deleteSecurityGroup, deleteSecurityGroupResponse)
+ .build();
+
+ SecurityGroupExtension extension = requestsSendResponses(requestResponseMap).getSecurityGroupExtension().get();
+
+ assertTrue(extension.removeSecurityGroup("13"), "Did not remove security group");
+ }
+
+ public void testRemoveSecurityGroupDoesNotExist() {
+ HttpRequest listSecurityGroups = HttpRequest.builder().method("GET")
+ .endpoint("http://localhost:8080/client/api")
+ .addQueryParam("response", "json")
+ .addQueryParam("command", "listSecurityGroups")
+ .addQueryParam("listAll", "true")
+ .addQueryParam("id", "14")
+ .addQueryParam("apiKey", "APIKEY")
+ .addQueryParam("signature", "pWQ30A6l5qh4eaNypGwM9FoLnUM%3D")
+ .addHeader("Accept", "application/json")
+ .build();
+
+ HttpResponse listSecurityGroupsResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/getsecuritygroupresponse.json"))
+ .build();
+
+ Map<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder()
+ .put(listTemplates, listTemplatesResponse)
+ .put(listOsTypes, listOsTypesResponse)
+ .put(listOsCategories, listOsCategoriesResponse)
+ .put(listZones, listZonesResponse)
+ .put(listServiceOfferings, listServiceOfferingsResponse)
+ .put(listAccounts, listAccountsResponse)
+ .put(listNetworks, listNetworksResponse)
+ .put(listSecurityGroups, listSecurityGroupsResponse)
+ .build();
+
+ SecurityGroupExtension extension = requestsSendResponses(requestResponseMap).getSecurityGroupExtension().get();
+
+ assertFalse(extension.removeSecurityGroup("14"), "Should not have found security group to remove");
+ }
+
+ public void testAddIpPermissionCidrFromIpPermission() {
+ HttpRequest addRule = HttpRequest.builder().method("GET")
+ .endpoint("http://localhost:8080/client/api")
+ .addQueryParam("response", "json")
+ .addQueryParam("command", "authorizeSecurityGroupIngress")
+ .addQueryParam("securitygroupid", "13")
+ .addQueryParam("protocol", "UDP")
+ .addQueryParam("startport", "11")
+ .addQueryParam("endport", "11")
+ .addQueryParam("cidrlist", "1.1.1.1/24")
+ .addQueryParam("apiKey", "APIKEY")
+ .addQueryParam("signature", "XyokGNutHwcyU7KQVFZOTHvc4RY%3D")
+ .addHeader("Accept", "application/json")
+ .build();
+
+ HttpResponse getWithRuleResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/getsecuritygroupresponse_extension_byid_with_cidr.json"))
+ .build();
+
+ SecurityGroupExtension extension = orderedRequestsSendResponses(
+ ImmutableList.of(addRule, queryAsyncJobResultAuthorizeIngress, getWithRule),
+ ImmutableList.of(addRuleResponse, queryAsyncJobResultAuthorizeIngressResponse, getWithRuleResponse)
+ ).getSecurityGroupExtension().get();
+
+ IpPermission.Builder builder = IpPermission.builder();
+
+ builder.ipProtocol(IpProtocol.UDP);
+ builder.fromPort(11);
+ builder.toPort(11);
+ builder.cidrBlock("1.1.1.1/24");
+
+ IpPermission perm = builder.build();
+
+ SecurityGroup origGroup = new SecurityGroupBuilder().id("13").build();
+
+ SecurityGroup newGroup = extension.addIpPermission(perm, origGroup);
+
+ assertEquals(1, newGroup.getIpPermissions().size());
+
+ IpPermission newPerm = Iterables.getOnlyElement(newGroup.getIpPermissions());
+
+ assertNotNull(newPerm);
+ assertEquals(newPerm.getIpProtocol(), IpProtocol.UDP);
+ assertEquals(newPerm.getFromPort(), 11);
+ assertEquals(newPerm.getToPort(), 11);
+ assertEquals(newPerm.getCidrBlocks().size(), 1);
+ assertTrue(newPerm.getCidrBlocks().contains("1.1.1.1/24"));
+ }
+
+ public void testAddIpPermissionCidrFromParams() {
+ HttpRequest addRule = HttpRequest.builder().method("GET")
+ .endpoint("http://localhost:8080/client/api")
+ .addQueryParam("response", "json")
+ .addQueryParam("command", "authorizeSecurityGroupIngress")
+ .addQueryParam("securitygroupid", "13")
+ .addQueryParam("protocol", "UDP")
+ .addQueryParam("startport", "11")
+ .addQueryParam("endport", "11")
+ .addQueryParam("cidrlist", "1.1.1.1/24")
+ .addQueryParam("apiKey", "APIKEY")
+ .addQueryParam("signature", "XyokGNutHwcyU7KQVFZOTHvc4RY%3D")
+ .addHeader("Accept", "application/json")
+ .build();
+
+ HttpResponse getWithRuleResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/getsecuritygroupresponse_extension_byid_with_cidr.json"))
+ .build();
+
+ SecurityGroupExtension extension = orderedRequestsSendResponses(
+ ImmutableList.of(addRule, queryAsyncJobResultAuthorizeIngress, getWithRule),
+ ImmutableList.of(addRuleResponse, queryAsyncJobResultAuthorizeIngressResponse, getWithRuleResponse)
+ ).getSecurityGroupExtension().get();
+
+ SecurityGroup origGroup = new SecurityGroupBuilder().id("13").build();
+
+ SecurityGroup newGroup = extension.addIpPermission(IpProtocol.UDP, 11, 11, emptyMultimap(),
+ ImmutableSet.of("1.1.1.1/24"), emptyStringSet(), origGroup);
+
+ assertEquals(1, newGroup.getIpPermissions().size());
+
+ IpPermission newPerm = Iterables.getOnlyElement(newGroup.getIpPermissions());
+
+ assertNotNull(newPerm);
+ assertEquals(newPerm.getIpProtocol(), IpProtocol.UDP);
+ assertEquals(newPerm.getFromPort(), 11);
+ assertEquals(newPerm.getToPort(), 11);
+ assertEquals(newPerm.getCidrBlocks().size(), 1);
+ assertTrue(newPerm.getCidrBlocks().contains("1.1.1.1/24"));
+ }
+
+ public void testAddIpPermissionGroupFromIpPermission() {
+ HttpRequest addRule = HttpRequest.builder().method("GET")
+ .endpoint("http://localhost:8080/client/api")
+ .addQueryParam("response", "json")
+ .addQueryParam("command", "authorizeSecurityGroupIngress")
+ .addQueryParam("securitygroupid", "13")
+ .addQueryParam("protocol", "TCP")
+ .addQueryParam("startport", "22")
+ .addQueryParam("endport", "22")
+ .addQueryParam("usersecuritygrouplist[0].account", "adrian")
+ .addQueryParam("usersecuritygrouplist[0].group", "adriancole")
+ .addQueryParam("apiKey", "APIKEY")
+ .addQueryParam("signature", "v2OgKc2IftwX9pfKq2Pw/Z2xh9w%3D")
+ .addHeader("Accept", "application/json")
+ .build();
+
+
+ HttpResponse getWithRuleResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/getsecuritygroupresponse_extension_byid_with_group.json"))
+ .build();
+
+ SecurityGroupExtension extension = orderedRequestsSendResponses(
+ ImmutableList.of(addRule, queryAsyncJobResultAuthorizeIngress, getWithRule),
+ ImmutableList.of(addRuleResponse, queryAsyncJobResultAuthorizeIngressResponse, getWithRuleResponse)
+ ).getSecurityGroupExtension().get();
+
+ IpPermission.Builder builder = IpPermission.builder();
+
+ builder.ipProtocol(IpProtocol.TCP);
+ builder.fromPort(22);
+ builder.toPort(22);
+ builder.tenantIdGroupNamePair("adrian", "adriancole");
+
+ IpPermission perm = builder.build();
+
+ SecurityGroup origGroup = new SecurityGroupBuilder().id("13").build();
+
+ SecurityGroup newGroup = extension.addIpPermission(perm, origGroup);
+
+ assertEquals(1, newGroup.getIpPermissions().size());
+
+ IpPermission newPerm = Iterables.getOnlyElement(newGroup.getIpPermissions());
+
+ assertNotNull(newPerm);
+ assertEquals(newPerm.getIpProtocol(), IpProtocol.TCP);
+ assertEquals(newPerm.getFromPort(), 22);
+ assertEquals(newPerm.getToPort(), 22);
+ assertEquals(newPerm.getCidrBlocks().size(), 0);
+ assertEquals(newPerm.getTenantIdGroupNamePairs().size(), 1);
+ assertTrue(newPerm.getTenantIdGroupNamePairs().containsEntry("adrian", "adriancole"));
+ }
+
+ public void testAddIpPermissionGroupFromParams() {
+ HttpRequest addRule = HttpRequest.builder().method("GET")
+ .endpoint("http://localhost:8080/client/api")
+ .addQueryParam("response", "json")
+ .addQueryParam("command", "authorizeSecurityGroupIngress")
+ .addQueryParam("securitygroupid", "13")
+ .addQueryParam("protocol", "TCP")
+ .addQueryParam("startport", "22")
+ .addQueryParam("endport", "22")
+ .addQueryParam("usersecuritygrouplist[0].account", "adrian")
+ .addQueryParam("usersecuritygrouplist[0].group", "adriancole")
+ .addQueryParam("apiKey", "APIKEY")
+ .addQueryParam("signature", "v2OgKc2IftwX9pfKq2Pw/Z2xh9w%3D")
+ .addHeader("Accept", "application/json")
+ .build();
+
+
+ HttpResponse getWithRuleResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/getsecuritygroupresponse_extension_byid_with_group.json"))
+ .build();
+
+ SecurityGroupExtension extension = orderedRequestsSendResponses(
+ ImmutableList.of(addRule, queryAsyncJobResultAuthorizeIngress, getWithRule),
+ ImmutableList.of(addRuleResponse, queryAsyncJobResultAuthorizeIngressResponse, getWithRuleResponse)
+ ).getSecurityGroupExtension().get();
+
+ ImmutableMultimap.Builder<String, String> permBuilder = ImmutableMultimap.builder();
+ permBuilder.put("adrian", "adriancole");
+
+ SecurityGroup origGroup = new SecurityGroupBuilder().id("13").build();
+
+ SecurityGroup newGroup = extension.addIpPermission(IpProtocol.TCP, 22, 22,
+ permBuilder.build(), emptyStringSet(), emptyStringSet(), origGroup);
+
+ assertEquals(1, newGroup.getIpPermissions().size());
+
+ IpPermission newPerm = Iterables.getOnlyElement(newGroup.getIpPermissions());
+
+ assertNotNull(newPerm);
+ assertEquals(newPerm.getIpProtocol(), IpProtocol.TCP);
+ assertEquals(newPerm.getFromPort(), 22);
+ assertEquals(newPerm.getToPort(), 22);
+ assertEquals(newPerm.getCidrBlocks().size(), 0);
+ assertEquals(newPerm.getTenantIdGroupNamePairs().size(), 1);
+ assertTrue(newPerm.getTenantIdGroupNamePairs().containsEntry("adrian", "adriancole"));
+ }
+
+ public void testRemoveIpPermissionCidrFromIpPermission() {
+ HttpRequest revokeRule = HttpRequest.builder().method("GET")
+ .endpoint("http://localhost:8080/client/api")
+ .addQueryParam("response", "json")
+ .addQueryParam("command", "revokeSecurityGroupIngress")
+ .addQueryParam("id", "6")
+ .addQueryParam("apiKey", "APIKEY")
+ .addQueryParam("signature", "H7cY/MEYGN7df1hiz0mMAFVBfa8%3D")
+ .addHeader("Accept", "application/json")
+ .build();
+
+ HttpResponse getWithRuleResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/getsecuritygroupresponse_extension_byid_with_cidr.json"))
+ .build();
+
+ SecurityGroupExtension extension = orderedRequestsSendResponses(
+ ImmutableList.of(getWithRule, revokeRule, queryAsyncJobResultAuthorizeIngress, getWithRule),
+ ImmutableList.of(getWithRuleResponse, revokeRuleResponse,
+ queryAsyncJobResultAuthorizeIngressResponse, getEmptyResponse)
+ ).getSecurityGroupExtension().get();
+
+ IpPermission.Builder builder = IpPermission.builder();
+
+ builder.ipProtocol(IpProtocol.UDP);
+ builder.fromPort(11);
+ builder.toPort(11);
+ builder.cidrBlock("1.1.1.1/24");
+
+ IpPermission perm = builder.build();
+
+ SecurityGroup origGroup = new SecurityGroupBuilder().id("13").build();
+
+ SecurityGroup newGroup = extension.removeIpPermission(perm, origGroup);
+
+ assertEquals(newGroup.getIpPermissions().size(), 0);
+ }
+
+ public void testRemoveIpPermissionCidrFromParams() {
+ HttpRequest revokeRule = HttpRequest.builder().method("GET")
+ .endpoint("http://localhost:8080/client/api")
+ .addQueryParam("response", "json")
+ .addQueryParam("command", "revokeSecurityGroupIngress")
+ .addQueryParam("id", "6")
+ .addQueryParam("apiKey", "APIKEY")
+ .addQueryParam("signature", "H7cY/MEYGN7df1hiz0mMAFVBfa8%3D")
+ .addHeader("Accept", "application/json")
+ .build();
+
+ HttpResponse getWithRuleResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/getsecuritygroupresponse_extension_byid_with_cidr.json"))
+ .build();
+
+ SecurityGroupExtension extension = orderedRequestsSendResponses(
+ ImmutableList.of(getWithRule, revokeRule, queryAsyncJobResultAuthorizeIngress, getWithRule),
+ ImmutableList.of(getWithRuleResponse, revokeRuleResponse,
+ queryAsyncJobResultAuthorizeIngressResponse, getEmptyResponse)
+ ).getSecurityGroupExtension().get();
+
+
+ SecurityGroup origGroup = new SecurityGroupBuilder().id("13").build();
+
+ SecurityGroup newGroup = extension.removeIpPermission(IpProtocol.UDP, 11, 11, emptyMultimap(),
+ ImmutableSet.of("1.1.1.1/24"), emptyStringSet(), origGroup);
+
+ assertEquals(newGroup.getIpPermissions().size(), 0);
+ }
+
+ public void testRemoveIpPermissionGroupFromIpPermission() {
+ HttpRequest revokeRule = HttpRequest.builder().method("GET")
+ .endpoint("http://localhost:8080/client/api")
+ .addQueryParam("response", "json")
+ .addQueryParam("command", "revokeSecurityGroupIngress")
+ .addQueryParam("id", "5")
+ .addQueryParam("apiKey", "APIKEY")
+ .addQueryParam("signature", "bEzvrLtO7aEWkIqJgUeTnd%2B0XbY%3D")
+ .addHeader("Accept", "application/json")
+ .build();
+
+ HttpResponse getWithRuleResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/getsecuritygroupresponse_extension_byid_with_group.json"))
+ .build();
+
+ SecurityGroupExtension extension = orderedRequestsSendResponses(
+ ImmutableList.of(getWithRule, revokeRule, queryAsyncJobResultAuthorizeIngress, getWithRule),
+ ImmutableList.of(getWithRuleResponse, revokeRuleResponse,
+ queryAsyncJobResultAuthorizeIngressResponse, getEmptyResponse)
+ ).getSecurityGroupExtension().get();
+
+ IpPermission.Builder builder = IpPermission.builder();
+
+ builder.ipProtocol(IpProtocol.TCP);
+ builder.fromPort(22);
+ builder.toPort(22);
+ builder.tenantIdGroupNamePair("adrian", "adriancole");
+
+ IpPermission perm = builder.build();
+
+ SecurityGroup origGroup = new SecurityGroupBuilder().id("13").build();
+
+ SecurityGroup newGroup = extension.removeIpPermission(perm, origGroup);
+
+ assertEquals(newGroup.getIpPermissions().size(), 0);
+ }
+
+ public void testRemoveIpPermissionGroupFromParams() {
+ HttpRequest revokeRule = HttpRequest.builder().method("GET")
+ .endpoint("http://localhost:8080/client/api")
+ .addQueryParam("response", "json")
+ .addQueryParam("command", "revokeSecurityGroupIngress")
+ .addQueryParam("id", "5")
+ .addQueryParam("apiKey", "APIKEY")
+ .addQueryParam("signature", "bEzvrLtO7aEWkIqJgUeTnd%2B0XbY%3D")
+ .addHeader("Accept", "application/json")
+ .build();
+
+ HttpResponse getWithRuleResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/getsecuritygroupresponse_extension_byid_with_group.json"))
+ .build();
+
+ SecurityGroupExtension extension = orderedRequestsSendResponses(
+ ImmutableList.of(getWithRule, revokeRule, queryAsyncJobResultAuthorizeIngress, getWithRule),
+ ImmutableList.of(getWithRuleResponse, revokeRuleResponse,
+ queryAsyncJobResultAuthorizeIngressResponse, getEmptyResponse)
+ ).getSecurityGroupExtension().get();
+
+ ImmutableMultimap.Builder<String, String> permBuilder = ImmutableMultimap.builder();
+ permBuilder.put("adrian", "adriancole");
+
+ SecurityGroup origGroup = new SecurityGroupBuilder().id("13").build();
+
+ SecurityGroup newGroup = extension.removeIpPermission(IpProtocol.TCP, 22, 22,
+ permBuilder.build(), emptyStringSet(), emptyStringSet(), origGroup);
+
+ assertEquals(newGroup.getIpPermissions().size(), 0);
+ }
+
+ @Override
+ public ComputeService createClient(Function<HttpRequest, HttpResponse> fn, Module module, Properties props) {
+ return clientFrom(createInjector(fn, module, props).getInstance(CloudStackContext.class));
+ }
+
+ @Override
+ protected ComputeService clientFrom(CloudStackContext context) {
+ return context.getComputeService();
+ }
+
+ private Multimap<String, String> emptyMultimap() {
+ return LinkedHashMultimap.create();
+ }
+
+ private Set<String> emptyStringSet() {
+ return Sets.newLinkedHashSet();
+ }
+
+}
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/compute/extensions/CloudStackSecurityGroupExtensionLiveTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/extensions/CloudStackSecurityGroupExtensionLiveTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/extensions/CloudStackSecurityGroupExtensionLiveTest.java
new file mode 100644
index 0000000..af5b0fb
--- /dev/null
+++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/extensions/CloudStackSecurityGroupExtensionLiveTest.java
@@ -0,0 +1,65 @@
+/*
+ * 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.compute.extensions;
+
+import org.jclouds.cloudstack.CloudStackApi;
+import org.jclouds.cloudstack.domain.Zone;
+import org.jclouds.compute.domain.Template;
+import org.jclouds.compute.extensions.internal.BaseSecurityGroupExtensionLiveTest;
+import org.jclouds.sshj.config.SshjSshClientModule;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import com.google.inject.Module;
+
+/**
+ * Live test for CloudStack {@link org.jclouds.compute.extensions.SecurityGroupExtension} implementation.
+ */
+@Test(groups = "live", singleThreaded = true, testName = "CloudStackSecurityGroupExtensionLiveTest")
+public class CloudStackSecurityGroupExtensionLiveTest extends BaseSecurityGroupExtensionLiveTest {
+
+ protected Zone zone;
+
+ public CloudStackSecurityGroupExtensionLiveTest() {
+ provider = "cloudstack";
+ }
+
+ @BeforeClass(groups = { "integration", "live" })
+ public void setupContext() {
+ super.setupContext();
+
+ CloudStackApi api = view.unwrapApi(CloudStackApi.class);
+ for (Zone z : api.getZoneApi().listZones()) {
+ if (z.isSecurityGroupsEnabled()) {
+ zone = z;
+ break;
+ }
+ }
+
+ if (zone == null)
+ securityGroupsSupported = false;
+ }
+
+ protected Module getSshModule() {
+ return new SshjSshClientModule();
+ }
+
+ @Override
+ public Template getNodeTemplate() {
+ return view.getComputeService().templateBuilder().locationId(zone.getId()).build();
+ }
+}
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/compute/functions/CloudStackSecurityGroupToSecurityGroupTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/functions/CloudStackSecurityGroupToSecurityGroupTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/functions/CloudStackSecurityGroupToSecurityGroupTest.java
new file mode 100644
index 0000000..6b9122a
--- /dev/null
+++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/functions/CloudStackSecurityGroupToSecurityGroupTest.java
@@ -0,0 +1,72 @@
+/*
+ * 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.compute.functions;
+
+import static com.google.common.collect.Iterables.transform;
+import static org.testng.Assert.assertEquals;
+
+
+import org.jclouds.compute.domain.SecurityGroup;
+import org.jclouds.net.domain.IpProtocol;
+import org.jclouds.cloudstack.domain.IngressRule;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSet;
+
+@Test(groups = "unit", testName = "CloudStackSecurityGroupToSecurityGroupTest")
+public class CloudStackSecurityGroupToSecurityGroupTest {
+
+ private static final IngressRuleToIpPermission ruleConverter = new IngressRuleToIpPermission();
+
+ @Test
+ public void testApply() {
+ IngressRule ruleToConvert = IngressRule.builder()
+ .id("some-id")
+ .account("some-account")
+ .securityGroupName("some-group-name")
+ .protocol(IpProtocol.TCP.toString())
+ .startPort(10)
+ .endPort(20)
+ .CIDR("0.0.0.0/0")
+ .build();
+
+ org.jclouds.cloudstack.domain.SecurityGroup origGroup = org.jclouds.cloudstack.domain.SecurityGroup.builder()
+ .id("some-id")
+ .name("some-group")
+ .description("some-description")
+ .account("some-account")
+ .ingressRules(ImmutableSet.of(ruleToConvert))
+ .build();
+
+ CloudStackSecurityGroupToSecurityGroup parser = createGroupParser();
+
+ SecurityGroup group = parser.apply(origGroup);
+
+ assertEquals(group.getId(), origGroup.getId());
+ assertEquals(group.getProviderId(), origGroup.getId());
+ assertEquals(group.getName(), origGroup.getName());
+ assertEquals(group.getOwnerId(), origGroup.getAccount());
+ assertEquals(group.getIpPermissions(), ImmutableSet.copyOf(transform(origGroup.getIngressRules(), ruleConverter)));
+ }
+
+ private CloudStackSecurityGroupToSecurityGroup createGroupParser() {
+ CloudStackSecurityGroupToSecurityGroup parser = new CloudStackSecurityGroupToSecurityGroup(ruleConverter);
+
+ return parser;
+ }
+
+}
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/compute/functions/IngressRuleToIpPermissionTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/functions/IngressRuleToIpPermissionTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/functions/IngressRuleToIpPermissionTest.java
new file mode 100644
index 0000000..aedf310
--- /dev/null
+++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/functions/IngressRuleToIpPermissionTest.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.compute.functions;
+
+import static org.testng.Assert.assertEquals;
+
+import org.jclouds.cloudstack.domain.IngressRule;
+import org.jclouds.net.domain.IpPermission;
+import org.jclouds.net.domain.IpProtocol;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSet;
+
+
+/**
+ * Tests for the function for transforming a cloudstack specific IngressRule into a generic
+ * IpPermission object.
+ */
+public class IngressRuleToIpPermissionTest {
+
+ @Test
+ public void testApplyWithTCP() {
+ IngressRule ruleToConvert = IngressRule.builder()
+ .id("some-id")
+ .account("some-account")
+ .securityGroupName("some-group-name")
+ .protocol(IpProtocol.TCP.toString())
+ .startPort(10)
+ .endPort(20)
+ .CIDR("0.0.0.0/0")
+ .build();
+
+ IngressRuleToIpPermission converter = new IngressRuleToIpPermission();
+
+ IpPermission convertedPerm = converter.apply(ruleToConvert);
+
+ assertEquals(convertedPerm.getIpProtocol(), IpProtocol.fromValue(ruleToConvert.getProtocol()));
+ assertEquals(convertedPerm.getFromPort(), ruleToConvert.getStartPort());
+ assertEquals(convertedPerm.getToPort(), ruleToConvert.getEndPort());
+ assertEquals(convertedPerm.getCidrBlocks(), ImmutableSet.of("0.0.0.0/0"));
+ assertEquals(convertedPerm.getTenantIdGroupNamePairs().size(), 1);
+ assertEquals(convertedPerm.getGroupIds().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/compute/functions/ServiceOfferingToHardwareTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/functions/ServiceOfferingToHardwareTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/functions/ServiceOfferingToHardwareTest.java
new file mode 100644
index 0000000..827d8ce
--- /dev/null
+++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/functions/ServiceOfferingToHardwareTest.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.compute.functions;
+
+import static org.testng.AssertJUnit.assertEquals;
+
+import java.util.Set;
+
+import org.jclouds.cloudstack.domain.ServiceOffering;
+import org.jclouds.cloudstack.parse.ListServiceOfferingsResponseTest;
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.HardwareBuilder;
+import org.jclouds.compute.domain.Processor;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+
+/**
+ * Tests {@code ServiceOfferingToHardware}
+ */
+@Test(groups = "unit")
+public class ServiceOfferingToHardwareTest {
+
+ static ServiceOfferingToHardware function = new ServiceOfferingToHardware();
+ static Hardware one = new HardwareBuilder().ids("1").name("Small Instance")
+ .processors(ImmutableList.of(new Processor(1, 500))).ram(512).build();
+ static Hardware two = new HardwareBuilder().ids("2").name("Medium Instance")
+ .processors(ImmutableList.of(new Processor(1, 1000))).ram(1024).build();
+
+ @Test
+ public void test() {
+
+ Set<Hardware> expected = ImmutableSet.of(one, two);
+
+ Set<ServiceOffering> offerings = new ListServiceOfferingsResponseTest().expected();
+
+ Iterable<Hardware> profiles = Iterables.transform(offerings, function);
+
+ assertEquals(profiles.toString(), expected.toString());
+ }
+
+}
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/compute/functions/TemplateToImageTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/functions/TemplateToImageTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/functions/TemplateToImageTest.java
new file mode 100644
index 0000000..11c9d9e
--- /dev/null
+++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/functions/TemplateToImageTest.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.compute.functions;
+
+import static org.testng.AssertJUnit.assertEquals;
+
+import java.util.Set;
+
+import org.jclouds.cloudstack.domain.Template;
+import org.jclouds.cloudstack.parse.ListTemplatesResponseTest;
+import org.jclouds.compute.domain.Image;
+import org.jclouds.compute.domain.Image.Status;
+import org.jclouds.compute.domain.ImageBuilder;
+import org.jclouds.domain.Location;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+
+/**
+ * Tests {@code TemplateToImage}
+ */
+@Test(groups = "unit")
+public class TemplateToImageTest {
+ static Supplier<Set<? extends Location>> locationSupplier = Suppliers
+ .<Set<? extends Location>> ofInstance(ImmutableSet.<Location> of(ZoneToLocationTest.one,
+ ZoneToLocationTest.two));
+
+ static TemplateToImage function = new TemplateToImage(locationSupplier, TemplateToOperatingSystemTest.function);
+
+ // location free image
+ static Image one = new ImageBuilder().id("2").providerId("2").name("CentOS 5.3(64-bit) no GUI (XenServer)")
+ .operatingSystem(TemplateToOperatingSystemTest.one).description("CentOS 5.3(64-bit) no GUI (XenServer)")
+ .status(Status.AVAILABLE).build();
+ // location free image
+ static Image two = new ImageBuilder().id("4").providerId("4").name("CentOS 5.5(64-bit) no GUI (KVM)")
+ .operatingSystem(TemplateToOperatingSystemTest.two).description("CentOS 5.5(64-bit) no GUI (KVM)")
+ .status(Status.AVAILABLE).build();
+ static Image three = new ImageBuilder().id("203").providerId("203").name("Windows 7 KVM")
+ .operatingSystem(TemplateToOperatingSystemTest.three).description("Windows 7 KVM")
+ .location(ZoneToLocationTest.two).status(Status.AVAILABLE).build();
+ // location free image
+ static Image four = new ImageBuilder().id("7").providerId("7").name("CentOS 5.3(64-bit) no GUI (vSphere)")
+ .operatingSystem(TemplateToOperatingSystemTest.four).description("CentOS 5.3(64-bit) no GUI (vSphere)")
+ .status(Status.AVAILABLE).build();
+ static Image five = new ImageBuilder().id("241").providerId("241").name("kvmdev4")
+ .operatingSystem(TemplateToOperatingSystemTest.five).description("v5.6.28_Dev4")
+ .location(ZoneToLocationTest.two).status(Status.AVAILABLE).build();
+
+ @Test
+ public void test() {
+
+ Set<Image> expected = ImmutableSet.of(one, two, three, four, five);
+
+ Set<Template> offerings = new ListTemplatesResponseTest().expected();
+
+ Iterable<Image> profiles = Iterables.transform(offerings, function);
+
+ assertEquals(profiles.toString(), expected.toString());
+ }
+
+}
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/compute/functions/TemplateToOperatingSystemTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/functions/TemplateToOperatingSystemTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/functions/TemplateToOperatingSystemTest.java
new file mode 100644
index 0000000..3877807
--- /dev/null
+++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/functions/TemplateToOperatingSystemTest.java
@@ -0,0 +1,86 @@
+/*
+ * 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.compute.functions;
+
+import static org.testng.AssertJUnit.assertEquals;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.jclouds.cloudstack.domain.OSType;
+import org.jclouds.cloudstack.domain.Template;
+import org.jclouds.cloudstack.parse.ListOSCategoriesResponseTest;
+import org.jclouds.cloudstack.parse.ListOSTypesResponseTest;
+import org.jclouds.cloudstack.parse.ListTemplatesResponseTest;
+import org.jclouds.compute.config.BaseComputeServiceContextModule;
+import org.jclouds.compute.domain.OperatingSystem;
+import org.jclouds.compute.domain.OsFamily;
+import org.jclouds.compute.reference.ComputeServiceConstants;
+import org.jclouds.json.Json;
+import org.jclouds.json.config.GsonModule;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Function;
+import com.google.common.base.Suppliers;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Maps;
+import com.google.inject.Guice;
+
+/**
+ * Tests {@code TemplateToOperatingSystem}
+ */
+@Test(groups = "unit")
+public class TemplateToOperatingSystemTest {
+ static Map<String, OSType> ostypes = Maps.<String, OSType> uniqueIndex(new ListOSTypesResponseTest().expected(),
+ new Function<OSType, String>() {
+
+ @Override
+ public String apply(OSType arg0) {
+ return arg0.getId();
+ }
+ });
+
+ static TemplateToOperatingSystem function = new TemplateToOperatingSystem(Suppliers.ofInstance(ostypes),
+ Suppliers.ofInstance(new ListOSCategoriesResponseTest().expected()), new BaseComputeServiceContextModule() {
+ }.provideOsVersionMap(new ComputeServiceConstants.ReferenceData(), Guice.createInjector(new GsonModule())
+ .getInstance(Json.class)));
+
+ static OperatingSystem one = OperatingSystem.builder().name("CentOS").family(OsFamily.CENTOS).is64Bit(false)
+ .version("5.3").description("CentOS 5.3 (32-bit)").build();
+ static OperatingSystem two = OperatingSystem.builder().name("CentOS").family(OsFamily.CENTOS).is64Bit(true)
+ .version("5.5").description("CentOS 5.5 (64-bit)").build();
+ static OperatingSystem three = OperatingSystem.builder().name("Windows").family(OsFamily.WINDOWS).is64Bit(false)
+ .version("7").description("Windows 7 (32-bit)").build();
+ static OperatingSystem four = OperatingSystem.builder().name("CentOS").family(OsFamily.CENTOS).is64Bit(true)
+ .version("5.3").description("CentOS 5.3 (64-bit)").build();
+ static OperatingSystem five = OperatingSystem.builder().name("CentOS").family(OsFamily.CENTOS).is64Bit(true)
+ .version("5.4").description("CentOS 5.4 (64-bit)").build();
+
+ @Test
+ public void test() {
+
+ Set<OperatingSystem> expected = ImmutableSet.of(one, two, three, four, five);
+
+ Set<Template> offerings = new ListTemplatesResponseTest().expected();
+
+ Iterable<OperatingSystem> profiles = Iterables.transform(offerings, function);
+
+ assertEquals(profiles.toString(), expected.toString());
+ }
+
+}
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/compute/functions/VirtualMachineToNodeMetadataTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/functions/VirtualMachineToNodeMetadataTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/functions/VirtualMachineToNodeMetadataTest.java
new file mode 100644
index 0000000..6c055f7
--- /dev/null
+++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/functions/VirtualMachineToNodeMetadataTest.java
@@ -0,0 +1,187 @@
+/*
+ * 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.compute.functions;
+
+import static org.testng.Assert.assertEquals;
+
+import java.net.UnknownHostException;
+import java.util.Set;
+
+import org.jclouds.cloudstack.domain.GuestIPType;
+import org.jclouds.cloudstack.domain.IPForwardingRule;
+import org.jclouds.cloudstack.domain.NIC;
+import org.jclouds.cloudstack.domain.TrafficType;
+import org.jclouds.cloudstack.domain.VirtualMachine;
+import org.jclouds.cloudstack.parse.ListVirtualMachinesResponseTest;
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.HardwareBuilder;
+import org.jclouds.compute.domain.Image;
+import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.domain.NodeMetadata.Status;
+import org.jclouds.compute.domain.NodeMetadataBuilder;
+import org.jclouds.compute.functions.GroupNamingConvention;
+import org.jclouds.date.internal.SimpleDateFormatDateService;
+import org.jclouds.domain.Location;
+import org.jclouds.rest.ResourceNotFoundException;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.inject.Guice;
+
+@Test(groups = "unit", testName = "VirtualMachineToNodeMetadataTest")
+public class VirtualMachineToNodeMetadataTest {
+
+ GroupNamingConvention.Factory namingConvention = Guice.createInjector().getInstance(GroupNamingConvention.Factory.class);
+
+ @Test
+ public void testApplyWhereVirtualMachineWithIPForwardingRule() throws UnknownHostException {
+
+ Supplier<Set<? extends Location>> locationSupplier = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
+ .<Location>of(ZoneToLocationTest.one, ZoneToLocationTest.two));
+
+ Supplier<Set<? extends Image>> imageSupplier = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet
+ .<Image>of(TemplateToImageTest.one, TemplateToImageTest.two));
+ VirtualMachineToNodeMetadata parser = new VirtualMachineToNodeMetadata(locationSupplier, imageSupplier,
+ CacheBuilder.newBuilder().<String, Set<IPForwardingRule>> build(
+ new CacheLoader<String, Set<IPForwardingRule>>() {
+ @Override
+ public Set<IPForwardingRule> load(String arg0) throws Exception {
+ return ImmutableSet.of(IPForwardingRule.builder().id("1234l").IPAddress("1.1.1.1").build());
+ }
+ }), namingConvention);
+
+ // notice if we've already parsed this properly here, we can rely on it.
+ VirtualMachine guest = Iterables.get(new ListVirtualMachinesResponseTest().expected(), 0);
+
+ NodeMetadata node = parser.apply(guest);
+
+ assertEquals(
+ node.toString(),
+ new NodeMetadataBuilder().id("54").providerId("54").name("i-3-54-VM").group("i-3-54")
+ .location(ZoneToLocationTest.one).status(Status.PENDING).hostname("i-3-54-VM")
+ .privateAddresses(ImmutableSet.of("10.1.1.18")).publicAddresses(ImmutableSet.of("1.1.1.1"))
+ .hardware(addHypervisor(ServiceOfferingToHardwareTest.one, "XenServer"))
+ .imageId(TemplateToImageTest.one.getId())
+ .operatingSystem(TemplateToImageTest.one.getOperatingSystem()).build().toString());
+
+ }
+
+ @Test
+ public void testApplyWhereVirtualMachineHasNoIpForwardingRuleAndAPublicIP() throws UnknownHostException {
+
+ Supplier<Set<? extends Location>> locationSupplier = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
+ .<Location>of(ZoneToLocationTest.one, ZoneToLocationTest.two));
+
+ Supplier<Set<? extends Image>> imageSupplier = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet
+ .<Image>of(TemplateToImageTest.one, TemplateToImageTest.two));
+
+ VirtualMachineToNodeMetadata parser = new VirtualMachineToNodeMetadata(locationSupplier, imageSupplier,
+ CacheBuilder.newBuilder().<String, Set<IPForwardingRule>> build(
+ new CacheLoader<String, Set<IPForwardingRule>>() {
+ @Override
+ public Set<IPForwardingRule> load(String arg0) throws Exception {
+ return ImmutableSet.of();
+ }
+ }), namingConvention);
+
+ VirtualMachine guest = VirtualMachine.builder()
+ .id("54")
+ .name("i-3-54-VM")
+ .displayName("i-3-54-VM")
+ .account("adrian")
+ .domainId("1")
+ .domain("ROOT")
+ .created(new SimpleDateFormatDateService().iso8601SecondsDateParse("2011-02-16T14:28:37-0800"))
+ .state(VirtualMachine.State.STARTING)
+ .isHAEnabled(false)
+ .zoneId("1")
+ .zoneName("San Jose 1")
+ .templateId("2")
+ .templateName("CentOS 5.3(64-bit) no GUI (XenServer)")
+ .templateDisplayText("CentOS 5.3(64-bit) no GUI (XenServer)")
+ .passwordEnabled(false)
+ .serviceOfferingId("1")
+ .serviceOfferingName("Small Instance")
+ .cpuCount(1)
+ .cpuSpeed(500)
+ .memory(512)
+ .guestOSId("11")
+ .rootDeviceId("0")
+ .rootDeviceType("NetworkFilesystem")
+ .jobId("63l")
+ .jobStatus(0)
+ .nics(ImmutableSet.of(NIC.builder().id("72").networkId("204").netmask("255.255.255.0").gateway("1.1.1.1")
+ .IPAddress("1.1.1.5").trafficType(TrafficType.GUEST).guestIPType(GuestIPType.VIRTUAL)
+ .isDefault(true).build())).hypervisor("XenServer").build();
+
+ NodeMetadata node = parser.apply(guest);
+
+ assertEquals(
+ node.toString(),
+ new NodeMetadataBuilder().id("54").providerId("54").name("i-3-54-VM").group("i-3-54")
+ .location(ZoneToLocationTest.one).status(Status.PENDING).hostname("i-3-54-VM")
+ .privateAddresses(ImmutableSet.<String>of())
+ .publicAddresses(ImmutableSet.<String>of("1.1.1.5"))
+ .hardware(addHypervisor(ServiceOfferingToHardwareTest.one, "XenServer"))
+ .imageId(TemplateToImageTest.one.getId())
+ .operatingSystem(TemplateToImageTest.one.getOperatingSystem()).build().toString());
+ }
+
+ @Test
+ public void testApplyWhereVirtualMachineWithNoPassword() throws UnknownHostException {
+
+ Supplier<Set<? extends Location>> locationSupplier = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
+ .<Location>of(ZoneToLocationTest.one, ZoneToLocationTest.two));
+
+ Supplier<Set<? extends Image>> imageSupplier = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet
+ .<Image>of(TemplateToImageTest.one, TemplateToImageTest.two));
+ VirtualMachineToNodeMetadata parser = new VirtualMachineToNodeMetadata(locationSupplier, imageSupplier,
+ CacheBuilder.newBuilder().<String, Set<IPForwardingRule>> build(
+ new CacheLoader<String, Set<IPForwardingRule>>() {
+
+ @Override
+ public Set<IPForwardingRule> load(String arg0) throws Exception {
+ throw new ResourceNotFoundException("no ip forwarding rule for: " + arg0);
+ }
+
+ }), namingConvention);
+
+ // notice if we've already parsed this properly here, we can rely on it.
+ VirtualMachine guest = Iterables.get(new ListVirtualMachinesResponseTest().expected(), 0);
+
+ NodeMetadata node = parser.apply(guest);
+
+ assertEquals(
+ node.toString(),
+ new NodeMetadataBuilder().id("54").providerId("54").name("i-3-54-VM").group("i-3-54")
+ .location(ZoneToLocationTest.one).status(Status.PENDING).hostname("i-3-54-VM")
+ .privateAddresses(ImmutableSet.of("10.1.1.18"))
+ .hardware(addHypervisor(ServiceOfferingToHardwareTest.one, "XenServer"))
+ .imageId(TemplateToImageTest.one.getId())
+ .operatingSystem(TemplateToImageTest.one.getOperatingSystem()).build().toString());
+ }
+
+ protected Hardware addHypervisor(Hardware in, String hypervisor) {
+ return HardwareBuilder.fromHardware(in).hypervisor(hypervisor).build();
+ }
+
+}
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/compute/functions/ZoneToLocationTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/functions/ZoneToLocationTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/functions/ZoneToLocationTest.java
new file mode 100644
index 0000000..ab8c239
--- /dev/null
+++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/functions/ZoneToLocationTest.java
@@ -0,0 +1,61 @@
+/*
+ * 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.compute.functions;
+
+import static org.testng.AssertJUnit.assertEquals;
+
+import java.net.URI;
+import java.util.Set;
+
+import org.jclouds.cloudstack.domain.Zone;
+import org.jclouds.cloudstack.parse.ListZonesResponseTest;
+import org.jclouds.domain.Location;
+import org.jclouds.domain.LocationBuilder;
+import org.jclouds.domain.LocationScope;
+import org.jclouds.location.suppliers.all.JustProvider;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Suppliers;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+
+/**
+ * Tests {@code ZoneToLocation}
+ */
+@Test(singleThreaded = true, groups = "unit")
+public class ZoneToLocationTest {
+
+ public static final JustProvider justProvider = new JustProvider("cloudstack", Suppliers.ofInstance(URI.create("foo")),
+ ImmutableSet.<String> of());
+ public static final ZoneToLocation function = new ZoneToLocation(justProvider);
+ public static final Location one = new LocationBuilder().parent(Iterables.get(justProvider.get(), 0)).scope(LocationScope.ZONE)
+ .description("San Jose 1").id("1").build();
+ public static final Location two = new LocationBuilder().parent(Iterables.get(justProvider.get(), 0)).scope(LocationScope.ZONE)
+ .description("Chicago").id("2").build();
+
+ @Test
+ public void test() {
+
+ Set<Location> expected = ImmutableSet.of(one, two);
+
+ Set<Zone> zones = new ListZonesResponseTest().expected();
+
+ Iterable<Location> locations = Iterables.transform(zones, function);
+
+ assertEquals(locations.toString(), expected.toString());
+ }
+}
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/compute/loaders/CreateUniqueKeyPairTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/loaders/CreateUniqueKeyPairTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/loaders/CreateUniqueKeyPairTest.java
new file mode 100644
index 0000000..1fbddae
--- /dev/null
+++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/loaders/CreateUniqueKeyPairTest.java
@@ -0,0 +1,69 @@
+/*
+ * 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.compute.loaders;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.testng.Assert.assertEquals;
+
+import java.net.UnknownHostException;
+
+import org.jclouds.cloudstack.CloudStackApi;
+import org.jclouds.cloudstack.domain.SshKeyPair;
+import org.jclouds.cloudstack.features.SSHKeyPairApi;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.TypeLiteral;
+
+@Test(groups = "unit", testName = "CreateUniqueKeyPairTest")
+public class CreateUniqueKeyPairTest {
+
+ @Test
+ public void testLoad() throws UnknownHostException {
+ final CloudStackApi client = createMock(CloudStackApi.class);
+ SSHKeyPairApi keyClient = createMock(SSHKeyPairApi.class);
+
+ SshKeyPair pair = createMock(SshKeyPair.class);
+
+ expect(client.getSSHKeyPairApi()).andReturn(keyClient);
+ expect(keyClient.createSSHKeyPair("group-1")).andReturn(pair);
+
+ replay(client, keyClient);
+
+ CreateUniqueKeyPair parser = Guice.createInjector(new AbstractModule() {
+
+ @Override
+ protected void configure() {
+ bind(new TypeLiteral<Supplier<String>>() {
+ }).toInstance(Suppliers.ofInstance("1"));
+ bind(CloudStackApi.class).toInstance(client);
+ }
+
+ }).getInstance(CreateUniqueKeyPair.class);
+
+ assertEquals(parser.load("group-1"), pair);
+
+ verify(client, keyClient);
+ }
+
+}
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/compute/loaders/FindSecurityGroupOrCreateTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/loaders/FindSecurityGroupOrCreateTest.java b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/loaders/FindSecurityGroupOrCreateTest.java
new file mode 100644
index 0000000..87fabd8
--- /dev/null
+++ b/dependencies/jclouds/apis/cloudstack/1.8.0-stratos/src/test/java/org/jclouds/cloudstack/compute/loaders/FindSecurityGroupOrCreateTest.java
@@ -0,0 +1,257 @@
+/*
+ * 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.compute.loaders;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL;
+import static org.jclouds.util.Predicates2.retry;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.testng.Assert.assertEquals;
+
+import java.net.UnknownHostException;
+import javax.inject.Singleton;
+
+import org.jclouds.cloudstack.CloudStackApi;
+import org.jclouds.cloudstack.domain.IngressRule;
+import org.jclouds.cloudstack.domain.SecurityGroup;
+import org.jclouds.cloudstack.domain.Zone;
+import org.jclouds.cloudstack.domain.ZoneAndName;
+import org.jclouds.cloudstack.domain.ZoneSecurityGroupNamePortsCidrs;
+import org.jclouds.cloudstack.features.AsyncJobApi;
+import org.jclouds.cloudstack.features.SecurityGroupApi;
+import org.jclouds.cloudstack.features.ZoneApi;
+import org.jclouds.cloudstack.functions.CreateSecurityGroupIfNeeded;
+import org.jclouds.cloudstack.functions.ZoneIdToZone;
+import org.jclouds.cloudstack.predicates.JobComplete;
+import org.jclouds.cloudstack.suppliers.ZoneIdToZoneSupplier;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Provides;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Names;
+
+@Test(groups = "unit", testName = "FindSecurityGroupOrCreateTest")
+public class FindSecurityGroupOrCreateTest {
+
+ @Test
+ public void testLoad() throws UnknownHostException {
+ final CloudStackApi client = createMock(CloudStackApi.class);
+ SecurityGroupApi secClient = createMock(SecurityGroupApi.class);
+ ZoneApi zoneClient = createMock(ZoneApi.class);
+ AsyncJobApi jobClient = createMock(AsyncJobApi.class);
+
+ SecurityGroup group = createMock(SecurityGroup.class);
+
+ Zone zone = createMock(Zone.class);
+
+ expect(group.getIngressRules()).andReturn(ImmutableSet.<IngressRule> of());
+ expect(group.getId()).andReturn("sec-1234").anyTimes();
+ expect(zone.isSecurityGroupsEnabled()).andReturn(true);
+
+ expect(client.getSecurityGroupApi()).andReturn(secClient)
+ .anyTimes();
+ expect(client.getZoneApi()).andReturn(zoneClient);
+ expect(client.getAsyncJobApi()).andReturn(jobClient).anyTimes();
+
+ expect(zoneClient.getZone("zone-1")).andReturn(zone);
+ expect(secClient.getSecurityGroupByName("group-1")).andReturn(null);
+ expect(secClient.createSecurityGroup("group-1")).andReturn(group);
+ expect(secClient.authorizeIngressPortsToCIDRs("sec-1234",
+ "TCP",
+ 22,
+ 22,
+ ImmutableSet.of("0.0.0.0/0"))).andReturn("job-1234");
+
+ replay(client, secClient, zoneClient, zone, group);
+
+ ZoneSecurityGroupNamePortsCidrs input = ZoneSecurityGroupNamePortsCidrs.builder()
+ .zone("zone-1")
+ .name("group-1")
+ .ports(ImmutableSet.of(22))
+ .cidrs(ImmutableSet.<String> of()).build();
+
+ FindSecurityGroupOrCreate parser = Guice.createInjector(new AbstractModule() {
+
+ @Override
+ protected void configure() {
+ bind(new TypeLiteral<Supplier<String>>() {
+ }).toInstance(Suppliers.ofInstance("1"));
+ bind(CloudStackApi.class).toInstance(client);
+ bind(new TypeLiteral<CacheLoader<String, Zone>>() {}).
+ to(ZoneIdToZone.class);
+ bind(new TypeLiteral<Supplier<LoadingCache<String, Zone>>>() {}).
+ to(ZoneIdToZoneSupplier.class);
+ bind(String.class).annotatedWith(Names.named(PROPERTY_SESSION_INTERVAL)).toInstance("60");
+
+ bind(new TypeLiteral<Function<ZoneSecurityGroupNamePortsCidrs, SecurityGroup>>() {
+ }).to(CreateSecurityGroupIfNeeded.class);
+
+ bind(new TypeLiteral<CacheLoader<ZoneAndName, SecurityGroup>>() {
+ }).to(FindSecurityGroupOrCreate.class);
+ }
+
+ @Provides
+ @Singleton
+ protected Predicate<String> jobComplete(JobComplete jobComplete) {
+ return retry(jobComplete, 1200, 1, 5, SECONDS);
+ }
+
+ }).getInstance(FindSecurityGroupOrCreate.class);
+
+ assertEquals(parser.load(input), group);
+
+ verify(client, secClient, zoneClient, zone, group);
+ }
+
+
+ @Test
+ public void testLoadAlreadyExists() throws UnknownHostException {
+ final CloudStackApi client = createMock(CloudStackApi.class);
+ SecurityGroupApi secClient = createMock(SecurityGroupApi.class);
+ ZoneApi zoneClient = createMock(ZoneApi.class);
+ AsyncJobApi jobClient = createMock(AsyncJobApi.class);
+
+ SecurityGroup group = createMock(SecurityGroup.class);
+
+ Zone zone = createMock(Zone.class);
+
+ expect(group.getId()).andReturn("sec-1234").anyTimes();
+
+ expect(client.getSecurityGroupApi()).andReturn(secClient)
+ .anyTimes();
+ expect(client.getZoneApi()).andReturn(zoneClient);
+ expect(client.getAsyncJobApi()).andReturn(jobClient).anyTimes();
+
+ expect(secClient.getSecurityGroupByName("group-1")).andReturn(group);
+
+ replay(client, secClient, zoneClient, zone, group);
+
+ ZoneSecurityGroupNamePortsCidrs input = ZoneSecurityGroupNamePortsCidrs.builder()
+ .zone("zone-1")
+ .name("group-1")
+ .ports(ImmutableSet.of(22))
+ .cidrs(ImmutableSet.<String> of()).build();
+
+ FindSecurityGroupOrCreate parser = Guice.createInjector(new AbstractModule() {
+
+ @Override
+ protected void configure() {
+ bind(new TypeLiteral<Supplier<String>>() {
+ }).toInstance(Suppliers.ofInstance("1"));
+ bind(CloudStackApi.class).toInstance(client);
+ bind(new TypeLiteral<CacheLoader<String, Zone>>() {}).
+ to(ZoneIdToZone.class);
+ bind(new TypeLiteral<Supplier<LoadingCache<String, Zone>>>() {}).
+ to(ZoneIdToZoneSupplier.class);
+ bind(String.class).annotatedWith(Names.named(PROPERTY_SESSION_INTERVAL)).toInstance("60");
+
+ bind(new TypeLiteral<Function<ZoneSecurityGroupNamePortsCidrs, SecurityGroup>>() {
+ }).to(CreateSecurityGroupIfNeeded.class);
+
+ bind(new TypeLiteral<CacheLoader<ZoneAndName, SecurityGroup>>() {
+ }).to(FindSecurityGroupOrCreate.class);
+ }
+
+ @Provides
+ @Singleton
+ protected Predicate<String> jobComplete(JobComplete jobComplete) {
+ return retry(jobComplete, 1200, 1, 5, SECONDS);
+ }
+
+ }).getInstance(FindSecurityGroupOrCreate.class);
+
+ assertEquals(parser.load(input), group);
+
+ verify(client, secClient, zoneClient, zone, group);
+ }
+
+ @Test(expectedExceptions = IllegalArgumentException.class)
+ public void testLoadZoneNoSecurityGroups() throws UnknownHostException {
+ final CloudStackApi client = createMock(CloudStackApi.class);
+ SecurityGroupApi secClient = createMock(SecurityGroupApi.class);
+ ZoneApi zoneClient = createMock(ZoneApi.class);
+ AsyncJobApi jobClient = createMock(AsyncJobApi.class);
+
+ SecurityGroup group = createMock(SecurityGroup.class);
+
+ Zone zone = createMock(Zone.class);
+
+ expect(zone.isSecurityGroupsEnabled()).andReturn(false);
+
+ expect(client.getSecurityGroupApi()).andReturn(secClient)
+ .anyTimes();
+ expect(client.getZoneApi()).andReturn(zoneClient);
+ expect(client.getAsyncJobApi()).andReturn(jobClient).anyTimes();
+
+ expect(zoneClient.getZone("zone-1")).andReturn(zone);
+ expect(secClient.getSecurityGroupByName("group-1")).andReturn(null);
+
+ replay(client, secClient, zoneClient, zone, group);
+
+ ZoneSecurityGroupNamePortsCidrs input = ZoneSecurityGroupNamePortsCidrs.builder()
+ .zone("zone-1")
+ .name("group-1")
+ .ports(ImmutableSet.of(22))
+ .cidrs(ImmutableSet.<String> of()).build();
+
+ FindSecurityGroupOrCreate parser = Guice.createInjector(new AbstractModule() {
+
+ @Override
+ protected void configure() {
+ bind(new TypeLiteral<Supplier<String>>() {
+ }).toInstance(Suppliers.ofInstance("1"));
+ bind(CloudStackApi.class).toInstance(client);
+ bind(new TypeLiteral<CacheLoader<String, Zone>>() {}).
+ to(ZoneIdToZone.class);
+ bind(new TypeLiteral<Supplier<LoadingCache<String, Zone>>>() {}).
+ to(ZoneIdToZoneSupplier.class);
+ bind(String.class).annotatedWith(Names.named(PROPERTY_SESSION_INTERVAL)).toInstance("60");
+
+ bind(new TypeLiteral<Function<ZoneSecurityGroupNamePortsCidrs, SecurityGroup>>() {
+ }).to(CreateSecurityGroupIfNeeded.class);
+
+ bind(new TypeLiteral<CacheLoader<ZoneAndName, SecurityGroup>>() {
+ }).to(FindSecurityGroupOrCreate.class);
+ }
+
+ @Provides
+ @Singleton
+ protected Predicate<String> jobComplete(JobComplete jobComplete) {
+ return retry(jobComplete, 1200, 1, 5, SECONDS);
+ }
+
+ }).getInstance(FindSecurityGroupOrCreate.class);
+
+ assertEquals(parser.load(input), group);
+
+ verify(client, secClient, zoneClient, zone, group);
+ }
+
+}