You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2017/02/06 09:37:07 UTC

[3/3] jclouds-labs git commit: Add Load Balancer APIs to Azure ARM

Add Load Balancer APIs to Azure ARM


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

Branch: refs/heads/2.0.x
Commit: 9f5825656713284e8ed1d697587bef05e157ac74
Parents: 5261cba
Author: Daniel Estevez <co...@danielestevez.com>
Authored: Mon Jan 23 14:59:06 2017 -0500
Committer: Ignasi Barrera <na...@apache.org>
Committed: Mon Feb 6 10:36:33 2017 +0100

----------------------------------------------------------------------
 .../azurecompute/arm/AzureComputeApi.java       |  25 +
 .../arm/AzureComputeProviderMetadata.java       |   4 +
 .../arm/compute/AzureComputeServiceAdapter.java |   7 +-
 .../AzureComputeServiceContextModule.java       |  89 ++--
 .../functions/TemplateToAvailabilitySet.java    |  87 ++++
 .../functions/VirtualMachineToNodeMetadata.java |  10 +-
 .../compute/options/AzureTemplateOptions.java   |  54 ++-
 .../CreateResourceGroupThenCreateNodes.java     |  16 +-
 .../arm/domain/AvailabilitySet.java             |  84 +++-
 .../domain/AvailabilitySetVirtualMachine.java   |  37 --
 .../arm/domain/BackendAddressPool.java          |  43 ++
 .../domain/BackendAddressPoolProperties.java    |  74 +++
 .../azurecompute/arm/domain/DataDisk.java       |   3 +
 .../azurecompute/arm/domain/Deployment.java     |   2 +-
 .../arm/domain/DeploymentTemplate.java          |   3 +
 .../arm/domain/DiagnosticsProfile.java          |   6 +
 .../azurecompute/arm/domain/DnsSettings.java    |   3 +
 .../arm/domain/FrontendIPConfigurations.java    |  45 ++
 .../FrontendIPConfigurationsProperties.java     |  66 +++
 .../arm/domain/HardwareProfile.java             |   3 +
 .../azurecompute/arm/domain/ImageReference.java |   3 +
 .../azurecompute/arm/domain/InboundNatRule.java |  43 ++
 .../arm/domain/InboundNatRuleProperties.java    | 105 +++++
 .../arm/domain/IpConfiguration.java             |   2 +
 .../arm/domain/IpConfigurationProperties.java   |  43 +-
 .../azurecompute/arm/domain/LoadBalancer.java   |  50 ++
 .../arm/domain/LoadBalancerProperties.java      | 109 +++++
 .../arm/domain/LoadBalancingRule.java           |  43 ++
 .../arm/domain/LoadBalancingRuleProperties.java | 135 ++++++
 .../domain/NetworkInterfaceCardProperties.java  |   4 +-
 .../azurecompute/arm/domain/NetworkProfile.java |   3 +
 .../domain/NetworkSecurityGroupProperties.java  |   5 +-
 .../domain/NetworkSecurityRuleProperties.java   |   3 +
 .../jclouds/azurecompute/arm/domain/OSDisk.java |   3 +
 .../azurecompute/arm/domain/OSProfile.java      |   3 +
 .../jclouds/azurecompute/arm/domain/Probe.java  |  42 ++
 .../arm/domain/ProbeProperties.java             |  91 ++++
 .../azurecompute/arm/domain/Provisionable.java  |  22 +
 .../arm/domain/PublicIPAddressProperties.java   |   5 +-
 .../arm/domain/ResourceDefinition.java          |   3 +
 .../azurecompute/arm/domain/ResourceGroup.java  |   2 +-
 .../arm/domain/ResourceProviderMetaData.java    |   3 +
 .../jclouds/azurecompute/arm/domain/Status.java |  49 ++
 .../azurecompute/arm/domain/StorageProfile.java |   3 +
 .../azurecompute/arm/domain/StorageService.java |   4 +-
 .../jclouds/azurecompute/arm/domain/Subnet.java |   5 +-
 .../jclouds/azurecompute/arm/domain/VHD.java    |   3 +
 .../azurecompute/arm/domain/VMImage.java        |   2 +
 .../azurecompute/arm/domain/VirtualMachine.java |   2 +
 .../arm/domain/VirtualMachineInstance.java      |  57 +--
 .../arm/domain/VirtualMachineProperties.java    |   8 +-
 .../azurecompute/arm/domain/VirtualNetwork.java |   5 +-
 .../arm/features/AvailabilitySetApi.java        |  83 ++++
 .../arm/features/LoadBalancerApi.java           |  82 ++++
 .../arm/features/NetworkInterfaceCardApi.java   |   7 +-
 .../compute/AzureComputeServiceLiveTest.java    |  32 ++
 .../AzureComputeImageExtensionLiveTest.java     |  34 +-
 ...reComputeSecurityGroupExtensionLiveTest.java |  15 +-
 .../features/AvailabilitySetApiLiveTest.java    | 100 ++++
 .../features/AvailabilitySetApiMockTest.java    | 153 ++++++
 .../arm/features/DeploymentApiLiveTest.java     |  13 +-
 .../arm/features/LoadBalancerApiLiveTest.java   | 460 +++++++++++++++++++
 .../arm/features/LoadBalancerApiMockTest.java   | 155 +++++++
 .../NetworkInterfaceCardApiLiveTest.java        |  19 +-
 .../NetworkInterfaceCardApiMockTest.java        |  10 +-
 .../NetworkSecurityGroupApiLiveTest.java        |  23 +-
 .../NetworkSecurityRuleApiLiveTest.java         |  23 +-
 .../features/PublicIPAddressApiLiveTest.java    |  26 +-
 .../arm/features/StorageAccountApiLiveTest.java |  26 +-
 .../arm/features/SubnetApiLiveTest.java         |  25 +-
 .../arm/features/VirtualMachineApiLiveTest.java |  25 +-
 .../arm/features/VirtualMachineApiMockTest.java |  11 +-
 .../arm/features/VirtualNetworkApiLiveTest.java |  22 +-
 .../arm/internal/AzureLiveTestUtils.java        |   2 +
 .../internal/BaseAzureComputeApiLiveTest.java   |  68 ++-
 .../test/resources/availabilitysetcreate.json   |  11 +
 .../src/test/resources/availabilitysetget.json  |  12 +
 .../src/test/resources/availabilitysetlist.json |  16 +
 .../src/test/resources/listvirtualnetworks.json |   2 +-
 .../src/test/resources/loadbalancercreate.json  |  28 ++
 .../src/test/resources/loadbalancerget.json     |  54 +++
 .../src/test/resources/loadbalancerlist.json    |  35 ++
 82 files changed, 2745 insertions(+), 348 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeApi.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeApi.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeApi.java
index c0c0994..3700069 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeApi.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeApi.java
@@ -20,8 +20,10 @@ import java.io.Closeable;
 
 import javax.ws.rs.PathParam;
 
+import org.jclouds.azurecompute.arm.features.AvailabilitySetApi;
 import org.jclouds.azurecompute.arm.features.DeploymentApi;
 import org.jclouds.azurecompute.arm.features.JobApi;
+import org.jclouds.azurecompute.arm.features.LoadBalancerApi;
 import org.jclouds.azurecompute.arm.features.LocationApi;
 import org.jclouds.azurecompute.arm.features.NetworkInterfaceCardApi;
 import org.jclouds.azurecompute.arm.features.NetworkSecurityGroupApi;
