Added Virtual Network Gateway API

Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/9705aa7f
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/9705aa7f
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/9705aa7f

Branch: refs/heads/2.1.x
Commit: 9705aa7fb809c27cfed4a9acf8d718ac2e9882f1
Parents: ff95137
Author: Ignasi Barrera <[email protected]>
Authored: Mon Jul 2 13:19:46 2018 +0200
Committer: Ignasi Barrera <[email protected]>
Committed: Tue Jul 3 12:52:17 2018 +0200

----------------------------------------------------------------------
 .../azurecompute/arm/AzureComputeApi.java       |   11 +-
 .../arm/AzureComputeProviderMetadata.java       |    2 +
 .../compute/config/AzurePredicatesModule.java   | 1055 +++++++++---------
 .../CreateResourcesThenCreateNodes.java         |    2 +-
 .../arm/config/AzureComputeProperties.java      |    2 +-
 .../azurecompute/arm/domain/AddressSpace.java   |   39 +
 .../arm/domain/IpAllocationMethod.java          |   28 +
 .../arm/domain/LocalNetworkGateway.java         |   75 --
 .../domain/LocalNetworkGatewayProperties.java   |   96 --
 .../jclouds/azurecompute/arm/domain/Subnet.java |   10 +
 .../azurecompute/arm/domain/VirtualNetwork.java |   21 +-
 .../arm/domain/vpn/BGPSettings.java             |   37 +
 .../azurecompute/arm/domain/vpn/DHGroup.java    |   28 +
 .../arm/domain/vpn/IPSecEncryption.java         |   28 +
 .../arm/domain/vpn/IPSecIntegrity.java          |   28 +
 .../arm/domain/vpn/IPSecPolicy.java             |   77 ++
 .../arm/domain/vpn/IkeEncryption.java           |   28 +
 .../arm/domain/vpn/IkeIntegrity.java            |   28 +
 .../arm/domain/vpn/LocalNetworkGateway.java     |   72 ++
 .../vpn/LocalNetworkGatewayProperties.java      |   63 ++
 .../azurecompute/arm/domain/vpn/PFSGroup.java   |   28 +
 .../azurecompute/arm/domain/vpn/SKU.java        |   55 +
 .../arm/domain/vpn/VPNClientConfiguration.java  |   89 ++
 .../domain/vpn/VPNClientRevokedCertificate.java |   57 +
 .../domain/vpn/VPNClientRootCertificate.java    |   57 +
 .../azurecompute/arm/domain/vpn/VPNType.java    |   27 +
 .../arm/domain/vpn/VirtualNetworkGateway.java   |   72 ++
 .../vpn/VirtualNetworkGatewayProperties.java    |  144 +++
 .../domain/vpn/VirtualNetworkGatewayType.java   |   28 +
 .../arm/features/LocalNetworkGatewayApi.java    |    4 +-
 .../arm/features/VirtualNetworkGatewayApi.java  |   80 ++
 .../LocalNetworkGatewayApiLiveTest.java         |    8 +-
 .../LocalNetworkGatewayApiMockTest.java         |    8 +-
 .../NetworkInterfaceCardApiLiveTest.java        |    1 -
 .../arm/features/VirtualNetworkApiLiveTest.java |    3 +-
 .../arm/features/VirtualNetworkApiMockTest.java |   22 +-
 .../VirtualNetworkGatewayApiLiveTest.java       |  132 +++
 .../VirtualNetworkGatewayApiMockTest.java       |  161 +++
 .../internal/BaseAzureComputeApiLiveTest.java   |   47 +-
 .../resources/virtualnetworkgatewaycreate.json  |   45 +
 .../resources/virtualnetworkgatewayget.json     |   37 +
 .../resources/virtualnetworkgatewaylist.json    |   49 +
 42 files changed, 2146 insertions(+), 738 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/9705aa7f/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeApi.java
----------------------------------------------------------------------
diff --git 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeApi.java
 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeApi.java
index a4b6282..d14f7e1 100644
--- 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeApi.java
+++ 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeApi.java
@@ -46,6 +46,7 @@ import org.jclouds.azurecompute.arm.features.VaultApi;
 import org.jclouds.azurecompute.arm.features.VirtualMachineApi;
 import org.jclouds.azurecompute.arm.features.VirtualMachineScaleSetApi;
 import org.jclouds.azurecompute.arm.features.VirtualNetworkApi;
+import org.jclouds.azurecompute.arm.features.VirtualNetworkGatewayApi;
 import org.jclouds.rest.annotations.Delegate;
 
 import com.google.common.base.Supplier;
