Repository: jclouds-labs Updated Branches: refs/heads/master a91ff3bdb -> fde928eb0
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fde928eb/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourceGroupThenCreateNodes.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourceGroupThenCreateNodes.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourceGroupThenCreateNodes.java index 524eb69..378030f 100644 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourceGroupThenCreateNodes.java +++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourceGroupThenCreateNodes.java @@ -21,7 +21,8 @@ import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.Iterables.getOnlyElement; import static org.jclouds.azurecompute.arm.compute.functions.VMImageToImage.decodeFieldsFromUniqueId; -import static org.jclouds.util.Predicates2.retry; +import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.DEFAULT_SUBNET_ADDRESS_PREFIX; +import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.DEFAULT_VNET_ADDRESS_SPACE_PREFIX; import java.net.URI; import java.util.Arrays; @@ -36,9 +37,7 @@ import javax.inject.Singleton; import org.jclouds.Constants; import org.jclouds.azurecompute.arm.AzureComputeApi; -import org.jclouds.azurecompute.arm.compute.config.AzureComputeServiceContextModule; import org.jclouds.azurecompute.arm.compute.domain.RegionAndIdAndIngressRules; -import org.jclouds.azurecompute.arm.compute.functions.LocationToResourceGroupName; import org.jclouds.azurecompute.arm.compute.options.AzureTemplateOptions; import org.jclouds.azurecompute.arm.domain.NetworkSecurityGroup; import org.jclouds.azurecompute.arm.domain.RegionAndId; @@ -47,10 +46,8 @@ import org.jclouds.azurecompute.arm.domain.StorageService; import org.jclouds.azurecompute.arm.domain.Subnet; import org.jclouds.azurecompute.arm.domain.VMImage; import org.jclouds.azurecompute.arm.domain.VirtualNetwork; -import org.jclouds.azurecompute.arm.features.ResourceGroupApi; import org.jclouds.azurecompute.arm.features.SubnetApi; import org.jclouds.azurecompute.arm.features.VirtualNetworkApi; -import org.jclouds.azurecompute.arm.functions.ParseJobStatus; import org.jclouds.compute.config.CustomizationResponse; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; @@ -65,6 +62,7 @@ import org.jclouds.compute.strategy.impl.CreateNodesWithGroupEncodedIntoNameThen import org.jclouds.domain.Location; import org.jclouds.logging.Logger; +import com.google.common.base.Optional; import com.google.common.base.Predicate; import com.google.common.base.Strings; import com.google.common.cache.LoadingCache; @@ -81,9 +79,11 @@ public class CreateResourceGroupThenCreateNodes extends CreateNodesWithGroupEnco protected Logger logger = Logger.NULL; private final AzureComputeApi api; - private final AzureComputeServiceContextModule.AzureComputeConstants azureComputeConstants; - private final LocationToResourceGroupName locationToResourceGroupName; private final LoadingCache<RegionAndIdAndIngressRules, String> securityGroupMap; + private final LoadingCache<String, ResourceGroup> resourceGroupMap; + private final String defaultVnetAddressPrefix; + private final String defaultSubnetAddressPrefix; + private final Predicate<URI> storageAccountCreated; @Inject protected CreateResourceGroupThenCreateNodes( @@ -92,22 +92,28 @@ public class CreateResourceGroupThenCreateNodes extends CreateNodesWithGroupEnco GroupNamingConvention.Factory namingConvention, @Named(Constants.PROPERTY_USER_THREADS) ListeningExecutorService userExecutor, CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap.Factory customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory, - AzureComputeApi api, AzureComputeServiceContextModule.AzureComputeConstants azureComputeConstants, - LocationToResourceGroupName locationToResourceGroupName, - LoadingCache<RegionAndIdAndIngressRules, String> securityGroupMap) { + AzureComputeApi api, @Named(DEFAULT_VNET_ADDRESS_SPACE_PREFIX) String defaultVnetAddressPrefix, + @Named(DEFAULT_SUBNET_ADDRESS_PREFIX) String defaultSubnetAddressPrefix, + LoadingCache<RegionAndIdAndIngressRules, String> securityGroupMap, + LoadingCache<String, ResourceGroup> resourceGroupMap, @Named("STORAGE") Predicate<URI> storageAccountCreated) { super(addNodeWithGroupStrategy, listNodesStrategy, namingConvention, userExecutor, customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory); this.api = checkNotNull(api, "api cannot be null"); checkNotNull(userExecutor, "userExecutor cannot be null"); - this.azureComputeConstants = azureComputeConstants; - this.locationToResourceGroupName = locationToResourceGroupName; this.securityGroupMap = securityGroupMap; + this.resourceGroupMap = resourceGroupMap; + this.defaultVnetAddressPrefix = defaultVnetAddressPrefix; + this.defaultSubnetAddressPrefix = defaultSubnetAddressPrefix; + this.storageAccountCreated = storageAccountCreated; } @Override public Map<?, ListenableFuture<Void>> execute(String group, int count, Template template, Set<NodeMetadata> goodNodes, Map<NodeMetadata, Exception> badNodes, Multimap<NodeMetadata, CustomizationResponse> customizationResponses) { + + AzureTemplateOptions options = template.getOptions().as(AzureTemplateOptions.class); + // If there is a script to be run on the node and public key // authentication has been configured, warn users if the private key // is not present @@ -115,56 +121,39 @@ public class CreateResourceGroupThenCreateNodes extends CreateNodesWithGroupEnco logger.warn(">> a runScript was configured but no SSH key has been provided. " + "Authentication will delegate to the ssh-agent"); } - String azureGroupName = locationToResourceGroupName.apply(template.getLocation().getId()); - - AzureTemplateOptions options = template.getOptions().as(AzureTemplateOptions.class); - // create resource group for jclouds group if it does not already exist - ResourceGroupApi resourceGroupApi = api.getResourceGroupApi(); - ResourceGroup resourceGroup = resourceGroupApi.get(azureGroupName); - final String location = template.getLocation().getId(); - - if (resourceGroup == null) { - final Map<String, String> tags = ImmutableMap.of("description", "jclouds managed VMs"); - resourceGroupApi.create(azureGroupName, location, tags).name(); - } - String vnetName = azureGroupName + "virtualnetwork"; - String subnetName = azureGroupName + "subnet"; + // This sill create the resource group if it does not exist + String location = template.getLocation().getId(); + ResourceGroup resourceGroup = resourceGroupMap.getUnchecked(location); + String azureGroupName = resourceGroup.name(); - if (options.getVirtualNetworkName() != null) { - vnetName = options.getVirtualNetworkName(); - } - - this.getOrCreateVirtualNetworkWithSubnet(vnetName, subnetName, location, options, azureGroupName); + getOrCreateVirtualNetworkWithSubnet(location, options, azureGroupName); configureSecurityGroupForOptions(group, azureGroupName, template.getLocation(), options); StorageService storageService = getOrCreateStorageService(group, azureGroupName, location, template.getImage()); - String blob = storageService.storageServiceProperties().primaryEndpoints().get("blob"); - options.blob(blob); - - Map<?, ListenableFuture<Void>> responses = super.execute(group, count, template, goodNodes, badNodes, - customizationResponses); + options.blob(storageService.storageServiceProperties().primaryEndpoints().get("blob")); - return responses; + return super.execute(group, count, template, goodNodes, badNodes, customizationResponses); } - protected synchronized void getOrCreateVirtualNetworkWithSubnet(final String virtualNetworkName, - final String subnetName, final String location, AzureTemplateOptions options, final String azureGroupName) { + protected synchronized void getOrCreateVirtualNetworkWithSubnet(final String location, AzureTemplateOptions options, + final String azureGroupName) { + String virtualNetworkName = Optional.fromNullable(options.getVirtualNetworkName()).or( + azureGroupName + "virtualnetwork"); + String subnetName = azureGroupName + "subnet"; // Subnets belong to a virtual network so that needs to be created first VirtualNetworkApi vnApi = api.getVirtualNetworkApi(azureGroupName); VirtualNetwork vn = vnApi.get(virtualNetworkName); if (vn == null) { + Subnet subnet = Subnet.create(subnetName, null, null, + Subnet.SubnetProperties.builder().addressPrefix(defaultSubnetAddressPrefix).build()); + VirtualNetwork.VirtualNetworkProperties virtualNetworkProperties = VirtualNetwork.VirtualNetworkProperties - .builder() - .addressSpace( - VirtualNetwork.AddressSpace.create(Arrays.asList(this.azureComputeConstants - .azureDefaultVnetAddressPrefixProperty()))) - .subnets( - Arrays.asList(Subnet.create(subnetName, null, null, Subnet.SubnetProperties.builder() - .addressPrefix(this.azureComputeConstants.azureDefaultSubnetAddressPrefixProperty()).build()))) - .build(); + .builder().addressSpace(VirtualNetwork.AddressSpace.create(Arrays.asList(defaultVnetAddressPrefix))) + .subnets(Arrays.asList(subnet)).build(); + vn = vnApi.createOrUpdate(virtualNetworkName, location, virtualNetworkProperties); } @@ -199,15 +188,10 @@ public class CreateResourceGroupThenCreateNodes extends CreateNodesWithGroupEnco URI uri = api.getStorageAccountApi(resourceGroupName).create(storageAccountName, locationName, ImmutableMap.of("jclouds", name), ImmutableMap.of("accountType", StorageService.AccountType.Standard_LRS.toString())); - boolean starageAccountCreated = retry(new Predicate<URI>() { - @Override - public boolean apply(URI uri) { - return ParseJobStatus.JobStatus.DONE == api.getJobApi().jobStatus(uri); - } - }, 60 * 2 * 1000 /* 2 minutes timeout */).apply(uri); - // TODO check provisioning state of the primary - checkState(starageAccountCreated, "Storage account %s was not created in the configured timeout", + + checkState(storageAccountCreated.apply(uri), "Storage account %s was not created in the configured timeout", storageAccountName); + return api.getStorageAccountApi(resourceGroupName).get(storageAccountName); } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fde928eb/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/config/AzureComputeProperties.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/config/AzureComputeProperties.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/config/AzureComputeProperties.java index 2a15e4b..4ac5eaa 100644 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/config/AzureComputeProperties.java +++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/config/AzureComputeProperties.java @@ -22,30 +22,16 @@ package org.jclouds.azurecompute.arm.config; */ public class AzureComputeProperties { - public static final String STORAGE_API_VERSION = "2015-06-15"; - public static final String OPERATION_TIMEOUT = "jclouds.azurecompute.arm.operation.timeout"; - public static final String OPERATION_POLL_INITIAL_PERIOD = "jclouds.azurecompute.arm.operation.poll.initial.period"; - - public static final String OPERATION_POLL_MAX_PERIOD = "jclouds.azurecompute.arm.operation.poll.max.period"; - - public static final String TCP_RULE_FORMAT = "jclouds.azurecompute.arm.tcp.rule.format"; - - public static final String TCP_RULE_REGEXP = "jclouds.azurecompute.arm.tcp.rule.regexp"; - public static final String IMAGE_PUBLISHERS = "jclouds.azurecompute.arm.publishers"; - public static final String DEFAULT_IMAGE_LOGIN = "jclouds.azurecompute.arm.defaultimagelogin"; - public static final String TIMEOUT_RESOURCE_DELETED = "jclouds.azurecompute.arm.timeout.resourcedeleted"; public static final String DEFAULT_VNET_ADDRESS_SPACE_PREFIX = "jclouds.azurecompute.arm.vnet.addressprefix"; public static final String DEFAULT_SUBNET_ADDRESS_PREFIX = "jclouds.azurecompute.arm.subnet.addressprefix"; - public static final String DEFAULT_DATADISKSIZE = "jclouds.azurecompute.arm.datadisksize"; - public static final String API_VERSION_PREFIX = "jclouds.azurecompute.arm.apiversion."; } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fde928eb/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/functions/CleanupResources.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/functions/CleanupResources.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/functions/CleanupResources.java deleted file mode 100644 index 9d2a1c1..0000000 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/functions/CleanupResources.java +++ /dev/null @@ -1,202 +0,0 @@ -/* - * 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.azurecompute.arm.functions; - -import static com.google.common.base.Predicates.notNull; -import static com.google.common.collect.Iterables.filter; -import static com.google.common.collect.Iterables.transform; -import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.TIMEOUT_RESOURCE_DELETED; -import static org.jclouds.util.Closeables2.closeQuietly; - -import java.net.URI; -import java.util.List; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.azurecompute.arm.AzureComputeApi; -import org.jclouds.azurecompute.arm.compute.functions.LocationToResourceGroupName; -import org.jclouds.azurecompute.arm.domain.IdReference; -import org.jclouds.azurecompute.arm.domain.IpConfiguration; -import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCard; -import org.jclouds.azurecompute.arm.domain.NetworkSecurityGroup; -import org.jclouds.azurecompute.arm.domain.RegionAndId; -import org.jclouds.azurecompute.arm.domain.StorageServiceKeys; -import org.jclouds.azurecompute.arm.domain.VirtualMachine; -import org.jclouds.azurecompute.arm.features.NetworkSecurityGroupApi; -import org.jclouds.azurecompute.arm.util.BlobHelper; -import org.jclouds.compute.functions.GroupNamingConvention; -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.logging.Logger; - -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.base.Splitter; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; - -@Singleton -public class CleanupResources { - - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - protected Logger logger = Logger.NULL; - - protected final AzureComputeApi api; - private final Predicate<URI> resourceDeleted; - private final StorageProfileToStorageAccountName storageProfileToStorageAccountName; - private final LocationToResourceGroupName locationToResourceGroupName; - private final GroupNamingConvention.Factory namingConvention; - - @Inject - CleanupResources(AzureComputeApi azureComputeApi, @Named(TIMEOUT_RESOURCE_DELETED) Predicate<URI> resourceDeleted, - StorageProfileToStorageAccountName storageProfileToStorageAccountName, - LocationToResourceGroupName locationToResourceGroupName, GroupNamingConvention.Factory namingConvention) { - this.api = azureComputeApi; - this.resourceDeleted = resourceDeleted; - this.storageProfileToStorageAccountName = storageProfileToStorageAccountName; - this.locationToResourceGroupName = locationToResourceGroupName; - this.namingConvention = namingConvention; - } - - public boolean cleanupNode(final String id) { - RegionAndId regionAndId = RegionAndId.fromSlashEncoded(id); - String group = locationToResourceGroupName.apply(regionAndId.region()); - - VirtualMachine virtualMachine = api.getVirtualMachineApi(group).get(regionAndId.id()); - if (virtualMachine == null) { - return true; - } - - logger.debug(">> destroying %s ...", regionAndId.slashEncode()); - boolean vmDeleted = deleteVirtualMachine(group, virtualMachine); - - // We don't delete the network here, as it is global to the resource - // group. It will be deleted when the resource group is deleted - - cleanupVirtualMachineNICs(group, virtualMachine); - cleanupVirtualMachineStorage(group, virtualMachine); - - return vmDeleted; - } - - public void cleanupVirtualMachineNICs(String group, VirtualMachine virtualMachine) { - for (String nicName : getNetworkCardInterfaceNames(virtualMachine)) { - NetworkInterfaceCard nic = api.getNetworkInterfaceCardApi(group).get(nicName); - Iterable<String> publicIps = getPublicIps(group, nic); - - logger.debug(">> destroying nic %s...", nicName); - URI nicDeletionURI = api.getNetworkInterfaceCardApi(group).delete(nicName); - resourceDeleted.apply(nicDeletionURI); - - for (String publicIp : publicIps) { - logger.debug(">> deleting public ip nic %s...", publicIp); - api.getPublicIPAddressApi(group).delete(publicIp); - } - } - } - - public void cleanupVirtualMachineStorage(String group, VirtualMachine virtualMachine) { - String storageAccountName = storageProfileToStorageAccountName - .apply(virtualMachine.properties().storageProfile()); - StorageServiceKeys keys = api.getStorageAccountApi(group).getKeys(storageAccountName); - - // Remove the virtual machine files - logger.debug(">> deleting virtual machine disk storage..."); - BlobHelper blobHelper = new BlobHelper(storageAccountName, keys.key1()); - try { - blobHelper.deleteContainerIfExists("vhds"); - - if (!blobHelper.customImageExists()) { - logger.debug(">> deleting storage account %s...", storageAccountName); - api.getStorageAccountApi(group).delete(storageAccountName); - } else { - logger.debug(">> the storage account contains custom images. Will not delete it!"); - } - } finally { - closeQuietly(blobHelper); - } - } - - public boolean cleanupSecurityGroupIfOrphaned(String resourceGroup, String group) { - String name = namingConvention.create().sharedNameForGroup(group); - NetworkSecurityGroupApi sgapi = api.getNetworkSecurityGroupApi(resourceGroup); - - boolean deleted = false; - - try { - NetworkSecurityGroup securityGroup = sgapi.get(name); - if (securityGroup != null) { - List<NetworkInterfaceCard> nics = securityGroup.properties().networkInterfaces(); - if (nics == null || nics.isEmpty()) { - logger.debug(">> deleting orphaned security group %s from %s...", name, resourceGroup); - try { - deleted = resourceDeleted.apply(sgapi.delete(name)); - } catch (Exception ex) { - logger.warn(ex, ">> error deleting orphaned security group %s from %s...", name, resourceGroup); - } - } - } - } catch (Exception ex) { - logger.warn(ex, "Error deleting security groups for %s and group %s", resourceGroup, group); - } - - return deleted; - } - - public boolean deleteResourceGroupIfEmpty(String group) { - boolean deleted = false; - if (api.getVirtualMachineApi(group).list().isEmpty() && api.getStorageAccountApi(group).list().isEmpty() - && api.getNetworkInterfaceCardApi(group).list().isEmpty() - && api.getPublicIPAddressApi(group).list().isEmpty() - && api.getNetworkSecurityGroupApi(group).list().isEmpty()) { - logger.debug(">> the resource group %s is empty. Deleting...", group); - deleted = resourceDeleted.apply(api.getResourceGroupApi().delete(group)); - } - return deleted; - } - - private Iterable<String> getPublicIps(String group, NetworkInterfaceCard nic) { - return transform( - filter(transform(nic.properties().ipConfigurations(), new Function<IpConfiguration, IdReference>() { - @Override - public IdReference apply(IpConfiguration input) { - return input.properties().publicIPAddress(); - } - }), notNull()), new Function<IdReference, String>() { - @Override - public String apply(IdReference input) { - return Iterables.getLast(Splitter.on("/").split(input.id())); - } - }); - } - - private List<String> getNetworkCardInterfaceNames(VirtualMachine virtualMachine) { - List<String> nics = Lists.newArrayList(); - for (IdReference idReference : virtualMachine.properties().networkProfile().networkInterfaces()) { - nics.add(Iterables.getLast(Splitter.on("/").split(idReference.id()))); - } - return nics; - } - - private boolean deleteVirtualMachine(String group, VirtualMachine virtualMachine) { - return resourceDeleted.apply(api.getVirtualMachineApi(group).delete(virtualMachine.name())); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fde928eb/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtensionLiveTest.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtensionLiveTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtensionLiveTest.java index 02fe52e..cb13c7b 100644 --- a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtensionLiveTest.java +++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtensionLiveTest.java @@ -18,7 +18,6 @@ package org.jclouds.azurecompute.arm.compute.extensions; import static com.google.common.collect.Iterables.get; import static com.google.common.collect.Iterables.getOnlyElement; -import static java.util.logging.Logger.getAnonymousLogger; import static org.jclouds.compute.options.TemplateOptions.Builder.inboundPorts; import static org.jclouds.compute.options.TemplateOptions.Builder.securityGroups; import static org.jclouds.compute.predicates.NodePredicates.inGroup; @@ -26,14 +25,12 @@ import static org.jclouds.net.domain.IpProtocol.TCP; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; -import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.concurrent.ExecutionException; -import org.jclouds.azurecompute.arm.AzureComputeApi; import org.jclouds.azurecompute.arm.AzureComputeProviderMetadata; -import org.jclouds.azurecompute.arm.compute.functions.LocationToResourceGroupName; +import org.jclouds.azurecompute.arm.compute.strategy.CleanupResources; import org.jclouds.azurecompute.arm.domain.ResourceGroup; import org.jclouds.azurecompute.arm.internal.AzureLiveTestUtils; import org.jclouds.compute.ComputeService; @@ -50,7 +47,9 @@ import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import com.google.common.base.Optional; -import com.google.common.collect.ImmutableMap; +import com.google.common.cache.LoadingCache; +import com.google.inject.Key; +import com.google.inject.TypeLiteral; /** * Live test for AzureCompute @@ -59,10 +58,9 @@ import com.google.common.collect.ImmutableMap; @Test(groups = "live", singleThreaded = true, testName = "AzureComputeSecurityGroupExtensionLiveTest") public class AzureComputeSecurityGroupExtensionLiveTest extends BaseSecurityGroupExtensionLiveTest { - private AzureComputeApi api; - private LocationToResourceGroupName locationToResourceGroupName; - private String resourceGroupName; + private LoadingCache<String, ResourceGroup> resourceGroupMap; private ResourceGroup testResourceGroup; + private CleanupResources cleanupResources; public AzureComputeSecurityGroupExtensionLiveTest() { provider = "azurecompute-arm"; @@ -71,8 +69,10 @@ public class AzureComputeSecurityGroupExtensionLiveTest extends BaseSecurityGrou @BeforeClass(groups = { "integration", "live" }) public void setupContext() { super.setupContext(); - api = context.utils().injector().getInstance(AzureComputeApi.class); - locationToResourceGroupName = context.utils().injector().getInstance(LocationToResourceGroupName.class); + resourceGroupMap = context.utils().injector() + .getInstance(Key.get(new TypeLiteral<LoadingCache<String, ResourceGroup>>() { + })); + cleanupResources = context.utils().injector().getInstance(CleanupResources.class); createResourceGroupIfMissing(); } @@ -119,12 +119,7 @@ public class AzureComputeSecurityGroupExtensionLiveTest extends BaseSecurityGrou @Override protected void tearDownContext() { super.tearDownContext(); - if (testResourceGroup != null) { - // Cleanup the resource group we created for the tests - getAnonymousLogger().info( - "deleting resource group " + testResourceGroup.name() + " for the security group live tests..."); - api.getResourceGroupApi().delete(testResourceGroup.name()); - } + cleanupResources.deleteResourceGroupIfEmpty(testResourceGroup.name()); } @Override @@ -142,13 +137,6 @@ public class AzureComputeSecurityGroupExtensionLiveTest extends BaseSecurityGrou private void createResourceGroupIfMissing() { Location location = getNodeTemplate().getLocation(); - resourceGroupName = locationToResourceGroupName.apply(location.getId()); - ResourceGroup resourceGroupInLocation = api.getResourceGroupApi().get(resourceGroupName); - if (resourceGroupInLocation == null) { - getAnonymousLogger().info( - "creating resource group " + resourceGroupName + " for the security group live tests..."); - final Map<String, String> tags = ImmutableMap.of("description", "AzureComputeSecurityGroupExtensionLiveTest"); - testResourceGroup = api.getResourceGroupApi().create(resourceGroupName, location.getId(), tags); - } + testResourceGroup = resourceGroupMap.getUnchecked(location.getId()); } }