@@ -35,6 +37,7 @@ import org.jclouds.azurecompute.arm.features.SubnetApi;
 import org.jclouds.azurecompute.arm.features.VMSizeApi;
 import org.jclouds.azurecompute.arm.features.VirtualMachineApi;
 import org.jclouds.azurecompute.arm.features.VirtualNetworkApi;
+
 import org.jclouds.rest.annotations.Delegate;
 
 /**
@@ -157,6 +160,28 @@ public interface AzureComputeApi extends Closeable {
                                                     @PathParam("networksecuritygroup") String networksecuritygroup);
 
    /**
+    * The LoadBalancer API includes operations for managing load balancers
+    * within your subscription.
+    *
+    * @see <a href=
+    *      "https://msdn.microsoft.com/en-us/library/azure/mt163574.aspx">docs
+    *      </a>
+    */
+   @Delegate
+   LoadBalancerApi getLoadBalancerApi(@PathParam("resourcegroup") String resourcegroup);
+   
+   /**
+    * The AvailabilitySet API includes operations for managing availability sets
+    * within your subscription.
+    *
+    * @see <a href=
+    *      "https://docs.microsoft.com/en-us/rest/api/compute/availabilitysets">docs
+    *      </a>
+    */
+   @Delegate
+   AvailabilitySetApi getAvailabilitySetApi(@PathParam("resourcegroup") String resourcegroup);
+
+   /**
     * The Azure Resource Provider API provides information about a resource provider and its supported resource types.
     *
     * @see <a href="https://msdn.microsoft.com/en-us/library/azure/dn790534.aspx">docs</a>

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java
index 1590bf2..a4c2bbe 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java
@@ -39,7 +39,9 @@ import java.net.URI;
 import java.util.Properties;
 
 import org.jclouds.azurecompute.arm.domain.Region;
+import org.jclouds.azurecompute.arm.features.AvailabilitySetApi;
 import org.jclouds.azurecompute.arm.features.DeploymentApi;
+import org.jclouds.azurecompute.arm.features.LoadBalancerApi;
 import org.jclouds.azurecompute.arm.features.LocationApi;
 import org.jclouds.azurecompute.arm.features.NetworkInterfaceCardApi;
 import org.jclouds.azurecompute.arm.features.NetworkSecurityGroupApi;
@@ -108,6 +110,8 @@ public class AzureComputeProviderMetadata extends BaseProviderMetadata {
       properties.put(API_VERSION_PREFIX + VirtualNetworkApi.class.getSimpleName(), "2015-06-15");
       properties.put(API_VERSION_PREFIX + VMSizeApi.class.getSimpleName(), "2015-06-15");
       properties.put(API_VERSION_PREFIX + VirtualMachineApi.class.getSimpleName(), "2015-06-15");
+      properties.put(API_VERSION_PREFIX + LoadBalancerApi.class.getSimpleName(), "2016-03-30");
+      properties.put(API_VERSION_PREFIX + AvailabilitySetApi.class.getSimpleName(), "2016-03-30");
       properties.put(API_VERSION_PREFIX + "GetVirtualMachine", "2016-03-30");
       properties.put(API_VERSION_PREFIX + "GetVirtualMachineInstance", "2016-03-30");
       properties.put(API_VERSION_PREFIX + "CreateVirtualMachine", "2016-03-30");

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java
index 5a8204e..a1204bf 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java
@@ -139,6 +139,11 @@ public class AzureComputeServiceAdapter implements ComputeServiceAdapter<Virtual
 
       // TODO ARM specific options
       // TODO network ids => create one nic in each network
+      
+      IdReference availabilitySet = null;
+      if (templateOptions.getAvailabilitySet() != null) {
+         availabilitySet = IdReference.create(templateOptions.getAvailabilitySet().id());
+      }
 
       String locationName = template.getLocation().getId();
       String subnetId = templateOptions.getSubnetId();
@@ -151,7 +156,7 @@ public class AzureComputeServiceAdapter implements ComputeServiceAdapter<Virtual
             .networkInterfaces(ImmutableList.of(IdReference.create(nic.id()))).build();
       VirtualMachineProperties virtualMachineProperties = VirtualMachineProperties.builder()
             .licenseType(null) // TODO
-            .availabilitySet(null) // TODO
+            .availabilitySet(availabilitySet)
             .hardwareProfile(hardwareProfile).storageProfile(storageProfile).osProfile(osProfile)
             .networkProfile(networkProfile).build();
       

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzureComputeServiceContextModule.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzureComputeServiceContextModule.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzureComputeServiceContextModule.java
index 8ea823b..690022b 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzureComputeServiceContextModule.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzureComputeServiceContextModule.java
@@ -51,6 +51,7 @@ import org.jclouds.azurecompute.arm.compute.strategy.CreateResourceGroupThenCrea
 import org.jclouds.azurecompute.arm.domain.Location;
 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.PublicIPAddress;
 import org.jclouds.azurecompute.arm.domain.ResourceDefinition;
 import org.jclouds.azurecompute.arm.domain.ResourceGroup;
@@ -58,7 +59,7 @@ import org.jclouds.azurecompute.arm.domain.VMHardware;
 import org.jclouds.azurecompute.arm.domain.VMImage;
 import org.jclouds.azurecompute.arm.domain.VirtualMachine;
 import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance;
-import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance.VirtualMachineStatus.PowerState;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance.PowerState;
 import org.jclouds.azurecompute.arm.functions.ParseJobStatus;
 import org.jclouds.compute.ComputeService;
 import org.jclouds.compute.ComputeServiceAdapter;
@@ -79,6 +80,7 @@ import org.jclouds.net.domain.IpPermission;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
@@ -185,15 +187,20 @@ public class AzureComputeServiceContextModule extends
 
    @Provides
    protected PublicIpAvailablePredicateFactory providePublicIpAvailablePredicate(final AzureComputeApi api,
-         @Named(OPERATION_TIMEOUT) Integer operationTimeout, PollPeriod pollPeriod) {
-      return new PublicIpAvailablePredicateFactory(api, operationTimeout, pollPeriod.pollInitialPeriod,
-            pollPeriod.pollMaxPeriod);
+         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 Predicate<Supplier<Provisionable>> provideResourceAvailablePredicate(final AzureComputeApi api,
          @Named(OPERATION_TIMEOUT) Integer operationTimeout, PollPeriod pollPeriod) {
-      return new SecurityGroupAvailablePredicateFactory(api, operationTimeout, pollPeriod.pollInitialPeriod,
+      return retry(new ResourceInStatusPredicate("Succeeded"), operationTimeout, pollPeriod.pollInitialPeriod,
             pollPeriod.pollMaxPeriod);
    }
 
@@ -274,64 +281,74 @@ public class AzureComputeServiceContextModule extends
          }, timeout, period, maxPeriod);
       }
    }
+   
+   public static class ResourceInStatusPredicate implements Predicate<Supplier<Provisionable>> {
+      private final String expectedStatus;
 
-   public static class PublicIpAvailablePredicateFactory {
+      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 long timeout;
-      private final long period;
-      private final long maxPeriod;
+      private final Predicate<Supplier<Provisionable>> resourceAvailable;
 
-      PublicIpAvailablePredicateFactory(final AzureComputeApi api, final long timeout, final long period,
-            final long maxPeriod) {
+      PublicIpAvailablePredicateFactory(final AzureComputeApi api, Predicate<Supplier<Provisionable>> resourceAvailable) {
          this.api = checkNotNull(api, "api cannot be null");
-         this.timeout = timeout;
-         this.period = period;
-         this.maxPeriod = maxPeriod;
+         this.resourceAvailable = resourceAvailable;
       }
 
       public Predicate<String> create(final String azureGroup) {
-         return retry(new Predicate<String>() {
+         checkNotNull(azureGroup, "azureGroup cannot be null");
+         return new Predicate<String>() {
             @Override
             public boolean apply(final String name) {
                checkNotNull(name, "name cannot be null");
-               PublicIPAddress publicIp = api.getPublicIPAddressApi(azureGroup).get(name);
-               if (publicIp == null) {
-                  return false;
-               }
-               return publicIp.properties().provisioningState().equalsIgnoreCase("Succeeded");
+               return resourceAvailable.apply(new Supplier<Provisionable>() {
+                  @Override
+                  public Provisionable get() {
+                     PublicIPAddress publicIp = api.getPublicIPAddressApi(azureGroup).get(name);
+                     return publicIp == null ? null : publicIp.properties();
+                  }
+               });
             }
-         }, timeout, period, maxPeriod);
+         };
       }
    }
 
    public static class SecurityGroupAvailablePredicateFactory {
       private final AzureComputeApi api;
-      private final long timeout;
-      private final long period;
-      private final long maxPeriod;
+      private final Predicate<Supplier<Provisionable>> resourceAvailable;
 
-      SecurityGroupAvailablePredicateFactory(final AzureComputeApi api, final long timeout, final long period,
-            final long maxPeriod) {
+      SecurityGroupAvailablePredicateFactory(final AzureComputeApi api,
+            Predicate<Supplier<Provisionable>> resourceAvailable) {
          this.api = checkNotNull(api, "api cannot be null");
-         this.timeout = timeout;
-         this.period = period;
-         this.maxPeriod = maxPeriod;
+         this.resourceAvailable = resourceAvailable;
       }
 
       public Predicate<String> create(final String resourceGroup) {
          checkNotNull(resourceGroup, "resourceGroup cannot be null");
-         return retry(new Predicate<String>() {
+         return new Predicate<String>() {
             @Override
             public boolean apply(final String name) {
                checkNotNull(name, "name cannot be null");
-               NetworkSecurityGroup sg = api.getNetworkSecurityGroupApi(resourceGroup).get(name);
-               if (sg == null) {
-                  return false;
-               }
-               return sg.properties().provisioningState().equalsIgnoreCase("Succeeded");
+               return resourceAvailable.apply(new Supplier<Provisionable>() {
+                  @Override
+                  public Provisionable get() {
+                     NetworkSecurityGroup sg = api.getNetworkSecurityGroupApi(resourceGroup).get(name);
+                     return sg == null ? null : sg.properties();
+                  }
+               });
             }
-         }, timeout, period, maxPeriod);
+         };
       }
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/TemplateToAvailabilitySet.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/TemplateToAvailabilitySet.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/TemplateToAvailabilitySet.java
new file mode 100644
index 0000000..4e1adeb
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/TemplateToAvailabilitySet.java
@@ -0,0 +1,87 @@
+/*
+ * 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.compute.functions;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.jclouds.azurecompute.arm.AzureComputeApi;
+import org.jclouds.azurecompute.arm.compute.options.AzureTemplateOptions;
+import org.jclouds.azurecompute.arm.domain.AvailabilitySet;
+import org.jclouds.azurecompute.arm.domain.ResourceGroup;
+import org.jclouds.compute.domain.Template;
+import org.jclouds.compute.reference.ComputeServiceConstants;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.logging.Logger;
+
+import com.google.common.base.Function;
+import com.google.common.cache.LoadingCache;
+
+@Singleton
+public class TemplateToAvailabilitySet implements Function<Template, AvailabilitySet> {
+
+   @Resource
+   @Named(ComputeServiceConstants.COMPUTE_LOGGER)
+   protected Logger logger = Logger.NULL;
+
+   private final AzureComputeApi api;
+   private final LoadingCache<String, ResourceGroup> resourceGroupMap;
+
+   @Inject
+   TemplateToAvailabilitySet(AzureComputeApi api, LoadingCache<String, ResourceGroup> resourceGroupMap) {
+      this.api = api;
+      this.resourceGroupMap = resourceGroupMap;
+   }
+
+   @Nullable
+   @Override
+   public AvailabilitySet apply(final Template input) {
+      checkArgument(input.getOptions() instanceof AzureTemplateOptions, "An AzureTemplateOptions object is required");
+      AzureTemplateOptions options = input.getOptions().as(AzureTemplateOptions.class);
+
+      AvailabilitySet availabilitySet = null;
+      String location = input.getLocation().getId();
+      String resourceGroup = resourceGroupMap.getUnchecked(location).name();
+
+      if (options.getAvailabilitySetName() != null) {
+         availabilitySet = api.getAvailabilitySetApi(resourceGroup).get(options.getAvailabilitySetName());
+
+         checkArgument(availabilitySet != null, "No availability set with name '%s' was found", options.getAvailabilitySetName());
+         checkArgument(location.equals(availabilitySet.location()), "The availability set %s does not belong to location %s",
+               options.getAvailabilitySetName(), location);
+
+      } else if (options.getAvailabilitySet() != null) {
+         availabilitySet = api.getAvailabilitySetApi(resourceGroup).get(options.getAvailabilitySet().name());
+
+         if (availabilitySet != null) {
+            checkArgument(location.equals(availabilitySet.location()), "The availability set %s does not belong to location %s",
+                  options.getAvailabilitySetName(), location);
+         } else {
+            availabilitySet = api.getAvailabilitySetApi(resourceGroup).createOrUpdate(options.getAvailabilitySet().name(), location,
+                  options.getAvailabilitySet().tags(), options.getAvailabilitySet().properties());
+            logger.debug(">> creating availability set [%s]", availabilitySet.name());
+         }
+      }
+
+      return availabilitySet;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToNodeMetadata.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToNodeMetadata.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToNodeMetadata.java
index 92689c2..26bf985 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToNodeMetadata.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToNodeMetadata.java
@@ -48,10 +48,10 @@ import org.jclouds.azurecompute.arm.domain.StorageServiceKeys;
 import org.jclouds.azurecompute.arm.domain.VMImage;
 import org.jclouds.azurecompute.arm.domain.VirtualMachine;
 import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance;
-import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance.VirtualMachineStatus;
-import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance.VirtualMachineStatus.PowerState;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance.PowerState;
 import org.jclouds.azurecompute.arm.domain.VirtualMachineProperties;
 import org.jclouds.azurecompute.arm.domain.VirtualMachineProperties.ProvisioningState;
+import org.jclouds.azurecompute.arm.domain.Status;
 import org.jclouds.azurecompute.arm.functions.StorageProfileToStorageAccountName;
 import org.jclouds.azurecompute.arm.util.BlobHelper;
 import org.jclouds.collect.Memoized;
@@ -107,7 +107,7 @@ public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, No
                      .put(VirtualMachineProperties.ProvisioningState.UNRECOGNIZED, NodeMetadata.Status.UNRECOGNIZED)
                      .build(), NodeMetadata.Status.UNRECOGNIZED);
 
-   private static final Function<VirtualMachineStatus.PowerState, NodeMetadata.Status> POWERSTATE_TO_NODESTATUS = Functions
+   private static final Function<PowerState, NodeMetadata.Status> POWERSTATE_TO_NODESTATUS = Functions
          .forMap(
                ImmutableMap.<PowerState, NodeMetadata.Status> builder()
                      .put(PowerState.RUNNING, NodeMetadata.Status.RUNNING)
@@ -161,9 +161,9 @@ public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, No
          if (instanceDetails != null && instanceDetails.powerState() != null) {
             builder.status(POWERSTATE_TO_NODESTATUS.apply(instanceDetails.powerState()));
             builder.backendStatus(Joiner.on(',').join(
-                  transform(instanceDetails.statuses(), new Function<VirtualMachineStatus, String>() {
+                  transform(instanceDetails.statuses(), new Function<Status, String>() {
                      @Override
-                     public String apply(VirtualMachineStatus input) {
+                     public String apply(Status input) {
                         return input.code();
                      }
                   })));

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/options/AzureTemplateOptions.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/options/AzureTemplateOptions.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/options/AzureTemplateOptions.java
index ecbc237..8381076 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/options/AzureTemplateOptions.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/options/AzureTemplateOptions.java
@@ -16,6 +16,7 @@
  */
 package org.jclouds.azurecompute.arm.compute.options;
 