@@ -151,7 +152,7 @@ public interface AzureComputeApi extends Closeable {
    /**
     * The Azure Resource Manager API gets all the OS images in your 
subscription.
     *
-    * @see <a href="http://msdn.microsoft.com/en-us/library/jj157175";>docs</a>
+    * @see <a 
href="https://docs.microsoft.com/en-us/rest/api/compute/virtualmachineimages";>docs</a>
     */
    @Delegate
    OSImageApi getOSImageApi(@PathParam("location") String location);
@@ -272,6 +273,14 @@ public interface AzureComputeApi extends Closeable {
    LocalNetworkGatewayApi 
getLocalNetworkGatewayApi(@PathParam("resourcegroup") String resourcegroup);
    
    /**
+    * Management features for Virtual Network Gateways.
+    * 
+    * @see <a 
href="https://docs.microsoft.com/en-us/rest/api/network-gateway/virtualnetworkgateways";>docs</a>
+    */
+   @Delegate
+   VirtualNetworkGatewayApi 
getVirtualNetworkGatewayApi(@PathParam("resourcegroup") String resourcegroup);
+   
+   /**
     * Returns the information about the current service principal.
     */
    @Provides

http://git-wip-us.apache.org/repos/asf/jclouds/blob/9705aa7f/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java
----------------------------------------------------------------------
diff --git 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java
 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java
index 3038f8e..b16557a 100644
--- 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java
+++ 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java
@@ -63,6 +63,7 @@ import org.jclouds.azurecompute.arm.features.VaultApi;
 import org.jclouds.azurecompute.arm.features.VirtualMachineApi;
 import org.jclouds.azurecompute.arm.features.VirtualMachineScaleSetApi;
 import org.jclouds.azurecompute.arm.features.VirtualNetworkApi;
+import org.jclouds.azurecompute.arm.features.VirtualNetworkGatewayApi;
 import org.jclouds.providers.ProviderMetadata;
 import org.jclouds.providers.internal.BaseProviderMetadata;
 
@@ -132,6 +133,7 @@ public class AzureComputeProviderMetadata extends 
BaseProviderMetadata {
       properties.put(API_VERSION_PREFIX + GraphRBACApi.class.getSimpleName(), 
"1.6");
       properties.put(API_VERSION_PREFIX + VaultApi.class.getSimpleName(), 
"2016-10-01");
       properties.put(API_VERSION_PREFIX + 
LocalNetworkGatewayApi.class.getSimpleName(), "2018-02-01");
+      properties.put(API_VERSION_PREFIX + 
VirtualNetworkGatewayApi.class.getSimpleName(), "2018-02-01");
       
       return properties;
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/9705aa7f/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzurePredicatesModule.java
----------------------------------------------------------------------
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 d02909b..6d7f8ac 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
@@ -35,6 +35,7 @@ import static org.jclouds.util.Predicates2.retry;
 
 import java.net.URI;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import org.jclouds.azurecompute.arm.AzureComputeApi;
 import org.jclouds.azurecompute.arm.domain.Certificate.CertificateBundle;
@@ -52,6 +53,7 @@ import 
org.jclouds.azurecompute.arm.domain.Secret.SecretBundle;
 import org.jclouds.azurecompute.arm.domain.Vault;
 import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance;
 import org.jclouds.azurecompute.arm.domain.VirtualNetwork;
+import org.jclouds.azurecompute.arm.domain.vpn.VirtualNetworkGateway;
 import org.jclouds.azurecompute.arm.functions.ParseJobStatus;
 import org.jclouds.compute.reference.ComputeServiceConstants;
 import org.jclouds.compute.reference.ComputeServiceConstants.PollPeriod;
@@ -65,74 +67,84 @@ import com.google.inject.Provides;
 import com.google.inject.name.Named;
 
 public class AzurePredicatesModule extends AbstractModule {
-    protected void configure() {
-    }
-
-    @Provides
-    @Named(TIMEOUT_NODE_RUNNING)
-    protected VirtualMachineInStatePredicateFactory 
provideVirtualMachineRunningPredicate(final AzureComputeApi api,
-                                                                               
           final ComputeServiceConstants.Timeouts timeouts, final PollPeriod 
pollPeriod) {
-        return new VirtualMachineInStatePredicateFactory(api, 
VirtualMachineInstance.PowerState.RUNNING, timeouts.nodeRunning,
-                pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod);
-    }
-
-    @Provides
-    @Named(TIMEOUT_NODE_TERMINATED)
-    protected Predicate<URI> provideNodeTerminatedPredicate(final 
AzureComputeApi api, final ComputeServiceConstants.Timeouts timeouts,
-                                                            final PollPeriod 
pollPeriod) {
-        return retry(new ActionDonePredicate(api), timeouts.nodeTerminated, 
pollPeriod.pollInitialPeriod,
-                pollPeriod.pollMaxPeriod);
-    }
-
-    @Provides
-    @Named(TIMEOUT_IMAGE_AVAILABLE)
-    protected Predicate<URI> provideImageCapturedPredicate(final 
AzureComputeApi api, final ComputeServiceConstants.Timeouts timeouts,
-                                                           final PollPeriod 
pollPeriod) {
-        return retry(new ImageCapturedPredicate(api), timeouts.imageAvailable, 
pollPeriod.pollInitialPeriod,
-                pollPeriod.pollMaxPeriod);
-    }
-
-    @Provides
-    @Named(TIMEOUT_RESOURCE_DELETED)
-    protected Predicate<URI> provideResourceDeletedPredicate(final 
AzureComputeApi api, final ComputeServiceConstants.Timeouts timeouts,
-                                                             final PollPeriod 
pollPeriod) {
-        return retry(new ActionDonePredicate(api), timeouts.nodeTerminated, 
pollPeriod.pollInitialPeriod,
-                pollPeriod.pollMaxPeriod);
-    }
-
-    @Provides
-    @Named(TIMEOUT_NODE_SUSPENDED)
-    protected VirtualMachineInStatePredicateFactory 
provideNodeSuspendedPredicate(final AzureComputeApi api,
-                                                                               
   final ComputeServiceConstants.Timeouts timeouts, final PollPeriod 
pollPeriod) {
-        return new VirtualMachineInStatePredicateFactory(api, 
VirtualMachineInstance.PowerState.STOPPED, timeouts.nodeTerminated,
-                pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod);
-    }
-
-    @Provides
-    protected PublicIpAvailablePredicateFactory 
providePublicIpAvailablePredicate(final AzureComputeApi api,
-                                                                               
   Predicate<Supplier<Provisionable>> resourceAvailable) {
-        return new PublicIpAvailablePredicateFactory(api, resourceAvailable);
-    }
-
-    @Provides
-    protected SecurityGroupAvailablePredicateFactory 
provideSecurityGroupAvailablePredicate(final AzureComputeApi api,
-                                                                               
             Predicate<Supplier<Provisionable>> resourceAvailable) {
-        return new SecurityGroupAvailablePredicateFactory(api, 
resourceAvailable);
-    }
-
-    @Provides
-    protected ImageAvailablePredicateFactory 
provideImageAvailablePredicate(final AzureComputeApi api,
-                                                                            
Predicate<Supplier<Provisionable>> resourceAvailable, final 
ComputeServiceConstants.Timeouts timeouts, final PollPeriod pollPeriod) {
-        return new ImageAvailablePredicateFactory(api, retry(new 
ResourceInStatusPredicate("Succeeded"),
-                timeouts.imageAvailable, pollPeriod.pollInitialPeriod, 
pollPeriod.pollMaxPeriod));
-    }
-
-    @Provides
-    protected Predicate<Supplier<Provisionable>> 
provideResourceAvailablePredicate(final AzureComputeApi api,
-                                                                               
    @Named(OPERATION_TIMEOUT) Integer operationTimeout, PollPeriod pollPeriod) {
-        return retry(new ResourceInStatusPredicate("Succeeded"), 
operationTimeout, pollPeriod.pollInitialPeriod,
-                pollPeriod.pollMaxPeriod);
-    }
+   protected void configure() {
+   }
+
+   @Provides
+   @Named(TIMEOUT_NODE_RUNNING)
+   protected VirtualMachineInStatePredicateFactory 
provideVirtualMachineRunningPredicate(final AzureComputeApi api,
+         final ComputeServiceConstants.Timeouts timeouts, final PollPeriod 
pollPeriod) {
+      return new VirtualMachineInStatePredicateFactory(api, 
VirtualMachineInstance.PowerState.RUNNING,
+            timeouts.nodeRunning, pollPeriod.pollInitialPeriod, 
pollPeriod.pollMaxPeriod);
+   }
+
+   @Provides
+   @Named(TIMEOUT_NODE_TERMINATED)
+   protected Predicate<URI> provideNodeTerminatedPredicate(final 
AzureComputeApi api,
+         final ComputeServiceConstants.Timeouts timeouts, final PollPeriod 
pollPeriod) {
+      return retry(new ActionDonePredicate(api), timeouts.nodeTerminated, 
pollPeriod.pollInitialPeriod,
+            pollPeriod.pollMaxPeriod);
+   }
+
+   @Provides
+   @Named(TIMEOUT_IMAGE_AVAILABLE)
+   protected Predicate<URI> provideImageCapturedPredicate(final 
AzureComputeApi api,
+         final ComputeServiceConstants.Timeouts timeouts, final PollPeriod 
pollPeriod) {
+      return retry(new ImageCapturedPredicate(api), timeouts.imageAvailable, 
pollPeriod.pollInitialPeriod,
+            pollPeriod.pollMaxPeriod);
+   }
+
+   @Provides
+   @Named(TIMEOUT_RESOURCE_DELETED)
+   protected Predicate<URI> provideResourceDeletedPredicate(final 
AzureComputeApi api,
+         final ComputeServiceConstants.Timeouts timeouts, final PollPeriod 
pollPeriod) {
+      return retry(new ActionDonePredicate(api), timeouts.nodeTerminated, 
pollPeriod.pollInitialPeriod,
+            pollPeriod.pollMaxPeriod);
+   }
+
+   @Provides
+   @Named(TIMEOUT_NODE_SUSPENDED)
+   protected VirtualMachineInStatePredicateFactory 
provideNodeSuspendedPredicate(final AzureComputeApi api,
+         final ComputeServiceConstants.Timeouts timeouts, final PollPeriod 
pollPeriod) {
+      return new VirtualMachineInStatePredicateFactory(api, 
VirtualMachineInstance.PowerState.STOPPED,
+            timeouts.nodeTerminated, pollPeriod.pollInitialPeriod, 
pollPeriod.pollMaxPeriod);
+   }
+
+   @Provides
+   protected PublicIpAvailablePredicateFactory 
providePublicIpAvailablePredicate(final AzureComputeApi api,
+         Predicate<Supplier<Provisionable>> resourceAvailable) {
+      return new PublicIpAvailablePredicateFactory(api, resourceAvailable);
+   }
+
+   @Provides
+   protected SecurityGroupAvailablePredicateFactory 
provideSecurityGroupAvailablePredicate(final AzureComputeApi api,
+         Predicate<Supplier<Provisionable>> resourceAvailable) {
+      return new SecurityGroupAvailablePredicateFactory(api, 
resourceAvailable);
+   }
+
+   @Provides
+   protected ImageAvailablePredicateFactory 
provideImageAvailablePredicate(final AzureComputeApi api,
+         final ComputeServiceConstants.Timeouts timeouts, final PollPeriod 
pollPeriod) {
+      return new ImageAvailablePredicateFactory(api, retry(new 
ResourceInStatusPredicate("Succeeded"),
+            timeouts.imageAvailable, pollPeriod.pollInitialPeriod, 
pollPeriod.pollMaxPeriod));
+   }
+
+   @Provides
+   protected VirtualNetworkGatewayAvailablePredicateFactory 
provideVirtualNetworkGatewayAvailablePredicate(
+         final AzureComputeApi api, Predicate<Supplier<Provisionable>> 
resourceAvailable,
+         final ComputeServiceConstants.Timeouts timeouts, final PollPeriod 
pollPeriod) {
+      // The Azure Virtual Gateways can take up to 45 minutes to be 
provisioned.
+      // Don't poll too aggressively
+      return new VirtualNetworkGatewayAvailablePredicateFactory(api, retry(new 
ResourceInStatusPredicate("Succeeded"),
+            45, 1, 2, TimeUnit.MINUTES));
+   }
+
+   @Provides
+   protected Predicate<Supplier<Provisionable>> 
provideResourceAvailablePredicate(final AzureComputeApi api,
+         @Named(OPERATION_TIMEOUT) Integer operationTimeout, PollPeriod 
pollPeriod) {
+      return retry(new ResourceInStatusPredicate("Succeeded"), 
operationTimeout, pollPeriod.pollInitialPeriod,
+            pollPeriod.pollMaxPeriod);
+   }
 
    @Provides
    protected NetworkAvailablePredicateFactory 
provideNetworkAvailablePredicate(final AzureComputeApi api,
@@ -140,150 +152,123 @@ public class AzurePredicatesModule extends 
AbstractModule {
       return new NetworkAvailablePredicateFactory(api, resourceAvailable);
    }
 
-    @VisibleForTesting
-    static class ActionDonePredicate implements Predicate<URI> {
+   @VisibleForTesting
+   static class ActionDonePredicate implements Predicate<URI> {
+
+      private final AzureComputeApi api;
+
+      public ActionDonePredicate(final AzureComputeApi api) {
+         this.api = checkNotNull(api, "api must not be null");
+      }
+
+      @Override
+      public boolean apply(final URI uri) {
+         checkNotNull(uri, "uri cannot be null");
+         return ParseJobStatus.JobStatus.DONE == api.getJobApi().jobStatus(uri)
+               || ParseJobStatus.JobStatus.NO_CONTENT == 
api.getJobApi().jobStatus(uri);
+      }
+   }
 
-        private final AzureComputeApi api;
+   @VisibleForTesting
+   static class ImageCapturedPredicate implements Predicate<URI> {
 
-        public ActionDonePredicate(final AzureComputeApi api) {
-            this.api = checkNotNull(api, "api must not be null");
-        }
+      private final AzureComputeApi api;
 
-        @Override
-        public boolean apply(final URI uri) {
-            checkNotNull(uri, "uri cannot be null");
-            return ParseJobStatus.JobStatus.DONE == 
api.getJobApi().jobStatus(uri)
-                    || ParseJobStatus.JobStatus.NO_CONTENT == 
api.getJobApi().jobStatus(uri);
-        }
-    }
+      public ImageCapturedPredicate(final AzureComputeApi api) {
+         this.api = checkNotNull(api, "api must not be null");
+      }
 
-    @VisibleForTesting
-    static class ImageCapturedPredicate implements Predicate<URI> {
+      @Override
+      public boolean apply(final URI uri) {
+         checkNotNull(uri, "uri cannot be null");
+         if (api.getJobApi().jobStatus(uri) != ParseJobStatus.JobStatus.DONE) {
+            return false;
+         }
+         List<ResourceDefinition> definitions = 
api.getJobApi().captureStatus(uri);
+         return definitions != null;
+      }
+   }
 
-        private final AzureComputeApi api;
+   public static class VirtualMachineInStatePredicateFactory {
 
-        public ImageCapturedPredicate(final AzureComputeApi api) {
-            this.api = checkNotNull(api, "api must not be null");
-        }
+      private final AzureComputeApi api;
+      private final VirtualMachineInstance.PowerState powerState;
+      private final long timeout;
+      private final long period;
+      private final long maxPeriod;
+
+      VirtualMachineInStatePredicateFactory(final AzureComputeApi api,
+            final VirtualMachineInstance.PowerState powerState, final long 
timeout, final long period,
+            final long maxPeriod) {
+         this.api = checkNotNull(api, "api cannot be null");
+         this.powerState = checkNotNull(powerState, "powerState cannot be 
null");
+         this.timeout = timeout;
+         this.period = period;
+         this.maxPeriod = maxPeriod;
+      }
 
-        @Override
-        public boolean apply(final URI uri) {
-            checkNotNull(uri, "uri cannot be null");
-            if (api.getJobApi().jobStatus(uri) != 
ParseJobStatus.JobStatus.DONE) {
-                return false;
+      public Predicate<String> create(final String azureGroup) {
+         return retry(new Predicate<String>() {
+            @Override
+            public boolean apply(final String name) {
+               checkNotNull(name, "name cannot be null");
+               VirtualMachineInstance vmInstance = 
api.getVirtualMachineApi(azureGroup).getInstanceDetails(name);
+               if (vmInstance == null) {
+                  return false;
+               }
+               return powerState == vmInstance.powerState();
             }
-            List<ResourceDefinition> definitions = 
api.getJobApi().captureStatus(uri);
-            return definitions != null;
-        }
-    }
+         }, timeout, period, maxPeriod);
+      }
+   }
 
-    public static class VirtualMachineInStatePredicateFactory {
+   public static class ResourceInStatusPredicate implements 
Predicate<Supplier<Provisionable>> {
+      private final String expectedStatus;
 
-        private final AzureComputeApi api;
-        private final VirtualMachineInstance.PowerState powerState;
-        private final long timeout;
-        private final long period;
-        private final long maxPeriod;
+      ResourceInStatusPredicate(String expectedStatus) {
+         this.expectedStatus = checkNotNull(expectedStatus, "expectedStatus 
cannot be null");
+      }
 
-        VirtualMachineInStatePredicateFactory(final AzureComputeApi api, final 
VirtualMachineInstance.PowerState powerState, final long timeout,
-                                              final long period, final long 
maxPeriod) {
-            this.api = checkNotNull(api, "api cannot be null");
-            this.powerState = checkNotNull(powerState, "powerState cannot be 
null");
-            this.timeout = timeout;
-            this.period = period;
-            this.maxPeriod = maxPeriod;
-        }
+      @Override
+      public boolean apply(Supplier<Provisionable> provisionableSupplier) {
+         checkNotNull(provisionableSupplier, "provisionableSupplier supplier 
cannot be null");
+         Provisionable provisionable = provisionableSupplier.get();
+         return provisionable != null && 
provisionable.provisioningState().equalsIgnoreCase(expectedStatus);
+      }
+   }
 
-        public Predicate<String> create(final String azureGroup) {
-            return retry(new Predicate<String>() {
-                @Override
-                public boolean apply(final String name) {
-                    checkNotNull(name, "name cannot be null");
-                    VirtualMachineInstance vmInstance = 
api.getVirtualMachineApi(azureGroup).getInstanceDetails(name);
-                    if (vmInstance == null) {
-                        return false;
-                    }
-                    return powerState == vmInstance.powerState();
-                }
-            }, timeout, period, maxPeriod);
-        }
-    }
-
-    public static class ResourceInStatusPredicate implements 
Predicate<Supplier<Provisionable>> {
-        private final String expectedStatus;
-
-        ResourceInStatusPredicate(String expectedStatus) {
-            this.expectedStatus = checkNotNull(expectedStatus, "expectedStatus 
cannot be null");
-        }
-
-        @Override
-        public boolean apply(Supplier<Provisionable> provisionableSupplier) {
-            checkNotNull(provisionableSupplier, "provisionableSupplier 
supplier cannot be null");
-            Provisionable provisionable = provisionableSupplier.get();
-            return provisionable != null && 
provisionable.provisioningState().equalsIgnoreCase(expectedStatus);
-        }
-    }
-
-    public static class PublicIpAvailablePredicateFactory {
-        private final AzureComputeApi api;
-        private final Predicate<Supplier<Provisionable>> resourceAvailable;
-
-        PublicIpAvailablePredicateFactory(final AzureComputeApi api, 
Predicate<Supplier<Provisionable>> resourceAvailable) {
-            this.api = checkNotNull(api, "api cannot be null");
-            this.resourceAvailable = resourceAvailable;
-        }
-
-        public Predicate<String> create(final String azureGroup) {
-            checkNotNull(azureGroup, "azureGroup 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() {
-                            PublicIPAddress publicIp = 
api.getPublicIPAddressApi(azureGroup).get(name);
-                            return publicIp == null ? null : 
publicIp.properties();
-                        }
-                    });
-                }
-            };
-        }
-    }
-
-    public static class SecurityGroupAvailablePredicateFactory {
-        private final AzureComputeApi api;
-        private final Predicate<Supplier<Provisionable>> resourceAvailable;
-
-        SecurityGroupAvailablePredicateFactory(final AzureComputeApi api,
-                                               
Predicate<Supplier<Provisionable>> resourceAvailable) {
-            this.api = checkNotNull(api, "api cannot be null");
-            this.resourceAvailable = resourceAvailable;
-        }
+   public static class PublicIpAvailablePredicateFactory {
+      private final AzureComputeApi api;
+      private final Predicate<Supplier<Provisionable>> resourceAvailable;
 
-        public Predicate<String> create(final String resourceGroup) {
-            checkNotNull(resourceGroup, "resourceGroup 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() {
-                            NetworkSecurityGroup sg = 
api.getNetworkSecurityGroupApi(resourceGroup).get(name);
-                            return sg == null ? null : sg.properties();
-                        }
-                    });
-                }
-            };
-        }
-    }
+      PublicIpAvailablePredicateFactory(final AzureComputeApi api, 
Predicate<Supplier<Provisionable>> resourceAvailable) {
+         this.api = checkNotNull(api, "api cannot be null");
+         this.resourceAvailable = resourceAvailable;
+      }
 
-   public static class NetworkAvailablePredicateFactory {
+      public Predicate<String> create(final String azureGroup) {
+         checkNotNull(azureGroup, "azureGroup 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() {
+                     PublicIPAddress publicIp = 
api.getPublicIPAddressApi(azureGroup).get(name);
+                     return publicIp == null ? null : publicIp.properties();
+                  }
+               });
+            }
+         };
+      }
+   }
+
+   public static class SecurityGroupAvailablePredicateFactory {
       private final AzureComputeApi api;
       private final Predicate<Supplier<Provisionable>> resourceAvailable;
 
-      NetworkAvailablePredicateFactory(final AzureComputeApi api,
+      SecurityGroupAvailablePredicateFactory(final AzureComputeApi api,
             Predicate<Supplier<Provisionable>> resourceAvailable) {
          this.api = checkNotNull(api, "api cannot be null");
          this.resourceAvailable = resourceAvailable;
@@ -298,6 +283,33 @@ public class AzurePredicatesModule extends AbstractModule {
                return resourceAvailable.apply(new Supplier<Provisionable>() {
                   @Override
                   public Provisionable get() {
+                     NetworkSecurityGroup sg = 
api.getNetworkSecurityGroupApi(resourceGroup).get(name);
+                     return sg == null ? null : sg.properties();
+                  }
+               });
+            }
+         };
+      }
+   }
+
+   public static class NetworkAvailablePredicateFactory {
+      private final AzureComputeApi api;
+      private final Predicate<Supplier<Provisionable>> resourceAvailable;
+
+      NetworkAvailablePredicateFactory(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) {
+         checkNotNull(resourceGroup, "resourceGroup 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() {
                      VirtualNetwork vnet = 
api.getVirtualNetworkApi(resourceGroup).get(name);
                      return vnet == null ? null : vnet.properties();
                   }
@@ -307,324 +319,363 @@ public class AzurePredicatesModule extends 
AbstractModule {
       }
    }
 
+   public static class ImageAvailablePredicateFactory {
+      private final AzureComputeApi api;
+      private final Predicate<Supplier<Provisionable>> resourceAvailable;
+
+      ImageAvailablePredicateFactory(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) {
+         checkNotNull(resourceGroup, "resourceGroup 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() {
+                     Image img = 
api.getVirtualMachineImageApi(resourceGroup).get(name);
+                     return img == null ? null : img.properties();
+                  }
+               });
+            }
+         };
+      }
+   }
+
+   public static class VirtualNetworkGatewayAvailablePredicateFactory {
+      private final AzureComputeApi api;
+      private final Predicate<Supplier<Provisionable>> resourceAvailable;
+
+      VirtualNetworkGatewayAvailablePredicateFactory(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) {
+         checkNotNull(resourceGroup, "resourceGroup 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() {
+                     VirtualNetworkGateway vng = 
api.getVirtualNetworkGatewayApi(resourceGroup).get(name);
+                     return vng == null ? null : vng.properties();
+                  }
+               });
+            }
+         };
+      }
+   }
+
+   @Provides
+   @Named(VAULT_DELETE_STATUS)
+   protected VaultPredicates.DeletedVaultStatusPredicateFactory 
provideDeletedVaultStatusPredicateFactory(
+         final AzureComputeApi api, @Named(OPERATION_TIMEOUT) Integer 
operationTimeout, final PollPeriod pollPeriod) {
+      return new VaultPredicates.DeletedVaultStatusPredicateFactory(api, 
operationTimeout.longValue(),
+            pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod);
+   }
 
