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 2016/05/11 23:10:56 UTC

[1/3] jclouds-labs git commit: JCLOUDS-664 Azurecompute-arm NicApi PublicIPApi and VMApi

Repository: jclouds-labs
Updated Branches:
  refs/heads/master 1f2153799 -> 3be36289f


http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/test/resources/virtualmachines.json
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/resources/virtualmachines.json b/azurecompute-arm/src/test/resources/virtualmachines.json
new file mode 100644
index 0000000..cd0e24b
--- /dev/null
+++ b/azurecompute-arm/src/test/resources/virtualmachines.json
@@ -0,0 +1,57 @@
+{
+  "value": [
+    {
+      "properties": {
+        "vmId": "27ee085b-d707-xxxx-yyyy-2370e2eb1cc1",
+        "hardwareProfile": {
+          "vmSize": "Standard_D1"
+        },
+        "storageProfile": {
+          "imageReference": {
+            "publisher": "publisher",
+            "offer": "offer",
+            "sku": "sku",
+            "version": "ver"
+          },
+          "osDisk": {
+            "osType": "Windows",
+            "name": "windowsmachine",
+            "createOption": "FromImage",
+            "vhd": {
+              "uri": "https://groupname2760.blob.core.windows.net/vhds/windowsmachine201624102936.vhd"
+            },
+            "caching": "ReadWrite"
+          },
+          "dataDisks": []
+        },
+        "osProfile": {
+          "computerName": "windowsmachine",
+          "adminUsername": "azureuser",
+          "windowsConfiguration": {
+            "provisionVMAgent": false,
+            "enableAutomaticUpdates": true
+          },
+          "secrets": []
+        },
+        "networkProfile": {
+          "networkInterfaces": [
+            {
+              "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Network/networkInterfaces/windowsmachine167"
+            }
+          ]
+        },
+        "diagnosticsProfile": {
+          "bootDiagnostics": {
+            "enabled": true,
+            "storageUri": "https://groupname2760.blob.core.windows.net/"
+          }
+        },
+        "provisioningState": "Creating"
+      },
+      "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute/virtualMachines/windowsmachine",
+      "name": "windowsmachine",
+      "type": "Microsoft.Compute/virtualMachines",
+      "location": "westus"
+    }
+  ]
+}


[2/3] jclouds-labs git commit: JCLOUDS-664 Azurecompute-arm NicApi PublicIPApi and VMApi