+import org.jclouds.azurecompute.arm.domain.AvailabilitySet;
 import org.jclouds.compute.options.TemplateOptions;
 
 import com.google.common.base.Objects;
@@ -30,6 +31,8 @@ public class AzureTemplateOptions extends TemplateOptions implements Cloneable {
    private String virtualNetworkName;
    private String subnetId;
    private String blob;
+   private AvailabilitySet availabilitySet;
+   private String availabilitySetName;
 
    /**
     * Sets the virtual network name
@@ -54,10 +57,30 @@ public class AzureTemplateOptions extends TemplateOptions implements Cloneable {
       this.blob = blob;
       return this;
    }
+   
+   /**
+    * Sets the availability set where the nodes will be configured. If it does
+    * not exist jclouds will create a new one with the given configuration.
+    */
+   public AzureTemplateOptions availabilitySet(AvailabilitySet availabilitySet) {
+      this.availabilitySet = availabilitySet;
+      return this;
+   }
+
+   /**
+    * Sets the availability set where the nodes will be configured. The
+    * availability set must exist.
+    */
+   public AzureTemplateOptions availabilitySet(String availabilitySetName) {
+      this.availabilitySetName = availabilitySetName;
+      return this;
+   }
 
    public String getVirtualNetworkName() { return virtualNetworkName; }
    public String getSubnetId() { return subnetId; }
    public String getBlob() { return blob; }
+   public AvailabilitySet getAvailabilitySet() { return availabilitySet; }
+   public String getAvailabilitySetName() { return availabilitySetName; }
 
 
    @Override
@@ -75,12 +98,15 @@ public class AzureTemplateOptions extends TemplateOptions implements Cloneable {
          eTo.virtualNetworkName(virtualNetworkName);
          eTo.subnetId(subnetId);
          eTo.blob(blob);
+         eTo.availabilitySet(availabilitySet);
+         eTo.availabilitySet(availabilitySetName);
       }
    }
 
    @Override
    public int hashCode() {
-      return Objects.hashCode(super.hashCode(), virtualNetworkName, subnetId, blob);
+      return Objects.hashCode(super.hashCode(), virtualNetworkName, subnetId, blob, availabilitySet,
+            availabilitySetName);
    }
 
    @Override