-    public static class ImageAvailablePredicateFactory {
-        private final AzureComputeApi api;
-        private final Predicate<Supplier<Provisionable>> resourceAvailable;
+   public static class VaultPredicates {
+      public static class DeletedVaultStatusPredicateFactory {
+         private final AzureComputeApi api;
+         private final long operationTimeout;
+         private final long initialPeriod;
+         private final long maxPeriod;
 
-        ImageAvailablePredicateFactory(final AzureComputeApi api,
-                                       Predicate<Supplier<Provisionable>> 
resourceAvailable) {
+         DeletedVaultStatusPredicateFactory(final AzureComputeApi api, final 
long operationTimeout,
+               final long initialPeriod, final long maxPeriod) {
             this.api = checkNotNull(api, "api cannot be null");
-            this.resourceAvailable = resourceAvailable;
-        }
+            this.operationTimeout = operationTimeout;
+            this.initialPeriod = initialPeriod;
+            this.maxPeriod = maxPeriod;
+         }
 
-        public Predicate<String> create(final String resourceGroup) {
+         public Predicate<String> create(final String resourceGroup, final 
boolean shouldBePresent) {
             checkNotNull(resourceGroup, "resourceGroup 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() {
-                            Image img = 
api.getVirtualMachineImageApi(resourceGroup).get(name);
-                            return img == null ? null : img.properties();
-                        }
-                    });
-                }
-            };
-        }
-    }
-
-    @Provides
-    @Named(VAULT_DELETE_STATUS)
-    protected VaultPredicates.DeletedVaultStatusPredicateFactory 
provideDeletedVaultStatusPredicateFactory(final AzureComputeApi api,
-                                                                               
                            @Named(OPERATION_TIMEOUT) Integer operationTimeout,
-                                                                               
                            final PollPeriod pollPeriod) {
-        return new VaultPredicates.DeletedVaultStatusPredicateFactory(api, 
operationTimeout.longValue(), pollPeriod.pollInitialPeriod, 
pollPeriod.pollMaxPeriod);
-    }
-
-    public static class VaultPredicates {
-        public static class DeletedVaultStatusPredicateFactory {
-            private final AzureComputeApi api;
-            private final long operationTimeout;
-            private final long initialPeriod;
-            private final long maxPeriod;
-
-            DeletedVaultStatusPredicateFactory(final AzureComputeApi api, 
final long operationTimeout, final long initialPeriod, final long maxPeriod) {
-                this.api = checkNotNull(api, "api cannot be null");
-                this.operationTimeout = operationTimeout;
-                this.initialPeriod = initialPeriod;
-                this.maxPeriod = maxPeriod;
-            }
+            return retry(new Predicate<String>() {
+               @Override
+               public boolean apply(final String name) {
+                  checkNotNull(name, "name cannot be null");
+                  List<Vault.DeletedVault> vaults = 
api.getVaultApi(resourceGroup).listDeletedVaults();
+                  return shouldBePresent == Iterables.any(vaults, new 
Predicate<Vault.DeletedVault>() {
+                     @Override
+                     public boolean apply(Vault.DeletedVault input) {
+                        return input.name().equals(name);
+                     }
+                  });
+               }
+            }, operationTimeout, initialPeriod, maxPeriod);
+         }
+      }
+   }
 
