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:06 UTC

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

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LoadBalancingRuleProperties.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LoadBalancingRuleProperties.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LoadBalancingRuleProperties.java
new file mode 100644
index 0000000..ca90a15
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/LoadBalancingRuleProperties.java
@@ -0,0 +1,135 @@
+/*
+ * 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 LoadBalancingRuleProperties {
+
+   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;
+      }
+   }
+   
+   public enum LoadDistribution {
+      Default("Default"), SourceIp("SourceIP"), SourceIPProtocol("SourceIPProtocol"), UNRECOGNIZED("Unrecognized");
+
+      private final String label;
+
+      private LoadDistribution(final String label) {
+         this.label = label;
+      }
+
+      public static LoadDistribution fromValue(final String text) {
+         return (LoadDistribution) GetEnumValue.fromValueOrDefault(text, LoadDistribution.UNRECOGNIZED);
+      }
+
+      @Override
+      public String toString() {
+         return label;
+      }
+   }
+
+   @Nullable
+   public abstract IdReference frontendIPConfiguration();
+
+   @Nullable
+   public abstract IdReference backendAddressPool();
+
+   public abstract Protocol protocol();
+
+   public abstract int frontendPort();
+
+   public abstract int backendPort();
+
+   @Nullable
+   public abstract IdReference probe();
+
+   @Nullable
+   public abstract Boolean enableFloatingIP();
+
+   @Nullable
+   public abstract Integer idleTimeoutInMinutes();
+
+   @Nullable
+   public abstract LoadDistribution loadDistribution();
+
+   @Nullable
+   public abstract String provisioningState();
+
+   @SerializedNames({ "frontendIPConfiguration", "backendAddressPool", "protocol", "frontendPort", "backendPort",
+         "probe", "enableFloatingIP", "idleTimeoutInMinutes", "loadDistribution", "provisioningState" })
+   public static LoadBalancingRuleProperties create(final IdReference frontendIPConfiguration,
+         final IdReference backendAddressPool, final Protocol protocol, final int frontendPort, final int backendPort,
+         final IdReference probe, final Boolean enableFloatingIP, final Integer idleTimeoutInMinutes,
+         final LoadDistribution loadDistribution, final String provisioningState) {
+      return builder().frontendIPConfiguration(frontendIPConfiguration).backendAddressPool(backendAddressPool)
+            .protocol(protocol).frontendPort(frontendPort).backendPort(backendPort).probe(probe)
+            .enableFloatingIP(enableFloatingIP).idleTimeoutInMinutes(idleTimeoutInMinutes)
+            .loadDistribution(loadDistribution).build();
+   }
+   
+   public abstract Builder toBuilder();
+
+   public static Builder builder() {
+      return new AutoValue_LoadBalancingRuleProperties.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder frontendIPConfiguration(IdReference frontendIPConfiguration);
+
+      public abstract Builder backendAddressPool(IdReference backendAddressPool);
+
+      public abstract Builder protocol(Protocol protocol);
+
+      public abstract Builder frontendPort(int frontendPort);
+
+      public abstract Builder backendPort(int backendPort);
+
+      public abstract Builder probe(IdReference probe);
+
+      public abstract Builder enableFloatingIP(Boolean enableFloatingIP);
+
+      public abstract Builder idleTimeoutInMinutes(Integer idleTimeoutInMinutes);
+
+      public abstract Builder loadDistribution(LoadDistribution loadDistribution);
+
+      public abstract Builder provisioningState(String provisioningState);
+
+      public abstract LoadBalancingRuleProperties build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkInterfaceCardProperties.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkInterfaceCardProperties.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkInterfaceCardProperties.java
index 8b19493..d1976f1 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkInterfaceCardProperties.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkInterfaceCardProperties.java
@@ -24,7 +24,7 @@ import org.jclouds.json.SerializedNames;
 import java.util.List;
 
 @AutoValue
-public abstract class NetworkInterfaceCardProperties {
+public abstract class NetworkInterfaceCardProperties implements Provisionable {
 
    @Nullable
    public abstract String provisioningState();
@@ -52,6 +52,8 @@ public abstract class NetworkInterfaceCardProperties {
 
       return builder.build();
    }
+   
+   public abstract Builder toBuilder();
 
    public static Builder builder() {
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkProfile.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkProfile.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkProfile.java
index ffcf9ee..b26305f 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkProfile.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkProfile.java
@@ -18,6 +18,7 @@ package org.jclouds.azurecompute.arm.domain;
 
 import com.google.auto.value.AutoValue;
 import com.google.common.collect.ImmutableList;
+
 import org.jclouds.json.SerializedNames;
 
 import java.util.List;
@@ -34,6 +35,8 @@ public abstract class NetworkProfile {
    public static NetworkProfile create(final List<IdReference> networkInterfaces) {
       return builder().networkInterfaces(networkInterfaces).build();
    }
+   
+   public abstract Builder toBuilder();
 
    public static Builder builder() {
       return new AutoValue_NetworkProfile.Builder();

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkSecurityGroupProperties.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkSecurityGroupProperties.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkSecurityGroupProperties.java
index f81ab0f..bbc2746 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkSecurityGroupProperties.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkSecurityGroupProperties.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;
 import com.google.common.collect.ImmutableList;
@@ -24,7 +25,7 @@ import com.google.common.collect.ImmutableList;
 import java.util.List;
 
 @AutoValue
-public abstract class NetworkSecurityGroupProperties {
+public abstract class NetworkSecurityGroupProperties implements Provisionable {
 
    @Nullable
    public abstract List<NetworkSecurityRule> securityRules();
@@ -60,6 +61,8 @@ public abstract class NetworkSecurityGroupProperties {
               .provisioningState(provisioningState)
               .build();
    }
+   
+   public abstract Builder toBuilder();
 
    public static Builder builder() {
       return new AutoValue_NetworkSecurityGroupProperties.Builder();

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkSecurityRuleProperties.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkSecurityRuleProperties.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkSecurityRuleProperties.java
index 0710503..e93107e 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkSecurityRuleProperties.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkSecurityRuleProperties.java
@@ -17,6 +17,7 @@
 package org.jclouds.azurecompute.arm.domain;
 
 import com.google.auto.value.AutoValue;
+
 import org.jclouds.azurecompute.arm.util.GetEnumValue;
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.json.SerializedNames;
@@ -112,6 +113,8 @@ public abstract class NetworkSecurityRuleProperties {
               .direction(direction)
               .build();
    }
+   
+   public abstract Builder toBuilder();
 
    public static Builder builder() {
       return new AutoValue_NetworkSecurityRuleProperties.Builder();

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/OSDisk.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/OSDisk.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/OSDisk.java
index 0be43bf..9cdee44 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/OSDisk.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/OSDisk.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;
 
@@ -70,6 +71,8 @@ public abstract class OSDisk {
             .image(image)
             .build();
    }
+   
+   public abstract Builder toBuilder();
 
    public static Builder builder() {
       return new AutoValue_OSDisk.Builder();

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/OSProfile.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/OSProfile.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/OSProfile.java
index 9240824..5592b4c 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/OSProfile.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/OSProfile.java
@@ -18,6 +18,7 @@ package org.jclouds.azurecompute.arm.domain;
 
 import com.google.auto.value.AutoValue;
 import com.google.common.collect.ImmutableList;
+
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.json.SerializedNames;
 
@@ -212,6 +213,8 @@ public abstract class OSProfile {
               .windowsConfiguration(windowsConfiguration)
               .build();
    }
+   
+   public abstract Builder toBuilder();
 
    public static Builder builder() {
       return new AutoValue_OSProfile.Builder();

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Probe.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Probe.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Probe.java
new file mode 100644
index 0000000..e523984
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Probe.java
@@ -0,0 +1,42 @@
+/*
+ * 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 Probe {
+   @Nullable
+   public abstract String name();
+
+   @Nullable
+   public abstract String id();
+
+   @Nullable
+   public abstract ProbeProperties properties();
+
+   @Nullable
+   public abstract String etag();
+
+   @SerializedNames({ "name", "id", "properties", "etag" })
+   public static Probe create(final String name, final String id, final ProbeProperties properties, final String etag) {
+      return new AutoValue_Probe(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/ProbeProperties.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ProbeProperties.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ProbeProperties.java
new file mode 100644
index 0000000..6fe273e
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ProbeProperties.java
@@ -0,0 +1,91 @@
+/*
+ * 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 ProbeProperties implements Provisionable {
+   public enum Protocol {
+      Tcp("Tcp"), Http("Http"), 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 Protocol protocol();
+
+   public abstract int port();
+
+   @Nullable
+   public abstract String requestPath();
+
+   public abstract int intervalInSeconds();
+
+   public abstract int numberOfProbes();
+
+   @Nullable
+   public abstract String provisioningState();
+
+   @SerializedNames({ "protocol", "port", "requestPath", "intervalInSeconds", "numberOfProbes", "provisioningState" })
+   public static ProbeProperties create(final Protocol protocol, final int port, final String requestPath,
+         final int intervalInSeconds, final int numberOfProbes, final String provisioningState) {
+      return builder().protocol(protocol).port(port).requestPath(requestPath).intervalInSeconds(intervalInSeconds)
+            .numberOfProbes(numberOfProbes).provisioningState(provisioningState).build();
+   }
+   
+   public abstract Builder toBuilder();
+
+   public static Builder builder() {
+      return new AutoValue_ProbeProperties.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+
+      public abstract Builder protocol(Protocol protocol);
+
+      public abstract Builder port(int port);
+
+      public abstract Builder requestPath(String requestPath);
+
+      public abstract Builder intervalInSeconds(int intervalInSeconds);
+
+      public abstract Builder numberOfProbes(int numberOfProbes);
+
+      public abstract Builder provisioningState(String provisioningState);
+
+      public abstract ProbeProperties build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Provisionable.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Provisionable.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Provisionable.java
new file mode 100644
index 0000000..f400e93
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Provisionable.java
@@ -0,0 +1,22 @@
+/*
+ * 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;
+
+public interface Provisionable {
+   
+   String provisioningState();
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/PublicIPAddressProperties.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/PublicIPAddressProperties.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/PublicIPAddressProperties.java
index 2fc7fb5..af7da0d 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/PublicIPAddressProperties.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/PublicIPAddressProperties.java
@@ -17,11 +17,12 @@
 package org.jclouds.azurecompute.arm.domain;
 
 import com.google.auto.value.AutoValue;
+
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.json.SerializedNames;
 
 @AutoValue
-public abstract class PublicIPAddressProperties {
+public abstract class PublicIPAddressProperties implements Provisionable {
 
    @Nullable // needs to be nullable to create the payload for create request
    public abstract String provisioningState();
@@ -58,6 +59,8 @@ public abstract class PublicIPAddressProperties {
               .dnsSettings(dnsSettings)
               .build();
    }
+   
+   public abstract Builder toBuilder();
 
    public static Builder builder() {
       return new AutoValue_PublicIPAddressProperties.Builder();

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ResourceDefinition.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ResourceDefinition.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ResourceDefinition.java
index 7c68e80..1b51375 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ResourceDefinition.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ResourceDefinition.java
@@ -20,6 +20,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 org.jclouds.json.SerializedNames;
 
@@ -67,6 +68,8 @@ public abstract class ResourceDefinition {
 
         return  builder.build();
     }
+    
+    public abstract Builder toBuilder();
 
     public static Builder builder() {
         return new AutoValue_ResourceDefinition.Builder();

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ResourceGroup.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ResourceGroup.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ResourceGroup.java
index 936b813..51bea9e 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ResourceGroup.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ResourceGroup.java
@@ -27,7 +27,7 @@ import com.google.common.collect.ImmutableMap;
 public abstract class ResourceGroup {
 
    @AutoValue
-   public abstract static class ResourceGroupProperties{
+   public abstract static class ResourceGroupProperties 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/ResourceProviderMetaData.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ResourceProviderMetaData.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ResourceProviderMetaData.java
index 84526b9..e919f02 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ResourceProviderMetaData.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ResourceProviderMetaData.java
@@ -18,6 +18,7 @@ package org.jclouds.azurecompute.arm.domain;
 
 import com.google.auto.value.AutoValue;
 import com.google.common.collect.ImmutableList;
+
 import org.jclouds.json.SerializedNames;
 
 import java.util.List;
@@ -40,6 +41,8 @@ public abstract class ResourceProviderMetaData {
 
       return builder.build();
    }
+   
+   public abstract Builder toBuilder();
 
    public static Builder builder() {
       return new AutoValue_ResourceProviderMetaData.Builder();

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Status.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Status.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Status.java
new file mode 100644
index 0000000..780877b
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Status.java
@@ -0,0 +1,49 @@
+/*
+ * 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.Date;
+
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+public abstract class Status {
+
+   @Nullable
+   public abstract String code();
+
+   @Nullable
+   public abstract String level();
+
+   @Nullable
+   public abstract String displayStatus();
+
+   @Nullable
+   public abstract String message();
+
+   @Nullable
+   public abstract Date time();
+
+   @SerializedNames({ "code", "level", "displayStatus", "message", "time" })
+   public static Status create(final String code, final String level, final String displayStatus, final String message,
+         final Date time) {
+      return new AutoValue_Status(code, level, displayStatus, message, time);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/StorageProfile.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/StorageProfile.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/StorageProfile.java
index bcb62ee..a65ffd7 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/StorageProfile.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/StorageProfile.java
@@ -18,6 +18,7 @@ package org.jclouds.azurecompute.arm.domain;
 
 import com.google.auto.value.AutoValue;
 import com.google.common.collect.ImmutableList;
+
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.json.SerializedNames;
 
@@ -53,6 +54,8 @@ public abstract class StorageProfile {
 
       return builder.build();
    }
+   
+   public abstract Builder toBuilder();
 
    public static Builder builder() {
       return new AutoValue_StorageProfile.Builder();

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/StorageService.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/StorageService.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/StorageService.java
index a97117f..0f5dbe5 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/StorageService.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/StorageService.java
@@ -22,7 +22,6 @@ import java.util.Map;
 import com.google.common.collect.ImmutableMap;
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.json.SerializedNames;
-
 import org.jclouds.azurecompute.arm.util.GetEnumValue;
 
 @AutoValue
@@ -150,6 +149,9 @@ public abstract class StorageService {
 
          return  builder.build();
       }
+      
+      public abstract Builder toBuilder();
+      
       public static Builder builder() {
          return new AutoValue_StorageService_StorageServiceProperties.Builder();
       }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Subnet.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Subnet.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Subnet.java
index e4024df..6830438 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Subnet.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/Subnet.java
@@ -21,6 +21,7 @@ import static com.google.common.collect.ImmutableList.copyOf;
 import java.util.List;
 
 import com.google.common.collect.ImmutableList;
+
 import org.jclouds.javax.annotation.Nullable;
 import com.google.auto.value.AutoValue;
 import org.jclouds.json.SerializedNames;
@@ -40,7 +41,7 @@ public abstract class Subnet {
    }
 
    @AutoValue
-   public abstract static class SubnetProperties {
+   public abstract static class SubnetProperties implements Provisionable {
 
       @Nullable
       public abstract String provisioningState();
@@ -59,6 +60,8 @@ public abstract class Subnet {
                  .ipConfigurations(ipConfigurations != null ? copyOf(ipConfigurations) : null)
                  .build();
       }
+      
+      public abstract Builder toBuilder();
 
       public static Builder builder() {
          return new AutoValue_Subnet_SubnetProperties.Builder();

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VHD.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VHD.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VHD.java
index 3b1421a..7e6b387 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VHD.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VHD.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 VHD {
    public static VHD create(final String uri) {
       return builder().uri(uri).build();
    }
+   
+   public abstract Builder toBuilder();
 
    public static Builder builder() {
       return new AutoValue_VHD.Builder();

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VMImage.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VMImage.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VMImage.java
index b08355e..04863ad 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VMImage.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VMImage.java
@@ -111,6 +111,8 @@ public abstract class VMImage {
       return new AutoValue_VMImage.Builder().globallyAvailable(false).custom(true);
    }
    
+   public abstract Builder toBuilder();
+   
    @AutoValue.Builder
    public abstract static class Builder {
       

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachine.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachine.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachine.java
index 65a389c..86810e5 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachine.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachine.java
@@ -74,6 +74,8 @@ public abstract class VirtualMachine {
             .build();
    }
    
+   public abstract Builder toBuilder();
+   
    public static Builder builder() {
       return new AutoValue_VirtualMachine.Builder();
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineInstance.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineInstance.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineInstance.java
index 1c11e4d..66ef283 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineInstance.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineInstance.java
@@ -21,10 +21,8 @@ import static com.google.common.collect.Iterables.getFirst;
 import static com.google.common.collect.Iterables.transform;
 import static org.jclouds.util.Predicates2.startsWith;
 
-import java.util.Date;
 import java.util.List;
 
-import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance.VirtualMachineStatus.PowerState;
 import org.jclouds.azurecompute.arm.domain.VirtualMachineProperties.ProvisioningState;
 import org.jclouds.azurecompute.arm.util.GetEnumValue;
 import org.jclouds.javax.annotation.Nullable;
@@ -40,42 +38,19 @@ import com.google.common.collect.ImmutableList;
 @AutoValue
 public abstract class VirtualMachineInstance {
 
-   @com.google.auto.value.AutoValue
-   public abstract static class VirtualMachineStatus {
-      
-      public static final String PROVISIONING_STATE_PREFIX = "ProvisioningState/";
-      public static final String POWER_STATE_PREFIX = "PowerState/";
-      
-      public enum PowerState {
-         RUNNING,
-         STOPPED,
-         UNRECOGNIZED;
-
-         public static PowerState fromValue(final String text) {
-            return (PowerState) GetEnumValue.fromValueOrDefault(text, PowerState.UNRECOGNIZED);
-         }
-      }
-
-      @Nullable
-      public abstract String code();
-
-      @Nullable
-      public abstract String level();
-
-      @Nullable
-      public abstract String displayStatus();
-
-      @Nullable
-      public abstract Date time();
-
-      @SerializedNames({"code", "level", "displayStatus", "time"})
-      public static VirtualMachineStatus create(final String code, final String level, final String displayStatus,
-                                                final Date time) {
+   public static final String PROVISIONING_STATE_PREFIX = "ProvisioningState/";
+   public static final String POWER_STATE_PREFIX = "PowerState/";
+   
+   public enum PowerState {
+      RUNNING,
+      STOPPED,
+      UNRECOGNIZED;
 
-         return new AutoValue_VirtualMachineInstance_VirtualMachineStatus(code, level, displayStatus, time);
+      public static PowerState fromValue(final String text) {
+         return (PowerState) GetEnumValue.fromValueOrDefault(text, PowerState.UNRECOGNIZED);
       }
    }
-
+   
    @Nullable
    public abstract String platformUpdateDomain();
 
@@ -83,19 +58,19 @@ public abstract class VirtualMachineInstance {
    public abstract String platformFaultDomain();
 
    @Nullable
-   public abstract List<VirtualMachineStatus> statuses();
+   public abstract List<Status> statuses();
    
    public ProvisioningState provisioningState() {
-      return ProvisioningState.fromValue(firstStatus(VirtualMachineStatus.PROVISIONING_STATE_PREFIX));
+      return ProvisioningState.fromValue(firstStatus(PROVISIONING_STATE_PREFIX));
    }
    
    public PowerState powerState() {
-      return PowerState.fromValue(firstStatus(VirtualMachineStatus.POWER_STATE_PREFIX));
+      return PowerState.fromValue(firstStatus(POWER_STATE_PREFIX));
    }
    
    private String firstStatus(final String type) {
-      return getFirst(transform(filter(transform(statuses(), new Function<VirtualMachineStatus, String>() {
-         @Override public String apply(VirtualMachineStatus input) {
+      return getFirst(transform(filter(transform(statuses(), new Function<Status, String>() {
+         @Override public String apply(Status input) {
             return input.code();
          }
       }), startsWith(type)), new Function<String, String>() {
@@ -108,7 +83,7 @@ public abstract class VirtualMachineInstance {
 
    @SerializedNames({"platformUpdateDomain", "platformFaultDomain", "statuses"})
    public static VirtualMachineInstance create(final String platformUpdateDomain, final String platformFaultDomain,
-                                               final List<VirtualMachineStatus> statuses) {
+                                               final List<Status> statuses) {
 
       return new AutoValue_VirtualMachineInstance(platformUpdateDomain, platformFaultDomain, statuses == null ? null : ImmutableList.copyOf(statuses));
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineProperties.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineProperties.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineProperties.java
index eb9520a..732da5c 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineProperties.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineProperties.java
@@ -61,7 +61,7 @@ public abstract class VirtualMachineProperties {
     * The availability set  of the virtual machine
     */
    @Nullable
