This is an automated email from the ASF dual-hosted git repository.

nacx pushed a commit to branch 2.1.x
in repository https://gitbox.apache.org/repos/asf/jclouds.git

commit 077dca824cf2052e3736bbab5f73b39a27ceea7d
Author: Daniel Estévez <[email protected]>
AuthorDate: Fri May 17 02:59:01 2019 -0400

    Checks provisioning state in Rule resource instead of Group (#30)
    
    * Checks provisioning state in Rule resource instead of Group
    
    * comments by @nacx to proper check and delete rules
    
    * Fixes log message deleting rule
---
 .../arm/compute/config/AzurePredicatesModule.java  | 35 ++++++++++++++++++++++
 .../AzureComputeSecurityGroupExtension.java        | 23 +++++++-------
 .../arm/domain/NetworkSecurityRuleProperties.java  | 18 +++++++----
 .../features/NetworkSecurityGroupApiMockTest.java  |  1 +
 .../features/NetworkSecurityRuleApiMockTest.java   |  1 +
 .../test/resources/networksecurityrulecreate.json  |  5 ++--
 6 files changed, 64 insertions(+), 19 deletions(-)

diff --git 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzurePredicatesModule.java
 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzurePredicatesModule.java
index 01650de..80e1a6e 100644
--- 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzurePredicatesModule.java
+++ 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzurePredicatesModule.java
@@ -45,6 +45,7 @@ import org.jclouds.azurecompute.arm.domain.Image;
 import org.jclouds.azurecompute.arm.domain.Key.DeletedKeyBundle;
 import org.jclouds.azurecompute.arm.domain.Key.KeyBundle;
 import org.jclouds.azurecompute.arm.domain.NetworkSecurityGroup;
+import org.jclouds.azurecompute.arm.domain.NetworkSecurityRule;
 import org.jclouds.azurecompute.arm.domain.Provisionable;
 import org.jclouds.azurecompute.arm.domain.ResourceDefinition;
 import org.jclouds.azurecompute.arm.domain.Secret.DeletedSecretBundle;
@@ -123,6 +124,12 @@ public class AzurePredicatesModule extends AbstractModule {
    }
 
    @Provides
+   protected SecurityGroupRuleAvailablePredicateFactory 
provideSecurityGroupRuleAvailablePredicate(final AzureComputeApi api,
+         Predicate<Supplier<Provisionable>> resourceAvailable) {
+      return new SecurityGroupRuleAvailablePredicateFactory(api, 
resourceAvailable);
+   }
+
+   @Provides
    protected ImageAvailablePredicateFactory 
provideImageAvailablePredicate(final AzureComputeApi api,
          final ComputeServiceConstants.Timeouts timeouts, final PollPeriod 
pollPeriod) {
       return new ImageAvailablePredicateFactory(api, retry(new 
ResourceInStatusPredicate("Succeeded"),
@@ -292,6 +299,34 @@ public class AzurePredicatesModule extends AbstractModule {
       }
    }
 
+   public static class SecurityGroupRuleAvailablePredicateFactory {
+      private final AzureComputeApi api;
+      private final Predicate<Supplier<Provisionable>> resourceAvailable;
+
+      SecurityGroupRuleAvailablePredicateFactory(final AzureComputeApi api, 
Predicate<Supplier<Provisionable>> resourceAvailable) {
+         this.api = checkNotNull(api, "api cannot be null");
+         this.resourceAvailable = resourceAvailable;
+      }
+
+      public Predicate<String> create(final String resourceGroup, final String 
securityGroupName) {
+         checkNotNull(resourceGroup, "resourceGroup cannot be null");
+         checkNotNull(securityGroupName, "securityGroupName cannot be null");
+         return new Predicate<String>() {
+            @Override
+            public boolean apply(final String name) {
+               checkNotNull(name, "name cannot be null");
+               return resourceAvailable.apply(new Supplier<Provisionable>() {
+                  @Override
+                  public Provisionable get() {
+                     NetworkSecurityRule securityRule = 
api.getNetworkSecurityRuleApi(resourceGroup, securityGroupName).get(name);
+                     return securityRule == null ? null : 
securityRule.properties();
+                  }
+               });
+            }
+         };
+      }
+   }
+
    public static class NetworkAvailablePredicateFactory {
       private final AzureComputeApi api;
       private final Predicate<Supplier<Provisionable>> resourceAvailable;
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 b85628c..bfbd595 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
@@ -30,13 +30,13 @@ import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
-
 import javax.annotation.Resource;
 import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.jclouds.azurecompute.arm.AzureComputeApi;
 import 
org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.SecurityGroupAvailablePredicateFactory;
+import 
org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.SecurityGroupRuleAvailablePredicateFactory;
 import org.jclouds.azurecompute.arm.compute.domain.ResourceGroupAndName;
 import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCard;
 import org.jclouds.azurecompute.arm.domain.NetworkProfile.NetworkInterface;
@@ -78,20 +78,21 @@ public class AzureComputeSecurityGroupExtension implements 
SecurityGroupExtensio
    private final AzureComputeApi api;
    private final Function<NetworkSecurityGroup, SecurityGroup> 
securityGroupConverter;
    private final SecurityGroupAvailablePredicateFactory securityGroupAvailable;
+   private final SecurityGroupRuleAvailablePredicateFactory 
securityGroupRuleAvailable;
    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,
+   AzureComputeSecurityGroupExtension(AzureComputeApi api, 
Function<NetworkSecurityGroup, SecurityGroup> groupConverter,
+         SecurityGroupAvailablePredicateFactory securityGroupAvailable, 
SecurityGroupRuleAvailablePredicateFactory securityGroupRuleAvailable,
          @Named(TIMEOUT_RESOURCE_DELETED) Predicate<URI> resourceDeleted,
          LoadingCache<String, ResourceGroup> defaultResourceGroup,
          @Region Supplier<Set<String>> regionIds) {
       this.api = api;
       this.securityGroupConverter = groupConverter;
-      this.securityGroupAvailable = securityRuleAvailable;
+      this.securityGroupAvailable = securityGroupAvailable;
+      this.securityGroupRuleAvailable = securityGroupRuleAvailable;
       this.resourceDeleted = resourceDeleted;
       this.defaultResourceGroup = defaultResourceGroup;
       this.regionIds = regionIds;
@@ -252,8 +253,7 @@ public class AzureComputeSecurityGroupExtension implements 
SecurityGroupExtensio
 
          ruleApi.createOrUpdate(ruleName, properties);
 
-         checkState(
-               
securityGroupAvailable.create(resourceGroupAndName.resourceGroup()).apply(networkSecurityGroup.name()),
+         
checkState(securityGroupRuleAvailable.create(resourceGroupAndName.resourceGroup(),
 networkSecurityGroup.name()).apply(ruleName),
                "Security group was not updated in the configured timeout");
       }
 
@@ -294,10 +294,11 @@ public class AzureComputeSecurityGroupExtension 
implements SecurityGroupExtensio
 
       for (NetworkSecurityRule matchingRule : rules) {
          logger.debug(">> deleting network security rule %s from %s...", 
matchingRule.name(), group.getName());
-         ruleApi.delete(matchingRule.name());
-         checkState(
-               
securityGroupAvailable.create(resourceGroupAndName.resourceGroup()).apply(networkSecurityGroup.name()),
-               "Security group was not updated in the configured timeout");
+         URI uri = ruleApi.delete(matchingRule.name());
+         if (uri != null) {
+            checkState(resourceDeleted.apply(uri), "Rule %s could not be 
deleted in the configured timeout", matchingRule.id());
+         }
+
       }
 
       return getSecurityGroupById(group.getId());
diff --git 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkSecurityRuleProperties.java
 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkSecurityRuleProperties.java
index e93107e..d52c7fc 100644
--- 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkSecurityRuleProperties.java
+++ 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkSecurityRuleProperties.java
@@ -16,14 +16,14 @@
  */
 package org.jclouds.azurecompute.arm.domain;
 
-import com.google.auto.value.AutoValue;
-
 import org.jclouds.azurecompute.arm.util.GetEnumValue;
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.json.SerializedNames;
 
+import com.google.auto.value.AutoValue;
+
 @AutoValue
-public abstract class NetworkSecurityRuleProperties {
+public abstract class NetworkSecurityRuleProperties implements Provisionable {
    public enum Protocol {
       // * is an allowed value, will handle in
       Tcp("Tcp"),
@@ -91,7 +91,10 @@ public abstract class NetworkSecurityRuleProperties {
 
    public abstract Direction direction();
 
-   @SerializedNames({"description", "protocol", "sourcePortRange", 
"destinationPortRange", "sourceAddressPrefix", "destinationAddressPrefix", 
"access", "priority", "direction"})
+   @Nullable
+   public abstract String provisioningState();
+
+   @SerializedNames({ "description", "protocol", "sourcePortRange", 
"destinationPortRange", "sourceAddressPrefix", "destinationAddressPrefix", 
"access", "priority", "direction", "provisioningState" })
    public static NetworkSecurityRuleProperties create(final String description,
                                                       final Protocol protocol,
                                                       final String 
sourcePortRange,
@@ -100,7 +103,8 @@ public abstract class NetworkSecurityRuleProperties {
                                                       final String 
destinationAddressPrefix,
                                                       final Access access,
                                                       final Integer priority,
-                                                      final Direction 
direction) {
+                                                      final Direction 
direction,
+                                                      final String 
provisioningState) {
       return builder()
               .description(description)
               .protocol(protocol)
@@ -110,7 +114,7 @@ public abstract class NetworkSecurityRuleProperties {
               .destinationAddressPrefix(destinationAddressPrefix)
               .access(access)
               .priority(priority)
-              .direction(direction)
+              .direction(direction).provisioningState(provisioningState)
               .build();
    }
    
@@ -140,6 +144,8 @@ public abstract class NetworkSecurityRuleProperties {
 
       public abstract Builder direction(Direction direction);
 
+      public abstract Builder provisioningState(String provisioningState);
+
       public abstract NetworkSecurityRuleProperties build();
    }
 }
diff --git 
a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/NetworkSecurityGroupApiMockTest.java
 
b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/NetworkSecurityGroupApiMockTest.java
index 3dc0e4a..4f51954 100644
--- 
a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/NetworkSecurityGroupApiMockTest.java
+++ 
b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/NetworkSecurityGroupApiMockTest.java
@@ -54,6 +54,7 @@ public class NetworkSecurityGroupApiMockTest extends 
BaseAzureComputeApiMockTest
                       .access(NetworkSecurityRuleProperties.Access.Deny)
                       .priority(4095)
                       
.direction(NetworkSecurityRuleProperties.Direction.Outbound)
+                      .provisioningState("Succeeded")
                       .build());
       ArrayList<NetworkSecurityRule> ruleList = new 
ArrayList<NetworkSecurityRule>();
       ruleList.add(rule);
diff --git 
a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/NetworkSecurityRuleApiMockTest.java
 
b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/NetworkSecurityRuleApiMockTest.java
index 1ca4284..bb5f57c 100644
--- 
a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/NetworkSecurityRuleApiMockTest.java
+++ 
b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/NetworkSecurityRuleApiMockTest.java
@@ -52,6 +52,7 @@ public class NetworkSecurityRuleApiMockTest extends 
BaseAzureComputeApiMockTest
                       .access(NetworkSecurityRuleProperties.Access.Allow)
                       .priority(4094)
                       
.direction(NetworkSecurityRuleProperties.Direction.Inbound)
+                      .provisioningState("Succeeded")
                       .build());
       return rule;
    }
diff --git 
a/providers/azurecompute-arm/src/test/resources/networksecurityrulecreate.json 
b/providers/azurecompute-arm/src/test/resources/networksecurityrulecreate.json
index c09bf08..bb71460 100644
--- 
a/providers/azurecompute-arm/src/test/resources/networksecurityrulecreate.json
+++ 
b/providers/azurecompute-arm/src/test/resources/networksecurityrulecreate.json
@@ -12,6 +12,7 @@
     "destinationAddressPrefix": "*",
     "access": "Allow",
     "priority": 4094,
-    "direction": "Inbound"
+    "direction": "Inbound",
+    "provisioningState": "Succeeded"
   }
-}
\ No newline at end of file
+}

Reply via email to