From 3d274239a1058e91cc61f74b91d6f0c0b0c298dd Mon Sep 17 00:00:00 2001 From: Ignasi Barrera Date: Tue, 25 Apr 2017 10:05:46 +0200 Subject: [PATCH] Properly honor the configured regions in all list methods (list nodes, images and security groups) --- .../compute/AzureComputeServiceAdapter.java | 28 +++++----- .../AzureComputeSecurityGroupExtension.java | 51 +++++++++++-------- 2 files changed, 47 insertions(+), 32 deletions(-) diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java index 2e9e0f6ba4..73ecda925f 100644 --- a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java +++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java @@ -220,8 +220,14 @@ public class AzureComputeServiceAdapter implements ComputeServiceAdapter listCustomImagesByResourceGroup(String resourceGroup) { - List customImages = api.getVirtualMachineImageApi(resourceGroup).list(); - return Lists.transform(customImages, customImagetoVmImage); + List customImgs = api.getVirtualMachineImageApi(resourceGroup).list(); + return ImmutableList.copyOf(transform( + filter(customImgs, new Predicate() { + @Override + public boolean apply(org.jclouds.azurecompute.arm.domain.Image input) { + return regionIds.get().contains(input.location()); + } + }), customImagetoVmImage)); } @Override @@ -241,15 +247,7 @@ public class AzureComputeServiceAdapter implements ComputeServiceAdapter resourceGroupsInLocation = filter(api.getResourceGroupApi().list(), - new Predicate() { - @Override - public boolean apply(ResourceGroup input) { - return availableLocationNames.contains(input.location()); - } - }); - - for (ResourceGroup resourceGroup : resourceGroupsInLocation) { + for (ResourceGroup resourceGroup : api.getResourceGroupApi().list()) { osImages.addAll(listCustomImagesByResourceGroup(resourceGroup.name())); } @@ -345,7 +343,13 @@ public class AzureComputeServiceAdapter implements ComputeServiceAdapter listNodes() { ImmutableList.Builder nodes = builder(); for (ResourceGroup resourceGroup : api.getResourceGroupApi().list()) { - nodes.addAll(api.getVirtualMachineApi(resourceGroup.name()).list()); + List vms = api.getVirtualMachineApi(resourceGroup.name()).list(); + nodes.addAll(filter(vms, new Predicate() { + @Override + public boolean apply(VirtualMachine input) { + return regionIds.get().contains(input.location()); + } + })); } return nodes.build(); } diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtension.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtension.java index eafb4f1409..59608a498f 100644 --- a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtension.java +++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtension.java @@ -23,7 +23,6 @@ import static com.google.common.collect.Iterables.any; 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.compute.predicates.NodePredicates.locationId; import java.net.URI; import java.util.ArrayList; @@ -55,6 +54,7 @@ import org.jclouds.compute.domain.SecurityGroupBuilder; import org.jclouds.compute.extensions.SecurityGroupExtension; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.domain.Location; +import org.jclouds.location.Region; import org.jclouds.logging.Logger; import org.jclouds.net.domain.IpPermission; import org.jclouds.net.domain.IpProtocol; @@ -62,6 +62,7 @@ import org.jclouds.net.domain.IpProtocol; import com.google.common.base.Function; import com.google.common.base.Objects; import com.google.common.base.Predicate; +import com.google.common.base.Supplier; import com.google.common.cache.LoadingCache; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multimap; @@ -77,40 +78,50 @@ public class AzureComputeSecurityGroupExtension implements SecurityGroupExtensio private final SecurityGroupAvailablePredicateFactory securityGroupAvailable; private final Predicate resourceDeleted; private final LoadingCache defaultResourceGroup; + private final Supplier> regionIds; @Inject AzureComputeSecurityGroupExtension(AzureComputeApi api, Function groupConverter, SecurityGroupAvailablePredicateFactory securityRuleAvailable, @Named(TIMEOUT_RESOURCE_DELETED) Predicate resourceDeleted, - LoadingCache defaultResourceGroup) { + LoadingCache defaultResourceGroup, + @Region Supplier> regionIds) { this.api = api; this.securityGroupConverter = groupConverter; this.securityGroupAvailable = securityRuleAvailable; this.resourceDeleted = resourceDeleted; this.defaultResourceGroup = defaultResourceGroup; - } - - @Override - public Set listSecurityGroups() { - ImmutableSet.Builder securityGroups = ImmutableSet.builder(); - for (ResourceGroup rg : api.getResourceGroupApi().list()) { - securityGroups.addAll(securityGroupsInResourceGroup(rg.name())); - } - return securityGroups.build(); - } - - private Set securityGroupsInResourceGroup(String resourceGroup) { - List networkGroups = api.getNetworkSecurityGroupApi(resourceGroup).list(); - return ImmutableSet.copyOf(transform(filter(networkGroups, notNull()), securityGroupConverter)); + this.regionIds = regionIds; } @Override public Set listSecurityGroupsInLocation(Location location) { - // Even though the resource groups are in a location, each security group - // can be in a different resource group, so we need to inspect all teh - // existing resource groups, and filter afterwards - return ImmutableSet.copyOf(filter(listSecurityGroups(), locationId(location.getId()))); + return securityGroupsInLocations(ImmutableSet.of(location.getId())); + } + + @Override + public Set listSecurityGroups() { + return securityGroupsInLocations(regionIds.get()); + } + + private Set securityGroupsInLocations(final Set locations) { + List securityGroups = new ArrayList(); + for (ResourceGroup rg : api.getResourceGroupApi().list()) { + securityGroups.addAll(securityGroupsInResourceGroup(rg.name())); + } + + return ImmutableSet.copyOf(filter(securityGroups, new Predicate() { + @Override + public boolean apply(SecurityGroup input) { + return locations.contains(input.getLocation().getId()); + } + })); + } + + private Set securityGroupsInResourceGroup(String resourceGroup) { + List networkGroups = api.getNetworkSecurityGroupApi(resourceGroup).list(); + return ImmutableSet.copyOf(transform(filter(networkGroups, notNull()), securityGroupConverter)); } @Override