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); + } + +}