@@ -98,7 +124,9 @@ public class AzureTemplateOptions extends TemplateOptions implements Cloneable {
       return super.equals(other)
             && equal(this.virtualNetworkName, other.virtualNetworkName)
             && equal(this.subnetId, other.subnetId)
-            && equal(this.blob, other.blob);
+            && equal(this.blob, other.blob)
+            && equal(this.availabilitySet, other.availabilitySet)
+            && equal(this.availabilitySetName, other.availabilitySetName);
    }
 
    @Override
@@ -113,7 +141,7 @@ public class AzureTemplateOptions extends TemplateOptions implements Cloneable {
    public static class Builder {
 
       /**
-       * @see AzureTemplateOptions#virtualNetworkName
+       * @see AzureTemplateOptions#virtualNetworkName(String)
        */
       public static AzureTemplateOptions virtualNetworkName(String virtualNetworkName) {
          AzureTemplateOptions options = new AzureTemplateOptions();
@@ -121,7 +149,7 @@ public class AzureTemplateOptions extends TemplateOptions implements Cloneable {
       }
 
       /**
-       * @see AzureTemplateOptions#subnetId
+       * @see AzureTemplateOptions#subnetId(String)
        */
       public static AzureTemplateOptions subnetId(String subnetId) {
          AzureTemplateOptions options = new AzureTemplateOptions();
@@ -129,11 +157,27 @@ public class AzureTemplateOptions extends TemplateOptions implements Cloneable {
       }
 
       /**
-       * @see AzureTemplateOptions#blob
+       * @see AzureTemplateOptions#blob(String)
        */
       public static AzureTemplateOptions blob(String blob) {
          AzureTemplateOptions options = new AzureTemplateOptions();
          return options.blob(blob);
       }
+      
+      /**
+       * @see AzureTemplateOptions#availabilitySet(AvailabilitySet)
+       */
+      public static AzureTemplateOptions availabilitySet(AvailabilitySet availabilitySet) {
+         AzureTemplateOptions options = new AzureTemplateOptions();
+         return options.availabilitySet(availabilitySet);
+      }
+      
+      /**
+       * @see AzureTemplateOptions#availabilitySet(String)
+       */
+      public static AzureTemplateOptions availabilitySet(String availabilitySetName) {
+         AzureTemplateOptions options = new AzureTemplateOptions();
+         return options.availabilitySet(availabilitySetName);
+      }
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourceGroupThenCreateNodes.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourceGroupThenCreateNodes.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourceGroupThenCreateNodes.java
index 378030f..92c9499 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourceGroupThenCreateNodes.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/strategy/CreateResourceGroupThenCreateNodes.java
@@ -38,7 +38,9 @@ import javax.inject.Singleton;
 import org.jclouds.Constants;
 import org.jclouds.azurecompute.arm.AzureComputeApi;
 import org.jclouds.azurecompute.arm.compute.domain.RegionAndIdAndIngressRules;
+import org.jclouds.azurecompute.arm.compute.functions.TemplateToAvailabilitySet;
 import org.jclouds.azurecompute.arm.compute.options.AzureTemplateOptions;
+import org.jclouds.azurecompute.arm.domain.AvailabilitySet;
 import org.jclouds.azurecompute.arm.domain.NetworkSecurityGroup;
 import org.jclouds.azurecompute.arm.domain.RegionAndId;
 import org.jclouds.azurecompute.arm.domain.ResourceGroup;
@@ -84,6 +86,7 @@ public class CreateResourceGroupThenCreateNodes extends CreateNodesWithGroupEnco
    private final String defaultVnetAddressPrefix;
    private final String defaultSubnetAddressPrefix;
    private final Predicate<URI> storageAccountCreated;
+   private final TemplateToAvailabilitySet templateToAvailabilitySet;
 
    @Inject
    protected CreateResourceGroupThenCreateNodes(
@@ -95,7 +98,8 @@ public class CreateResourceGroupThenCreateNodes extends CreateNodesWithGroupEnco
          AzureComputeApi api, @Named(DEFAULT_VNET_ADDRESS_SPACE_PREFIX) String defaultVnetAddressPrefix,
          @Named(DEFAULT_SUBNET_ADDRESS_PREFIX) String defaultSubnetAddressPrefix,
          LoadingCache<RegionAndIdAndIngressRules, String> securityGroupMap,
-         LoadingCache<String, ResourceGroup> resourceGroupMap, @Named("STORAGE") Predicate<URI> storageAccountCreated) {
+         LoadingCache<String, ResourceGroup> resourceGroupMap, @Named("STORAGE") Predicate<URI> storageAccountCreated,
+         TemplateToAvailabilitySet templateToAvailabilitySet) {
       super(addNodeWithGroupStrategy, listNodesStrategy, namingConvention, userExecutor,
             customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory);
       this.api = checkNotNull(api, "api cannot be null");
@@ -105,6 +109,7 @@ public class CreateResourceGroupThenCreateNodes extends CreateNodesWithGroupEnco
       this.defaultVnetAddressPrefix = defaultVnetAddressPrefix;
       this.defaultSubnetAddressPrefix = defaultSubnetAddressPrefix;
       this.storageAccountCreated = storageAccountCreated;
+      this.templateToAvailabilitySet = templateToAvailabilitySet;
    }
 
    @Override
@@ -129,6 +134,7 @@ public class CreateResourceGroupThenCreateNodes extends CreateNodesWithGroupEnco
 
       getOrCreateVirtualNetworkWithSubnet(location, options, azureGroupName);
       configureSecurityGroupForOptions(group, azureGroupName, template.getLocation(), options);
+      configureAvailabilitySetForTemplate(template);
 
       StorageService storageService = getOrCreateStorageService(group, azureGroupName, location, template.getImage());
       options.blob(storageService.storageServiceProperties().primaryEndpoints().get("blob"));
@@ -217,6 +223,14 @@ public class CreateResourceGroupThenCreateNodes extends CreateNodesWithGroupEnco
          options.securityGroups(securityGroupId);
       }
    }
+   
+   private void configureAvailabilitySetForTemplate(Template template) {
+      AvailabilitySet availabilitySet = templateToAvailabilitySet.apply(template);
+      if (availabilitySet != null) {
+         logger.debug(">> configuring nodes in availability set [%s]", availabilitySet.name());
+         template.getOptions().as(AzureTemplateOptions.class).availabilitySet(availabilitySet);
+      }
+   }
 
    /**
     * Generates a valid storage account

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/AvailabilitySet.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/AvailabilitySet.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/AvailabilitySet.java
index cb90307..624c664 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/AvailabilitySet.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/AvailabilitySet.java
@@ -17,13 +17,15 @@
 
 package org.jclouds.azurecompute.arm.domain;
 
+import java.util.List;
+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;
-import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.json.SerializedNames;
-import java.util.Map;
-import java.util.List;
 
 /**
  * AvailabilitySet for subscription
@@ -45,24 +47,54 @@ public abstract class AvailabilitySet {
       public abstract int platformFaultDomainCount();
 
       /**
-       * A list of virtual machines in availability set
+       * A list of virtual machines in the availability set
        */
       @Nullable
-      public abstract List<AvailabilitySetVirtualMachine> virtualMachines();
+      public abstract List<IdReference> virtualMachines();
+      
+      /**
+       * A list of statuses in the availability set
+       */
+      @Nullable
+      public abstract List<Status> statuses();
 
-      @SerializedNames({"platformUpdateDomainCount", "platformFaultDomainCount", "virtualMachines"})
+      @SerializedNames({ "platformUpdateDomainCount", "platformFaultDomainCount", "virtualMachines", "statuses" })
       public static AvailabilitySetProperties create(final int platformUpdateDomainCount,
-                                                     final int platformFaultDomainCount,
-                                                     List<AvailabilitySetVirtualMachine> virtualMachines) {
-         return new AutoValue_AvailabilitySet_AvailabilitySetProperties(platformUpdateDomainCount,
-                 platformFaultDomainCount,
-                 virtualMachines == null ? null : ImmutableList.copyOf(virtualMachines));
+            final int platformFaultDomainCount, List<IdReference> virtualMachines, List<Status> statuses) {
+         return builder().platformUpdateDomainCount(platformUpdateDomainCount)
+               .platformFaultDomainCount(platformFaultDomainCount).virtualMachines(virtualMachines).statuses(statuses)
+               .build();
+      }
+      
+      public abstract Builder toBuilder();
+      
+      public static Builder builder() {
+         return new AutoValue_AvailabilitySet_AvailabilitySetProperties.Builder();
+      }
+      
+      @AutoValue.Builder
+      public abstract static class Builder {
+         public abstract Builder platformUpdateDomainCount(int platformUpdateDomainCount);
+         public abstract Builder platformFaultDomainCount(int platformFaultDomainCount);
+         public abstract Builder virtualMachines(List<IdReference> virtualMachines);
+         public abstract Builder statuses(List<Status> statuses);
+         
+         abstract List<IdReference> virtualMachines();
+         abstract List<Status> statuses();
+         abstract AvailabilitySetProperties autoBuild();
+         
+         public AvailabilitySetProperties build() {
+            virtualMachines(virtualMachines() != null ? ImmutableList.copyOf(virtualMachines()) : null);
+            statuses(statuses() != null ? ImmutableList.copyOf(statuses()) : null);
+            return autoBuild();
+         }
       }
    }
 
    /**
     * The id of the availability set
     */
+   @Nullable
    public abstract String id();
 
    /**
@@ -72,7 +104,7 @@ public abstract class AvailabilitySet {
    public abstract String name();
 
    /**
-    * The name of the availability set.
+    * The type of the availability set.
     */
    @Nullable
    public abstract String type();
@@ -99,6 +131,30 @@ public abstract class AvailabilitySet {
    @SerializedNames({"id", "name", "type", "location", "tags", "properties"})
    public static AvailabilitySet create(final String id, final String name, final String type, final String location,
                                         final Map<String, String> tags, AvailabilitySetProperties properties) {
-      return new AutoValue_AvailabilitySet(id, name, type, location, tags == null ? null : ImmutableMap.copyOf(tags), properties);
+      return builder().id(id).name(name).type(type).location(location).tags(tags).properties(properties).build();
+   }
+   
+   public abstract Builder toBuilder();
+   
+   public static Builder builder() {
+      return new AutoValue_AvailabilitySet.Builder();
+   }
+   
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder id(String id);
+      public abstract Builder name(String name);
+      public abstract Builder type(String type);
+      public abstract Builder location(String location);
+      public abstract Builder tags(Map<String, String> tags);
+      public abstract Builder properties(AvailabilitySetProperties properties);
+      
+      abstract Map<String, String> tags();
+      abstract AvailabilitySet autoBuild();
+      
+      public AvailabilitySet build() {
+         tags(tags() != null ? ImmutableMap.copyOf(tags()) : null);
+         return autoBuild();
+      }
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/AvailabilitySetVirtualMachine.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/AvailabilitySetVirtualMachine.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/AvailabilitySetVirtualMachine.java
deleted file mode 100644
index 3837ff2..0000000
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/AvailabilitySetVirtualMachine.java
+++ /dev/null
@@ -1,37 +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 com.google.auto.value.AutoValue;
-import org.jclouds.json.SerializedNames;
-
-/**
- * The virtual machine id
- */
-@AutoValue
-public abstract class AvailabilitySetVirtualMachine {
-
-   /**
-    * The id of the virtual machine.
-    */
-   public abstract String id();
-
-   @SerializedNames({"id"})
-   public static AvailabilitySetVirtualMachine create(final String id) {
-      return new AutoValue_AvailabilitySetVirtualMachine(id);
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/BackendAddressPool.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/BackendAddressPool.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/BackendAddressPool.java
new file mode 100644
index 0000000..37ea4aa
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/BackendAddressPool.java
@@ -0,0 +1,43 @@
+/*
+ * 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.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+public abstract class BackendAddressPool {
+   public abstract String name();
+
+   @Nullable
+   public abstract String id();
+
+   @Nullable
+   public abstract BackendAddressPoolProperties properties();
+
+   @Nullable
+   public abstract String etag();
+
+   @SerializedNames({ "name", "id", "properties", "etag" })
+   public static BackendAddressPool create(final String name, final String id,
+         final BackendAddressPoolProperties properties, final String etag) {
+      return new AutoValue_BackendAddressPool(name, id, properties, etag);
+   }
+}
+

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/BackendAddressPoolProperties.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/BackendAddressPoolProperties.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/BackendAddressPoolProperties.java
new file mode 100644
index 0000000..4daed6f
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/BackendAddressPoolProperties.java
@@ -0,0 +1,74 @@
+/*
+ * 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 BackendAddressPoolProperties implements Provisionable {
+
+   @Nullable
+   public abstract String provisioningState();
+
+   @Nullable
+   public abstract List<IdReference> backendIPConfigurations();
+
+   @Nullable
+   public abstract List<IdReference> loadBalancingRules();
+
+
+   @SerializedNames({ "provisioningState", "backendIPConfigurations", "loadBalancingRules"})
+   public static BackendAddressPoolProperties create(final String provisioningState,
+         final List<IdReference> backendIPConfigurations, final List<IdReference> loadBalancingRules) {
+      return builder().provisioningState(provisioningState).backendIPConfigurations(backendIPConfigurations).loadBalancingRules(loadBalancingRules).build();
+   }
+   
+   public abstract Builder toBuilder();
+
+   public static Builder builder() {
+      return new AutoValue_BackendAddressPoolProperties.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+
+      public abstract Builder provisioningState(String provisioningState);
+
+      public abstract Builder backendIPConfigurations(List<IdReference> backendIPConfigurations);
+
+      public abstract Builder loadBalancingRules(List<IdReference> loadBalancingRules);
+
+      abstract List<IdReference> backendIPConfigurations();
+      abstract List<IdReference> loadBalancingRules();
+      
+      abstract BackendAddressPoolProperties autoBuild();
+      
+      public BackendAddressPoolProperties build() {
+         backendIPConfigurations(backendIPConfigurations() != null ? ImmutableList.copyOf(backendIPConfigurations())
+               : null);
+         loadBalancingRules(loadBalancingRules() != null ? ImmutableList.copyOf(loadBalancingRules()) : null);
+         return autoBuild();
+      }
+   }
+}
+

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DataDisk.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DataDisk.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DataDisk.java
index de1fa36..ebb137b 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DataDisk.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DataDisk.java
@@ -17,6 +17,7 @@
 package org.jclouds.azurecompute.arm.domain;
 
 import com.google.auto.value.AutoValue;
+
 import org.jclouds.json.SerializedNames;
 
 @AutoValue
@@ -58,6 +59,8 @@ public abstract class DataDisk {
               .vhd(vhd)
               .build();
    }
+   
+   public abstract Builder toBuilder();
 
    public static Builder builder() {
       return new AutoValue_DataDisk.Builder();

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Deployment.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Deployment.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Deployment.java
index be363ec..fe22591 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Deployment.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Deployment.java
@@ -160,7 +160,7 @@ public abstract class Deployment {
    }
 
    @AutoValue
-   public abstract static class DeploymentProperties {
+   public abstract static class DeploymentProperties implements Provisionable {
       @Nullable
       public abstract String provisioningState();
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DeploymentTemplate.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DeploymentTemplate.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DeploymentTemplate.java
index 5221e05..84e6061 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DeploymentTemplate.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DeploymentTemplate.java
@@ -19,6 +19,7 @@ package org.jclouds.azurecompute.arm.domain;
 import com.google.auto.value.AutoValue;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+
 import org.jclouds.javax.annotation.Nullable;
 
 import java.util.List;
@@ -89,6 +90,8 @@ public abstract class DeploymentTemplate {
 
       return builder.build();
    }
+   
+   public abstract Builder toBuilder();
 
    public static Builder builder() {
       return new AutoValue_DeploymentTemplate.Builder();

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DiagnosticsProfile.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DiagnosticsProfile.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DiagnosticsProfile.java
index 6097e59..bd8cb0c 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DiagnosticsProfile.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DiagnosticsProfile.java
@@ -17,6 +17,7 @@
 package org.jclouds.azurecompute.arm.domain;
 
 import com.google.auto.value.AutoValue;
+
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.json.SerializedNames;
 
@@ -38,6 +39,8 @@ public abstract class DiagnosticsProfile {
                  .storageUri(storageUri)
                  .build();
       }
+      
+      public abstract Builder toBuilder();
 
       public static Builder builder() {
          return new AutoValue_DiagnosticsProfile_BootDiagnostics.Builder();
@@ -56,6 +59,9 @@ public abstract class DiagnosticsProfile {
    public static DiagnosticsProfile create(final BootDiagnostics  bootDiagnostics) {
       return builder().bootDiagnostics(bootDiagnostics).build();
    }
+   
+   public abstract Builder toBuilder();
+   
    public static Builder builder() {
       return new AutoValue_DiagnosticsProfile.Builder();
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DnsSettings.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DnsSettings.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DnsSettings.java
index a527eb0..c06ef22 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DnsSettings.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DnsSettings.java
@@ -17,6 +17,7 @@
 package org.jclouds.azurecompute.arm.domain;
 
 import com.google.auto.value.AutoValue;
+
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.json.SerializedNames;
 
@@ -39,6 +40,8 @@ public abstract class DnsSettings {
               .reverseFqdn(reverseFqdn)
               .build();
    }
+   
+   public abstract Builder toBuilder();
 
    public static Builder builder() {
       return new AutoValue_DnsSettings.Builder();

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/FrontendIPConfigurations.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/FrontendIPConfigurations.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/FrontendIPConfigurations.java
new file mode 100644
index 0000000..fae60c9
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/FrontendIPConfigurations.java
@@ -0,0 +1,45 @@
+/*
+ * 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.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+public abstract class FrontendIPConfigurations {
+   public abstract String name();
+
+   @Nullable
+   public abstract String id();
+
+   @Nullable
+   public abstract FrontendIPConfigurationsProperties properties();
+
+   @Nullable
+   public abstract String etag();
+
+   @SerializedNames({ "name", "id", "properties", "etag" })
+   public static FrontendIPConfigurations create(final String name, final String id,
+         final FrontendIPConfigurationsProperties properties,
+                                             final String etag) {
+      return new AutoValue_FrontendIPConfigurations(name, id,
+                                                properties, etag);
+   }
+}
+

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/FrontendIPConfigurationsProperties.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/FrontendIPConfigurationsProperties.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/FrontendIPConfigurationsProperties.java
new file mode 100644
index 0000000..b451773
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/FrontendIPConfigurationsProperties.java
@@ -0,0 +1,66 @@
+/*
+ * 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.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+public abstract class FrontendIPConfigurationsProperties {
+
+   @Nullable
+   public abstract IdReference subnet();
+
+   @Nullable
+   public abstract String privateIPAddress();
+
+   @Nullable
+   public abstract String privateIPAllocationMethod();
+
+   @Nullable
+   public abstract IdReference publicIPAddress();
+
+
+   @SerializedNames({ "subnet", "privateIPAddress", "privateIPAllocationMethod", "publicIPAddress" })
+   public static FrontendIPConfigurationsProperties create(final IdReference subnet, final String privateIPAddress,
+         final String privateIPAllocationMethod, final IdReference publicIPAddress) {
+      return builder().subnet(subnet).publicIPAddress(publicIPAddress).privateIPAddress(privateIPAddress)
+            .privateIPAllocationMethod(privateIPAllocationMethod).build();
+   }
+   
+   public abstract Builder toBuilder();
+   
+   public static Builder builder() {
+      return new AutoValue_FrontendIPConfigurationsProperties.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder subnet(IdReference subnet);
+
+      public abstract Builder privateIPAddress(String privateIPAddress);
+
+      public abstract Builder privateIPAllocationMethod(String privateIPAllocationMethod);
+
+      public abstract Builder publicIPAddress(IdReference publicIPAddress);
+
+      public abstract FrontendIPConfigurationsProperties build();
+   }
+}
+

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/HardwareProfile.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/HardwareProfile.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/HardwareProfile.java
index ee9a5f1..9342202 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/HardwareProfile.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/HardwareProfile.java
@@ -17,6 +17,7 @@
 package org.jclouds.azurecompute.arm.domain;
 
 import com.google.auto.value.AutoValue;
+
 import org.jclouds.json.SerializedNames;
 
 @AutoValue
@@ -31,6 +32,8 @@ public abstract class HardwareProfile {
    public static HardwareProfile create(final String vmSize) {
       return builder().vmSize(vmSize).build();
    }
+   
+   public abstract Builder toBuilder();
 
    public static Builder builder() {
       return new AutoValue_HardwareProfile.Builder();

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ImageReference.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ImageReference.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ImageReference.java
index 9cc6747..f9e1875 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ImageReference.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ImageReference.java
@@ -17,6 +17,7 @@
 package org.jclouds.azurecompute.arm.domain;
 
 import com.google.auto.value.AutoValue;
+
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.json.SerializedNames;
 
@@ -60,6 +61,8 @@ public abstract class ImageReference {
               .version(version)
               .build();
    }
+   
+   public abstract Builder toBuilder();
 
    public static Builder builder() {
       return new AutoValue_ImageReference.Builder();

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/InboundNatRule.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/InboundNatRule.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/InboundNatRule.java
new file mode 100644
index 0000000..dccc2e9
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/InboundNatRule.java
@@ -0,0 +1,43 @@
+/*
+ * 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.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+public abstract class InboundNatRule {
+   @Nullable
+   public abstract String name();
+
+   @Nullable
+   public abstract String id();
+
+   @Nullable
+   public abstract InboundNatRuleProperties properties();
+
+   @Nullable
+   public abstract String etag();
+
+   @SerializedNames({ "name", "id", "properties", "etag" })
+   public static InboundNatRule create(final String name, final String id, final InboundNatRuleProperties properties,
+         final String etag) {
+      return new AutoValue_InboundNatRule(name, id, properties, etag);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/InboundNatRuleProperties.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/InboundNatRuleProperties.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/InboundNatRuleProperties.java
new file mode 100644
index 0000000..9ed6aed
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/InboundNatRuleProperties.java
@@ -0,0 +1,105 @@
+/*
+ * 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;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+public abstract class InboundNatRuleProperties implements Provisionable {
+   public enum Protocol {
+      Tcp("Tcp"), Udp("Udp"), UNRECOGNIZED("Unrecognized");
+
+      private final String label;
+
+      private Protocol(final String label) {
+         this.label = label;
+      }
+
+      public static Protocol fromValue(final String text) {
+         return (Protocol) GetEnumValue.fromValueOrDefault(text, Protocol.UNRECOGNIZED);
+      }
+
+      @Override
+      public String toString() {
+         return label;
+      }
+   }
+
+   @Nullable
+   public abstract IdReference frontendIPConfiguration();
+
+   @Nullable
+   public abstract IdReference backendIPConfiguration();
+
+   public abstract Protocol protocol();
+
+   public abstract int backendPort();
+
+   public abstract int frontendPort();
+
+   @Nullable
+   public abstract Boolean enableFloatingIP();
+
+   @Nullable
+   public abstract Integer idleTimeoutInMinutes();
+
+   @Nullable
+   public abstract String provisioningState();
+
+   @SerializedNames({ "frontendIPConfiguration", "backendIPConfiguration", "protocol", "frontendPort", "backendPort",
+         "provisioningState", "enableFloatingIP", "idleTimeoutInMinutes" })
+   public static InboundNatRuleProperties create(final IdReference frontendIPConfiguration,
+         final IdReference backendIPConfiguration, final Protocol protocol, final int frontendPort,
+         final int backendPort, final String provisioningState, Boolean enableFloatingIP, Integer idleTimeoutInMinutes) {
+      return builder().frontendIPConfiguration(frontendIPConfiguration).backendIPConfiguration(backendIPConfiguration)
+            .protocol(protocol).frontendPort(frontendPort).backendPort(backendPort)
+            .provisioningState(provisioningState).enableFloatingIP(enableFloatingIP)
+            .idleTimeoutInMinutes(idleTimeoutInMinutes).build();
+   }
+
+   public abstract Builder toBuilder();
+
+   public static Builder builder() {
+      return new AutoValue_InboundNatRuleProperties.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+
+      public abstract Builder frontendIPConfiguration(IdReference frontendIPConfiguration);
+
+      public abstract Builder backendIPConfiguration(IdReference backendIPConfiguration);
+
+      public abstract Builder protocol(Protocol protocol);
+
+      public abstract Builder frontendPort(int frontendPort);
+
+      public abstract Builder backendPort(int backendPort);
+
+      public abstract Builder provisioningState(String provisioningState);
+
+      public abstract Builder enableFloatingIP(Boolean enableFloatingIP);
+
+      public abstract Builder idleTimeoutInMinutes(Integer idleTimeoutInMinutes);
+
+      public abstract InboundNatRuleProperties build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/IpConfiguration.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/IpConfiguration.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/IpConfiguration.java
index bb49a77..e523622 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/IpConfiguration.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/IpConfiguration.java
@@ -49,6 +49,8 @@ public abstract class IpConfiguration {
               .properties(properties)
               .build();
    }
+   
+   public abstract Builder toBuilder();
 
    public static Builder builder() {
       return new AutoValue_IpConfiguration.Builder();

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/IpConfigurationProperties.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/IpConfigurationProperties.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/IpConfigurationProperties.java
index 8e3bd53..21f494f 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/IpConfigurationProperties.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/IpConfigurationProperties.java
@@ -16,12 +16,16 @@
  */
 package org.jclouds.azurecompute.arm.domain;
 
+import java.util.List;
+
 import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
+
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.json.SerializedNames;
 
 @AutoValue
-public abstract class IpConfigurationProperties {
+public abstract class IpConfigurationProperties implements Provisionable {
 
    @Nullable
    public abstract String provisioningState();
@@ -37,9 +41,18 @@ public abstract class IpConfigurationProperties {
 
    @Nullable
    public abstract IdReference publicIPAddress();
+   
+   @Nullable
+   public abstract List<IdReference> loadBalancerBackendAddressPools();
+   
+   @Nullable
+   public abstract List<IdReference> loadBalancerInboundNatRules();
 
-   @SerializedNames({"provisioningState", "privateIPAddress", "privateIPAllocationMethod", "subnet", "publicIPAddress"})
-   public static IpConfigurationProperties create(final String provisioningState, final String privateIPAddress, final String privateIPAllocationMethod, final IdReference subnet, final IdReference publicIPAddress) {
+   @SerializedNames({ "provisioningState", "privateIPAddress", "privateIPAllocationMethod", "subnet",
+         "publicIPAddress", "loadBalancerBackendAddressPools", "loadBalancerInboundNatRules" })
+   public static IpConfigurationProperties create(final String provisioningState, final String privateIPAddress,
+         final String privateIPAllocationMethod, final IdReference subnet, final IdReference publicIPAddress,
+         List<IdReference> loadBalancerBackendAddressPools, List<IdReference> loadBalancerInboundNatRules) {
 
       return builder()
               .provisioningState(provisioningState)
@@ -47,8 +60,12 @@ public abstract class IpConfigurationProperties {
               .privateIPAllocationMethod(privateIPAllocationMethod)
               .subnet(subnet)
               .publicIPAddress(publicIPAddress)
+              .loadBalancerBackendAddressPools(loadBalancerBackendAddressPools)
+              .loadBalancerInboundNatRules(loadBalancerInboundNatRules)
               .build();
    }
+   
+   public abstract Builder toBuilder();
 
    public static Builder builder() {
       return new AutoValue_IpConfigurationProperties.Builder();
@@ -65,8 +82,24 @@ public abstract class IpConfigurationProperties {
       public abstract Builder subnet(IdReference subnet);
 
       public abstract Builder publicIPAddress(IdReference publicIPAddress);
-
-      public abstract IpConfigurationProperties build();
+      
+      public abstract Builder loadBalancerBackendAddressPools(List<IdReference> loadBalancerBackendAddressPools);
+      
+      public abstract Builder loadBalancerInboundNatRules(List<IdReference> loadBalancerInboundNatRules);
+      
+      abstract List<IdReference> loadBalancerBackendAddressPools();
+      
+      abstract List<IdReference> loadBalancerInboundNatRules();
+      
+      abstract IpConfigurationProperties autoBuild();
+
+      public IpConfigurationProperties build() {
+         loadBalancerBackendAddressPools(loadBalancerBackendAddressPools() != null ? ImmutableList
+               .copyOf(loadBalancerBackendAddressPools()) : null);
+         loadBalancerInboundNatRules(loadBalancerInboundNatRules() != null ? ImmutableList
+               .copyOf(loadBalancerInboundNatRules()) : null);
+         return autoBuild();
+      }
    }
 }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LoadBalancer.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LoadBalancer.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LoadBalancer.java
new file mode 100644
index 0000000..d313e36
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LoadBalancer.java
@@ -0,0 +1,50 @@
+/*
+ * 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 LoadBalancer {
+   @Nullable
+   public abstract String name();
+
+   @Nullable
+   public abstract String location();
+
+   @Nullable
+   public abstract Map<String, String> tags();
+
+   @Nullable
+   public abstract LoadBalancerProperties properties();
+
+   @Nullable
+   public abstract String etag();
+
+   @SerializedNames({ "name", "location", "tags", "properties", "etag" })
+   public static LoadBalancer create(final String name, final String location, final Map<String, String> tags,
+         final LoadBalancerProperties properties, final String etag) {
+      return new AutoValue_LoadBalancer(name, location, tags == null ? null : ImmutableMap.copyOf(tags), properties,
+            etag);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LoadBalancerProperties.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LoadBalancerProperties.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LoadBalancerProperties.java
new file mode 100644
index 0000000..b8ab723
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LoadBalancerProperties.java
@@ -0,0 +1,109 @@
+/*
+ * 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 LoadBalancerProperties implements Provisionable {
+
+   @Nullable
+   public abstract List<FrontendIPConfigurations> frontendIPConfigurations();
+
+   @Nullable
+   public abstract List<BackendAddressPool> backendAddressPools();
+
+   @Nullable
+   public abstract List<LoadBalancingRule> loadBalancingRules();
+
+   @Nullable
+   public abstract List<Probe> probes();
+
+   @Nullable
+   public abstract List<InboundNatRule> inboundNatRules();
+
+   @Nullable
+   public abstract String resourceGuid();
+
+   @Nullable
+   public abstract String provisioningState();
+
+   @SerializedNames({ "frontendIPConfigurations", "backendAddressPools", "loadBalancingRules", "probes",
+         "inboundNatRules", "resourceGuid", "provisioningState" })
+   public static LoadBalancerProperties create(final List<FrontendIPConfigurations> frontendIPConfigurations,
+         final List<BackendAddressPool> backendAddressPools, final List<LoadBalancingRule> loadBalancingRules,
+         final List<Probe> probes, final List<InboundNatRule> inboundNatRules, final String resourceGuid,
+         final String provisioningState) {
+      return builder().frontendIPConfigurations(frontendIPConfigurations)
+            .backendAddressPools(backendAddressPools == null ? null : ImmutableList.copyOf(backendAddressPools))
+            .loadBalancingRules(loadBalancingRules == null ? null : ImmutableList.copyOf(loadBalancingRules))
+            .probes(probes == null ? null : ImmutableList.copyOf(probes))
+            .inboundNatRules(inboundNatRules == null ? null : ImmutableList.copyOf(inboundNatRules))
+            .resourceGuid(resourceGuid).provisioningState(provisioningState).build();
+   }
+
+   public abstract Builder toBuilder();
+
+   public static Builder builder() {
+      return new AutoValue_LoadBalancerProperties.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder frontendIPConfigurations(List<FrontendIPConfigurations> frontendIPConfigurations);
+
+      public abstract Builder backendAddressPools(List<BackendAddressPool> backendAddressPools);
+
+      public abstract Builder loadBalancingRules(List<LoadBalancingRule> networkInterfaces);
+
+      public abstract Builder probes(List<Probe> probes);
+
+      public abstract Builder inboundNatRules(List<InboundNatRule> inboundNatRules);
+
+      public abstract Builder resourceGuid(String resourceGuid);
+
+      public abstract Builder provisioningState(String provisioningState);
+
+      abstract List<FrontendIPConfigurations> frontendIPConfigurations();
+
+      abstract List<BackendAddressPool> backendAddressPools();
+
+      abstract List<LoadBalancingRule> loadBalancingRules();
+
+      abstract List<Probe> probes();
+
+      abstract List<InboundNatRule> inboundNatRules();
+
+      abstract LoadBalancerProperties autoBuild();
+
+      public LoadBalancerProperties build() {
+         frontendIPConfigurations(frontendIPConfigurations() != null ? ImmutableList.copyOf(frontendIPConfigurations())
+               : null);
+         backendAddressPools(backendAddressPools() != null ? ImmutableList.copyOf(backendAddressPools()) : null);
+         loadBalancingRules(loadBalancingRules() != null ? ImmutableList.copyOf(loadBalancingRules()) : null);
+         probes(probes() != null ? ImmutableList.copyOf(probes()) : null);
+         inboundNatRules(inboundNatRules() != null ? ImmutableList.copyOf(inboundNatRules()) : null);
+         return autoBuild();
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LoadBalancingRule.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LoadBalancingRule.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LoadBalancingRule.java
new file mode 100644
index 0000000..ecc97dd
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LoadBalancingRule.java
@@ -0,0 +1,43 @@
+/*
+ * 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.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+public abstract class LoadBalancingRule {
+   @Nullable
+   public abstract String name();
+
+   @Nullable
+   public abstract String id();
+
+   @Nullable
+   public abstract LoadBalancingRuleProperties properties();
+
+   @Nullable
+   public abstract String etag();
+
+   @SerializedNames({ "name", "id", "properties", "etag" })
+   public static LoadBalancingRule create(final String name, final String id,
+         final LoadBalancingRuleProperties properties, final String etag) {
+      return new AutoValue_LoadBalancingRule(name, id, properties, etag);
+   }
+}