Posted by na...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualMachineApi.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualMachineApi.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualMachineApi.java
new file mode 100644
index 0000000..4689064
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualMachineApi.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.features;
+
+import org.jclouds.Fallbacks;
+import org.jclouds.azurecompute.arm.domain.VirtualMachine;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineProperties;
+import org.jclouds.azurecompute.arm.functions.URIParser;
+import org.jclouds.oauth.v2.filters.OAuthFilter;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.MapBinder;
+import org.jclouds.rest.annotations.Payload;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.QueryParams;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.rest.annotations.SelectJson;
+import org.jclouds.rest.binders.BindToJsonPayload;
+
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+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 java.net.URI;
+import java.util.List;
+
+/**
+ * The Virtual Machine API includes operations for managing the virtual machines in your subscription.
+ *
+ * @see <a href="https://msdn.microsoft.com/en-us/library/azure/mt163630.aspx">docs</a>
+ */
+@Path("/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/virtualMachines")
+@RequestFilters(OAuthFilter.class)
+@QueryParams(keys = "api-version", values = "2015-06-15")
+@Consumes(MediaType.APPLICATION_JSON)
+public interface VirtualMachineApi {
+
+   /**
+    * The Get Virtual Machine details
+    */
+   @Named("GetVirtualMachine")
+   @GET
+   @Path("/{name}")
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   VirtualMachine get(@PathParam("name") String name);
+
+   /**
+    * The Get Virtual Machine details
+    */
+   @Named("GetVirtualMachineInstance")
+   @GET
+   @Path("/{name}/instanceView")
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   VirtualMachineInstance getInstanceDetails(@PathParam("name") String name);
+
+   /**
+    * The Create Virtual Machine
+    */
+   @Named("CreateVirtualMachine")
+   @PUT
+   @Payload("%7B\"location\":\"{location}\",\"tags\":%7B%7D,\"properties\":{properties}%7D")
+   @MapBinder(BindToJsonPayload.class)
+   @Path("/{vmname}")
+   @QueryParams(keys = "validating", values = "false")
+   @Produces(MediaType.APPLICATION_JSON)
+   VirtualMachine create(@PathParam("vmname") String vmname,
+                         @PayloadParam("location") String location,
+                         @PayloadParam("properties") VirtualMachineProperties properties);
+
+   /**
+    * The List Virtual Machines operation
+    */
+   @Named("ListVirtualMachines")
+   @GET
+   @SelectJson("value")
+   @Fallback(Fallbacks.EmptyListOnNotFoundOr404.class)
+   List<VirtualMachine> list();
+
+   /**
+    * The Delete Virtual Machine operation
+    */
+   @Named("DeleteVirtualMachine")
+   @DELETE
+   @Path("/{name}")
+   @ResponseParser(URIParser.class)
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   URI delete(@PathParam("name") String name);
+
+   /**
+    * The Restart Virtual Machine operation
+    */
+   @Named("RestartVirtualMachine")
+   @POST
+   @Path("/{name}/restart")
+   void restart(@PathParam("name") String name);
+
+   /**
+    * The start Virtual Machine operation
+    */
+   @Named("StartVirtualMachine")
+   @POST
+   @Path("/{name}/start")
+   void start(@PathParam("name") String name);
+
+   /**
+    * The stop Virtual Machine operation
+    */
+   @Named("StopVirtualMachine")
+   @POST
+   @Path("/{name}/powerOff")
+   void stop(@PathParam("name") String name);
+
+}
+

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/NetworkInterfaceCardApiLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/NetworkInterfaceCardApiLiveTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/NetworkInterfaceCardApiLiveTest.java
new file mode 100644
index 0000000..c1e77a2
--- /dev/null
+++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/NetworkInterfaceCardApiLiveTest.java
@@ -0,0 +1,139 @@
+/*
+ * 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 com.google.common.collect.ImmutableMap;
+import org.jclouds.azurecompute.arm.domain.IdReference;
+import org.jclouds.azurecompute.arm.domain.IpConfiguration;
+import org.jclouds.azurecompute.arm.domain.IpConfigurationProperties;
+import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCard;
+import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCardProperties;
+import org.jclouds.azurecompute.arm.domain.Subnet;
+import org.jclouds.azurecompute.arm.domain.VirtualNetwork;
+import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiLiveTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+
+@Test(groups = "live", singleThreaded = true)
+public class NetworkInterfaceCardApiLiveTest extends BaseAzureComputeApiLiveTest {
+
+   private String resourcegroup;
+   private String subnetID;
+
+   @BeforeClass
+   @Override
+   public void setup() {
+      super.setup();
+
+      resourcegroup = getResourceGroupName();
+
+      //Subnets belong to a virtual network so that needs to be created first
+      VirtualNetwork vn = getOrCreateVirtualNetwork(VIRTUAL_NETWORK_NAME);
+      assertNotNull(vn);
+
+      //Subnet needs to be up & running before NIC can be created
+      Subnet subnet = getOrCreateSubnet(DEFAULT_SUBNET_NAME, VIRTUAL_NETWORK_NAME);
+      assertNotNull(subnet);
+      assertNotNull(subnet.id());
+      subnetID = subnet.id();
+   }
+
+
+   @Test(groups = "live")
+   public void deleteNetworkInterfaceCardResourceDoesNotExist() {
+
+      final NetworkInterfaceCardApi nicApi = api.getNetworkInterfaceCardApi(resourcegroup);
+      boolean status = nicApi.delete(NETWORKINTERFACECARD_NAME);
+      assertFalse(status);
+   }
+
+   @Test(groups = "live", dependsOnMethods = "deleteNetworkInterfaceCardResourceDoesNotExist")
+   public void createNetworkInterfaceCard() {
+
+      final NetworkInterfaceCardApi nicApi = api.getNetworkInterfaceCardApi(resourcegroup);
+
+
+      //Create properties object
+      //Create properties object
+      final NetworkInterfaceCardProperties networkInterfaceCardProperties =
+              NetworkInterfaceCardProperties.builder().ipConfigurations(
+                      Arrays.asList(IpConfiguration.builder()
+                              .name("myipconfig")
+                              .properties(IpConfigurationProperties.builder()
+                                      .privateIPAllocationMethod("Dynamic")
+                                      .subnet(IdReference.create(subnetID)).build()
+                      ).build()
+              )).build();
+
+      final Map<String, String> tags = ImmutableMap.of("jclouds", "livetest");
+      NetworkInterfaceCard nic = nicApi.createOrUpdate(NETWORKINTERFACECARD_NAME, LOCATION, networkInterfaceCardProperties, tags);
+
+      assertEquals(nic.name(), NETWORKINTERFACECARD_NAME);
+      assertEquals(nic.location(), LOCATION);
+      assertTrue(nic.properties().ipConfigurations().size() > 0);
+      assertEquals(nic.properties().ipConfigurations().get(0).name(), "myipconfig");
+      assertEquals(nic.properties().ipConfigurations().get(0).properties().privateIPAllocationMethod(), "Dynamic");
+      assertEquals(nic.properties().ipConfigurations().get(0).properties().subnet().id(), subnetID);
+      assertEquals(nic.tags().get("jclouds"), "livetest");
+
+   }
+
+   @Test(groups = "live", dependsOnMethods = "createNetworkInterfaceCard")
+   public void getNetworkInterfaceCard() {
+
+      final NetworkInterfaceCardApi nicApi = api.getNetworkInterfaceCardApi(resourcegroup);
+
+      NetworkInterfaceCard nic = nicApi.get(NETWORKINTERFACECARD_NAME);
+
+      assertEquals(nic.name(), NETWORKINTERFACECARD_NAME);
+      assertEquals(nic.location(), LOCATION);
+      assertTrue(nic.properties().ipConfigurations().size() > 0);
+      assertEquals(nic.properties().ipConfigurations().get(0).name(), "myipconfig");
+      assertEquals(nic.properties().ipConfigurations().get(0).properties().privateIPAllocationMethod(), "Dynamic");
+      assertEquals(nic.properties().ipConfigurations().get(0).properties().subnet().id(), subnetID);
+   }
+
+   @Test(groups = "live", dependsOnMethods = "createNetworkInterfaceCard")
+   public void listNetworkInterfaceCards() {
+
+      final NetworkInterfaceCardApi nicApi = api.getNetworkInterfaceCardApi(resourcegroup);
+
+      List<NetworkInterfaceCard> nicList = nicApi.list();
+
+      assertTrue(nicList.contains(nicApi.get(NETWORKINTERFACECARD_NAME)));
+   }
+
+
+   @Test(groups = "live", dependsOnMethods = {"listNetworkInterfaceCards", "getNetworkInterfaceCard"}, alwaysRun = true)
+   public void deleteNetworkInterfaceCard() {
+
+      final NetworkInterfaceCardApi nicApi = api.getNetworkInterfaceCardApi(resourcegroup);
+
+      boolean status = nicApi.delete(NETWORKINTERFACECARD_NAME);
+      assertTrue(status);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/NetworkInterfaceCardApiMockTest.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/NetworkInterfaceCardApiMockTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/NetworkInterfaceCardApiMockTest.java
new file mode 100644
index 0000000..179a4ab
--- /dev/null
+++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/NetworkInterfaceCardApiMockTest.java
@@ -0,0 +1,150 @@
+/*
+ * 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 com.google.common.collect.ImmutableMap;
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import org.jclouds.azurecompute.arm.domain.IdReference;
+import org.jclouds.azurecompute.arm.domain.IpConfiguration;
+import org.jclouds.azurecompute.arm.domain.IpConfigurationProperties;
+import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCard;
+import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCardProperties;
+import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiMockTest;
+import org.testng.annotations.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+
+@Test(groups = "unit", testName = "NetworkInterfaceCardApiMockTest", singleThreaded = true)
+public class NetworkInterfaceCardApiMockTest extends BaseAzureComputeApiMockTest {
+
+   private final String subscriptionid = "SUBSCRIPTIONID";
+   private final String resourcegroup = "myresourcegroup";
+   private final String apiVersion = "api-version=2015-06-15";
+   private final String location = "northeurope";
+   private final String nicName = "myNic";
+
+   public void getNetworkInterfaceCard() throws InterruptedException {
+      server.enqueue(jsonResponse("/getnetworkinterfacecard.json"));
+
+      final NetworkInterfaceCardApi nicApi = api.getNetworkInterfaceCardApi(resourcegroup);
+      NetworkInterfaceCard nic = nicApi.get(nicName);
+
+      String path = String.format("/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/networkInterfaces/%s?%s", subscriptionid, resourcegroup, nicName, apiVersion);
+      assertSent(server, "GET", path);
+      assertNotNull(nic);
+      assertEquals(nic.name(), nicName);
+      assertEquals(nic.properties().ipConfigurations().get(0).name(), "myip1");
+      assertEquals(nic.tags().get("mycustomtag"), "foobar");
+   }
+
+   public void getNetworkInterfaceCardEmpty() throws Exception {
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      final NetworkInterfaceCardApi nicApi = api.getNetworkInterfaceCardApi(resourcegroup);
+
+      assertNull(nicApi.get(nicName));
+
+      assertSent(server, "GET", "/subscriptions/SUBSCRIPTIONID/resourcegroups/myresourcegroup/providers/Microsoft.Network/networkInterfaces/myNic?api-version=2015-06-15");
+   }
+
+   public void listNetworkInterfaceCards() throws InterruptedException {
+      server.enqueue(jsonResponse("/listnetworkinterfaces.json"));
+
+      final NetworkInterfaceCardApi nicApi = api.getNetworkInterfaceCardApi(resourcegroup);
+      List<NetworkInterfaceCard> nicList = nicApi.list();
+      String path = String.format("/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/networkInterfaces?%s", subscriptionid, resourcegroup, apiVersion);
+
+      assertSent(server, "GET", path);
+      assertTrue(nicList.size() == 2);
+      assertTrue(nicList.get(0).properties().ipConfigurations().size() > 0);
+      assertEquals(nicList.get(0).properties().ipConfigurations().get(0).properties().privateIPAllocationMethod(), "Dynamic");
+      assertTrue(nicList.get(1).properties().ipConfigurations().size() > 0);
+      assertEquals(nicList.get(1).properties().ipConfigurations().get(0).properties().privateIPAllocationMethod(), "Static");
+   }
+
+   public void listNetworkInterfaceCardsEmpty() throws Exception {
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      final NetworkInterfaceCardApi nicApi = api.getNetworkInterfaceCardApi(resourcegroup);
+
+      assertTrue(nicApi.list().isEmpty());
+      String path = String.format("/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/networkInterfaces?%s", subscriptionid, resourcegroup, apiVersion);
+
+      assertSent(server, "GET", path);
+   }
+
+   public void createNetworkInterfaceCard() throws InterruptedException {
+
+      server.enqueue(jsonResponse("/createnetworkinterfacecard.json").setStatus("HTTP/1.1 201 Created"));
+
+      final NetworkInterfaceCardApi nicApi = api.getNetworkInterfaceCardApi(resourcegroup);
+
+
+      final String SubnetID = "/subscriptions/" + subscriptionid + "/resourceGroups/azurearmtesting/providers/Microsoft.Network/virtualNetworks/myvirtualnetwork/subnets/mysubnet";
+      //Create properties object
+      final NetworkInterfaceCardProperties networkInterfaceCardProperties =
+              NetworkInterfaceCardProperties.create(null, null, null,
+                      Arrays.asList(IpConfiguration.create("myipconfig", null, null, null,
+                              IpConfigurationProperties.create(null, null, "Dynamic", IdReference.create(SubnetID), null))
+                      )
+              );
+
+      final Map<String, String> tags = ImmutableMap.of("mycustomtag", "foobar");
+
+      NetworkInterfaceCard nic = nicApi.createOrUpdate(nicName, location, networkInterfaceCardProperties, tags);
+
+      String path = String.format("/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/networkInterfaces/%s?%s", subscriptionid, resourcegroup, nicName, apiVersion);
+      String json = String.format("{ \"location\":\"%s\", \"tags\": { \"mycustomtag\": \"foobar\" }, \"properties\":{ \"ipConfigurations\":[ { \"name\":\"%s\", \"properties\":{ \"subnet\":{ \"id\": \"%s\" }, \"privateIPAllocationMethod\":\"%s\" } } ] } }", location, "myipconfig", SubnetID, "Dynamic");
+      assertSent(server, "PUT", path, json);
+      assertEquals(nic.tags().get("mycustomtag"), "foobar");
+   }
+
+   public void deleteNetworkInterfaceCard() throws InterruptedException {
+
+      server.enqueue(response202());
+
+      final NetworkInterfaceCardApi nicApi = api.getNetworkInterfaceCardApi(resourcegroup);
+
+      boolean status = nicApi.delete(nicName);
+      assertTrue(status);
+
+      String path = String.format("/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/networkInterfaces/%s?%s", subscriptionid, resourcegroup, nicName, apiVersion);
+      assertSent(server, "DELETE", path);
+
+   }
+
+   public void deleteNetworkInterfaceCardResourceDoesNotExist() throws InterruptedException {
+
+      server.enqueue(response204());
+
+      final NetworkInterfaceCardApi nicApi = api.getNetworkInterfaceCardApi(resourcegroup);
+
+      boolean status = nicApi.delete(nicName);
+      assertFalse(status);
+
+      String path = String.format("/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/networkInterfaces/%s?%s", subscriptionid, resourcegroup, nicName, apiVersion);
+      assertSent(server, "DELETE", path);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/PublicIPAddressApiLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/PublicIPAddressApiLiveTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/PublicIPAddressApiLiveTest.java
new file mode 100644
index 0000000..5443235
--- /dev/null
+++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/PublicIPAddressApiLiveTest.java
@@ -0,0 +1,129 @@
+/*
+ * 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 com.google.common.collect.ImmutableMap;
+import org.jclouds.azurecompute.arm.domain.PublicIPAddress;
+import org.jclouds.azurecompute.arm.domain.PublicIPAddressProperties;
+import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiLiveTest;
+import org.jclouds.util.Predicates2;
+import com.google.common.base.Predicate;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import java.util.List;
+import java.util.Map;
+
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+
+
+@Test(groups = "live", singleThreaded = true)
+public class PublicIPAddressApiLiveTest extends BaseAzureComputeApiLiveTest {
+
+   private final String publicIpAddressName = "myipaddress";
+   private final String subscriptionid = getSubscriptionId();
+   private String resourcegroup;
+
+   @BeforeClass
+   @Override
+   public void setup() {
+      super.setup();
+      resourcegroup = getResourceGroupName();
+   }
+
+   @Test(groups = "live")
+   public void deletePublicIPAddressResourceDoesNotExist() {
+      final PublicIPAddressApi ipApi = api.getPublicIPAddressApi(resourcegroup);
+      boolean status = ipApi.delete(publicIpAddressName);
+      assertFalse(status);
+   }
+
+   @Test(groups = "live", dependsOnMethods = "deletePublicIPAddressResourceDoesNotExist")
+   public void createPublicIPAddress() {
+
+      final PublicIPAddressApi ipApi = api.getPublicIPAddressApi(resourcegroup);
+
+      final Map<String, String> tags = ImmutableMap.of("testkey", "testvalue");
+
+      PublicIPAddressProperties properties =
+              PublicIPAddressProperties.builder()
+                  .publicIPAllocationMethod("Static")
+                  .idleTimeoutInMinutes(4)
+                  .build();
+
+      PublicIPAddress ip = ipApi.createOrUpdate(publicIpAddressName, LOCATION, tags, properties);
+
+      assertNotNull(ip);
+      assertEquals(ip.name(), publicIpAddressName);
+      assertEquals(ip.location(), LOCATION);
+      assertEquals(ip.id(), String.format("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Network/publicIPAddresses/%s", subscriptionid, resourcegroup, publicIpAddressName));
+      assertEquals(ip.tags().get("testkey"), "testvalue");
+      assertNotNull(ip.properties());
+      assertEquals(ip.properties().provisioningState(), "Updating");
+      assertNull(ip.properties().ipAddress()); // as we don't get IP address until Succeeded state
+      assertEquals(ip.properties().publicIPAllocationMethod(), "Static");
+      assertEquals(ip.properties().idleTimeoutInMinutes().intValue(), 4);
+   }
+
+   @Test(groups = "live", dependsOnMethods = "createPublicIPAddress")
+   public void getPublicIPAddress() {
+
+      final PublicIPAddressApi ipApi = api.getPublicIPAddressApi(resourcegroup);
+
+      //Poll until resource is ready to be used
+      boolean jobDone = Predicates2.retry(new Predicate<String>() {
+         @Override public boolean apply(String name) {
+            return ipApi.get(name).properties().provisioningState().equals("Succeeded");
+         }
+      }, 10 * 1000).apply(publicIpAddressName);
+      assertTrue(jobDone, "get operation did not complete in the configured timeout");
+
+      PublicIPAddress ip = ipApi.get(publicIpAddressName);
+      assertNotNull(ip);
+      assertEquals(ip.name(), publicIpAddressName);
+      assertEquals(ip.location(), LOCATION);
+      assertEquals(ip.id(), String.format("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Network/publicIPAddresses/%s", subscriptionid, resourcegroup, publicIpAddressName));
+      assertEquals(ip.tags().get("testkey"), "testvalue");
+      assertNotNull(ip.properties());
+      assertEquals(ip.properties().provisioningState(), "Succeeded");
+      assertNotNull(ip.properties().ipAddress()); // by this time we should have IP address already
+      assertEquals(ip.properties().publicIPAllocationMethod(), "Static");
+      assertEquals(ip.properties().idleTimeoutInMinutes().intValue(), 4);
+   }
+
+   @Test(groups = "live", dependsOnMethods = "createPublicIPAddress")
+   public void listPublicIPAddresses() {
+
+      final PublicIPAddressApi ipApi = api.getPublicIPAddressApi(resourcegroup);
+
+      List<PublicIPAddress> ipList = ipApi.list();
+
+      assertTrue(ipList.size() > 0);
+   }
+
+   @Test(groups = "live", dependsOnMethods = {"listPublicIPAddresses", "getPublicIPAddress"}, alwaysRun = true)
+   public void deletePublicIPAddress() {
+      final PublicIPAddressApi ipApi = api.getPublicIPAddressApi(resourcegroup);
+      boolean status = ipApi.delete(publicIpAddressName);
+      assertTrue(status);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/PublicIPAddressApiMockTest.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/PublicIPAddressApiMockTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/PublicIPAddressApiMockTest.java
new file mode 100644
index 0000000..436cb91
--- /dev/null
+++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/PublicIPAddressApiMockTest.java
@@ -0,0 +1,179 @@
+/*
+ * 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 com.google.common.collect.ImmutableMap;
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import org.jclouds.azurecompute.arm.domain.DnsSettings;
+import org.jclouds.azurecompute.arm.domain.PublicIPAddress;
+import org.jclouds.azurecompute.arm.domain.PublicIPAddressProperties;
+import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiMockTest;
+import org.testng.annotations.Test;
+
+import java.util.List;
+import java.util.Map;
+
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+
+
+@Test(groups = "unit", testName = "NetworkInterfaceCardApiMockTest", singleThreaded = true)
+public class PublicIPAddressApiMockTest extends BaseAzureComputeApiMockTest {
+
+   private final String subscriptionid = "SUBSCRIPTIONID";
+   private final String resourcegroup = "myresourcegroup";
+   private final String apiVersion = "api-version=2015-06-15";
+   private final String location = "northeurope";
+   private final String publicIpName = "mypublicaddress";
+
+   public void getPublicIPAddressInfo() throws InterruptedException {
+      server.enqueue(jsonResponse("/PublicIPAddressGetInfo.json"));
+
+      final PublicIPAddressApi ipApi = api.getPublicIPAddressApi(resourcegroup);
+      PublicIPAddress ip = ipApi.get(publicIpName);
+
+      String path = String.format("/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/publicIPAddresses/%s?%s", subscriptionid, resourcegroup, publicIpName, apiVersion);
+      assertSent(server, "GET", path);
+
+      assertNotNull(ip);
+      assertEquals(ip.name(), "mypublicaddress");
+      assertEquals(ip.location(), "northeurope");
+      assertEquals(ip.id(), "/subscriptions/fakeb2f5-4710-4e93-bdf4-419edbde2178/resourceGroups/myresourcegroup/providers/Microsoft.Network/publicIPAddresses/mypublicaddress");
+      assertEquals(ip.tags().get("testkey"), "testvalue");
+      assertNotNull(ip.properties());
+      assertEquals(ip.properties().provisioningState(), "Succeeded");
+      assertEquals(ip.properties().ipAddress(), "12.123.12.123");
+      assertEquals(ip.properties().publicIPAllocationMethod(), "Static");
+      assertEquals(ip.properties().idleTimeoutInMinutes().intValue(), 4);
+      assertNotNull(ip.properties().dnsSettings());
+      assertEquals(ip.properties().dnsSettings().domainNameLabel(), "foobar");
+      assertEquals(ip.properties().dnsSettings().fqdn(), "foobar.northeurope.cloudapp.azure.com");
+      assertNotNull(ip.properties().ipConfiguration());
+      assertEquals(ip.properties().ipConfiguration().id(), "/subscriptions/fakeb2f5-4710-4e93-bdf4-419edbde2178/resourceGroups/myresourcegroup/providers/Microsoft.Network/networkInterfaces/myNic/ipConfigurations/myip1");
+   }
+
+   public void getPublicIPAddressInfoEmpty() throws Exception {
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      final PublicIPAddressApi ipApi = api.getPublicIPAddressApi(resourcegroup);
+      PublicIPAddress ip = ipApi.get(publicIpName);
+
+      String path = String.format("/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/publicIPAddresses/%s?%s", subscriptionid, resourcegroup, publicIpName, apiVersion);
+      assertSent(server, "GET", path);
+
+      assertNull(ip);
+   }
+
+   public void listPublicIPAddresses() throws InterruptedException {
+      server.enqueue(jsonResponse("/PublicIPAddressList.json"));
+
+      final PublicIPAddressApi ipApi = api.getPublicIPAddressApi(resourcegroup);
+      List<PublicIPAddress> ipList = ipApi.list();
+
+      String path = String.format("/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/publicIPAddresses?%s", subscriptionid, resourcegroup, apiVersion);
+      assertSent(server, "GET", path);
+      assertEquals(ipList.size(), 4);
+   }
+
+   public void listPublicIPAddressesEmpty() throws InterruptedException {
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      final PublicIPAddressApi ipApi = api.getPublicIPAddressApi(resourcegroup);
+      List<PublicIPAddress> ipList = ipApi.list();
+
+      String path = String.format("/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/publicIPAddresses?%s", subscriptionid, resourcegroup, apiVersion);
+      assertSent(server, "GET", path);
+      assertEquals(ipList.size(), 0);
+   }
+
+   public void createPublicIPAddress() throws InterruptedException {
+
+      server.enqueue(jsonResponse("/PublicIPAddressCreate.json").setStatus("HTTP/1.1 201 Created"));
+
+      final PublicIPAddressApi ipApi = api.getPublicIPAddressApi(resourcegroup);
+
+      final Map<String, String> tags = ImmutableMap.of("testkey", "testvalue");
+
+      PublicIPAddressProperties properties = PublicIPAddressProperties.create(null, null, "Static", 4, null,
+              DnsSettings.create("foobar", "foobar.northeurope.cloudapp.azure.com", null));
+
+      PublicIPAddress ip = ipApi.createOrUpdate(publicIpName, location, tags, properties);
+
+      String path = String.format("/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/publicIPAddresses/%s?%s", subscriptionid, resourcegroup, publicIpName, apiVersion);
+      String json = String.format("{ \"location\": \"%s\", \"tags\": { \"testkey\": \"testvalue\" }, \"properties\": { \"publicIPAllocationMethod\": \"Static\", \"idleTimeoutInMinutes\": 4, \"dnsSettings\": { \"domainNameLabel\": \"foobar\", \"fqdn\": \"foobar.northeurope.cloudapp.azure.com\" } } }", location);
+      assertSent(server, "PUT", path, json);
+
+      assertNotNull(ip);
+      assertEquals(ip.name(), "mypublicaddress");
+      assertEquals(ip.location(), "northeurope");
+      assertEquals(ip.id(), "/subscriptions/fakeb2f5-4710-4e93-bdf4-419edbde2178/resourceGroups/myresourcegroup/providers/Microsoft.Network/publicIPAddresses/mypublicaddress");
+      assertEquals(ip.tags().get("testkey"), "testvalue");
+      assertNotNull(ip.properties());
+      assertEquals(ip.properties().provisioningState(), "Updating");
+      assertNull(ip.properties().ipAddress()); // as we don't get IP address until Succeeded state
+      assertEquals(ip.properties().publicIPAllocationMethod(), "Static");
+      assertEquals(ip.properties().idleTimeoutInMinutes().intValue(), 4);
+      assertNotNull(ip.properties().dnsSettings());
+      assertEquals(ip.properties().dnsSettings().domainNameLabel(), "foobar");
+      assertEquals(ip.properties().dnsSettings().fqdn(), "foobar.northeurope.cloudapp.azure.com");
+   }
+
+   @Test(expectedExceptions = IllegalArgumentException.class)
+   public void createPublicIPAddressDnsRecordInUse() throws IllegalArgumentException, InterruptedException {
+
+      server.enqueue(jsonResponse("/PublicIPAddressCreateDnsRecordInUse.json").setStatus("HTTP/1.1 400 Bad Request"));
+
+      final PublicIPAddressApi ipApi = api.getPublicIPAddressApi(resourcegroup);
+
+      final Map<String, String> tags = ImmutableMap.of("testkey", "testvalue");
+
+      PublicIPAddressProperties properties = PublicIPAddressProperties.create(null, null, "Static", 4, null,
+              DnsSettings.create("foobar", "foobar.northeurope.cloudapp.azure.com", null));
+
+      PublicIPAddress ip = ipApi.createOrUpdate(publicIpName, location, tags, properties);
+
+   }
+
+   public void deletePublicIPAddress() throws InterruptedException {
+
+      server.enqueue(response202());
+
+      final PublicIPAddressApi ipApi = api.getPublicIPAddressApi(resourcegroup);
+      boolean status = ipApi.delete(publicIpName);
+
+      String path = String.format("/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/publicIPAddresses/%s?%s", subscriptionid, resourcegroup, publicIpName, apiVersion);
+      assertSent(server, "DELETE", path);
+
+      assertTrue(status);
+   }
+
+   public void deletePublicIPAddressResourceDoesNotExist() throws InterruptedException {
+
+      server.enqueue(response204());
+
+      final PublicIPAddressApi ipApi = api.getPublicIPAddressApi(resourcegroup);
+      boolean status = ipApi.delete(publicIpName);
+
+      String path = String.format("/subscriptions/%s/resourcegroups/%s/providers/Microsoft.Network/publicIPAddresses/%s?%s", subscriptionid, resourcegroup, publicIpName, apiVersion);
+      assertSent(server, "DELETE", path);
+
+      assertFalse(status);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualMachineApiLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualMachineApiLiveTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualMachineApiLiveTest.java
new file mode 100644
index 0000000..87b84d8
--- /dev/null
+++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualMachineApiLiveTest.java
@@ -0,0 +1,245 @@
+/*
+ * 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 com.google.common.base.Predicate;
+import org.jclouds.azurecompute.arm.domain.DataDisk;
+import org.jclouds.azurecompute.arm.domain.DiagnosticsProfile;
+import org.jclouds.azurecompute.arm.domain.HardwareProfile;
+import org.jclouds.azurecompute.arm.domain.IdReference;
+import org.jclouds.azurecompute.arm.domain.ImageReference;
+import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCard;
+import org.jclouds.azurecompute.arm.domain.NetworkProfile;
+import org.jclouds.azurecompute.arm.domain.OSDisk;
+import org.jclouds.azurecompute.arm.domain.OSProfile;
+import org.jclouds.azurecompute.arm.domain.StorageProfile;
+import org.jclouds.azurecompute.arm.domain.StorageService;
+import org.jclouds.azurecompute.arm.domain.VHD;
+import org.jclouds.azurecompute.arm.domain.VirtualMachine;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineProperties;
+import org.jclouds.azurecompute.arm.functions.ParseJobStatus;
+import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiLiveTest;
+import org.jclouds.util.Predicates2;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertNotNull;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.testng.Assert.assertTrue;
+
+@Test(groups = "live", testName = "VirtualMachineApiLiveTest")
+public class VirtualMachineApiLiveTest extends BaseAzureComputeApiLiveTest {
+
+   private String subscriptionid = getSubscriptionId();
+   private String vmName = null;
+   private String nicName = null;
+
+   @BeforeClass
+   public void Setup() {
+      NetworkInterfaceCard nic = getOrCreateNetworkInterfaceCard(NETWORKINTERFACECARD_NAME);
+      assertNotNull(nic);
+      nicName = nic.name();
+   }
+
+   private String getName() {
+      if (vmName == null) {
+         vmName = String.format("%3.24s",
+                 System.getProperty("user.name") + RAND + this.getClass().getSimpleName()).toLowerCase().substring(0, 15);
+      }
+      return vmName;
+   }
+
+   @Test
+   public void testCreate(){
+
+      StorageAccountApi storageApi = api.getStorageAccountApi(getResourceGroupName());
+      StorageService storageAccount = storageApi.get(getStorageServiceName());
+      String blob = storageAccount.storageServiceProperties().primaryEndpoints().get("blob");
+
+      VirtualMachine vm = api().create(getName(), LOCATION, getProperties(blob, nicName));
+      assertTrue(!vm.name().isEmpty());
+
+      //Poll until resource is ready to be used
+      boolean jobDone = Predicates2.retry(new Predicate<String>() {
+         @Override public boolean apply(String name) {
+            return !api().get(name).properties().provisioningState().equals("Creating");
+         }
+      }, 60 * 20 * 1000).apply(getName());
+      assertTrue(jobDone, "create operation did not complete in the configured timeout");
+
+      String status = api().get(vmName).properties().provisioningState();
+      // Cannot be creating anymore. Should be succeeded or running but not failed.
+      assertTrue(!status.equals("Creating"));
+      assertTrue(!status.equals("Failed"));
+   }
+
+   @Test(dependsOnMethods = "testCreate")
+   public void testGet() {
+      VirtualMachine vm = api().get(getName());
+      assertTrue(!vm.name().isEmpty());
+   }
+
+   @Test(dependsOnMethods = "testCreate")
+   public void testGetInstanceView() {
+      VirtualMachineInstance vmi = api().getInstanceDetails(getName());
+      assertTrue(!vmi.statuses().isEmpty());
+   }
+
+   @Test(dependsOnMethods = "testStart")
+   public void testStop() {
+      api().stop(getName());
+      //Poll until resource is ready to be used
+      boolean jobDone = Predicates2.retry(new Predicate<String>() {
+         @Override public boolean apply(String name) {
+            String status = "";
+            List<VirtualMachineInstance.VirtualMachineStatus> statuses = api().getInstanceDetails(name).statuses();
+            for (int c = 0; c < statuses.size(); c++) {
+               if (statuses.get(c).code().substring(0, 10).equals("PowerState")) {
+                  status = statuses.get(c).displayStatus();
+                  break;
+               }
+            }
+            return status.equals("VM stopped");
+         }
+      }, 60 * 4 * 1000).apply(getName());
+      assertTrue(jobDone, "stop operation did not complete in the configured timeout");
+
+   }
+
+   @Test(dependsOnMethods = "testGet")
+   public void testStart() {
+      api().start(getName());
+
+      //Poll until resource is ready to be used
+      boolean jobDone = Predicates2.retry(new Predicate<String>() {
+         @Override public boolean apply(String name) {
+            String status = "";
+            List<VirtualMachineInstance.VirtualMachineStatus> statuses = api().getInstanceDetails(name).statuses();
+            for (int c = 0; c < statuses.size(); c++) {
+               if (statuses.get(c).code().substring(0, 10).equals("PowerState")) {
+                  status = statuses.get(c).displayStatus();
+                  break;
+               }
+            }
+            return status.equals("VM running");
+         }
+      }, 60 * 4 * 1000).apply(getName());
+      assertTrue(jobDone, "start operation did not complete in the configured timeout");
+
+   }
+
+   @Test(dependsOnMethods = "testStop")
+   public void testRestart() {
+      api().start(getName());
+
+      //Poll until resource is ready to be used
+      boolean jobDone = Predicates2.retry(new Predicate<String>() {
+         @Override public boolean apply(String name) {
+            String status = "";
+            List<VirtualMachineInstance.VirtualMachineStatus> statuses = api().getInstanceDetails(name).statuses();
+            for (int c = 0; c < statuses.size(); c++) {
+               if (statuses.get(c).code().substring(0, 10).equals("PowerState")) {
+                  status = statuses.get(c).displayStatus();
+                  break;
+               }
+            }
+            return status.equals("VM running");
+         }
+      }, 60 * 4 * 1000).apply(getName());
+      assertTrue(jobDone, "start operation did not complete in the configured timeout");
+
+      api().restart(getName());
+
+      //Poll until resource is ready to be used
+      jobDone = Predicates2.retry(new Predicate<String>() {
+         @Override public boolean apply(String name) {
+            String status = "";
+            List<VirtualMachineInstance.VirtualMachineStatus> statuses = api().getInstanceDetails(name).statuses();
+            for (int c = 0; c < statuses.size(); c++) {
+               if (statuses.get(c).code().substring(0, 10).equals("PowerState")) {
+                  status = statuses.get(c).displayStatus();
+                  break;
+               }
+            }
+            return status.equals("VM running");
+         }
+      }, 60 * 4 * 1000).apply(getName());
+      assertTrue(jobDone, "restart operation did not complete in the configured timeout");
+   }
+
+   @Test(dependsOnMethods = "testCreate")
+   public void testList() {
+      List<VirtualMachine> list = api().list();
+      VirtualMachine vm = api().get(getName());
+      assertTrue(list.contains(vm));
+   }
+
+   @Test(dependsOnMethods = {"testRestart", "testList", "testGet"},  alwaysRun = true)
+   public void testDelete() throws Exception {
+      URI uri = api().delete(getName());
+
+      if (uri != null) {
+         assertTrue(uri.toString().contains("api-version"));
+
+         boolean jobDone = Predicates2.retry(new Predicate<URI>() {
+            @Override
+            public boolean apply(URI uri) {
+               return ParseJobStatus.JobStatus.DONE == api.getJobApi().jobStatus(uri);
+            }
+         }, 60 * 8 * 1000 /* 2 minutes timeout */).apply(uri);
+         assertTrue(jobDone, "delete operation did not complete in the configured timeout");
+      }
+   }
+
+   private VirtualMachineApi api() {
+      return api.getVirtualMachineApi(getResourceGroupName());
+   }
+
+   private VirtualMachineProperties getProperties(String blob, String nic) {
+
+      HardwareProfile hwProf = HardwareProfile.create("Standard_D1");
+      ImageReference imgRef = ImageReference.create("MicrosoftWindowsServerEssentials",
+              "WindowsServerEssentials", "WindowsServerEssentials", "latest");
+      VHD vhd = VHD.create(blob + "vhds/" + getName() + ".vhd");
+      VHD vhd2 = VHD.create(blob + "vhds/" + getName() + "data.vhd");
+      DataDisk dataDisk = DataDisk.create(getName() + "data", "100", 0, vhd2, "Empty");
+      OSDisk osDisk = OSDisk.create(null, getName(), vhd, "ReadWrite", "FromImage");
+      StorageProfile storageProfile = StorageProfile.create(imgRef, osDisk, null);
+      OSProfile.WindowsConfiguration windowsConfig = OSProfile.WindowsConfiguration.create(false, null, null, true,
+              null);
+      OSProfile osProfile = OSProfile.create(getName(), "azureuser", "RFe3&432dg", null, null, windowsConfig);
+      IdReference networkInterface =
+              IdReference.create("/subscriptions/" + subscriptionid +
+                      "/resourceGroups/" + getResourceGroupName() + "/providers/Microsoft.Network/networkInterfaces/"
+                      + nic);
+      List<IdReference> networkInterfaces =
+              new ArrayList<IdReference>();
+      networkInterfaces.add(networkInterface);
+      NetworkProfile networkProfile = NetworkProfile.create(networkInterfaces);
+      DiagnosticsProfile.BootDiagnostics bootDiagnostics =
+              DiagnosticsProfile.BootDiagnostics.create(true, blob);
+      DiagnosticsProfile diagnosticsProfile = DiagnosticsProfile.create(bootDiagnostics);
+      VirtualMachineProperties properties = VirtualMachineProperties.create(null,
+              null, null, hwProf, storageProfile, osProfile, networkProfile, diagnosticsProfile, "Creating");
+      return properties;
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualMachineApiMockTest.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualMachineApiMockTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualMachineApiMockTest.java
new file mode 100644
index 0000000..a2be833
--- /dev/null
+++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualMachineApiMockTest.java
@@ -0,0 +1,249 @@
+/*
+ * 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 com.google.common.collect.ImmutableList;
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import org.jclouds.azurecompute.arm.domain.HardwareProfile;
+import org.jclouds.azurecompute.arm.domain.IdReference;
+import org.jclouds.azurecompute.arm.domain.ImageReference;
+import org.jclouds.azurecompute.arm.domain.VirtualMachine;
+import org.jclouds.azurecompute.arm.domain.VHD;
+import org.jclouds.azurecompute.arm.domain.OSDisk;
+import org.jclouds.azurecompute.arm.domain.OSProfile;
+import org.jclouds.azurecompute.arm.domain.DiagnosticsProfile;
+import org.jclouds.azurecompute.arm.domain.NetworkProfile;
+import org.jclouds.azurecompute.arm.domain.StorageProfile;
+import org.jclouds.azurecompute.arm.domain.DataDisk;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineProperties;
+import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiMockTest;
+import org.testng.annotations.Test;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+
+import static com.google.common.collect.Iterables.isEmpty;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+@Test(groups = "unit", testName = "VirtualMachineApiMockTest", singleThreaded = true)
+public class VirtualMachineApiMockTest extends BaseAzureComputeApiMockTest {
+
+   public void testGet() throws Exception {
+      server.enqueue(jsonResponse("/virtualmachine.json"));
+      final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
+      assertEquals(vmAPI.get("windowsmachine"), getVM());
+      assertSent(server, "GET", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
+              "/virtualMachines/windowsmachine?api-version=2015-06-15");
+   }
+   public void testGetEmpty() throws Exception {
+      server.enqueue(new MockResponse().setResponseCode(404));
+      final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
+      assertNull(vmAPI.get("windowsmachine"));
+      assertSent(server, "GET", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
+              "/virtualMachines/windowsmachine?api-version=2015-06-15");
+   }
+
+   public void testGetInstanceDetails() throws Exception {
+      server.enqueue(jsonResponse("/virtualmachineInstance.json"));
+      final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
+      VirtualMachineInstance actual = vmAPI.getInstanceDetails("windowsmachine");
+      VirtualMachineInstance expected = getVMInstance();
+
+      assertEquals(actual.statuses().get(0).code(), expected.statuses().get(0).code());
+      assertEquals(actual.statuses().get(0).displayStatus(), expected.statuses().get(0).displayStatus());
+      assertEquals(actual.statuses().get(0).level(), expected.statuses().get(0).level());
+      assertEquals(actual.statuses().get(0).time().toString(), expected.statuses().get(0).time().toString());
+      assertSent(server, "GET", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
+              "/virtualMachines/windowsmachine/instanceView?api-version=2015-06-15");
+   }
+
+   public void testGetInstanceDetailsEmpty() throws Exception {
+      server.enqueue(new MockResponse().setResponseCode(404));
+      final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
+      assertNull(vmAPI.getInstanceDetails("windowsmachine"));
+      assertSent(server, "GET", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
+              "/virtualMachines/windowsmachine/instanceView?api-version=2015-06-15");
+   }
+
+   public void testList() throws Exception {
+      server.enqueue(jsonResponse("/virtualmachines.json"));
+      final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
+      assertEquals(vmAPI.list(), getVMList());
+      assertSent(server, "GET", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
+              "/virtualMachines?api-version=2015-06-15");
+   }
+   public void testListEmpty() throws Exception {
+      server.enqueue(new MockResponse().setResponseCode(404));
+      final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
+      assertTrue(isEmpty(vmAPI.list()));
+      assertSent(server, "GET", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
+              "/virtualMachines?api-version=2015-06-15");
+   }
+
+   public void testCreate() throws Exception {
+      server.enqueue(jsonResponse("/createvirtualmachineresponse.json"));
+
+      final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
+      VirtualMachine vm = vmAPI.create("windowsmachine", "westus", getProperties());
+      assertEquals(vm, getVM());
+      assertSent(server, "PUT", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
+              "/virtualMachines/windowsmachine?api-version=2015-06-15&validating=false",
+              "{\"location\":\"westus\",\"properties\":" +
+                      "{\"vmId\":\"27ee085b-d707-xxxx-yyyy-2370e2eb1cc1\"," +
+                      "\"hardwareProfile\":{\"vmSize\":\"Standard_D1\"}," +
+                      "\"storageProfile\":{\"imageReference\":{\"publisher\":\"publisher\",\"offer\":\"offer\",\"sku\":\"sku\",\"version\":\"ver\"}," +
+                      "\"osDisk\":{\"osType\":\"Windows\",\"name\":\"windowsmachine\"," +
+                      "\"vhd\":{\"uri\":\"https://groupname2760.blob.core.windows.net/vhds/windowsmachine201624102936.vhd\"},\"caching\":\"ReadWrite\",\"createOption\":\"FromImage\"},\"dataDisks\":[]}," +
+                      "\"osProfile\":{\"computerName\":\"windowsmachine\",\"adminUsername\":\"azureuser\",\"windowsConfiguration\":{\"provisionVMAgent\":false,\"enableAutomaticUpdates\":true}}," +
+                      "\"networkProfile\":{\"networkInterfaces\":[{\"id\":\"/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Network/networkInterfaces/windowsmachine167\"}]}," +
+                      "\"diagnosticsProfile\":{\"bootDiagnostics\":{\"enabled\":true,\"storageUri\":\"https://groupname2760.blob.core.windows.net/\"}},\"provisioningState\":\"Creating\"}}");
+
+   }
+
+   public void testDeleteReturns404() throws Exception {
+      server.enqueue(response404());
+
+      final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
+
+      URI uri = vmAPI.delete("windowsmachine");
+
+      assertEquals(server.getRequestCount(), 1);
+      assertNull(uri);
+
+      assertSent(server, "DELETE", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
+              "/virtualMachines/windowsmachine?api-version=2015-06-15");
+   }
+   public void testDelete() throws Exception {
+      server.enqueue(response202WithHeader());
+
+      final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
+
+      URI uri = vmAPI.delete("windowsmachine");
+
+      assertEquals(server.getRequestCount(), 1);
+      assertNotNull(uri);
+
+      assertSent(server, "DELETE", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
+              "/virtualMachines/windowsmachine?api-version=2015-06-15");
+   }
+
+   public void testStart() throws Exception {
+      server.enqueue(new MockResponse().setResponseCode(204));
+
+      final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
+
+      vmAPI.start("windowsmachine");
+
+      assertSent(server, "POST", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
+              "/virtualMachines/windowsmachine/start?api-version=2015-06-15");
+   }
+
+   public void testRestart() throws Exception {
+      server.enqueue(new MockResponse().setResponseCode(204));
+
+      final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
+
+      vmAPI.restart("windowsmachine");
+
+      assertSent(server, "POST", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
+              "/virtualMachines/windowsmachine/restart?api-version=2015-06-15");
+   }
+
+   public void testStop() throws Exception {
+      server.enqueue(new MockResponse().setResponseCode(204));
+
+      final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
+
+      vmAPI.stop("windowsmachine");
+
+      assertSent(server, "POST", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
+              "/virtualMachines/windowsmachine/powerOff?api-version=2015-06-15");
+   }
+
+   private VirtualMachineProperties getProperties() {
+      HardwareProfile hwProf = HardwareProfile.create("Standard_D1");
+      ImageReference imgRef = ImageReference.create("publisher", "offer", "sku", "ver");
+      VHD vhd = VHD.create("https://groupname2760.blob.core.windows.net/vhds/windowsmachine201624102936.vhd");
+      List<DataDisk> dataDisks = new ArrayList<DataDisk>();
+      OSDisk osDisk = OSDisk.create("Windows", "windowsmachine", vhd, "ReadWrite", "FromImage");
+      StorageProfile storageProfile = StorageProfile.create(imgRef, osDisk, dataDisks);
+      OSProfile.WindowsConfiguration windowsConfig = OSProfile.WindowsConfiguration.create(false, null, null, true,
+              null);
+      OSProfile osProfile = OSProfile.create("windowsmachine", "azureuser", null, null, null, windowsConfig);
+      IdReference networkInterface =
+              IdReference.create("/subscriptions/SUBSCRIPTIONID" +
+                      "/resourceGroups/groupname/providers/Microsoft.Network/networkInterfaces/" +
+                      "windowsmachine167");
+      List<IdReference> networkInterfaces = new ArrayList<IdReference>();
+      networkInterfaces.add(networkInterface);
+      NetworkProfile networkProfile = NetworkProfile.create(networkInterfaces);
+      DiagnosticsProfile.BootDiagnostics bootDiagnostics = DiagnosticsProfile.BootDiagnostics.create(true,
+              "https://groupname2760.blob.core.windows.net/");
+      DiagnosticsProfile diagnosticsProfile = DiagnosticsProfile.create(bootDiagnostics);
+      VirtualMachineProperties properties = VirtualMachineProperties.create("27ee085b-d707-xxxx-yyyy-2370e2eb1cc1",
+              null, null, hwProf, storageProfile, osProfile, networkProfile, diagnosticsProfile, "Creating");
+      return properties;
+   }
+
+   private VirtualMachine getVM() {
+      VirtualMachineProperties properties = getProperties();
+      VirtualMachine machine = VirtualMachine.create("/subscriptions/SUBSCRIPTIONID/" + "" +
+                      "resourceGroups/groupname/providers/Microsoft.Compute/virtualMachines/windowsmachine", "windowsmachine",
+              "Microsoft.Compute/virtualMachines", "westus", null, properties);
+      return machine;
+   }
+
+   private VirtualMachineInstance getVMInstance() {
+      List<VirtualMachineInstance.VirtualMachineStatus> statuses = new ArrayList<VirtualMachineInstance.VirtualMachineStatus>();
+      String testDate = "Wed May 04 01:38:52 PDT 2016";
+      DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
+      Date date = null;
+      try {
+         date = formatter.parse(testDate);
+      } catch (Exception e) {
+         e.printStackTrace();
+      }
+      VirtualMachineInstance.VirtualMachineStatus vmStatus =
+              VirtualMachineInstance.VirtualMachineStatus.create("ProvisioningState/succeeded", "Info", "Provisioning succeeded",  date);
+      statuses.add(vmStatus);
+      VirtualMachineInstance.VirtualMachineStatus vmStatus1 =
+              VirtualMachineInstance.VirtualMachineStatus.create("PowerState/running", "Info", "VM running",  null);
+      statuses.add(vmStatus1);
+
+      VirtualMachineInstance machineInstance =
+              VirtualMachineInstance.create(null, null, ImmutableList.copyOf(statuses));
+      return machineInstance;
+   }
+
+   private List<VirtualMachine> getVMList() {
+      VirtualMachineProperties properties = getProperties();
+      VirtualMachine machine = VirtualMachine.create("/subscriptions/SUBSCRIPTIONID/" + "" +
+                      "resourceGroups/groupname/providers/Microsoft.Compute/virtualMachines/windowsmachine",
+              "windowsmachine", "Microsoft.Compute/virtualMachines", "westus", null, properties);
+      List<VirtualMachine> list = new ArrayList<VirtualMachine>();
+      list.add(machine);
+      return list;
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/internal/AbstractAzureComputeApiLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/internal/AbstractAzureComputeApiLiveTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/internal/AbstractAzureComputeApiLiveTest.java
index aa0663a..bd55694 100644
--- a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/internal/AbstractAzureComputeApiLiveTest.java
+++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/internal/AbstractAzureComputeApiLiveTest.java
@@ -22,9 +22,9 @@ import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.OPERATI
 import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.OPERATION_TIMEOUT;
 import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.TCP_RULE_FORMAT;
 import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.TCP_RULE_REGEXP;
+
 import java.util.Properties;
 import java.util.Random;
-
 import org.jclouds.apis.BaseApiLiveTest;
 import org.jclouds.azurecompute.arm.AzureComputeApi;
 import org.jclouds.azurecompute.arm.AzureComputeProviderMetadata;

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/internal/BaseAzureComputeApiLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/internal/BaseAzureComputeApiLiveTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/internal/BaseAzureComputeApiLiveTest.java
index b1d97b8..0768dab 100644
--- a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/internal/BaseAzureComputeApiLiveTest.java
+++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/internal/BaseAzureComputeApiLiveTest.java
@@ -20,11 +20,17 @@ import static org.testng.Assert.assertTrue;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableMap;
+import org.jclouds.azurecompute.arm.domain.IdReference;
+import org.jclouds.azurecompute.arm.domain.IpConfiguration;
+import org.jclouds.azurecompute.arm.domain.IpConfigurationProperties;
+import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCard;
+import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCardProperties;
 import org.jclouds.azurecompute.arm.domain.ResourceGroup;
 
 import org.jclouds.azurecompute.arm.domain.StorageService;
 import org.jclouds.azurecompute.arm.domain.Subnet;
 import org.jclouds.azurecompute.arm.domain.VirtualNetwork;
+import org.jclouds.azurecompute.arm.features.NetworkInterfaceCardApi;
 import org.jclouds.azurecompute.arm.features.StorageAccountApi;
 import org.jclouds.azurecompute.arm.features.SubnetApi;
 import org.jclouds.azurecompute.arm.features.VirtualNetworkApi;
@@ -36,6 +42,7 @@ import org.testng.annotations.BeforeClass;
 
 import java.net.URI;
 import java.util.Arrays;
+import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -50,13 +57,15 @@ public class BaseAzureComputeApiLiveTest extends AbstractAzureComputeApiLiveTest
 
    public static final String DEFAULT_VIRTUALNETWORK_ADDRESS_PREFIX = "10.2.0.0/16";
 
+   public static final String NETWORKINTERFACECARD_NAME = "jcloudsNic";
+
    private String resourceGroupName = null;
 
    protected StorageService storageService;
 
-
    private String storageServiceName = null;
 
+
    protected String getStorageServiceName() {
       if (storageServiceName == null) {
          storageServiceName = String.format("%3.24s",
@@ -74,6 +83,17 @@ public class BaseAzureComputeApiLiveTest extends AbstractAzureComputeApiLiveTest
       return endpoint;
    }
 
+   protected String getSubscriptionId() {
+      String subscriptionid = null;
+      String endpoint = null;
+      endpoint = getEndpoint();
+      if (endpoint != null) {
+         subscriptionid = endpoint.substring(endpoint.lastIndexOf("/") + 1);
+      }
+      assertNotNull(subscriptionid);
+      return subscriptionid;
+   }
+
    protected String getResourceGroupName() {
       if (resourceGroupName == null) {
          resourceGroupName = String.format("%3.24s",
@@ -99,7 +119,6 @@ public class BaseAzureComputeApiLiveTest extends AbstractAzureComputeApiLiveTest
    @Override
    public void setup() {
       super.setup();
-
       storageService = getOrCreateStorageService(getStorageServiceName());
    }
 
@@ -169,4 +188,29 @@ public class BaseAzureComputeApiLiveTest extends AbstractAzureComputeApiLiveTest
 
       return subnet;
    }
+
+   protected NetworkInterfaceCard getOrCreateNetworkInterfaceCard(final String networkInterfaceCardName){
+
+      NetworkInterfaceCardApi nicApi = api.getNetworkInterfaceCardApi(getResourceGroupName());
+      NetworkInterfaceCard nic = nicApi.get(networkInterfaceCardName);
+
+      if (nic != null){
+         return nic;
+      }
+
+      VirtualNetwork vn = getOrCreateVirtualNetwork(VIRTUAL_NETWORK_NAME);
+
+      Subnet subnet = getOrCreateSubnet(DEFAULT_SUBNET_NAME, VIRTUAL_NETWORK_NAME);
+
+      //Create properties object
+      final NetworkInterfaceCardProperties networkInterfaceCardProperties =
+              NetworkInterfaceCardProperties.builder()
+                      .ipConfigurations(Arrays.asList(IpConfiguration.create("myipconfig", null, null, null,
+                              IpConfigurationProperties.create(null, null, "Dynamic", IdReference.create(subnet.id()), null))
+                      )).build();
+
+      final Map<String, String> tags = ImmutableMap.of("jclouds", "livetest");
+      nic = nicApi.createOrUpdate(NETWORKINTERFACECARD_NAME, LOCATION, networkInterfaceCardProperties, tags);
+      return  nic;
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/test/resources/PublicIPAddressCreate.json
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/resources/PublicIPAddressCreate.json b/azurecompute-arm/src/test/resources/PublicIPAddressCreate.json
new file mode 100644
index 0000000..d9e06aa
--- /dev/null
+++ b/azurecompute-arm/src/test/resources/PublicIPAddressCreate.json
@@ -0,0 +1,20 @@
+{
+  "name": "mypublicaddress",
+  "id": "/subscriptions/fakeb2f5-4710-4e93-bdf4-419edbde2178/resourceGroups/myresourcegroup/providers/Microsoft.Network/publicIPAddresses/mypublicaddress",
+  "etag": "W/\"f0bdaf62-456b-4338-8f65-05417b1a55e9\"",
+  "type": "Microsoft.Network/publicIPAddresses",
+  "location": "northeurope",
+  "tags": {
+    "testkey": "testvalue"
+  },
+  "properties": {
+    "provisioningState": "Updating",
+    "resourceGuid": "ebe3f160-2484-447a-8980-c587b214b16f",
+    "publicIPAllocationMethod": "Static",
+    "idleTimeoutInMinutes": 4,
+    "dnsSettings": {
+      "domainNameLabel": "foobar",
+      "fqdn": "foobar.northeurope.cloudapp.azure.com"
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/test/resources/PublicIPAddressCreateDnsRecordInUse.json
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/resources/PublicIPAddressCreateDnsRecordInUse.json b/azurecompute-arm/src/test/resources/PublicIPAddressCreateDnsRecordInUse.json
new file mode 100644
index 0000000..16a52c8
--- /dev/null
+++ b/azurecompute-arm/src/test/resources/PublicIPAddressCreateDnsRecordInUse.json
@@ -0,0 +1,7 @@
+{
+  "error": {
+    "code": "DnsRecordInUse",
+    "message": "DNS record foobar.northeurope.cloudapp.azure.com is already used by another public IP.",
+    "details": []
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/test/resources/PublicIPAddressGetInfo.json
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/resources/PublicIPAddressGetInfo.json b/azurecompute-arm/src/test/resources/PublicIPAddressGetInfo.json
new file mode 100644
index 0000000..00ca989
--- /dev/null
+++ b/azurecompute-arm/src/test/resources/PublicIPAddressGetInfo.json
@@ -0,0 +1,24 @@
+{
+  "name": "mypublicaddress",
+  "id": "/subscriptions/fakeb2f5-4710-4e93-bdf4-419edbde2178/resourceGroups/myresourcegroup/providers/Microsoft.Network/publicIPAddresses/mypublicaddress",
+  "etag": "W/\"0b020646-202f-4ac6-b1a7-f9645db7c371\"",
+  "type": "Microsoft.Network/publicIPAddresses",
+  "location": "northeurope",
+  "tags": {
+    "testkey": "testvalue"
+  },
+  "properties": {
+    "provisioningState": "Succeeded",
+    "resourceGuid": "eb0da01e-2a30-4e84-b7a4-0ce9dde019f5",
+    "ipAddress": "12.123.12.123",
+    "publicIPAllocationMethod": "Static",
+    "idleTimeoutInMinutes": 4,
+    "dnsSettings": {
+      "domainNameLabel": "foobar",
+      "fqdn": "foobar.northeurope.cloudapp.azure.com"
+    },
+    "ipConfiguration": {
+      "id": "/subscriptions/fakeb2f5-4710-4e93-bdf4-419edbde2178/resourceGroups/myresourcegroup/providers/Microsoft.Network/networkInterfaces/myNic/ipConfigurations/myip1"
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/test/resources/PublicIPAddressList.json
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/resources/PublicIPAddressList.json b/azurecompute-arm/src/test/resources/PublicIPAddressList.json
new file mode 100644
index 0000000..2b78b37
--- /dev/null
+++ b/azurecompute-arm/src/test/resources/PublicIPAddressList.json
@@ -0,0 +1,80 @@
+{
+  "value": [
+    {
+      "name": "my2ndpublicaddress",
+      "id": "/subscriptions/fakeb2f5-4710-4e93-bdf4-419edbde2178/resourceGroups/myresourcegroup/providers/Microsoft.Network/publicIPAddresses/my2ndpublicaddress",
+      "etag": "W/\"b83fa879-46ee-48a9-8120-26572449788f\"",
+      "type": "Microsoft.Network/publicIPAddresses",
+      "location": "northeurope",
+      "tags": {
+        "testkey": "testvalue"
+      },
+      "properties": {
+        "provisioningState": "Succeeded",
+        "resourceGuid": "ebe3f160-2484-447a-8980-c587b214b16f",
+        "publicIPAllocationMethod": "Dynamic",
+        "idleTimeoutInMinutes": 4,
+        "dnsSettings": {
+          "domainNameLabel": "foobar123",
+          "fqdn": "foobar123.northeurope.cloudapp.azure.com"
+        }
+      }
+    },
+    {
+      "name": "my3rdpublicaddress",
+      "id": "/subscriptions/fakeb2f5-4710-4e93-bdf4-419edbde2178/resourceGroups/myresourcegroup/providers/Microsoft.Network/publicIPAddresses/my3rdpublicaddress",
+      "etag": "W/\"17d2cf9a-7aa8-4c53-a5b8-ebc2ccb7bf93\"",
+      "type": "Microsoft.Network/publicIPAddresses",
+      "location": "northeurope",
+      "tags": {
+        "testkey": "testvalue"
+      },
+      "properties": {
+        "provisioningState": "Succeeded",
+        "resourceGuid": "e1107240-79c5-4829-ba16-f7a00c2763df",
+        "ipAddress": "12.12.123.123",
+        "publicIPAllocationMethod": "Static",
+        "idleTimeoutInMinutes": 4
+      }
+    },
+    {
+      "name": "my4thpublicaddress",
+      "id": "/subscriptions/fakeb2f5-4710-4e93-bdf4-419edbde2178/resourceGroups/myresourcegroup/providers/Microsoft.Network/publicIPAddresses/my4thpublicaddress",
+      "etag": "W/\"c32275e9-e1fc-465a-a5de-728c1359e123\"",
+      "type": "Microsoft.Network/publicIPAddresses",
+      "location": "northeurope",
+      "tags": {
+        "testkey": "testvalue"
+      },
+      "properties": {
+        "provisioningState": "Succeeded",
+        "resourceGuid": "dbde9a83-8c1a-43f4-8d81-0fa469703e8a",
+        "ipAddress": "12.12.123.124",
+        "publicIPAllocationMethod": "Static",
+        "idleTimeoutInMinutes": 4
+      }
+    },
+    {
+      "name": "mypublicaddress",
+      "id": "/subscriptions/fakeb2f5-4710-4e93-bdf4-419edbde2178/resourceGroups/myresourcegroup/providers/Microsoft.Network/publicIPAddresses/mypublicaddress",
+      "etag": "W/\"0b020646-202f-4ac6-b1a7-f9645db7c371\"",
+      "type": "Microsoft.Network/publicIPAddresses",
+      "location": "northeurope",
+      "tags": {},
+      "properties": {
+        "provisioningState": "Succeeded",
+        "resourceGuid": "eb0da01e-2a30-4e84-b7a4-0ce9dde019f5",
+        "ipAddress": "12.123.12.125",
+        "publicIPAllocationMethod": "Static",
+        "idleTimeoutInMinutes": 4,
+        "dnsSettings": {
+          "domainNameLabel": "foobar",
+          "fqdn": "foobar.northeurope.cloudapp.azure.com"
+        },
+        "ipConfiguration": {
+          "id": "/subscriptions/fakeb2f5-4710-4e93-bdf4-419edbde2178/resourceGroups/myresourcegroup/providers/Microsoft.Network/networkInterfaces/myNic/ipConfigurations/myip1"
+        }
+      }
+    }
+  ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/test/resources/createnetworkinterfacecard.json
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/resources/createnetworkinterfacecard.json b/azurecompute-arm/src/test/resources/createnetworkinterfacecard.json
new file mode 100644
index 0000000..d08b8f6
--- /dev/null
+++ b/azurecompute-arm/src/test/resources/createnetworkinterfacecard.json
@@ -0,0 +1,35 @@
+{
+  "name": "myNic",
+  "id": "/subscriptions/12345678-2749-4e68-9dcf-123456789abc/resourceGroups/azurearmtesting/providers/Microsoft.Network/networkInterfaces/myNic",
+  "etag": "W/\"6b51f6e7-232b-4289-b740-04a996929f5e\"",
+  "type": "Microsoft.Network/networkInterfaces",
+  "location": "northeurope",
+  "tags": {
+    "mycustomtag": "foobar"
+  },
+  "properties": {
+    "provisioningState": "Succeeded",
+    "resourceGuid": "f3465472-536f-49e7-9e9c-fa91b971a618",
+    "ipConfigurations": [
+      {
+        "name": "myip1",
+        "id": "/subscriptions/12345678-2749-4e68-9dcf-123456789abc/resourceGroups/azurearmtesting/providers/Microsoft.Network/networkInterfaces/myNic/ipConfigurations/myip1",
+        "etag": "W/\"6b51f6e7-232b-4289-b740-04a996929f5e\"",
+        "properties": {
+          "provisioningState": "Succeeded",
+          "privateIPAddress": "10.2.0.4",
+          "privateIPAllocationMethod": "Dynamic",
+          "subnet": {
+            "id": "/subscriptions/12345678-2749-4e68-9dcf-123456789abc/resourceGroups/azurearmtesting/providers/Microsoft.Network/virtualNetworks/myvirtualnetwork/subnets/mysubnet"
+          },
+          "primary": true
+        }
+      }
+    ],
+    "dnsSettings": {
+      "dnsServers": [],
+      "appliedDnsServers": []
+    },
+    "enableIPForwarding": false
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/test/resources/createvirtualmachineresponse.json
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/resources/createvirtualmachineresponse.json b/azurecompute-arm/src/test/resources/createvirtualmachineresponse.json
new file mode 100644
index 0000000..ae16bdb
--- /dev/null
+++ b/azurecompute-arm/src/test/resources/createvirtualmachineresponse.json
@@ -0,0 +1,47 @@
+{
+  "properties": {
+    "vmId": "27ee085b-d707-xxxx-yyyy-2370e2eb1cc1",
+    "hardwareProfile": {
+      "vmSize": "Standard_D1"
+    },
+    "storageProfile": {
+      "imageReference": {
+        "publisher": "publisher",
+        "offer": "offer",
+        "sku": "sku",
+        "version": "ver"
+      },
+      "osDisk": {
+        "osType": "Windows",
+        "name": "windowsmachine",
+        "createOption": "FromImage",
+        "vhd": {
+          "uri": "https://groupname2760.blob.core.windows.net/vhds/windowsmachine201624102936.vhd"
+        },
+        "caching": "ReadWrite"
+      },
+      "dataDisks": []
+    },
+    "osProfile": {
+      "computerName": "windowsmachine",
+      "adminUsername": "azureuser",
+      "windowsConfiguration": {
+        "provisionVMAgent": false,
+        "enableAutomaticUpdates": true
+      },
+      "secrets": []
+    },
+    "networkProfile": {"networkInterfaces":[{"id":"/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Network/networkInterfaces/windowsmachine167"}]},
+    "diagnosticsProfile": {
+      "bootDiagnostics": {
+        "enabled": true,
+        "storageUri": "https://groupname2760.blob.core.windows.net/"
+      }
+    },
+    "provisioningState": "Creating"
+  },
+  "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute/virtualMachines/windowsmachine",
+  "name": "windowsmachine",
+  "type": "Microsoft.Compute/virtualMachines",
+  "location": "westus"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/test/resources/getnetworkinterfacecard.json
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/resources/getnetworkinterfacecard.json b/azurecompute-arm/src/test/resources/getnetworkinterfacecard.json
new file mode 100644
index 0000000..f613291
--- /dev/null
+++ b/azurecompute-arm/src/test/resources/getnetworkinterfacecard.json
@@ -0,0 +1,35 @@
+{
+  "name": "myNic",
+  "id": "/subscriptions/12345678-2749-4e68-9dcf-123456789abc/resourceGroups/azurearmtesting/providers/Microsoft.Network/networkInterfaces/myNic",
+  "etag": "W/\"3dff0c55-a7a7-434f-837b-0cad946b755f\"",
+  "type": "Microsoft.Network/networkInterfaces",
+  "location": "northeurope",
+  "tags": {
+    "mycustomtag": "foobar"
+  },
+  "properties": {
+    "provisioningState": "Succeeded",
+    "resourceGuid": "f3465472-536f-49e7-9e9c-fa91b971a618",
+    "ipConfigurations": [
+      {
+        "name": "myip1",
+        "id": "/subscriptions/12345678-2749-4e68-9dcf-123456789abc/resourceGroups/azurearmtesting/providers/Microsoft.Network/networkInterfaces/myNic/ipConfigurations/myip1",
+        "etag": "W/\"3dff0c55-a7a7-434f-837b-0cad946b755f\"",
+        "properties": {
+          "provisioningState": "Succeeded",
+          "privateIPAddress": "10.2.0.4",
+          "privateIPAllocationMethod": "Dynamic",
+          "subnet": {
+            "id": "/subscriptions/12345678-2749-4e68-9dcf-123456789abc/resourceGroups/azurearmtesting/providers/Microsoft.Network/virtualNetworks/myvirtualnetwork/subnets/mysubnet"
+          },
+          "primary": true
+        }
+      }
+    ],
+    "dnsSettings": {
+      "dnsServers": [],
+      "appliedDnsServers": []
+    },
+    "enableIPForwarding": false
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/test/resources/listnetworkinterfaces.json
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/resources/listnetworkinterfaces.json b/azurecompute-arm/src/test/resources/listnetworkinterfaces.json
new file mode 100644
index 0000000..de4b1e3
--- /dev/null
+++ b/azurecompute-arm/src/test/resources/listnetworkinterfaces.json
@@ -0,0 +1,68 @@
+{
+  "value": [
+    {
+      "name": "AnotherNIC",
+      "id": "/subscriptions/12345678-2749-4e68-9dcf-123456789abc/resourceGroups/azurearmtesting/providers/Microsoft.Network/networkInterfaces/AnotherNIC",
+      "etag": "W/\"e4ed4253-64b6-4184-bfaa-554f470d20c5\"",
+      "type": "Microsoft.Network/networkInterfaces",
+      "location": "northeurope",
+      "properties": {
+        "provisioningState": "Succeeded",
+        "resourceGuid": "7fcf6704-21c5-4983-bd9f-017e0873f22f",
+        "ipConfigurations": [
+          {
+            "name": "ipconfig1",
+            "id": "/subscriptions/12345678-2749-4e68-9dcf-123456789abc/resourceGroups/azurearmtesting/providers/Microsoft.Network/networkInterfaces/AnotherNIC/ipConfigurations/ipconfig1",
+            "etag": "W/\"e4ed4253-64b6-4184-bfaa-554f470d20c5\"",
+            "properties": {
+              "provisioningState": "Succeeded",
+              "privateIPAddress": "10.2.1.4",
+              "privateIPAllocationMethod": "Dynamic",
+              "subnet": {
+                "id": "/subscriptions/12345678-2749-4e68-9dcf-123456789abc/resourceGroups/armlivetesting/providers/Microsoft.Network/virtualNetworks/jclouds-virtual-network-live-test/subnets/anothersubnet"
+              },
+              "primary": true
+            }
+          }
+        ],
+        "dnsSettings": {
+          "dnsServers": [],
+          "appliedDnsServers": []
+        },
+        "enableIPForwarding": false
+      }
+    },
+    {
+      "name": "MyNic",
+      "id": "/subscriptions/12345678-2749-4e68-9dcf-123456789abc/resourceGroups/azurearmtesting/providers/Microsoft.Network/networkInterfaces/MyNic",
+      "etag": "W/\"a37d25ff-3f62-4ee2-a111-f355beb5ff69\"",
+      "type": "Microsoft.Network/networkInterfaces",
+      "location": "northeurope",
+      "properties": {
+        "provisioningState": "Succeeded",
+        "resourceGuid": "35908409-a081-4411-86a9-51f9ea99321f",
+        "ipConfigurations": [
+          {
+            "name": "ipconfig1",
+            "id": "/subscriptions/12345678-2749-4e68-9dcf-123456789abc/resourceGroups/azurearmtesting/providers/Microsoft.Network/networkInterfaces/MyNic/ipConfigurations/ipconfig1",
+            "etag": "W/\"a37d25ff-3f62-4ee2-a111-f355beb5ff69\"",
+            "properties": {
+              "provisioningState": "Succeeded",
+              "privateIPAddress": "10.2.0.100",
+              "privateIPAllocationMethod": "Static",
+              "subnet": {
+                "id": "/subscriptions/12345678-2749-4e68-9dcf-123456789abc/resourceGroups/armlivetesting/providers/Microsoft.Network/virtualNetworks/jclouds-virtual-network-live-test/subnets/default"
+              },
+              "primary": true
+            }
+          }
+        ],
+        "dnsSettings": {
+          "dnsServers": [],
+          "appliedDnsServers": []
+        },
+        "enableIPForwarding": false
+      }
+    }
+  ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/test/resources/resourcegroups.json
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/resources/resourcegroups.json b/azurecompute-arm/src/test/resources/resourcegroups.json
index e21fdb7..56c2196 100644
--- a/azurecompute-arm/src/test/resources/resourcegroups.json
+++ b/azurecompute-arm/src/test/resources/resourcegroups.json
@@ -12,7 +12,6 @@
          "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/test2",
          "name": "test2",
          "location": "eastus",
-         "tags": {},
          "properties": {
             "provisioningState": "Succeeded"
          }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/test/resources/virtualmachine.json
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/resources/virtualmachine.json b/azurecompute-arm/src/test/resources/virtualmachine.json
new file mode 100644
index 0000000..4dda519
--- /dev/null
+++ b/azurecompute-arm/src/test/resources/virtualmachine.json
@@ -0,0 +1,47 @@
+{
+  "properties": {
+    "vmId": "27ee085b-d707-xxxx-yyyy-2370e2eb1cc1",
+    "hardwareProfile": {
+      "vmSize": "Standard_D1"
+    },
+    "storageProfile": {
+      "imageReference": {
+        "publisher": "publisher",
+        "offer": "offer",
+        "sku": "sku",
+        "version": "ver"
+      },
+      "osDisk": {
+        "osType": "Windows",
+        "name": "windowsmachine",
+        "createOption": "FromImage",
+        "vhd": {
+          "uri": "https://groupname2760.blob.core.windows.net/vhds/windowsmachine201624102936.vhd"
+        },
+        "caching": "ReadWrite"
+      },
+      "dataDisks": []
+    },
+    "osProfile": {
+      "computerName": "windowsmachine",
+      "adminUsername": "azureuser",
+      "windowsConfiguration": {
+        "provisionVMAgent": false,
+        "enableAutomaticUpdates": true
+      },
+      "secrets": []
+    },
+    "networkProfile": {"networkInterfaces":[{"id":"/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Network/networkInterfaces/windowsmachine167"}]},
+    "diagnosticsProfile": {
+      "bootDiagnostics": {
+        "enabled": true,
+        "storageUri": "https://groupname2760.blob.core.windows.net/"
+      }
+    },
+    "provisioningState": "Creating"
+  },
+  "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute/virtualMachines/windowsmachine",
+  "name": "windowsmachine",
+  "type": "Microsoft.Compute/virtualMachines",
+  "location": "westus"
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/test/resources/virtualmachineInstance.json
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/resources/virtualmachineInstance.json b/azurecompute-arm/src/test/resources/virtualmachineInstance.json
new file mode 100644
index 0000000..f73cab6
--- /dev/null
+++ b/azurecompute-arm/src/test/resources/virtualmachineInstance.json
@@ -0,0 +1,40 @@
+{
+  "vmAgent": {
+    "vmAgentVersion": "2.7.1198.766",
+    "statuses": [
+      {
+        "code": "ProvisioningState/succeeded",
+        "level": "Info",
+        "displayStatus": "Ready",
+        "message": "GuestAgent is running and accepting new configurations.",
+        "time": "2016-05-04T08:42:15+00:00"
+      }
+    ]
+  },
+  "disks": [
+    {
+      "name": "windowsmachine",
+      "statuses": [
+        {
+          "code": "ProvisioningState/succeeded",
+          "level": "Info",
+          "displayStatus": "Provisioning succeeded",
+          "time": "2016-05-04T08:31:45.2525129+00:00"
+        }
+      ]
+    }
+  ],
+  "statuses": [
+    {
+      "code": "ProvisioningState/succeeded",
+      "level": "Info",
+      "displayStatus": "Provisioning succeeded",
+      "time": "2016-05-04T08:38:52.4310433+00:00"
+    },
+    {
+      "code": "PowerState/running",
+      "level": "Info",
+      "displayStatus": "VM running"
+    }
+  ]
+}
\ No newline at end of file


[3/3] jclouds-labs git commit: JCLOUDS-664 Azurecompute-arm NicApi PublicIPApi and VMApi

Posted by na...@apache.org.
JCLOUDS-664 Azurecompute-arm NicApi PublicIPApi and VMApi


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

Branch: refs/heads/master
Commit: 3be36289f594c42af2f46daee1661556fb0e3a35
Parents: 1f21537
Author: Rita Zhang <ri...@gmail.com>
Authored: Wed Apr 27 16:36:14 2016 -0700
Committer: Ignasi Barrera <na...@apache.org>
Committed: Wed May 11 16:05:13 2016 -0700

----------------------------------------------------------------------
 .../azurecompute/arm/AzureComputeApi.java       |  35 ++-
 .../arm/domain/AvailabilitySet.java             | 104 ++++++++
 .../domain/AvailabilitySetVirtualMachine.java   |  37 +++
 .../azurecompute/arm/domain/DataDisk.java       |  80 ++++++
 .../arm/domain/DiagnosticsProfile.java          |  68 +++++
 .../azurecompute/arm/domain/DnsSettings.java    |  57 +++++
 .../arm/domain/HardwareProfile.java             |  45 ++++
 .../azurecompute/arm/domain/IdReference.java    |  34 +++
 .../azurecompute/arm/domain/ImageReference.java |  80 ++++++
 .../arm/domain/IpConfiguration.java             |  66 +++++
 .../arm/domain/IpConfigurationProperties.java   |  72 ++++++
 .../arm/domain/NetworkInterfaceCard.java        |  56 +++++
 .../domain/NetworkInterfaceCardProperties.java  |  78 ++++++
 .../azurecompute/arm/domain/NetworkProfile.java |  55 ++++
 .../jclouds/azurecompute/arm/domain/OSDisk.java |  85 +++++++
 .../azurecompute/arm/domain/OSProfile.java      | 236 ++++++++++++++++++
 .../arm/domain/PublicIPAddress.java             |  52 ++++
 .../arm/domain/PublicIPAddressProperties.java   |  83 +++++++
 .../azurecompute/arm/domain/StorageProfile.java |  78 ++++++
 .../jclouds/azurecompute/arm/domain/Subnet.java |  10 +-
 .../jclouds/azurecompute/arm/domain/VHD.java    |  45 ++++
 .../azurecompute/arm/domain/VirtualMachine.java |  69 +++++
 .../arm/domain/VirtualMachineInstance.java      |  72 ++++++
 .../arm/domain/VirtualMachineProperties.java    | 133 ++++++++++
 .../azurecompute/arm/domain/VirtualNetwork.java |  12 +-
 .../arm/features/NetworkInterfaceCardApi.java   |  78 ++++++
 .../arm/features/PublicIPAddressApi.java        |  78 ++++++
 .../arm/features/VirtualMachineApi.java         | 135 ++++++++++
 .../NetworkInterfaceCardApiLiveTest.java        | 139 +++++++++++
 .../NetworkInterfaceCardApiMockTest.java        | 150 +++++++++++
 .../features/PublicIPAddressApiLiveTest.java    | 129 ++++++++++
 .../features/PublicIPAddressApiMockTest.java    | 179 +++++++++++++
 .../arm/features/VirtualMachineApiLiveTest.java | 245 ++++++++++++++++++
 .../arm/features/VirtualMachineApiMockTest.java | 249 +++++++++++++++++++
 .../AbstractAzureComputeApiLiveTest.java        |   2 +-
 .../internal/BaseAzureComputeApiLiveTest.java   |  48 +++-
 .../test/resources/PublicIPAddressCreate.json   |  20 ++
 .../PublicIPAddressCreateDnsRecordInUse.json    |   7 +
 .../test/resources/PublicIPAddressGetInfo.json  |  24 ++
 .../src/test/resources/PublicIPAddressList.json |  80 ++++++
 .../resources/createnetworkinterfacecard.json   |  35 +++
 .../resources/createvirtualmachineresponse.json |  47 ++++
 .../test/resources/getnetworkinterfacecard.json |  35 +++
 .../test/resources/listnetworkinterfaces.json   |  68 +++++
 .../src/test/resources/resourcegroups.json      |   1 -
 .../src/test/resources/virtualmachine.json      |  47 ++++
 .../test/resources/virtualmachineInstance.json  |  40 +++
 .../src/test/resources/virtualmachines.json     |  57 +++++
 48 files changed, 3625 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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 5b4d600..f8ac6e9 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
@@ -16,21 +16,23 @@
  */
 package org.jclouds.azurecompute.arm;
 
-import java.io.Closeable;
-
 import org.jclouds.azurecompute.arm.features.JobApi;
 import org.jclouds.azurecompute.arm.features.LocationApi;
+import org.jclouds.azurecompute.arm.features.NetworkInterfaceCardApi;
+import org.jclouds.azurecompute.arm.features.PublicIPAddressApi;
 import org.jclouds.azurecompute.arm.features.ResourceGroupApi;
 import org.jclouds.azurecompute.arm.features.StorageAccountApi;
 import org.jclouds.azurecompute.arm.features.SubnetApi;
+import org.jclouds.azurecompute.arm.features.VirtualMachineApi;
 import org.jclouds.azurecompute.arm.features.VirtualNetworkApi;
 import org.jclouds.rest.annotations.Delegate;
 
 import javax.ws.rs.PathParam;
+import java.io.Closeable;
 
 /**
  * The Azure Resource Manager API is a REST API for managing your services and deployments.
- * <p/>
+ * <p>
  *
  * @see <a href="https://msdn.microsoft.com/en-us/library/azure/dn790568.aspx" >doc</a>
  */
@@ -62,6 +64,7 @@ public interface AzureComputeApi extends Closeable {
     */
    @Delegate
    StorageAccountApi getStorageAccountApi(@PathParam("resourceGroup") String resourceGroup);
+
    /**
     * The Subnet API includes operations for managing the subnets in your virtual network.
     *
@@ -79,4 +82,30 @@ public interface AzureComputeApi extends Closeable {
    @Delegate
    VirtualNetworkApi getVirtualNetworkApi(@PathParam("resourcegroup") String resourcegroup);
 
+
+   /**
+    * The Network Interface Card API includes operations for managing the NICs in your subscription.
+    *
+    * @see <a href="https://msdn.microsoft.com/en-us/library/mt163668.aspx">docs</a>
+    */
+   @Delegate
+   NetworkInterfaceCardApi getNetworkInterfaceCardApi(@PathParam("resourcegroup") String resourcegroup);
+
+   /**
+    * The Public IP Address API includes operations for managing public ID Addresses for NICs in your subscription.
+    *
+    * @see <a href="https://msdn.microsoft.com/en-us/library/azure/mt163638.aspx">docs</a>
+    */
+   @Delegate
+   PublicIPAddressApi getPublicIPAddressApi(@PathParam("resourcegroup") String resourcegroup);
+
+
+   /**
+    * The Virtual Machine API includes operations for managing the virtual machines in your subscription.
+    *
+    * @see <a href="https://msdn.microsoft.com/en-us/library/azure/mt163630.aspx">docs</a>
+    */
+   @Delegate
+   VirtualMachineApi getVirtualMachineApi(@PathParam("resourceGroup") String resourceGroup);
+
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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
new file mode 100644
index 0000000..cb90307
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/AvailabilitySet.java
@@ -0,0 +1,104 @@
+/*
+ * 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 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
+ */
+@AutoValue
+public abstract class AvailabilitySet {
+
+   @AutoValue
+   public abstract static class AvailabilitySetProperties {
+
+      /**
+       * A platform Update Domain Count
+       */
+      public abstract int platformUpdateDomainCount();
+
+      /**
+       * A platform Fault Domain Count
+       */
+      public abstract int platformFaultDomainCount();
+
+      /**
+       * A list of virtual machines in availability set
+       */
+      @Nullable
+      public abstract List<AvailabilitySetVirtualMachine> virtualMachines();
+
+      @SerializedNames({"platformUpdateDomainCount", "platformFaultDomainCount", "virtualMachines"})
+      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));
+      }
+   }
+
+   /**
+    * The id of the availability set
+    */
+   public abstract String id();
+
+   /**
+    * The name of the availability set.
+    */
+   @Nullable
+   public abstract String name();
+
+   /**
+    * The name of the availability set.
+    */
+   @Nullable
+   public abstract String type();
+
+   /**
+    * The location of the availability set
+    */
+   @Nullable
+   public abstract String location();
+
+   /**
+    * Specifies the tags of the availability set
+    */
+   @Nullable
+   public abstract Map<String, String> tags();
+
+   /**
+    * Specifies the properties of the availability set
+    */
+   @Nullable
+   public abstract AvailabilitySetProperties properties();
+
+
+   @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);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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
new file mode 100644
index 0000000..3837ff2
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/AvailabilitySetVirtualMachine.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azurecompute.arm.domain;
+
+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/3be36289/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
new file mode 100644
index 0000000..de1fa36
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DataDisk.java
@@ -0,0 +1,80 @@
+/*
+ * 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;
+
+@AutoValue
+public abstract class DataDisk {
+
+   /**
+    * The name of the data disk
+    */
+   public abstract String name();
+
+   /**
+    * The size of the data disk
+    */
+   public abstract String diskSizeGB();
+
+   /**
+    * The lun value of the data disk
+    */
+   public abstract int lun();
+
+   /**
+    * The vhd of the data disk
+    */
+   public abstract VHD vhd();
+
+   /**
+    * The create option of the data disk
+    */
+   public abstract String createOption();
+
+   @SerializedNames({"name", "diskSizeGB", "lun", "vhd", "createOption"})
+   public static DataDisk create(final String name, final String diskSizeGB, final int lun,
+                                 final VHD vhd, final String createOption) {
+      return builder()
+              .name(name)
+              .diskSizeGB(diskSizeGB)
+              .lun(lun)
+              .createOption(createOption)
+              .vhd(vhd)
+              .build();
+   }
+
+   public static Builder builder() {
+      return new AutoValue_DataDisk.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder name(String name);
+
+      public abstract Builder diskSizeGB(String diskSizeGB);
+
+      public abstract Builder createOption(String createOption);
+
+      public abstract Builder lun(int lun);
+
+      public abstract Builder vhd(VHD vhd);
+
+      public abstract DataDisk build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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
new file mode 100644
index 0000000..6097e59
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DiagnosticsProfile.java
@@ -0,0 +1,68 @@
+/*
+ * 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.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+@AutoValue
+public abstract class DiagnosticsProfile {
+
+   @AutoValue
+   public abstract static class BootDiagnostics{
+
+      public abstract boolean enabled();
+
+      @Nullable
+      public abstract String storageUri();
+
+      @SerializedNames({"enabled", "storageUri"})
+      public static BootDiagnostics create(final boolean enabled, final String storageUri) {
+         return builder()
+                 .enabled(enabled)
+                 .storageUri(storageUri)
+                 .build();
+      }
+
+      public static Builder builder() {
+         return new AutoValue_DiagnosticsProfile_BootDiagnostics.Builder();
+      }
+      @AutoValue.Builder
+      public abstract static class Builder {
+         public abstract Builder enabled(boolean enabled);
+         public abstract Builder storageUri(String storageUri);
+         public abstract BootDiagnostics build();
+      }
+   }
+
+   public abstract BootDiagnostics bootDiagnostics();
+
+   @SerializedNames({"bootDiagnostics"})
+   public static DiagnosticsProfile create(final BootDiagnostics  bootDiagnostics) {
+      return builder().bootDiagnostics(bootDiagnostics).build();
+   }
+   public static Builder builder() {
+      return new AutoValue_DiagnosticsProfile.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder bootDiagnostics(BootDiagnostics bootDiagnostics);
+      public abstract DiagnosticsProfile build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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
new file mode 100644
index 0000000..a527eb0
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/DnsSettings.java
@@ -0,0 +1,57 @@
+/*
+ * 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.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+@AutoValue
+public abstract class DnsSettings {
+
+   public abstract String domainNameLabel();
+
+   @Nullable
+   public abstract String fqdn();
+
+   @Nullable
+   public abstract String reverseFqdn();
+
+   @SerializedNames({"domainNameLabel", "fqdn", "reverseFqdn"})
+   public static DnsSettings create(final String domainNameLabel, final String fqdn, final String reverseFqdn) {
+      return builder()
+              .domainNameLabel(domainNameLabel)
+              .fqdn(fqdn)
+              .reverseFqdn(reverseFqdn)
+              .build();
+   }
+
+   public static Builder builder() {
+      return new AutoValue_DnsSettings.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder domainNameLabel(String domainNameLabel);
+
+      public abstract Builder fqdn(String fqdn);
+
+      public abstract Builder reverseFqdn(String reverseFqdn);
+
+      public abstract DnsSettings build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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
new file mode 100644
index 0000000..ee9a5f1
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/HardwareProfile.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 com.google.auto.value.AutoValue;
+import org.jclouds.json.SerializedNames;
+
+@AutoValue
+public abstract class HardwareProfile {
+
+   /**
+    * The vm size of the virtual machine.
+    */
+   public abstract String vmSize();
+
+   @SerializedNames({"vmSize"})
+   public static HardwareProfile create(final String vmSize) {
+      return builder().vmSize(vmSize).build();
+   }
+
+   public static Builder builder() {
+      return new AutoValue_HardwareProfile.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder vmSize(String vmSize);
+
+      public abstract HardwareProfile build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/IdReference.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/IdReference.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/IdReference.java
new file mode 100644
index 0000000..1854897
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/IdReference.java
@@ -0,0 +1,34 @@
+/*
+ * 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.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+// Simple helper class to serialize / deserialize id reference.
+
+@AutoValue
+public abstract class IdReference {
+   @Nullable
+   public abstract String id();
+
+   @SerializedNames({"id"})
+   public static IdReference create(final String id) {
+      return new AutoValue_IdReference(id);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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
new file mode 100644
index 0000000..9cc6747
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/ImageReference.java
@@ -0,0 +1,80 @@
+/*
+ * 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.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+@AutoValue
+public abstract class ImageReference {
+
+   /**
+    * The publisher of the image reference.
+    */
+   @Nullable
+   public abstract String publisher();
+
+   /**
+    * The offer of the image reference.
+    */
+   @Nullable
+   public abstract String offer();
+
+   /**
+    * The sku of the image reference.
+    */
+   @Nullable
+   public abstract String sku();
+
+   /**
+    * The version of the image reference.
+    */
+   @Nullable
+   public abstract String version();
+
+   @SerializedNames({"publisher", "offer", "sku", "version"})
+   public static ImageReference create(final String publisher,
+                                       final String offer,
+                                       final String sku,
+                                       final String version) {
+
+      return builder()
+              .publisher(publisher)
+              .offer(offer)
+              .sku(sku)
+              .version(version)
+              .build();
+   }
+
+   public static Builder builder() {
+      return new AutoValue_ImageReference.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder publisher(String publisher);
+
+      public abstract Builder offer(String offer);
+
+      public abstract Builder sku(String sku);
+
+      public abstract Builder version(String version);
+
+      public abstract ImageReference build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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
new file mode 100644
index 0000000..bb49a77
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/IpConfiguration.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 com.google.auto.value.AutoValue;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+@AutoValue
+public abstract class IpConfiguration {
+
+   @Nullable
+   public abstract String name();
+
+   @Nullable
+   public abstract String id();
+
+   @Nullable
+   public abstract String etag();
+
+   @Nullable
+   public abstract Boolean primary();
+
+   @Nullable
+   public abstract IpConfigurationProperties properties();
+
+   @SerializedNames({"name", "id", "etag", "primary", "properties"})
+   public static IpConfiguration create(final String name, final String id, final String etag, final Boolean primary, final IpConfigurationProperties properties) {
+      return builder()
+              .name(name)
+              .id(id)
+              .etag(etag)
+              .primary(primary)
+              .properties(properties)
+              .build();
+   }
+
+   public static Builder builder() {
+      return new AutoValue_IpConfiguration.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder name(String name);
+      public abstract Builder id(String id);
+      public abstract Builder etag(String etag);
+      public abstract Builder primary(Boolean primary);
+      public abstract Builder properties(IpConfigurationProperties properties);
+      public abstract IpConfiguration build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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
new file mode 100644
index 0000000..8e3bd53
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/IpConfigurationProperties.java
@@ -0,0 +1,72 @@
+/*
+ * 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.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+@AutoValue
+public abstract class IpConfigurationProperties {
+
+   @Nullable
+   public abstract String provisioningState();
+
+   @Nullable
+   public abstract String privateIPAddress();
+
+   @Nullable
+   public abstract String privateIPAllocationMethod();
+
+   @Nullable
+   public abstract IdReference subnet();
+
+   @Nullable
+   public abstract IdReference publicIPAddress();
+
+   @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) {
+
+      return builder()
+              .provisioningState(provisioningState)
+              .privateIPAddress(privateIPAddress)
+              .privateIPAllocationMethod(privateIPAllocationMethod)
+              .subnet(subnet)
+              .publicIPAddress(publicIPAddress)
+              .build();
+   }
+
+   public static Builder builder() {
+      return new AutoValue_IpConfigurationProperties.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder provisioningState(String provisioningState);
+
+      public abstract Builder privateIPAddress(String privateIPAddress);
+
+      public abstract Builder privateIPAllocationMethod(String privateIPAllocationMethod);
+
+      public abstract Builder subnet(IdReference subnet);
+
+      public abstract Builder publicIPAddress(IdReference publicIPAddress);
+
+      public abstract IpConfigurationProperties build();
+   }
+}
+

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkInterfaceCard.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkInterfaceCard.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkInterfaceCard.java
new file mode 100644
index 0000000..567addc
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkInterfaceCard.java
@@ -0,0 +1,56 @@
+/*
+ * 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 com.google.common.collect.ImmutableMap;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import java.util.Map;
+
+@AutoValue
+public abstract class NetworkInterfaceCard {
+
+   @Nullable
+   public abstract String name();
+
+   @Nullable
+   public abstract String id();
+
+   @Nullable
+   public abstract String etag();
+
+   @Nullable
+   public abstract String location();
+
+   @Nullable
+   public abstract NetworkInterfaceCardProperties properties();
+
+   @Nullable
+   public abstract Map<String, String> tags();
+
+   @SerializedNames({"name", "id", "etag", "location", "properties", "tags"})
+   public static NetworkInterfaceCard create(final String name,
+                                             final String id,
+                                             final String etag,
+                                             final String location,
+                                             final NetworkInterfaceCardProperties properties,
+                                             final Map<String, String> tags) {
+      return new AutoValue_NetworkInterfaceCard(name, id, etag, location, properties, tags == null ? null : ImmutableMap.copyOf(tags));
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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
new file mode 100644
index 0000000..e6f2de7
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkInterfaceCardProperties.java
@@ -0,0 +1,78 @@
+/*
+ * 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 com.google.common.collect.ImmutableList;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import java.util.List;
+
+@AutoValue
+public abstract class NetworkInterfaceCardProperties {
+
+   @Nullable
+   public abstract String provisioningState();
+
+   @Nullable
+   public abstract String resourceGuid();
+
+   @Nullable
+   public abstract Boolean enableIPForwarding();
+
+   @Nullable
+   public abstract List<IpConfiguration> ipConfigurations();
+
+   @SerializedNames({"provisioningState", "resourceGuid", "enableIPForwarding", "ipConfigurations"})
+   public static NetworkInterfaceCardProperties create(final String provisioningState, final String resourceGuid, final Boolean enableIPForwarding, final List<IpConfiguration> ipConfigurations) {
+      NetworkInterfaceCardProperties.Builder builder = NetworkInterfaceCardProperties.builder()
+              .provisioningState(provisioningState)
+              .resourceGuid(resourceGuid)
+              .enableIPForwarding(enableIPForwarding)
+              .ipConfigurations(ipConfigurations == null ? null : ImmutableList.copyOf(ipConfigurations));
+
+      return builder.build();
+   }
+
+   public static Builder builder() {
+
+      return new AutoValue_NetworkInterfaceCardProperties.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder provisioningState(String provisioningState);
+
+      public abstract Builder resourceGuid(String resourceGuid);
+
+      public abstract Builder enableIPForwarding(Boolean enableIPForwarding);
+
+      public abstract Builder ipConfigurations(List<IpConfiguration> ipConfigurations);
+
+      abstract List<IpConfiguration> ipConfigurations();
+
+      abstract NetworkInterfaceCardProperties autoBuild();
+
+      public NetworkInterfaceCardProperties build() {
+         ipConfigurations(ipConfigurations() != null ? ImmutableList.copyOf(ipConfigurations()) : null);
+         return autoBuild();
+      }
+   }
+}
+
+

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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
new file mode 100644
index 0000000..ffcf9ee
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/NetworkProfile.java
@@ -0,0 +1,55 @@
+/*
+ * 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 com.google.common.collect.ImmutableList;
+import org.jclouds.json.SerializedNames;
+
+import java.util.List;
+
+@AutoValue
+public abstract class NetworkProfile {
+
+   /**
+    * List of network interfaces
+    */
+   public abstract List<IdReference> networkInterfaces();
+
+   @SerializedNames({"networkInterfaces"})
+   public static NetworkProfile create(final List<IdReference> networkInterfaces) {
+      return builder().networkInterfaces(networkInterfaces).build();
+   }
+
+   public static Builder builder() {
+      return new AutoValue_NetworkProfile.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder networkInterfaces(List<IdReference> networkInterfaces);
+
+      abstract List<IdReference> networkInterfaces();
+
+      abstract NetworkProfile autoBuild();
+
+      public NetworkProfile build() {
+         networkInterfaces(networkInterfaces() != null ? ImmutableList.copyOf(networkInterfaces()) : ImmutableList.<IdReference>of());
+         return autoBuild();
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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
new file mode 100644
index 0000000..a9f7349
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/OSDisk.java
@@ -0,0 +1,85 @@
+/*
+ * 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.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+@AutoValue
+public abstract class OSDisk {
+   /**
+    * The OS type of the os disk
+    */
+   @Nullable
+   public abstract String osType();
+
+   /**
+    * The name of the os disk
+    */
+   @Nullable
+   public abstract String name();
+
+   /**
+    * The vhd of the os disk
+    */
+   @Nullable
+   public abstract VHD vhd();
+
+   /**
+    * The caching mode of the os disk
+    */
+   @Nullable
+   public abstract String caching();
+
+   /**
+    * The create options of the os disk
+    */
+   @Nullable
+   public abstract String createOption();
+
+   @SerializedNames({"osType", "name", "vhd", "caching", "createOption"})
+   public static OSDisk create(final String osType, final String name, final VHD vhd,
+                               final String caching, final String createOption) {
+      return builder()
+              .osType(osType)
+              .name(name)
+              .vhd(vhd)
+              .caching(caching)
+              .createOption(createOption)
+              .build();
+   }
+
+   public static Builder builder() {
+      return new AutoValue_OSDisk.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder osType(String osType);
+
+      public abstract Builder name(String name);
+
+      public abstract Builder caching(String caching);
+
+      public abstract Builder createOption(String createOption);
+
+      public abstract Builder vhd(VHD vhd);
+
+      public abstract OSDisk build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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
new file mode 100644
index 0000000..9240824
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/OSProfile.java
@@ -0,0 +1,236 @@
+/*
+ * 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 com.google.common.collect.ImmutableList;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import java.util.List;
+import java.util.Map;
+import com.google.common.collect.ImmutableMap;
+
+@AutoValue
+public abstract class OSProfile {
+
+   @AutoValue
+   public abstract static class LinuxConfiguration {
+
+      @AutoValue
+      public abstract static class SSH {
+
+         @AutoValue
+         public abstract static class SSHPublicKey {
+
+            @Nullable
+            public abstract String path();
+
+            @Nullable
+            public abstract String keyData();
+
+            @SerializedNames({"path", "keyData"})
+            public static SSHPublicKey create(final String path, final String keyData) {
+
+               return new AutoValue_OSProfile_LinuxConfiguration_SSH_SSHPublicKey(
+                       path, keyData);
+            }
+         }
+
+         /**
+          * The list of public keys and paths
+          */
+         @Nullable
+         public abstract List<SSHPublicKey> publicKeys();
+
+         @SerializedNames({"publicKeys"})
+         public static SSH create(final List<SSHPublicKey> publicKeys) {
+
+            return new AutoValue_OSProfile_LinuxConfiguration_SSH(
+                    publicKeys);
+         }
+      }
+
+      /**
+       * The authentication method password or ssh
+       */
+      public abstract String disablePasswordAuthentication();
+
+      /**
+       * ssh keys
+       */
+      @Nullable
+      public abstract SSH ssh();
+
+      @SerializedNames({"disablePasswordAuthentication", "ssh"})
+      public static LinuxConfiguration create(final String disablePasswordAuthentication,
+                                              final SSH ssh) {
+
+         return new AutoValue_OSProfile_LinuxConfiguration(disablePasswordAuthentication,
+                 ssh);
+      }
+   }
+
+   @AutoValue
+   public abstract static class WindowsConfiguration {
+
+      @AutoValue
+      public abstract static class WinRM {
+
+         /**
+          * Map of different settings
+          */
+         public abstract Map<String, String> listeners();
+
+         @SerializedNames({"listeners"})
+         public static WinRM create(final Map<String, String> listeners) {
+            return new AutoValue_OSProfile_WindowsConfiguration_WinRM(listeners == null ? ImmutableMap.<String, String>of() : ImmutableMap.copyOf(listeners));
+         }
+      }
+
+      @AutoValue
+      public abstract static class AdditionalUnattendContent {
+
+         public abstract String pass();
+
+         public abstract String component();
+
+         public abstract String settingName();
+
+         public abstract String content();
+
+         @SerializedNames({"pass", "component", "settingName", "content"})
+         public static AdditionalUnattendContent create(final String pass, final String component,
+                                                        final String settingName,
+                                                        final String content) {
+
+            return new AutoValue_OSProfile_WindowsConfiguration_AdditionalUnattendContent(
+                    pass, component, settingName, content);
+         }
+      }
+
+      /**
+       * The provision VM Agent true of false.
+       */
+      public abstract boolean provisionVMAgent();
+
+      /**
+       * winR
+       */
+      @Nullable
+      public abstract WinRM winRM();
+
+      /**
+       * unattend content
+       */
+      @Nullable
+      public abstract AdditionalUnattendContent additionalUnattendContent();
+
+      /**
+       * is automatic updates enabled
+       */
+      public abstract boolean enableAutomaticUpdates();
+
+      /**
+       * list of certificates
+       */
+      @Nullable
+      public abstract List<String> secrets();
+
+      @SerializedNames({"provisionVMAgent", "winRM", "additionalUnattendContent", "enableAutomaticUpdates",
+              "secrets"})
+      public static WindowsConfiguration create(final boolean provisionVMAgent, final WinRM winRM,
+                                                final AdditionalUnattendContent additionalUnattendContent,
+                                                final boolean enableAutomaticUpdates, final List<String> secrets) {
+
+         return new AutoValue_OSProfile_WindowsConfiguration(provisionVMAgent, winRM,
+                 additionalUnattendContent, enableAutomaticUpdates, secrets == null ? null : ImmutableList.copyOf(secrets));
+      }
+   }
+
+   /**
+    * The computer name of the VM
+    */
+   @Nullable
+   public abstract String computerName();
+
+   /**
+    * The admin username of the VM
+    */
+   @Nullable
+   public abstract String adminUsername();
+
+   /**
+    * The admin password of the VM
+    */
+   @Nullable
+   public abstract String adminPassword();
+
+   /**
+    * The custom data of the VM
+    */
+   @Nullable
+   public abstract String customData();
+
+   /**
+    * The linux configuration of the VM
+    */
+   @Nullable
+   public abstract LinuxConfiguration linuxConfiguration();
+
+   /**
+    * The windows configuration of the VM
+    */
+   @Nullable
+   public abstract WindowsConfiguration windowsConfiguration();
+
+   @SerializedNames({"computerName", "adminUsername", "adminPassword", "customData", "linuxConfiguration",
+           "windowsConfiguration"})
+   public static OSProfile create(final String computerName, final String adminUsername, final String adminPassword,
+                                  final String customData, final LinuxConfiguration linuxConfiguration,
+                                  final WindowsConfiguration windowsConfiguration) {
+      return builder()
+              .computerName(computerName)
+              .adminUsername(adminUsername)
+              .adminPassword(adminPassword)
+              .customData(customData)
+              .linuxConfiguration(linuxConfiguration)
+              .windowsConfiguration(windowsConfiguration)
+              .build();
+   }
+
+   public static Builder builder() {
+      return new AutoValue_OSProfile.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder computerName(String computerName);
+
+      public abstract Builder adminUsername(String adminUsername);
+
+      public abstract Builder adminPassword(String adminPassword);
+
+      public abstract Builder customData(String customData);
+
+      public abstract Builder linuxConfiguration(LinuxConfiguration linuxConfiguration);
+
+      public abstract Builder windowsConfiguration(WindowsConfiguration windowsConfiguration);
+
+      public abstract OSProfile build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/PublicIPAddress.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/PublicIPAddress.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/PublicIPAddress.java
new file mode 100644
index 0000000..a08fadd
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/PublicIPAddress.java
@@ -0,0 +1,52 @@
+/*
+ * 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 com.google.common.collect.ImmutableMap;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import java.util.Map;
+
+@AutoValue
+public abstract class PublicIPAddress {
+
+   public abstract String name();
+
+   public abstract String id();
+
+   public abstract String etag();
+
+   public abstract String location();
+
+   @Nullable
+   public abstract Map<String, String> tags();
+
+   public abstract PublicIPAddressProperties properties();
+
+   @SerializedNames({"name", "id", "etag", "location", "tags", "properties"})
+   public static PublicIPAddress create(final String name,
+                                        final String id,
+                                        final String etag,
+                                        final String location,
+                                        final Map<String, String> tags,
+                                        final PublicIPAddressProperties properties) {
+      return new AutoValue_PublicIPAddress(name, id, etag, location, tags == null ? null : ImmutableMap.copyOf(tags), properties);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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
new file mode 100644
index 0000000..2fc7fb5
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/PublicIPAddressProperties.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.domain;
+
+import com.google.auto.value.AutoValue;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+@AutoValue
+public abstract class PublicIPAddressProperties {
+
+   @Nullable // needs to be nullable to create the payload for create request
+   public abstract String provisioningState();
+
+   @Nullable // only set in succeeded provisioningState for Static IP and for Dynamic when attached to a NIC
+   public abstract String ipAddress();
+
+   public abstract String publicIPAllocationMethod();
+
+   @Nullable
+   public abstract Integer idleTimeoutInMinutes();
+
+   @Nullable // only if attached to NIC
+   public abstract IdReference ipConfiguration();
+
+   @Nullable // only if DNS name is set
+   public abstract DnsSettings dnsSettings();
+
+   @SerializedNames({"provisioningState", "ipAddress", "publicIPAllocationMethod", "idleTimeoutInMinutes", "ipConfiguration", "dnsSettings"})
+   public static PublicIPAddressProperties create(final String provisioningState,
+                                                  final String ipAddress,
+                                                  final String publicIPAllocationMethod,
+                                                  final Integer idleTimeoutInMinutes,
+                                                  final IdReference ipConfiguration,
+                                                  final DnsSettings dnsSettings) {
+      return builder()
+              .provisioningState(provisioningState)
+              .ipAddress(ipAddress)
+              .publicIPAllocationMethod(publicIPAllocationMethod)
+              .idleTimeoutInMinutes(idleTimeoutInMinutes)
+              .ipConfiguration(ipConfiguration)
+              .dnsSettings(dnsSettings)
+              .publicIPAllocationMethod(publicIPAllocationMethod)
+              .dnsSettings(dnsSettings)
+              .build();
+   }
+
+   public static Builder builder() {
+      return new AutoValue_PublicIPAddressProperties.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder provisioningState(String provisioningState);
+
+      public abstract Builder ipAddress(String ipAddress);
+
+      public abstract Builder publicIPAllocationMethod(String publicIPAllocationMethod);
+
+      public abstract Builder idleTimeoutInMinutes(Integer idleTimeoutInMinutes);
+
+      public abstract Builder ipConfiguration(IdReference ipConfiguration);
+
+      public abstract Builder dnsSettings(DnsSettings dnsSettings);
+
+      public abstract PublicIPAddressProperties build();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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
new file mode 100644
index 0000000..7c693ef
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/StorageProfile.java
@@ -0,0 +1,78 @@
+/*
+ * 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 com.google.common.collect.ImmutableList;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import java.util.List;
+
+@AutoValue
+public abstract class StorageProfile {
+
+   /**
+    * The image reference of the storage profile
+    */
+   public abstract ImageReference imageReference();
+
+   /**
+    * The image reference of the storage profile
+    */
+   public abstract OSDisk osDisk();
+
+   /**
+    * The list of the data disks of the storage profile
+    */
+   @Nullable
+   public abstract List<DataDisk> dataDisks();
+
+   @SerializedNames({"imageReference", "osDisk", "dataDisks"})
+   public static StorageProfile create(final ImageReference imageReference,
+                                       final OSDisk osDisk, final List<DataDisk> dataDisks) {
+      StorageProfile.Builder builder = StorageProfile.builder()
+              .imageReference(imageReference)
+              .osDisk(osDisk)
+              .dataDisks(dataDisks != null ? ImmutableList.copyOf(dataDisks) : null);
+
+      return builder.build();
+   }
+
+   public static Builder builder() {
+      return new AutoValue_StorageProfile.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder imageReference(ImageReference imageReference);
+
+      public abstract Builder osDisk(OSDisk osDisk);
+
+      public abstract Builder dataDisks(List<DataDisk> dataDisks);
+
+      abstract List<DataDisk> dataDisks();
+
+      abstract StorageProfile autoBuild();
+
+      public StorageProfile build() {
+         dataDisks(dataDisks() != null ? ImmutableList.copyOf(dataDisks()) : null);
+         return autoBuild();
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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 b195b7d..e4024df 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
@@ -20,6 +20,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;
@@ -71,7 +72,14 @@ public abstract class Subnet {
 
          public abstract Builder ipConfigurations(List<IpConfiguration> ipConfigurations);
 
-         public abstract SubnetProperties build();
+         abstract List<IpConfiguration> ipConfigurations();
+
+         abstract SubnetProperties autoBuild();
+
+         public SubnetProperties build() {
+            ipConfigurations(ipConfigurations() != null ? ImmutableList.copyOf(ipConfigurations()) : null);
+            return autoBuild();
+         }
       }
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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
new file mode 100644
index 0000000..3b1421a
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VHD.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 com.google.auto.value.AutoValue;
+import org.jclouds.json.SerializedNames;
+
+@AutoValue
+public abstract class VHD {
+
+   /**
+    * The uri of the vhd.
+    */
+   public abstract String uri();
+
+   @SerializedNames({"uri"})
+   public static VHD create(final String uri) {
+      return builder().uri(uri).build();
+   }
+
+   public static Builder builder() {
+      return new AutoValue_VHD.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder uri(String uri);
+
+      public abstract VHD build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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
new file mode 100644
index 0000000..71387e6
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachine.java
@@ -0,0 +1,69 @@
+/*
+ * 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 com.google.common.collect.ImmutableMap;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import java.util.Map;
+
+/**
+ * A virtual machine  that is valid for your subscription.
+ */
+@AutoValue
+public abstract class VirtualMachine {
+
+   /**
+    * The id of the virtual machine.
+    */
+   public abstract String id();
+
+   /**
+    * The name of the virtual machine
+    */
+   public abstract String name();
+
+   /**
+    * The type of the virtual machine .
+    */
+   public abstract String type();
+
+   /**
+    * The localized name of the virtual machine .
+    */
+   public abstract String location();
+
+   /**
+    * Specifies the tags of the vm
+    */
+   @Nullable
+   public abstract Map<String, String> tags();
+
+   /**
+    * Specifies the properties of the vm
+    */
+   public abstract VirtualMachineProperties properties();
+
+   @SerializedNames({"id", "name", "type", "location", "tags", "properties"})
+   public static VirtualMachine create(final String id, final String name, final String type, final String location,
+                                       @Nullable final Map<String, String> tags, VirtualMachineProperties properties) {
+
+      return new AutoValue_VirtualMachine(id, name, location, type, tags == null ? null : ImmutableMap.copyOf(tags), properties);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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
new file mode 100644
index 0000000..b0ed6d5
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineInstance.java
@@ -0,0 +1,72 @@
+/*
+ * 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 com.google.common.collect.ImmutableList;
+import java.util.List;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import java.util.Date;
+
+/**
+ * A virtual machine instance view that is valid for your subscription.
+ */
+@AutoValue
+public abstract class VirtualMachineInstance {
+
+   @AutoValue
+   public abstract static class VirtualMachineStatus {
+
+      @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) {
+
+         return new AutoValue_VirtualMachineInstance_VirtualMachineStatus(code, level, displayStatus, time);
+      }
+   }
+
+   @Nullable
+   public abstract String platformUpdateDomain();
+
+   @Nullable
+   public abstract String platformFaultDomain();
+
+   @Nullable
+   public abstract List<VirtualMachineStatus> statuses();
+
+
+   @SerializedNames({"platformUpdateDomain", "platformFaultDomain", "statuses"})
+   public static VirtualMachineInstance create(final String platformUpdateDomain, final String platformFaultDomain,
+                                               final List<VirtualMachineStatus> statuses) {
+
+      return new AutoValue_VirtualMachineInstance(platformUpdateDomain, platformFaultDomain, statuses == null ? null : ImmutableList.copyOf(statuses));
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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
new file mode 100644
index 0000000..73afd14
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineProperties.java
@@ -0,0 +1,133 @@
+/*
+ * 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.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+/**
+ * A virtual machine properties for the virtual machine.
+ */
+@AutoValue
+public abstract class VirtualMachineProperties {
+
+   /**
+    * The id of the virtual machine.
+    */
+   @Nullable
+   public abstract String vmId();
+
+   /**
+    * The license type of the virtual machine.
+    */
+   @Nullable
+   public abstract String licenseType();
+
+   /**
+    * The availability set  of the virtual machine
+    */
+   @Nullable
+   public abstract AvailabilitySet availabilitySet();
+
+   /**
+    * The hardware Profile of the virtual machine .
+    */
+   @Nullable
+   public abstract HardwareProfile hardwareProfile();
+
+   /**
+    * The Storage Profile of the virtual machine .
+    */
+   @Nullable
+   public abstract StorageProfile storageProfile();
+
+   /**
+    * The OS Profile of the virtual machine .
+    */
+   @Nullable
+   public abstract OSProfile osProfile();
+
+   /**
+    * The network profile of the VM
+    */
+   @Nullable
+   public abstract NetworkProfile networkProfile();
+
+   /**
+    * The diagnostics profile of the VM
+    */
+   @Nullable
+   public abstract DiagnosticsProfile diagnosticsProfile();
+
+   /**
+    * The provisioning state of the VM
+    */
+   @Nullable
+   public abstract String provisioningState();
+
+   @SerializedNames({"vmId", "licenseType", "availabilitySet", "hardwareProfile", "storageProfile", "osProfile",
+           "networkProfile", "diagnosticsProfile", "provisioningState"})
+   public static VirtualMachineProperties create(final String vmId,
+                                                 final String licenseType,
+                                                 final AvailabilitySet availabilitySet,
+                                                 final HardwareProfile hardwareProfile,
+                                                 final StorageProfile storageProfile,
+                                                 final OSProfile osProfile,
+                                                 final NetworkProfile networkProfile,
+                                                 final DiagnosticsProfile diagnosticsProfile,
+                                                 final String provisioningState) {
+      return builder()
+              .vmId(vmId)
+              .licenseType(licenseType)
+              .availabilitySet(availabilitySet)
+              .hardwareProfile(hardwareProfile)
+              .storageProfile(storageProfile)
+              .osProfile(osProfile)
+              .networkProfile(networkProfile)
+              .diagnosticsProfile(diagnosticsProfile)
+              .provisioningState(provisioningState)
+              .build();
+   }
+
+   public static Builder builder() {
+      return new AutoValue_VirtualMachineProperties.Builder();
+   }
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder vmId(String vmId);
+
+      public abstract Builder licenseType(String licenseType);
+
+      public abstract Builder availabilitySet(AvailabilitySet availabilitySet);
+
+      public abstract Builder hardwareProfile(HardwareProfile hardwareProfile);
+
+      public abstract Builder storageProfile(StorageProfile storageProfile);
+
+      public abstract Builder osProfile(OSProfile osProfile);
+
+      public abstract Builder networkProfile(NetworkProfile networkProfile);
+
+      public abstract Builder diagnosticsProfile(DiagnosticsProfile diagnosticsProfile);
+
+      public abstract Builder provisioningState(String provisioningState);
+
+      public abstract VirtualMachineProperties build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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 a7af6ec..d5eddf0 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
@@ -20,6 +20,7 @@ import static com.google.common.collect.ImmutableList.copyOf;
 
 import java.util.Map;
 import java.util.List;
+import com.google.common.collect.ImmutableList;
 
 import com.google.auto.value.AutoValue;
 import com.google.common.collect.ImmutableMap;
@@ -36,7 +37,7 @@ public abstract class VirtualNetwork {
 
       @SerializedNames({"addressPrefixes"})
       public static AddressSpace create(final List<String> addressPrefixes) {
-         return new AutoValue_VirtualNetwork_AddressSpace(copyOf(addressPrefixes));
+         return new AutoValue_VirtualNetwork_AddressSpace(addressPrefixes == null ? ImmutableList.<String>of() : ImmutableList.copyOf(addressPrefixes));
       }
    }
 
@@ -79,7 +80,14 @@ public abstract class VirtualNetwork {
 
          public abstract Builder subnets(List<Subnet> subnets);
 
-         public abstract VirtualNetworkProperties build();
+         abstract List<Subnet> subnets();
+
+         abstract VirtualNetworkProperties autoBuild();
+
+         public VirtualNetworkProperties build() {
+            subnets(subnets() != null ? ImmutableList.copyOf(subnets()) : null);
+            return autoBuild();
+         }
       }
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/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
new file mode 100644
index 0000000..c7c665d
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/NetworkInterfaceCardApi.java
@@ -0,0 +1,78 @@
+/*
+ * 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 org.jclouds.Fallbacks.EmptyListOnNotFoundOr404;
+import org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCard;
+import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCardProperties;
+import org.jclouds.azurecompute.arm.functions.FalseOn204;
+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.QueryParams;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.rest.annotations.SelectJson;
+import org.jclouds.rest.binders.BindToJsonPayload;
+
+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.core.MediaType;
+import java.util.List;
+import java.util.Map;
+
+@Path("/resourcegroups/{resourcegroup}/providers/Microsoft.Network/networkInterfaces")
+@QueryParams(keys = "api-version", values = "2015-06-15")
+@RequestFilters(OAuthFilter.class)
+@Consumes(MediaType.APPLICATION_JSON)
+
+public interface NetworkInterfaceCardApi {
+
+   @Named("networkinterfacecard:list")
+   @SelectJson("value")
+   @GET
+   @Fallback(EmptyListOnNotFoundOr404.class)
+   List<NetworkInterfaceCard> list();
+
+   @Named("networkinterfacecard:create_or_update")
+   @Path("/{networkinterfacecardname}")
+   @MapBinder(BindToJsonPayload.class)
+   @PUT
+   NetworkInterfaceCard createOrUpdate(@PathParam("networkinterfacecardname") String networkinterfacecardname,
+                                                           @PayloadParam("location") String location,
+                                                           @PayloadParam("properties") NetworkInterfaceCardProperties properties,
+                                                           @PayloadParam("tags") Map<String, String> tags);
+
+   @Named("networkinterfacecard:get")
+   @Path("/{networkinterfacecardname}")
+   @GET
+   @Fallback(NullOnNotFoundOr404.class)
+   NetworkInterfaceCard get(@PathParam("networkinterfacecardname") String networkinterfacecardname);
+
+   @Named("networkinterfacecard:delete")
+   @Path("/{networkinterfacecardname}")
+   @DELETE
+   @ResponseParser(FalseOn204.class)
+   boolean delete(@PathParam("networkinterfacecardname") String networkinterfacecardname);
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3be36289/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/PublicIPAddressApi.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/PublicIPAddressApi.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/PublicIPAddressApi.java
new file mode 100644
index 0000000..2e19fe2
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/PublicIPAddressApi.java
@@ -0,0 +1,78 @@
+/*
+ * 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 org.jclouds.Fallbacks.EmptyListOnNotFoundOr404;
+import org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.azurecompute.arm.domain.PublicIPAddress;
+import org.jclouds.azurecompute.arm.domain.PublicIPAddressProperties;
+import org.jclouds.azurecompute.arm.functions.FalseOn204;
+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.QueryParams;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.rest.annotations.SelectJson;
+import org.jclouds.rest.binders.BindToJsonPayload;
+
+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.core.MediaType;
+import java.util.List;
+import java.util.Map;
+
+@Path("/resourcegroups/{resourcegroup}/providers/Microsoft.Network/publicIPAddresses")
+@QueryParams(keys = "api-version", values = "2015-06-15")
+@RequestFilters(OAuthFilter.class)
+@Consumes(MediaType.APPLICATION_JSON)
+
+public interface PublicIPAddressApi {
+
+   @Named("publicipaddress:list")
+   @SelectJson("value")
+   @GET
+   @Fallback(EmptyListOnNotFoundOr404.class)
+   List<PublicIPAddress> list();
+
+   @Named("publicipaddress:create_or_update")
+   @Path("/{publicipaddressname}")
+   @MapBinder(BindToJsonPayload.class)
+   @PUT
+   PublicIPAddress createOrUpdate(@PathParam("publicipaddressname") String publicipaddressname,
+                                                 @PayloadParam("location") String location,
+                                                 @PayloadParam("tags") Map<String, String> tags,
+                                                 @PayloadParam("properties") PublicIPAddressProperties properties);
+
+   @Named("publicipaddress:get")
+   @Path("/{publicipaddressname}")
+   @GET
+   @Fallback(NullOnNotFoundOr404.class)
+   PublicIPAddress get(@PathParam("publicipaddressname") String publicipaddressname);
+
+   @Named("publicipaddress:delete")
+   @Path("/{publicipaddressname}")
+   @DELETE
+   @ResponseParser(FalseOn204.class)
+   boolean delete(@PathParam("publicipaddressname") String publicipaddressname);
+}