-            public Predicate<String> create(final String resourceGroup, final 
boolean shouldBePresent) {
-                checkNotNull(resourceGroup, "resourceGroup cannot be null");
-                return retry(new Predicate<String>() {
-                    @Override
-                    public boolean apply(final String name) {
-                        checkNotNull(name, "name cannot be null");
-                        List<Vault.DeletedVault> vaults = 
api.getVaultApi(resourceGroup).listDeletedVaults();
-                        return shouldBePresent == Iterables.any(vaults, new 
Predicate<Vault.DeletedVault>() {
-                            @Override public boolean apply(Vault.DeletedVault 
input) {
-                                return input.name().equals(name);
-                            }
-                        });
-                    }
-                }, operationTimeout, initialPeriod, maxPeriod);
-            }
-        }
-    }
-
-    @Provides
-    @Named(VAULT_KEY_DELETED_STATUS)
-    protected VaultKeyPredicates.DeletedKeyStatusPredicateFactory 
provideDeletedKeyStatusPredicateFactory(final AzureComputeApi api,
-                                                                               
                           @Named(OPERATION_TIMEOUT) Integer operationTimeout,
-                                                                               
                           final PollPeriod pollPeriod) {
-        return new VaultKeyPredicates.DeletedKeyStatusPredicateFactory(api, 
operationTimeout.longValue(), pollPeriod.pollInitialPeriod, 
pollPeriod.pollMaxPeriod);
-    }
-
-    @Provides
-    @Named(VAULT_KEY_RECOVERABLE_STATUS)
-    protected VaultKeyPredicates.RecoverableKeyStatusPredicateFactory 
provideRecoverableKeyStatusPredicateFactory(final AzureComputeApi api,
-                                                                               
                                   @Named(OPERATION_TIMEOUT) Integer 
operationTimeout,
-                                                                               
                                   final PollPeriod pollPeriod) {
-        return new 
VaultKeyPredicates.RecoverableKeyStatusPredicateFactory(api, 
operationTimeout.longValue(), pollPeriod.pollInitialPeriod, 
pollPeriod.pollMaxPeriod);
-    }
-
-    public static class VaultKeyPredicates {
-        public static class DeletedKeyStatusPredicateFactory {
-            private final AzureComputeApi api;
-            private final long operationTimeout;
-            private final long initialPeriod;
-            private final long maxPeriod;
-
-            DeletedKeyStatusPredicateFactory(final AzureComputeApi api, final 
long operationTimeout, final long initialPeriod, final long maxPeriod) {
-                this.api = checkNotNull(api, "api cannot be null");
-                this.operationTimeout = operationTimeout;
-                this.initialPeriod = initialPeriod;
-                this.maxPeriod = maxPeriod;
-            }
+   @Provides
+   @Named(VAULT_KEY_DELETED_STATUS)
+   protected VaultKeyPredicates.DeletedKeyStatusPredicateFactory 
provideDeletedKeyStatusPredicateFactory(
+         final AzureComputeApi api, @Named(OPERATION_TIMEOUT) Integer 
operationTimeout, final PollPeriod pollPeriod) {
+      return new VaultKeyPredicates.DeletedKeyStatusPredicateFactory(api, 
operationTimeout.longValue(),
+            pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod);
+   }
 
-            public Predicate<String> create(final String resourceGroup, final 
URI vaultUri, final boolean shouldBePresent) {
-                checkNotNull(resourceGroup, "resourceGroup cannot be null");
-                checkNotNull(vaultUri, "vaultUri cannot be null");
-                return retry(new Predicate<String>() {
-                    @Override
-                    public boolean apply(final String name) {
-                        checkNotNull(name, "name cannot be null");
-                        DeletedKeyBundle key = 
api.getVaultApi(resourceGroup).getDeletedKey(vaultUri, name);
-                        return shouldBePresent == (key != null);
-                    }
-                }, operationTimeout, initialPeriod, maxPeriod);
-            }
-        }
-
-        public static class RecoverableKeyStatusPredicateFactory {
-            private final AzureComputeApi api;
-            private final long operationTimeout;
-            private final long initialPeriod;
-            private final long maxPeriod;
-
-            RecoverableKeyStatusPredicateFactory(final AzureComputeApi api, 
final long operationTimeout, final long initialPeriod, final long maxPeriod) {
-                this.api = checkNotNull(api, "api cannot be null");
-                this.operationTimeout = operationTimeout;
-                this.initialPeriod = initialPeriod;
-                this.maxPeriod = maxPeriod;
-            }
+   @Provides
+   @Named(VAULT_KEY_RECOVERABLE_STATUS)
+   protected VaultKeyPredicates.RecoverableKeyStatusPredicateFactory 
provideRecoverableKeyStatusPredicateFactory(
+         final AzureComputeApi api, @Named(OPERATION_TIMEOUT) Integer 
operationTimeout, final PollPeriod pollPeriod) {
+      return new VaultKeyPredicates.RecoverableKeyStatusPredicateFactory(api, 
operationTimeout.longValue(),
+            pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod);
+   }
 
-            public Predicate<String> create(final String resourceGroup, final 
URI vaultUri, final boolean isRecovered) {
-                checkNotNull(resourceGroup, "resourceGroup cannot be null");
-                checkNotNull(vaultUri, "vaultUri cannot be null");
-                return retry(new Predicate<String>() {
-                    @Override
-                    public boolean apply(final String name) {
-                        checkNotNull(name, "name cannot be null");
-                        KeyBundle key = 
api.getVaultApi(resourceGroup).getKey(vaultUri, name);
-                        return key != null ? (isRecovered ? true : 
key.attributes().recoveryLevel().contains("Recoverable")) : false;
-                    }
-                }, operationTimeout, initialPeriod, maxPeriod);
-            }
-        }
-    }
-
-    @Provides
-    @Named(VAULT_SECRET_DELETE_STATUS)
-    protected VaultSecretPredicates.DeletedSecretStatusPredicateFactory 
provideDeletedSecretStatusPredicateFactory(final AzureComputeApi api,
-                                                                               
                                    @Named(OPERATION_TIMEOUT) Integer 
operationTimeout,
-                                                                               
                                    final PollPeriod pollPeriod) {
-        return new 
VaultSecretPredicates.DeletedSecretStatusPredicateFactory(api, 
operationTimeout.longValue(), pollPeriod.pollInitialPeriod, 
pollPeriod.pollMaxPeriod);
-    }
-
-    @Provides
-    @Named(VAULT_SECRET_RECOVERABLE_STATUS)
-    protected VaultSecretPredicates.RecoverableSecretStatusPredicateFactory 
provideRecoverableSecretStatusPredicateFactory(final AzureComputeApi api,
-                                                                               
                                            @Named(OPERATION_TIMEOUT) Integer 
operationTimeout,
-                                                                               
                                            final PollPeriod pollPeriod) {
-        return new 
VaultSecretPredicates.RecoverableSecretStatusPredicateFactory(api, 
operationTimeout.longValue(), pollPeriod.pollInitialPeriod, 
pollPeriod.pollMaxPeriod);
-    }
-
-    public static class VaultSecretPredicates {
-        public static class DeletedSecretStatusPredicateFactory {
-            private final AzureComputeApi api;
-            private final long operationTimeout;
-            private final long initialPeriod;
-            private final long maxPeriod;
-
-            DeletedSecretStatusPredicateFactory(final AzureComputeApi api, 
final long operationTimeout, final long initialPeriod, final long maxPeriod) {
-                this.api = checkNotNull(api, "api cannot be null");
-                this.operationTimeout = operationTimeout;
-                this.initialPeriod = initialPeriod;
-                this.maxPeriod = maxPeriod;
-            }
+   public static class VaultKeyPredicates {
+      public static class DeletedKeyStatusPredicateFactory {
+         private final AzureComputeApi api;
+         private final long operationTimeout;
+         private final long initialPeriod;
+         private final long maxPeriod;
 
-            public Predicate<String> create(final String resourceGroup, final 
URI vaultUri, final boolean shouldBePresent) {
-                checkNotNull(resourceGroup, "resourceGroup cannot be null");
-                checkNotNull(vaultUri, "vaultUri cannot be null");
-                return retry(new Predicate<String>() {
-                    @Override
-                    public boolean apply(final String name) {
-                        checkNotNull(name, "name cannot be null");
-                        DeletedSecretBundle secret = 
api.getVaultApi(resourceGroup).getDeletedSecret(vaultUri, name);
-                        return shouldBePresent == (secret != null);
-                    }
-                }, operationTimeout, initialPeriod, maxPeriod);
-            }
-        }
-
-        public static class RecoverableSecretStatusPredicateFactory {
-            private final AzureComputeApi api;
-            private final long operationTimeout;
-            private final long initialPeriod;
-            private final long maxPeriod;
-
-            RecoverableSecretStatusPredicateFactory(final AzureComputeApi api, 
final long operationTimeout, final long initialPeriod, final long maxPeriod) {
-                this.api = checkNotNull(api, "api cannot be null");
-                this.operationTimeout = operationTimeout;
-                this.initialPeriod = initialPeriod;
-                this.maxPeriod = maxPeriod;
-            }
+         DeletedKeyStatusPredicateFactory(final AzureComputeApi api, final 
long operationTimeout,
+               final long initialPeriod, final long maxPeriod) {
+            this.api = checkNotNull(api, "api cannot be null");
+            this.operationTimeout = operationTimeout;
+            this.initialPeriod = initialPeriod;
+            this.maxPeriod = maxPeriod;
+         }
 
-            public Predicate<String> create(final String resourceGroup, final 
URI vaultUri, final boolean isRecovered) {
-                checkNotNull(resourceGroup, "resourceGroup cannot be null");
-                checkNotNull(vaultUri, "vaultUri cannot be null");
-                return retry(new Predicate<String>() {
-                    @Override
-                    public boolean apply(final String name) {
-                        checkNotNull(name, "name cannot be null");
-                        SecretBundle secret = 
api.getVaultApi(resourceGroup).getSecret(vaultUri, name, null);
-                        return secret != null ? (isRecovered ? true : 
secret.attributes().recoveryLevel().contains("Recoverable")) : false;
-                    }
-                }, operationTimeout, initialPeriod, maxPeriod);
-            }
-        }
-    }
-
-    @Provides
-    @Named(VAULT_CERTIFICATE_DELETE_STATUS)
-    protected 
VaultCertificatePredicates.DeletedCertificateStatusPredicateFactory 
provideDeletedCertificateStatusPredicateFactory(final AzureComputeApi api,
-                                                                               
                                                   @Named(OPERATION_TIMEOUT) 
Integer operationTimeout,
-                                                                               
                                                   final PollPeriod pollPeriod) 
{
-        return new 
VaultCertificatePredicates.DeletedCertificateStatusPredicateFactory(api, 
operationTimeout.longValue(), pollPeriod.pollInitialPeriod, 
pollPeriod.pollMaxPeriod);
-    }
-
-    @Provides
-    @Named(VAULT_CERTIFICATE_RECOVERABLE_STATUS)
-    protected 
VaultCertificatePredicates.RecoverableCertificateStatusPredicateFactory 
provideRecoverableCertificateStatusPredicateFactory(final AzureComputeApi api,
-                                                                               
                                                           
@Named(OPERATION_TIMEOUT) Integer operationTimeout,
-                                                                               
                                                           final PollPeriod 
pollPeriod) {
-        return new 
VaultCertificatePredicates.RecoverableCertificateStatusPredicateFactory(api, 
operationTimeout.longValue(), pollPeriod.pollInitialPeriod, 
pollPeriod.pollMaxPeriod);
-    }
-
-    @Provides
-    @Named(VAULT_CERTIFICATE_OPERATION_STATUS)
-    protected 
VaultCertificatePredicates.CertificateOperationStatusPredicateFactory 
provideCertificateOperationStatusPredicateFactory(final AzureComputeApi api,
-                                                                               
                                                       
@Named(OPERATION_TIMEOUT) Integer operationTimeout,
-                                                                               
                                                       final PollPeriod 
pollPeriod) {
-        return new 
VaultCertificatePredicates.CertificateOperationStatusPredicateFactory(api, 
operationTimeout.longValue(), pollPeriod.pollInitialPeriod, 
pollPeriod.pollMaxPeriod);
-    }
-
-    public static class VaultCertificatePredicates {
-        public static class DeletedCertificateStatusPredicateFactory {
-            private final AzureComputeApi api;
-            private final long operationTimeout;
-            private final long initialPeriod;
-            private final long maxPeriod;
-
-            DeletedCertificateStatusPredicateFactory(final AzureComputeApi 
api, final long operationTimeout, final long initialPeriod, final long 
maxPeriod) {
-                this.api = checkNotNull(api, "api cannot be null");
-                this.operationTimeout = operationTimeout;
-                this.initialPeriod = initialPeriod;
-                this.maxPeriod = maxPeriod;
-            }
+         public Predicate<String> create(final String resourceGroup, final URI 
vaultUri, final boolean shouldBePresent) {
+            checkNotNull(resourceGroup, "resourceGroup cannot be null");
+            checkNotNull(vaultUri, "vaultUri cannot be null");
+            return retry(new Predicate<String>() {
+               @Override
+               public boolean apply(final String name) {
+                  checkNotNull(name, "name cannot be null");
+                  DeletedKeyBundle key = 
api.getVaultApi(resourceGroup).getDeletedKey(vaultUri, name);
+                  return shouldBePresent == (key != null);
+               }
+            }, operationTimeout, initialPeriod, maxPeriod);
+         }
+      }
 
-            public Predicate<String> create(final String resourceGroup, final 
URI vaultUri, final boolean shouldBePresent) {
-                checkNotNull(resourceGroup, "resourceGroup cannot be null");
-                checkNotNull(vaultUri, "vaultUri cannot be null");
-                return retry(new Predicate<String>() {
-                    @Override
-                    public boolean apply(final String name) {
-                        checkNotNull(name, "name cannot be null");
-                        DeletedCertificateBundle cert = 
api.getVaultApi(resourceGroup).getDeletedCertificate(vaultUri, name);
-                        return shouldBePresent == (cert != null);
-                    }
-                }, operationTimeout, initialPeriod, maxPeriod);
-            }
-        }
-
-        public static class RecoverableCertificateStatusPredicateFactory {
-            private final AzureComputeApi api;
-            private final long operationTimeout;
-            private final long initialPeriod;
-            private final long maxPeriod;
-
-            RecoverableCertificateStatusPredicateFactory(final AzureComputeApi 
api, final long operationTimeout, final long initialPeriod, final long 
maxPeriod) {
-                this.api = checkNotNull(api, "api cannot be null");
-                this.operationTimeout = operationTimeout;
-                this.initialPeriod = initialPeriod;
-                this.maxPeriod = maxPeriod;
-            }
+      public static class RecoverableKeyStatusPredicateFactory {
+         private final AzureComputeApi api;
+         private final long operationTimeout;
+         private final long initialPeriod;
+         private final long maxPeriod;
 
-            public Predicate<String> create(final String resourceGroup, final 
URI vaultUri, final boolean isImport) {
-                checkNotNull(resourceGroup, "resourceGroup cannot be null");
-                checkNotNull(vaultUri, "vaultUri cannot be null");
-                return retry(new Predicate<String>() {
-                    @Override
-                    public boolean apply(final String name) {
-                        checkNotNull(name, "name cannot be null");
-                        CertificateBundle cert = 
api.getVaultApi(resourceGroup).getCertificate(vaultUri, name, null);
-                        return cert != null ? (isImport ? true : 
cert.attributes().recoveryLevel().contains("Recoverable")) : false;
-
-                    }
-                }, operationTimeout, initialPeriod, maxPeriod);
-            }
-        }
-
-        public static class CertificateOperationStatusPredicateFactory {
-            private final AzureComputeApi api;
-            private final long operationTimeout;
-            private final long initialPeriod;
-            private final long maxPeriod;
-
-            CertificateOperationStatusPredicateFactory(final AzureComputeApi 
api, final long operationTimeout, final long initialPeriod, final long 
maxPeriod) {
-                this.api = checkNotNull(api, "api cannot be null");
-                this.operationTimeout = operationTimeout;
-                this.initialPeriod = initialPeriod;
-                this.maxPeriod = maxPeriod;
-            }
+         RecoverableKeyStatusPredicateFactory(final AzureComputeApi api, final 
long operationTimeout,
+               final long initialPeriod, final long maxPeriod) {
+            this.api = checkNotNull(api, "api cannot be null");
+            this.operationTimeout = operationTimeout;
+            this.initialPeriod = initialPeriod;
+            this.maxPeriod = maxPeriod;
+         }
 
-            public Predicate<String> create(final String resourceGroup, final 
URI vaultUri, final boolean isCreate) {
-                checkNotNull(resourceGroup, "resourceGroup cannot be null");
-                checkNotNull(vaultUri, "vaultUri cannot be null");
-                return retry(new Predicate<String>() {
-                    @Override
-                    public boolean apply(final String name) {
-                        checkNotNull(name, "name cannot be null");
-                        CertificateOperation certOp = 
api.getVaultApi(resourceGroup).getCertificateOperation(vaultUri, name);
-                        return isCreate ? ((certOp != null) ? 
!certOp.status().equals("inProgress") : false) : (certOp == null);
-                    }
-                }, operationTimeout, initialPeriod, maxPeriod);
-            }
-        }
-    }
+         public Predicate<String> create(final String resourceGroup, final URI 
vaultUri, final boolean isRecovered) {
+            checkNotNull(resourceGroup, "resourceGroup cannot be null");
+            checkNotNull(vaultUri, "vaultUri cannot be null");
+            return retry(new Predicate<String>() {
+               @Override
+               public boolean apply(final String name) {
+                  checkNotNull(name, "name cannot be null");
+                  KeyBundle key = 
api.getVaultApi(resourceGroup).getKey(vaultUri, name);
+                  return key != null ? (isRecovered ? true : 
key.attributes().recoveryLevel().contains("Recoverable"))
+                        : false;
+               }
+            }, operationTimeout, initialPeriod, maxPeriod);
+         }
+      }
+   }
+
+   @Provides
+   @Named(VAULT_SECRET_DELETE_STATUS)
+   protected VaultSecretPredicates.DeletedSecretStatusPredicateFactory 
provideDeletedSecretStatusPredicateFactory(
+         final AzureComputeApi api, @Named(OPERATION_TIMEOUT) Integer 
operationTimeout, final PollPeriod pollPeriod) {
+      return new 
VaultSecretPredicates.DeletedSecretStatusPredicateFactory(api, 
operationTimeout.longValue(),
+            pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod);
+   }
+
+   @Provides
+   @Named(VAULT_SECRET_RECOVERABLE_STATUS)
+   protected VaultSecretPredicates.RecoverableSecretStatusPredicateFactory 
provideRecoverableSecretStatusPredicateFactory(
+         final AzureComputeApi api, @Named(OPERATION_TIMEOUT) Integer 
operationTimeout, final PollPeriod pollPeriod) {
+      return new 
VaultSecretPredicates.RecoverableSecretStatusPredicateFactory(api, 
operationTimeout.longValue(),
+            pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod);
+   }
+
+   public static class VaultSecretPredicates {
+      public static class DeletedSecretStatusPredicateFactory {
+         private final AzureComputeApi api;
+         private final long operationTimeout;
+         private final long initialPeriod;
+         private final long maxPeriod;
+
+         DeletedSecretStatusPredicateFactory(final AzureComputeApi api, final 
long operationTimeout,
+               final long initialPeriod, final long maxPeriod) {
+            this.api = checkNotNull(api, "api cannot be null");
+            this.operationTimeout = operationTimeout;
+            this.initialPeriod = initialPeriod;
+            this.maxPeriod = maxPeriod;
+         }
+
+         public Predicate<String> create(final String resourceGroup, final URI 
vaultUri, final boolean shouldBePresent) {
+            checkNotNull(resourceGroup, "resourceGroup cannot be null");
+            checkNotNull(vaultUri, "vaultUri cannot be null");
+            return retry(new Predicate<String>() {
+               @Override
+               public boolean apply(final String name) {
+                  checkNotNull(name, "name cannot be null");
+                  DeletedSecretBundle secret = 
api.getVaultApi(resourceGroup).getDeletedSecret(vaultUri, name);
+                  return shouldBePresent == (secret != null);
+               }
+            }, operationTimeout, initialPeriod, maxPeriod);
+         }
+      }
+
+      public static class RecoverableSecretStatusPredicateFactory {
+         private final AzureComputeApi api;
+         private final long operationTimeout;
+         private final long initialPeriod;
+         private final long maxPeriod;
+
+         RecoverableSecretStatusPredicateFactory(final AzureComputeApi api, 
final long operationTimeout,
+               final long initialPeriod, final long maxPeriod) {
+            this.api = checkNotNull(api, "api cannot be null");
+            this.operationTimeout = operationTimeout;
+            this.initialPeriod = initialPeriod;
+            this.maxPeriod = maxPeriod;
+         }
+
+         public Predicate<String> create(final String resourceGroup, final URI 
vaultUri, final boolean isRecovered) {
+            checkNotNull(resourceGroup, "resourceGroup cannot be null");
+            checkNotNull(vaultUri, "vaultUri cannot be null");
+            return retry(new Predicate<String>() {
+               @Override
+               public boolean apply(final String name) {
+                  checkNotNull(name, "name cannot be null");
+                  SecretBundle secret = 
api.getVaultApi(resourceGroup).getSecret(vaultUri, name, null);
+                  return secret != null ? (isRecovered ? true : 
secret.attributes().recoveryLevel()
+                        .contains("Recoverable")) : false;
+               }
+            }, operationTimeout, initialPeriod, maxPeriod);
+         }
+      }
+   }
+
+   @Provides
+   @Named(VAULT_CERTIFICATE_DELETE_STATUS)
+   protected 
VaultCertificatePredicates.DeletedCertificateStatusPredicateFactory 
provideDeletedCertificateStatusPredicateFactory(
+         final AzureComputeApi api, @Named(OPERATION_TIMEOUT) Integer 
operationTimeout, final PollPeriod pollPeriod) {
+      return new 
VaultCertificatePredicates.DeletedCertificateStatusPredicateFactory(api, 
operationTimeout.longValue(),
+            pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod);
+   }
+
+   @Provides
+   @Named(VAULT_CERTIFICATE_RECOVERABLE_STATUS)
+   protected 
VaultCertificatePredicates.RecoverableCertificateStatusPredicateFactory 
provideRecoverableCertificateStatusPredicateFactory(
+         final AzureComputeApi api, @Named(OPERATION_TIMEOUT) Integer 
operationTimeout, final PollPeriod pollPeriod) {
+      return new 
VaultCertificatePredicates.RecoverableCertificateStatusPredicateFactory(api,
+            operationTimeout.longValue(), pollPeriod.pollInitialPeriod, 
pollPeriod.pollMaxPeriod);
+   }
+
+   @Provides
+   @Named(VAULT_CERTIFICATE_OPERATION_STATUS)
+   protected 
VaultCertificatePredicates.CertificateOperationStatusPredicateFactory 
provideCertificateOperationStatusPredicateFactory(
+         final AzureComputeApi api, @Named(OPERATION_TIMEOUT) Integer 
operationTimeout, final PollPeriod pollPeriod) {
+      return new 
VaultCertificatePredicates.CertificateOperationStatusPredicateFactory(api,
+            operationTimeout.longValue(), pollPeriod.pollInitialPeriod, 
pollPeriod.pollMaxPeriod);
+   }
+
+   public static class VaultCertificatePredicates {
+      public static class DeletedCertificateStatusPredicateFactory {
+         private final AzureComputeApi api;
+         private final long operationTimeout;
+         private final long initialPeriod;
+         private final long maxPeriod;
+
+         DeletedCertificateStatusPredicateFactory(final AzureComputeApi api, 
final long operationTimeout,
+               final long initialPeriod, final long maxPeriod) {
+            this.api = checkNotNull(api, "api cannot be null");
+            this.operationTimeout = operationTimeout;
+            this.initialPeriod = initialPeriod;
+            this.maxPeriod = maxPeriod;
+         }
+
+         public Predicate<String> create(final String resourceGroup, final URI 
vaultUri, final boolean shouldBePresent) {
+            checkNotNull(resourceGroup, "resourceGroup cannot be null");
+            checkNotNull(vaultUri, "vaultUri cannot be null");
+            return retry(new Predicate<String>() {
+               @Override
+               public boolean apply(final String name) {
+                  checkNotNull(name, "name cannot be null");
+                  DeletedCertificateBundle cert = 
api.getVaultApi(resourceGroup).getDeletedCertificate(vaultUri, name);
+                  return shouldBePresent == (cert != null);
+               }
+            }, operationTimeout, initialPeriod, maxPeriod);
+         }
+      }
+
+      public static class RecoverableCertificateStatusPredicateFactory {
+         private final AzureComputeApi api;
+         private final long operationTimeout;
+         private final long initialPeriod;
+         private final long maxPeriod;
+
+         RecoverableCertificateStatusPredicateFactory(final AzureComputeApi 
api, final long operationTimeout,
+               final long initialPeriod, final long maxPeriod) {
+            this.api = checkNotNull(api, "api cannot be null");
+            this.operationTimeout = operationTimeout;
+            this.initialPeriod = initialPeriod;
+            this.maxPeriod = maxPeriod;
+         }
+
+         public Predicate<String> create(final String resourceGroup, final URI 
vaultUri, final boolean isImport) {
+            checkNotNull(resourceGroup, "resourceGroup cannot be null");
+            checkNotNull(vaultUri, "vaultUri cannot be null");
+            return retry(new Predicate<String>() {
+               @Override
+               public boolean apply(final String name) {
+                  checkNotNull(name, "name cannot be null");
+                  CertificateBundle cert = 
api.getVaultApi(resourceGroup).getCertificate(vaultUri, name, null);
+                  return cert != null ? (isImport ? true : 
cert.attributes().recoveryLevel().contains("Recoverable"))
+                        : false;
+
+               }
+            }, operationTimeout, initialPeriod, maxPeriod);
+         }
+      }
+
+      public static class CertificateOperationStatusPredicateFactory {
+         private final AzureComputeApi api;
+         private final long operationTimeout;
+         private final long initialPeriod;
+         private final long maxPeriod;
+
+         CertificateOperationStatusPredicateFactory(final AzureComputeApi api, 
final long operationTimeout,
+               final long initialPeriod, final long maxPeriod) {
+            this.api = checkNotNull(api, "api cannot be null");
+            this.operationTimeout = operationTimeout;
+            this.initialPeriod = initialPeriod;
+            this.maxPeriod = maxPeriod;
+         }
+
+         public Predicate<String> create(final String resourceGroup, final URI 
vaultUri, final boolean isCreate) {
+            checkNotNull(resourceGroup, "resourceGroup cannot be null");
+            checkNotNull(vaultUri, "vaultUri cannot be null");
+            return retry(new Predicate<String>() {
+               @Override
+               public boolean apply(final String name) {
+                  checkNotNull(name, "name cannot be null");
+                  CertificateOperation certOp = 
api.getVaultApi(resourceGroup).getCertificateOperation(vaultUri, name);
+                  return isCreate ? ((certOp != null) ? 
!certOp.status().equals("inProgress") : false)
+                        : (certOp == null);
+               }
+            }, operationTimeout, initialPeriod, maxPeriod);
+         }
+      }
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/9705aa7f/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourcesThenCreateNodes.java
----------------------------------------------------------------------
diff --git 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourcesThenCreateNodes.java
 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourcesThenCreateNodes.java
index 436dff0..a2f2919 100644
--- 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourcesThenCreateNodes.java
+++ 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourcesThenCreateNodes.java
@@ -41,13 +41,13 @@ import 
org.jclouds.azurecompute.arm.compute.domain.ResourceGroupAndNameAndIngres
 import 
org.jclouds.azurecompute.arm.compute.functions.TemplateToAvailabilitySet;
 import org.jclouds.azurecompute.arm.compute.options.AzureTemplateOptions;
 import org.jclouds.azurecompute.arm.compute.options.IpOptions;
+import org.jclouds.azurecompute.arm.domain.AddressSpace;
 import org.jclouds.azurecompute.arm.domain.AvailabilitySet;
 import org.jclouds.azurecompute.arm.domain.NetworkSecurityGroup;
 import org.jclouds.azurecompute.arm.domain.PublicIPAddress;
 import org.jclouds.azurecompute.arm.domain.ResourceGroup;
 import org.jclouds.azurecompute.arm.domain.Subnet;
 import org.jclouds.azurecompute.arm.domain.Subnet.SubnetProperties;
-import org.jclouds.azurecompute.arm.domain.VirtualNetwork.AddressSpace;
 import 
org.jclouds.azurecompute.arm.domain.VirtualNetwork.VirtualNetworkProperties;
 import org.jclouds.compute.config.CustomizationResponse;
 import org.jclouds.compute.domain.NodeMetadata;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/9705aa7f/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/config/AzureComputeProperties.java
----------------------------------------------------------------------
diff --git 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/config/AzureComputeProperties.java
 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/config/AzureComputeProperties.java
index abe057d..80fa8f1 100644
--- 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/config/AzureComputeProperties.java
+++ 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/config/AzureComputeProperties.java
@@ -23,7 +23,7 @@ package org.jclouds.azurecompute.arm.config;
 public class AzureComputeProperties {
 
    public static final String OPERATION_TIMEOUT = 
"jclouds.azurecompute.arm.operation.timeout";
-
+   
    public static final String IMAGE_PUBLISHERS = 
"jclouds.azurecompute.arm.publishers";
 
    public static final String TIMEOUT_RESOURCE_DELETED = 
"jclouds.azurecompute.arm.timeout.resourcedeleted";

http://git-wip-us.apache.org/repos/asf/jclouds/blob/9705aa7f/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/AddressSpace.java
----------------------------------------------------------------------
diff --git 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/AddressSpace.java
 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/AddressSpace.java
new file mode 100644
index 0000000..1b7f434
--- /dev/null
+++ 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/AddressSpace.java
@@ -0,0 +1,39 @@
+/*
+ * 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.domain;
+
+import java.util.List;
+
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
+
+@AutoValue
+public abstract class AddressSpace {
+   public abstract List<String> addressPrefixes();
+
+   @SerializedNames({ "addressPrefixes" })
+   public static AddressSpace create(List<String> addressPrefixes) {
+      return new AutoValue_AddressSpace(addressPrefixes == null ? 
ImmutableList.<String> of()
+            : ImmutableList.copyOf(addressPrefixes));
+   }
+
+   AddressSpace() {
+
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/9705aa7f/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/IpAllocationMethod.java
----------------------------------------------------------------------
diff --git 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/IpAllocationMethod.java
 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/IpAllocationMethod.java
new file mode 100644
index 0000000..43911f9
--- /dev/null
+++ 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/IpAllocationMethod.java
@@ -0,0 +1,28 @@
+/*
+ * 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.domain;
+
+import org.jclouds.azurecompute.arm.util.GetEnumValue;
+
+public enum IpAllocationMethod {
+   
+   Static, Dynamic, Unrecognized;
+
+   public static IpAllocationMethod fromValue(final String text) {
+      return (IpAllocationMethod) GetEnumValue.fromValueOrDefault(text, 
IpAllocationMethod.Unrecognized);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/9705aa7f/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LocalNetworkGateway.java
----------------------------------------------------------------------
diff --git 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LocalNetworkGateway.java
 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LocalNetworkGateway.java
deleted file mode 100644
index b8e95ab..0000000
--- 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LocalNetworkGateway.java
+++ /dev/null
@@ -1,75 +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.domain;
-
-import java.util.Map;
-
-import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.json.SerializedNames;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.ImmutableMap;
-
-@AutoValue
-public abstract class LocalNetworkGateway {
-
-   @Nullable public abstract String id();
-   public abstract String name();
-   public abstract String location();
-   @Nullable public abstract String type();
-   @Nullable public abstract Map<String, String> tags();
-   @Nullable public abstract String etag();
-   public abstract LocalNetworkGatewayProperties properties();
-
-   LocalNetworkGateway() {
-
-   }
-
-   @SerializedNames({ "id", "name", "location", "type", "tags", "etag", 
"properties" })
-   public static LocalNetworkGateway create(String id, String name, String 
location, String type,
-         Map<String, String> tags, String etag, LocalNetworkGatewayProperties 
properties) {
-      return 
builder().id(id).name(name).location(location).type(type).tags(tags).etag(etag).properties(properties)
-            .build();
-   }
-
-   public abstract Builder toBuilder();
-
-   public static Builder builder() {
-      return new AutoValue_LocalNetworkGateway.Builder();
-   }
-
-   @AutoValue.Builder
-   public abstract static class Builder {
-      public abstract Builder id(String id);
-      public abstract Builder name(String name);
-      public abstract Builder location(String location);
-      public abstract Builder type(String type);
-      public abstract Builder tags(Map<String, String> tags);
-      public abstract Builder etag(String etag);
-      public abstract Builder properties(LocalNetworkGatewayProperties 
properties);
-
-      abstract String location();
-      abstract Map<String, String> tags();
-      abstract LocalNetworkGateway autoBuild();
-
-      public LocalNetworkGateway build() {
-         tags(tags() != null ? ImmutableMap.copyOf(tags()) : null);
-         location(location().toLowerCase()); // Avoid issues in regions such 
as CanadaEast
-         return autoBuild();
-      }
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/9705aa7f/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LocalNetworkGatewayProperties.java
----------------------------------------------------------------------
diff --git 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LocalNetworkGatewayProperties.java
 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LocalNetworkGatewayProperties.java
deleted file mode 100644
index 56b773f..0000000
--- 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LocalNetworkGatewayProperties.java
+++ /dev/null
@@ -1,96 +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.domain;
-
-import java.util.List;
-
-import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.json.SerializedNames;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.ImmutableList;
-
-@AutoValue
-public abstract class LocalNetworkGatewayProperties implements Provisionable {
-   
-   @Nullable public abstract BGPSettings bgpSettings();
-   public abstract String gatewayIpAddress();
-   @Nullable public abstract AddressSpace localNetworkAddressSpace();
-   @Nullable public abstract String provisioningState();
-   @Nullable public abstract String resourceGuid();
-
-   @SerializedNames({ "bgpSettings", "gatewayIpAddress", 
"localNetworkAddressSpace", "provisioningState",
-         "resourceGuid" })
-   public static LocalNetworkGatewayProperties create(BGPSettings bgpSettings, 
String gatewayIpAddress,
-         AddressSpace localNetworkAddressSpace, String provisioningState, 
String resourceGuid) {
-      return 
builder().bgpSettings(bgpSettings).gatewayIpAddress(gatewayIpAddress)
-            
.localNetworkAddressSpace(localNetworkAddressSpace).provisioningState(provisioningState)
-            .resourceGuid(resourceGuid).build();
-   }
-
-   LocalNetworkGatewayProperties() {
-
-   }
-
-   public abstract LocalNetworkGatewayProperties.Builder toBuilder();
-
-   public static LocalNetworkGatewayProperties.Builder builder() {
-      return new AutoValue_LocalNetworkGatewayProperties.Builder();
-   }
-
-   @AutoValue.Builder
-   public abstract static class Builder {
-      public abstract Builder bgpSettings(BGPSettings bgpSettings);
-      public abstract Builder gatewayIpAddress(String gatewayIpAddress);
-      public abstract Builder localNetworkAddressSpace(AddressSpace 
localNetworkAddressSpace);
-      public abstract Builder provisioningState(String provisioningState);
-      public abstract Builder resourceGuid(String resourceGuid);
-
-      public abstract LocalNetworkGatewayProperties build();
-   }
-
-   @AutoValue
-   public abstract static class BGPSettings {
-      public abstract int asn();
-      public abstract String bgpPeeringAddress();
-      public abstract int peerWeight();
-
-      @SerializedNames({ "asn", "bgpPeeringAddress", "peerWeight" })
-      public static LocalNetworkGatewayProperties.BGPSettings create(int asn, 
String bgpPeeringAddress, int peerWeight) {
-         return new AutoValue_LocalNetworkGatewayProperties_BGPSettings(asn, 
bgpPeeringAddress, peerWeight);
-      }
-
-      BGPSettings() {
-
-      }
-   }
-
-   @AutoValue
-   public abstract static class AddressSpace {
-      public abstract List<String> addressPrefixes();
-
-      @SerializedNames({ "addressPrefixes" })
-      public static LocalNetworkGatewayProperties.AddressSpace 
create(List<String> addressPrefixes) {
-         return new AutoValue_LocalNetworkGatewayProperties_AddressSpace(
-               addressPrefixes == null ? ImmutableList.<String> of() : 
ImmutableList.copyOf(addressPrefixes));
-      }
-
-      AddressSpace() {
-
-      }
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/9705aa7f/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Subnet.java
----------------------------------------------------------------------
diff --git 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Subnet.java
 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Subnet.java
index 80460b8..ec57cbb 100644
--- 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Subnet.java
+++ 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Subnet.java
@@ -31,6 +31,10 @@ import org.jclouds.json.SerializedNames;
 @AutoValue
 public abstract class Subnet {
 
+   // To create VPN endpoints, a "GatewaySubnet" is required. Azure identifies
+   // such networks by name, and they have to be named exactly "GatewaySubnet".
+   public static final String GATEWAY_SUBNET_NAME = "GatewaySubnet";
+   
    private static final Pattern NETWORK_PATTERN = 
Pattern.compile("^.*/virtualNetworks/([^/]+)(/.*)?$");
    
    @AutoValue
@@ -131,6 +135,12 @@ public abstract class Subnet {
       public abstract Builder id(String id);
       public abstract Builder etag(String etag);
       public abstract Builder properties(SubnetProperties properties);
+      
+      // Gateway subnets are identified by name
+      public Builder setGatewaySubnet() {
+         return name(GATEWAY_SUBNET_NAME);
+      }
+      
       public abstract Subnet build();
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/9705aa7f/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualNetwork.java
----------------------------------------------------------------------
diff --git 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualNetwork.java
 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualNetwork.java
index a0f5c3e..6b01532 100644
--- 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualNetwork.java
+++ 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualNetwork.java
@@ -18,31 +18,20 @@ package org.jclouds.azurecompute.arm.domain;
 
 import static com.google.common.collect.ImmutableList.copyOf;
 
-import java.util.Map;
 import java.util.List;
-import com.google.common.collect.ImmutableList;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.ImmutableMap;
+import java.util.Map;
 
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.json.SerializedNames;
 
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
 @AutoValue
 public abstract class VirtualNetwork {
 
    @AutoValue
-   public abstract static class AddressSpace {
-
-      public abstract List<String> addressPrefixes();
-
-      @SerializedNames({"addressPrefixes"})
-      public static AddressSpace create(final List<String> addressPrefixes) {
-         return new AutoValue_VirtualNetwork_AddressSpace(addressPrefixes == 
null ? ImmutableList.<String>of() : ImmutableList.copyOf(addressPrefixes));
-      }
-   }
-
-   @AutoValue
    public abstract static class VirtualNetworkProperties implements 
Provisionable {
 
       @Nullable

http://git-wip-us.apache.org/repos/asf/jclouds/blob/9705aa7f/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/BGPSettings.java
----------------------------------------------------------------------
diff --git 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/BGPSettings.java
 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/BGPSettings.java
new file mode 100644
index 0000000..740cf62
--- /dev/null
+++ 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/BGPSettings.java
@@ -0,0 +1,37 @@
+/*
+ * 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.domain.vpn;
+
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+public abstract class BGPSettings {
+   public abstract int asn();
+   public abstract String bgpPeeringAddress();
+   public abstract int peerWeight();
+
+   @SerializedNames({ "asn", "bgpPeeringAddress", "peerWeight" })
+   public static BGPSettings create(int asn, String bgpPeeringAddress, int 
peerWeight) {
+      return new AutoValue_BGPSettings(asn, bgpPeeringAddress, peerWeight);
+   }
+
+   BGPSettings() {
+
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/9705aa7f/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/DHGroup.java
----------------------------------------------------------------------
diff --git 
a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/DHGroup.java
 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/DHGroup.java
new file mode 100644
index 0000000..66f7a7f
--- /dev/null
+++ 
b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/vpn/DHGroup.java
@@ -0,0 +1,28 @@
+/*
+ * 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.domain.vpn;
+
+import org.jclouds.azurecompute.arm.util.GetEnumValue;
+
+public enum DHGroup {
+
+   DHGroup1, DHGroup14, DHGroup2, DHGroup2048, DHGroup24, ECP256, ECP384, 
None, Unrecognized;
+
+   public static DHGroup fromValue(final String text) {
+      return (DHGroup) GetEnumValue.fromValueOrDefault(text, 
DHGroup.Unrecognized);
+   }
+}

Reply via email to