Properly honor the configured regions in all list methods (list nodes, images and security groups)
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java
index 2e9e0f6..73ecda9 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java
@@ -220,8 +220,14 @@
}
private List<VMImage> listCustomImagesByResourceGroup(String resourceGroup) {
- List<org.jclouds.azurecompute.arm.domain.Image> customImages = api.getVirtualMachineImageApi(resourceGroup).list();
- return Lists.transform(customImages, customImagetoVmImage);
+ List<org.jclouds.azurecompute.arm.domain.Image> customImgs = api.getVirtualMachineImageApi(resourceGroup).list();
+ return ImmutableList.copyOf(transform(
+ filter(customImgs, new Predicate<org.jclouds.azurecompute.arm.domain.Image>() {
+ @Override
+ public boolean apply(org.jclouds.azurecompute.arm.domain.Image input) {
+ return regionIds.get().contains(input.location());
+ }
+ }), customImagetoVmImage));
}
@Override
@@ -241,15 +247,7 @@
}
// We need to look for custom images in all resource groups
- Iterable<ResourceGroup> resourceGroupsInLocation = filter(api.getResourceGroupApi().list(),
- new Predicate<ResourceGroup>() {
- @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 Iterable<VirtualMachine> listNodes() {
ImmutableList.Builder<VirtualMachine> nodes = builder();
for (ResourceGroup resourceGroup : api.getResourceGroupApi().list()) {
- nodes.addAll(api.getVirtualMachineApi(resourceGroup.name()).list());
+ List<VirtualMachine> vms = api.getVirtualMachineApi(resourceGroup.name()).list();
+ nodes.addAll(filter(vms, new Predicate<VirtualMachine>() {
+ @Override
+ public boolean apply(VirtualMachine input) {
+ return regionIds.get().contains(input.location());
+ }
+ }));
}
return nodes.build();
}
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtension.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtension.java
index eafb4f1..59608a4 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtension.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtension.java
@@ -23,7 +23,6 @@
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.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 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 @@
private final SecurityGroupAvailablePredicateFactory securityGroupAvailable;
private final Predicate<URI> resourceDeleted;
private final LoadingCache<String, ResourceGroup> defaultResourceGroup;
+ private final Supplier<Set<String>> regionIds;
@Inject
AzureComputeSecurityGroupExtension(AzureComputeApi api,
Function<NetworkSecurityGroup, SecurityGroup> groupConverter,
SecurityGroupAvailablePredicateFactory securityRuleAvailable,
@Named(TIMEOUT_RESOURCE_DELETED) Predicate<URI> resourceDeleted,
- LoadingCache<String, ResourceGroup> defaultResourceGroup) {
+ LoadingCache<String, ResourceGroup> defaultResourceGroup,
+ @Region Supplier<Set<String>> regionIds) {
this.api = api;
this.securityGroupConverter = groupConverter;
this.securityGroupAvailable = securityRuleAvailable;
this.resourceDeleted = resourceDeleted;
this.defaultResourceGroup = defaultResourceGroup;
- }
-
- @Override
- public Set<SecurityGroup> listSecurityGroups() {
- ImmutableSet.Builder<SecurityGroup> securityGroups = ImmutableSet.builder();
- for (ResourceGroup rg : api.getResourceGroupApi().list()) {
- securityGroups.addAll(securityGroupsInResourceGroup(rg.name()));
- }
- return securityGroups.build();
- }
-
- private Set<SecurityGroup> securityGroupsInResourceGroup(String resourceGroup) {
- List<NetworkSecurityGroup> networkGroups = api.getNetworkSecurityGroupApi(resourceGroup).list();
- return ImmutableSet.copyOf(transform(filter(networkGroups, notNull()), securityGroupConverter));
+ this.regionIds = regionIds;
}
@Override
public Set<SecurityGroup> 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<SecurityGroup> listSecurityGroups() {
+ return securityGroupsInLocations(regionIds.get());
+ }
+
+ private Set<SecurityGroup> securityGroupsInLocations(final Set<String> locations) {
+ List<SecurityGroup> securityGroups = new ArrayList<SecurityGroup>();
+ for (ResourceGroup rg : api.getResourceGroupApi().list()) {
+ securityGroups.addAll(securityGroupsInResourceGroup(rg.name()));
+ }
+
+ return ImmutableSet.copyOf(filter(securityGroups, new Predicate<SecurityGroup>() {
+ @Override
+ public boolean apply(SecurityGroup input) {
+ return locations.contains(input.getLocation().getId());
+ }
+ }));
+ }
+
+ private Set<SecurityGroup> securityGroupsInResourceGroup(String resourceGroup) {
+ List<NetworkSecurityGroup> networkGroups = api.getNetworkSecurityGroupApi(resourceGroup).list();
+ return ImmutableSet.copyOf(transform(filter(networkGroups, notNull()), securityGroupConverter));
}
@Override