-   public abstract AvailabilitySet availabilitySet();
+   public abstract IdReference availabilitySet();
 
    /**
     * The hardware Profile of the virtual machine .
@@ -103,7 +103,7 @@ public abstract class VirtualMachineProperties {
            "networkProfile", "diagnosticsProfile", "provisioningState"})
    public static VirtualMachineProperties create(final String vmId,
                                                  final String licenseType,
-                                                 final AvailabilitySet availabilitySet,
+                                                 final IdReference availabilitySet,
                                                  final HardwareProfile hardwareProfile,
                                                  final StorageProfile storageProfile,
                                                  final OSProfile osProfile,
@@ -122,6 +122,8 @@ public abstract class VirtualMachineProperties {
               .provisioningState(provisioningState)
               .build();
    }
+   
+   public abstract Builder toBuilder();
 
    public static Builder builder() {
       return new AutoValue_VirtualMachineProperties.Builder();
@@ -133,7 +135,7 @@ public abstract class VirtualMachineProperties {
 
       public abstract Builder licenseType(String licenseType);
 
-      public abstract Builder availabilitySet(AvailabilitySet availabilitySet);
+      public abstract Builder availabilitySet(IdReference availabilitySet);
 
       public abstract Builder hardwareProfile(HardwareProfile hardwareProfile);
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualNetwork.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualNetwork.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualNetwork.java
index d5eddf0..a0f5c3e 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualNetwork.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualNetwork.java
@@ -24,6 +24,7 @@ import com.google.common.collect.ImmutableList;
 
 import com.google.auto.value.AutoValue;
 import com.google.common.collect.ImmutableMap;
+
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.json.SerializedNames;
 
@@ -42,7 +43,7 @@ public abstract class VirtualNetwork {
    }
 
    @AutoValue
-   public abstract static class VirtualNetworkProperties {
+   public abstract static class VirtualNetworkProperties implements Provisionable {
 
       @Nullable
       public abstract String provisioningState();
@@ -65,6 +66,8 @@ public abstract class VirtualNetwork {
                  .subnets(subnets != null ? copyOf(subnets) : null)
                  .build();
       }
+      
+      public abstract Builder toBuilder();
 
       public static Builder builder() {
          return new AutoValue_VirtualNetwork_VirtualNetworkProperties.Builder();

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/AvailabilitySetApi.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/AvailabilitySetApi.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/AvailabilitySetApi.java
new file mode 100644
index 0000000..30456d4
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/AvailabilitySetApi.java
@@ -0,0 +1,83 @@
+/*
+ * 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.features;
+
+import java.io.Closeable;
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.Fallbacks.EmptyListOnNotFoundOr404;
+import org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.azurecompute.arm.domain.AvailabilitySet;
+import org.jclouds.azurecompute.arm.domain.AvailabilitySet.AvailabilitySetProperties;
+import org.jclouds.azurecompute.arm.filters.ApiVersionFilter;
+import org.jclouds.azurecompute.arm.functions.URIParser;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.oauth.v2.filters.OAuthFilter;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.MapBinder;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.rest.annotations.SelectJson;
+import org.jclouds.rest.binders.BindToJsonPayload;
+
+@Path("/resourcegroups/{resourcegroup}/providers/Microsoft.Compute/availabilitySets")
+@RequestFilters({ OAuthFilter.class, ApiVersionFilter.class })
+@Consumes(MediaType.APPLICATION_JSON)
+public interface AvailabilitySetApi extends Closeable {
+
+   @Named("availabilityset:list")
+   @GET
+   @SelectJson("value")
+   @Fallback(EmptyListOnNotFoundOr404.class)
+   List<AvailabilitySet> list();
+
+   @Named("availabilityset:get")
+   @Path("/{name}")
+   @GET
+   @Fallback(NullOnNotFoundOr404.class)
+   AvailabilitySet get(@PathParam("name") String name);
+
+   @Named("availabilityset:createOrUpdate")
+   @Path("/{name}")
+   @PUT
+   @MapBinder(BindToJsonPayload.class)
+   @Produces(MediaType.APPLICATION_JSON)
+   AvailabilitySet createOrUpdate(@PathParam("name") String name,
+         @PayloadParam("location") String location, @Nullable @PayloadParam("tags") Map<String, String> tags,
+         @PayloadParam("properties") AvailabilitySetProperties properties);
+
+   @Named("availabilityset:delete")
+   @Path("/{name}")
+   @DELETE
+   @ResponseParser(URIParser.class)
+   @Fallback(NullOnNotFoundOr404.class)
+   URI delete(@PathParam("name") String name);
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/LoadBalancerApi.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/LoadBalancerApi.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/LoadBalancerApi.java
new file mode 100644
index 0000000..f0ea900
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/LoadBalancerApi.java
@@ -0,0 +1,82 @@
+/*
+ * 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.features;
+
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.Fallbacks.EmptyListOnNotFoundOr404;
+import org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.azurecompute.arm.domain.LoadBalancer;
+import org.jclouds.azurecompute.arm.domain.LoadBalancerProperties;
+import org.jclouds.azurecompute.arm.filters.ApiVersionFilter;
+import org.jclouds.azurecompute.arm.functions.URIParser;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.oauth.v2.filters.OAuthFilter;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.MapBinder;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.rest.annotations.SelectJson;
+import org.jclouds.rest.binders.BindToJsonPayload;
+
+@Path("/resourcegroups/{resourcegroup}/providers/Microsoft.Network/loadBalancers")
+@RequestFilters({ OAuthFilter.class, ApiVersionFilter.class })
+@Consumes(MediaType.APPLICATION_JSON)
+public interface LoadBalancerApi {
+
+   @Named("loadbalancer:list")
+   @GET
+   @SelectJson("value")
+   @Fallback(EmptyListOnNotFoundOr404.class)
+   List<LoadBalancer> list();
+
+   @Named("loadbalancer:get")
+   @Path("/{loadbalancername}")
+   @GET
+   @Fallback(NullOnNotFoundOr404.class)
+   LoadBalancer get(@PathParam("loadbalancername") String lbName);
+
+   @Named("loadbalancer:createOrUpdate")
+   @Path("/{loadbalancername}")
+   @PUT
+   @MapBinder(BindToJsonPayload.class)
+   @Produces(MediaType.APPLICATION_JSON)
+   LoadBalancer createOrUpdate(@PathParam("loadbalancername") String lbName,
+         @PayloadParam("location") String location, @Nullable @PayloadParam("tags") Map<String, String> tags,
+         @PayloadParam("properties") LoadBalancerProperties properties);
+
+   @Named("loadbalancer:delete")
+   @Path("/{loadbalancername}")
+   @DELETE
+   @ResponseParser(URIParser.class)
+   @Fallback(NullOnNotFoundOr404.class)
+   URI delete(@PathParam("loadbalancername") String lbName);
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/NetworkInterfaceCardApi.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/NetworkInterfaceCardApi.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/NetworkInterfaceCardApi.java
index c135e9e..5d2773f 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/NetworkInterfaceCardApi.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/NetworkInterfaceCardApi.java
@@ -35,6 +35,7 @@ import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCard;
 import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCardProperties;
 import org.jclouds.azurecompute.arm.filters.ApiVersionFilter;
 import org.jclouds.azurecompute.arm.functions.URIParser;
+import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.oauth.v2.filters.OAuthFilter;
 import org.jclouds.rest.annotations.Fallback;
 import org.jclouds.rest.annotations.MapBinder;
@@ -60,9 +61,9 @@ public interface NetworkInterfaceCardApi {
    @MapBinder(BindToJsonPayload.class)
    @PUT
    NetworkInterfaceCard createOrUpdate(@PathParam("networkinterfacecardname") String networkinterfacecardname,
-                                                           @PayloadParam("location") String location,
-                                                           @PayloadParam("properties") NetworkInterfaceCardProperties properties,
-                                                           @PayloadParam("tags") Map<String, String> tags);
+         @PayloadParam("location") String location,
+         @PayloadParam("properties") NetworkInterfaceCardProperties properties,
+         @Nullable @PayloadParam("tags") Map<String, String> tags);
 
    @Named("networkinterfacecard:get")
    @Path("/{networkinterfacecardname}")

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceLiveTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceLiveTest.java
index 784f007..9c2427c 100644
--- a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceLiveTest.java
+++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceLiveTest.java
@@ -20,7 +20,9 @@ import static org.jclouds.compute.options.TemplateOptions.Builder.authorizePubli
 
 import java.util.Properties;
 
+import org.jclouds.azurecompute.arm.AzureComputeApi;
 import org.jclouds.azurecompute.arm.AzureComputeProviderMetadata;
+import org.jclouds.azurecompute.arm.domain.ResourceGroup;
 import org.jclouds.azurecompute.arm.internal.AzureLiveTestUtils;
 import org.jclouds.compute.domain.Template;
 import org.jclouds.compute.domain.TemplateBuilder;
@@ -33,9 +35,13 @@ import org.jclouds.scriptbuilder.domain.Statements;
 import org.jclouds.scriptbuilder.statements.java.InstallJDK;
 import org.jclouds.scriptbuilder.statements.login.AdminAccess;
 import org.jclouds.sshj.config.SshjSshClientModule;
+import org.testng.annotations.AfterClass;
 import org.testng.annotations.Test;
 
+import com.google.common.cache.LoadingCache;
+import com.google.inject.Key;
 import com.google.inject.Module;
+import com.google.inject.TypeLiteral;
 
 /**
  * Live tests for the {@link org.jclouds.compute.ComputeService} integration.
@@ -43,11 +49,37 @@ import com.google.inject.Module;
 @Test(groups = "live", singleThreaded = true, testName = "AzureComputeServiceLiveTest")
 public class AzureComputeServiceLiveTest extends BaseComputeServiceLiveTest {
    
+   private LoadingCache<String, ResourceGroup> resourceGroupMap;
+
    public AzureComputeServiceLiveTest() {
       provider = "azurecompute-arm";
    }
 
    @Override
+   public void initializeContext() {
+      super.initializeContext();
+      resourceGroupMap = context.utils().injector()
+            .getInstance(Key.get(new TypeLiteral<LoadingCache<String, ResourceGroup>>() {
+            }));
+   }
+
+   @Override
+   @AfterClass(groups = "live", alwaysRun = true)
+   protected void tearDownContext() {
+      try {
+         if (template != null) {
+            ResourceGroup rg = resourceGroupMap.getIfPresent(template.getLocation().getId());
+            if (rg != null) {
+               AzureComputeApi api = view.unwrapApi(AzureComputeApi.class);
+               api.getResourceGroupApi().delete(rg.name());
+            }
+         }
+      } finally {
+         super.tearDownContext();
+      }
+   }
+
+   @Override
    protected LoggingModule getLoggingModule() {
       return new SLF4JLoggingModule();
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeImageExtensionLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeImageExtensionLiveTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeImageExtensionLiveTest.java
index 8939eb1..a6d19fa 100644
--- a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeImageExtensionLiveTest.java
+++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeImageExtensionLiveTest.java
@@ -21,16 +21,23 @@ import static org.jclouds.compute.options.TemplateOptions.Builder.authorizePubli
 import java.util.Map;
 import java.util.Properties;
 
+import org.jclouds.azurecompute.arm.AzureComputeApi;
 import org.jclouds.azurecompute.arm.AzureComputeProviderMetadata;
+import org.jclouds.azurecompute.arm.domain.ResourceGroup;
 import org.jclouds.azurecompute.arm.internal.AzureLiveTestUtils;
 import org.jclouds.compute.ComputeTestUtils;
 import org.jclouds.compute.domain.TemplateBuilder;
 import org.jclouds.compute.extensions.internal.BaseImageExtensionLiveTest;
+import org.jclouds.domain.Location;
 import org.jclouds.providers.ProviderMetadata;
 import org.jclouds.sshj.config.SshjSshClientModule;
+import org.testng.annotations.AfterClass;
 import org.testng.annotations.Test;
 
+import com.google.common.cache.LoadingCache;
+import com.google.inject.Key;
 import com.google.inject.Module;
+import com.google.inject.TypeLiteral;
 
 /**
  * Live tests for the {@link org.jclouds.compute.extensions.ImageExtension}
@@ -38,12 +45,37 @@ import com.google.inject.Module;
  */
 @Test(groups = "live", singleThreaded = true, testName = "AzureComputeImageExtensionLiveTest")
 public class AzureComputeImageExtensionLiveTest extends BaseImageExtensionLiveTest {
+   
+   public static final String NAME_PREFIX = "%s";
+   
+   private LoadingCache<String, ResourceGroup> resourceGroupMap;
 
    public AzureComputeImageExtensionLiveTest() {
       provider = "azurecompute-arm";
    }
 
-   public static String NAME_PREFIX = "%s";
+   @Override
+   public void initializeContext() {
+      super.initializeContext();
+      resourceGroupMap = context.utils().injector()
+            .getInstance(Key.get(new TypeLiteral<LoadingCache<String, ResourceGroup>>() {
+            }));
+   }
+
+   @Override
+   @AfterClass(groups = "live", alwaysRun = true)
+   protected void tearDownContext() {
+      try {
+         Location location = getNodeTemplate().build().getLocation();
+         ResourceGroup rg = resourceGroupMap.getIfPresent(location.getId());
+         if (rg != null) {
+            AzureComputeApi api = view.unwrapApi(AzureComputeApi.class);
+            api.getResourceGroupApi().delete(rg.name());
+         }
+      } finally {
+         super.tearDownContext();
+      }
+   }
 
    @Override
    protected Module getSshModule() {

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtensionLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtensionLiveTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtensionLiveTest.java
index cb13c7b..2aa012a 100644
--- a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtensionLiveTest.java
+++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtensionLiveTest.java
@@ -29,8 +29,8 @@ import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 
+import org.jclouds.azurecompute.arm.AzureComputeApi;
 import org.jclouds.azurecompute.arm.AzureComputeProviderMetadata;
-import org.jclouds.azurecompute.arm.compute.strategy.CleanupResources;
 import org.jclouds.azurecompute.arm.domain.ResourceGroup;
 import org.jclouds.azurecompute.arm.internal.AzureLiveTestUtils;
 import org.jclouds.compute.ComputeService;
@@ -60,7 +60,6 @@ public class AzureComputeSecurityGroupExtensionLiveTest extends BaseSecurityGrou
 
    private LoadingCache<String, ResourceGroup> resourceGroupMap;
    private ResourceGroup testResourceGroup;
-   private CleanupResources cleanupResources;
 
    public AzureComputeSecurityGroupExtensionLiveTest() {
       provider = "azurecompute-arm";
@@ -72,8 +71,7 @@ public class AzureComputeSecurityGroupExtensionLiveTest extends BaseSecurityGrou
       resourceGroupMap = context.utils().injector()
             .getInstance(Key.get(new TypeLiteral<LoadingCache<String, ResourceGroup>>() {
             }));
-      cleanupResources = context.utils().injector().getInstance(CleanupResources.class);
-      createResourceGroupIfMissing();
+      createResourceGroup();
    }
 
    @Test(groups = { "integration", "live" }, dependsOnMethods = "testCreateSecurityGroup")
@@ -118,8 +116,11 @@ public class AzureComputeSecurityGroupExtensionLiveTest extends BaseSecurityGrou
    @AfterClass(groups = { "integration", "live" })
    @Override
    protected void tearDownContext() {
-      super.tearDownContext();
-      cleanupResources.deleteResourceGroupIfEmpty(testResourceGroup.name());
+      try {
+         view.unwrapApi(AzureComputeApi.class).getResourceGroupApi().delete(testResourceGroup.name());
+      } finally {
+         super.tearDownContext();
+      }
    }
 
    @Override
@@ -135,7 +136,7 @@ public class AzureComputeSecurityGroupExtensionLiveTest extends BaseSecurityGrou
       return AzureComputeProviderMetadata.builder().build();
    }
 
-   private void createResourceGroupIfMissing() {
+   private void createResourceGroup() {
       Location location = getNodeTemplate().getLocation();
       testResourceGroup = resourceGroupMap.getUnchecked(location.getId());
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/AvailabilitySetApiLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/AvailabilitySetApiLiveTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/AvailabilitySetApiLiveTest.java
new file mode 100644
index 0000000..6e9e1e7
--- /dev/null
+++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/AvailabilitySetApiLiveTest.java
@@ -0,0 +1,100 @@
+/*
+ * 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.features;
+
+import static com.google.common.collect.Iterables.any;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import java.net.URI;
+import java.util.UUID;
+
+import org.jclouds.azurecompute.arm.domain.AvailabilitySet;
+import org.jclouds.azurecompute.arm.domain.AvailabilitySet.AvailabilitySetProperties;
+import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiLiveTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableMap;
+
+@Test(groups = "live", testName = "AvailabilitySetApiLiveTest", singleThreaded = true)
+public class AvailabilitySetApiLiveTest extends BaseAzureComputeApiLiveTest {
+
+   private String asName;
+
+   @BeforeClass
+   @Override
+   public void setup() {
+      super.setup();
+      createTestResourceGroup();
+      asName = "jclouds-" + RAND;
+   }
+
+   @Test
+   public void deleteAvailabilitySetDoesNotExist() {
+      assertNull(api().delete(UUID.randomUUID().toString()));
+   }
+
+   @Test
+   public void createAvailabilitySet() {
+      AvailabilitySetProperties props = AvailabilitySetProperties.builder().platformUpdateDomainCount(2)
+            .platformFaultDomainCount(3).build();
+      AvailabilitySet as = api().createOrUpdate(asName, LOCATION, null, props);
+
+      assertNotNull(as);
+      assertEquals(as.name(), asName);
+   }
+
+   @Test(dependsOnMethods = "createAvailabilitySet")
+   public void getAvailabilitySet() {
+      assertNotNull(api().get(asName));
+   }
+   
+   @Test(dependsOnMethods = "createAvailabilitySet")
+   public void listAvailabilitySet() {
+      assertTrue(any(api().list(), new Predicate<AvailabilitySet>() {
+         @Override
+         public boolean apply(AvailabilitySet input) {
+            return asName.equals(input.name());
+         }
+      }));
+   }
+   
+   @Test(dependsOnMethods = "createAvailabilitySet")
+   public void updateAvailabilitySet() {
+      AvailabilitySet as = api().get(asName);
+      as = api().createOrUpdate(asName, LOCATION, ImmutableMap.of("foo", "bar"), as.properties());
+
+      assertNotNull(as);
+      assertTrue(as.tags().containsKey("foo"));
+      assertEquals(as.tags().get("foo"), "bar");
+   }
+   
+   @Test(dependsOnMethods = { "getAvailabilitySet", "listAvailabilitySet", "updateAvailabilitySet" })
+   public void deleteAvailabilitySet() {
+      URI uri = api().delete(asName);
+      assertResourceDeleted(uri);
+   }
+
+   private AvailabilitySetApi api() {
+      return api.getAvailabilitySetApi(resourceGroupName);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/AvailabilitySetApiMockTest.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/AvailabilitySetApiMockTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/AvailabilitySetApiMockTest.java
new file mode 100644
index 0000000..db9a7ed
--- /dev/null
+++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/AvailabilitySetApiMockTest.java
@@ -0,0 +1,153 @@
+/*
+ * 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.features;
+
+import static com.google.common.collect.Iterables.isEmpty;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import java.net.URI;
+import java.util.List;
+
+import org.jclouds.azurecompute.arm.domain.AvailabilitySet;
+import org.jclouds.azurecompute.arm.domain.AvailabilitySet.AvailabilitySetProperties;
+import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiMockTest;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "AvailabilitySetApiMockTest", singleThreaded = true)
+public class AvailabilitySetApiMockTest extends BaseAzureComputeApiMockTest {
+
+   private final String subscriptionid = "SUBSCRIPTIONID";
+   private final String resourcegroup = "myresourcegroup";
+   private final String asName = "myas";
+   private final String apiVersion = "api-version=2016-03-30";
+
+   public void createAvailabilitySet() throws InterruptedException {
+
+      server.enqueue(jsonResponse("/availabilitysetcreate.json").setResponseCode(200));
+
+      AvailabilitySetApi asApi = api.getAvailabilitySetApi(resourcegroup);
+
+      AvailabilitySetProperties props = AvailabilitySetProperties.builder().platformUpdateDomainCount(2)
+            .platformFaultDomainCount(3).build();
+      AvailabilitySet as = asApi.createOrUpdate(asName, "westeurope", null, props);
+
+      String path = String.format(
+            "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Compute/availabilitySets/%s?%s", subscriptionid,
+            resourcegroup, asName, apiVersion);
+      String json = "{\"location\":\"westeurope\",\"properties\":{\"platformUpdateDomainCount\":2,\"platformFaultDomainCount\":3}}";
+      assertSent(server, "PUT", path, json);
+
+      assertEquals(as.name(), asName);
+      assertEquals(as.properties().platformUpdateDomainCount(), 2);
+      assertEquals(as.properties().platformFaultDomainCount(), 3);
+   }
+
+   public void getAvailabilitySet() throws InterruptedException {
+
+      server.enqueue(jsonResponse("/availabilitysetget.json").setResponseCode(200));
+
+      AvailabilitySetApi asApi = api.getAvailabilitySetApi(resourcegroup);
+
+      AvailabilitySet as = asApi.get(asName);
+
+      String path = String.format(
+            "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Compute/availabilitySets/%s?%s", subscriptionid,
+            resourcegroup, asName, apiVersion);
+      assertSent(server, "GET", path);
+
+      assertEquals(as.name(), asName);
+   }
+
+   public void getAvailabilitySet404() throws InterruptedException {
+      server.enqueue(response404());
+
+      AvailabilitySetApi asApi = api.getAvailabilitySetApi(resourcegroup);
+
+      AvailabilitySet as = asApi.get(asName);
+
+      String path = String.format(
+            "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Compute/availabilitySets/%s?%s", subscriptionid,
+            resourcegroup, asName, apiVersion);
+      assertSent(server, "GET", path);
+
+      assertNull(as);
+   }
+
+   public void listAvailabilitySets() throws InterruptedException {
+
+      server.enqueue(jsonResponse("/availabilitysetlist.json").setResponseCode(200));
+
+      AvailabilitySetApi asApi = api.getAvailabilitySetApi(resourcegroup);
+
+      List<AvailabilitySet> asList = asApi.list();
+
+      String path = String.format(
+            "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Compute/availabilitySets?%s", subscriptionid,
+            resourcegroup, apiVersion);
+      assertSent(server, "GET", path);
+
+      assertTrue(asList.size() > 0);
+   }
+
+   public void listAvailabilitySets404() throws InterruptedException {
+      server.enqueue(response404());
+
+      AvailabilitySetApi asApi = api.getAvailabilitySetApi(resourcegroup);
+
+      List<AvailabilitySet> asList = asApi.list();
+
+      String path = String.format(
+            "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Compute/availabilitySets?%s", subscriptionid,
+            resourcegroup, apiVersion);
+      assertSent(server, "GET", path);
+
+      assertTrue(isEmpty(asList));
+   }
+
+   public void deleteAvailabilitySet() throws InterruptedException {
+
+      server.enqueue(response202WithHeader());
+
+      AvailabilitySetApi asApi = api.getAvailabilitySetApi(resourcegroup);
+
+      URI uri = asApi.delete(asName);
+      assertNotNull(uri);
+
+      String path = String.format(
+            "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Compute/availabilitySets/%s?%s", subscriptionid,
+            resourcegroup, asName, apiVersion);
+      assertSent(server, "DELETE", path);
+   }
+
+   public void deleteSubnetResourceDoesNotExist() throws InterruptedException {
+
+      server.enqueue(response204());
+
+      AvailabilitySetApi asApi = api.getAvailabilitySetApi(resourcegroup);
+
+      URI uri = asApi.delete(asName);
+      assertNull(uri);
+
+      String path = String.format(
+            "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Compute/availabilitySets/%s?%s", subscriptionid,
+            resourcegroup, asName, apiVersion);
+      assertSent(server, "DELETE", path);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f582565/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/DeploymentApiLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/DeploymentApiLiveTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/DeploymentApiLiveTest.java
index 42116c2..b485dc2 100644
--- a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/DeploymentApiLiveTest.java
+++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/DeploymentApiLiveTest.java
@@ -31,7 +31,6 @@ import org.jclouds.azurecompute.arm.domain.VirtualNetwork;
 import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiLiveTest;
 import org.jclouds.util.Predicates2;
 import org.testng.Assert;
-import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
@@ -41,7 +40,6 @@ import com.google.common.net.UrlEscapers;
 @Test(testName = "DeploymentApiLiveTest", singleThreaded = true)
 public class DeploymentApiLiveTest extends BaseAzureComputeApiLiveTest {
 
-   private String resourceGroupName;
    private String deploymentName;
    private String subnetId;
 
@@ -52,8 +50,7 @@ public class DeploymentApiLiveTest extends BaseAzureComputeApiLiveTest {
    @Override
    public void setup() {
       super.setup();
-      resourceGroupName = String.format("rg-%s-%s", this.getClass().getSimpleName().toLowerCase(), System.getProperty("user.name"));
-      assertNotNull(createResourceGroup(resourceGroupName));
+      createTestResourceGroup();
       deploymentName = "jc" + System.currentTimeMillis();
       String virtualNetworkName = String.format("vn-%s-%s", this.getClass().getSimpleName().toLowerCase(), System.getProperty("user.name"));
       String storageAccountName = String.format("st%s%s", System.getProperty("user.name"), RAND);
@@ -77,14 +74,6 @@ public class DeploymentApiLiveTest extends BaseAzureComputeApiLiveTest {
       subnetId = subnet.id();
    }
 
-   @AfterClass
-   @Override
-   protected void tearDown() {
-      super.tearDown();
-      URI uri = api.getResourceGroupApi().delete(resourceGroupName);
-      assertResourceDeleted(uri);
-   }
-
    private String getPutBody(String template, String mode, String parameters) {
       String body = "{ " +
               "\"properties\" : " +