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 2018/01/08 14:52:57 UTC

[36/50] [abbrv] jclouds git commit: JCLOUDS-1342 : Azure-ARM Virtual Machine Scale Set Support

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7368d58a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualMachineScaleSetApi.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualMachineScaleSetApi.java b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualMachineScaleSetApi.java
new file mode 100644
index 0000000..f6a237f
--- /dev/null
+++ b/providers/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualMachineScaleSetApi.java
@@ -0,0 +1,88 @@
+/*
+ * 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.VirtualMachineScaleSet;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetProperties;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetSKU;
+import org.jclouds.azurecompute.arm.filters.ApiVersionFilter;
+import org.jclouds.azurecompute.arm.functions.URIParser;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.oauth.v2.filters.OAuthFilter;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.SelectJson;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.MapBinder;
+import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.rest.binders.BindToJsonPayload;
+
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.PUT;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.MediaType;
+import java.io.Closeable;
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * The Virtual Machine Scale Set API includes operations for managing the virtual machines in your subscription.
+ *
+ * @see <a href="https://docs.microsoft.com/en-us/rest/api/virtualmachinescalesets/">docs</a>
+ */
+@Path("/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/VirtualMachineScaleSets")
+@RequestFilters({OAuthFilter.class, ApiVersionFilter.class})
+@Consumes(MediaType.APPLICATION_JSON)
+public interface VirtualMachineScaleSetApi extends Closeable {
+
+   @Named("virtualmachinescaleset:list")
+   @GET
+   @SelectJson("value")
+   @Fallback(EmptyListOnNotFoundOr404.class)
+   List<VirtualMachineScaleSet> list();
+
+   @Named("virtualmachinescaleset:get")
+   @Path("/{name}")
+   @GET
+   @Fallback(NullOnNotFoundOr404.class)
+   VirtualMachineScaleSet get(@PathParam("name") String name);
+
+   @Named("virtualmachinescaleset:createOrUpdate")
+   @MapBinder(BindToJsonPayload.class)
+   @Path("/{name}")
+   @PUT
+   VirtualMachineScaleSet createOrUpdate(@PathParam("name") String name,
+                                         @PayloadParam("location") String location,
+                                         @PayloadParam("sku") VirtualMachineScaleSetSKU sku,
+                                         @Nullable @PayloadParam("tags") Map<String, String> tags,
+                                         @PayloadParam("properties") VirtualMachineScaleSetProperties properties);
+
+   @Named("virtualmachinescaleset:delete")
+   @Path("/{name}")
+   @DELETE
+   @ResponseParser(URIParser.class)
+   @Fallback(NullOnNotFoundOr404.class)
+   URI delete(@PathParam("name") String name);
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7368d58a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualMachineScaleSetApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualMachineScaleSetApiLiveTest.java b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualMachineScaleSetApiLiveTest.java
new file mode 100644
index 0000000..d827d70
--- /dev/null
+++ b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualMachineScaleSetApiLiveTest.java
@@ -0,0 +1,297 @@
+/*
+ * 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.DataDisk;
+import org.jclouds.azurecompute.arm.domain.Extension;
+import org.jclouds.azurecompute.arm.domain.ExtensionProfile;
+import org.jclouds.azurecompute.arm.domain.ExtensionProfileSettings;
+import org.jclouds.azurecompute.arm.domain.ExtensionProperties;
+import org.jclouds.azurecompute.arm.domain.IdReference;
+import org.jclouds.azurecompute.arm.domain.ImageReference;
+import org.jclouds.azurecompute.arm.domain.IpConfiguration;
+import org.jclouds.azurecompute.arm.domain.IpConfigurationProperties;
+import org.jclouds.azurecompute.arm.domain.ManagedDiskParameters;
+import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCard;
+import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCardProperties;
+import org.jclouds.azurecompute.arm.domain.NetworkInterfaceConfiguration;
+import org.jclouds.azurecompute.arm.domain.NetworkInterfaceConfigurationProperties;
+import org.jclouds.azurecompute.arm.domain.NetworkProfile;
+import org.jclouds.azurecompute.arm.domain.OSDisk;
+import org.jclouds.azurecompute.arm.domain.StorageProfile;
+import org.jclouds.azurecompute.arm.domain.Subnet;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSet;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetDNSSettings;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetIpConfiguration;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetIpConfigurationProperties;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetNetworkProfile;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetNetworkSecurityGroup;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetOSProfile;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetProperties;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetPublicIPAddressConfiguration;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetPublicIPAddressProperties;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetSKU;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetUpgradePolicy;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetVirtualMachineProfile;
+import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiLiveTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Arrays;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+@Test(groups = "live", testName = "VirtualMachineScaleSetApiLiveTest")
+public class VirtualMachineScaleSetApiLiveTest extends BaseAzureComputeApiLiveTest {
+
+   private String subscriptionid;
+   private String vmssName;
+   private VirtualMachineScaleSetSKU SKU;
+   private String nicName;
+   private String virtualNetworkName;
+   private String subnetId;
+   private Subnet subnet;
+
+   @BeforeClass
+   @Override
+   public void setup() {
+      super.setup();
+      subscriptionid = getSubscriptionId();
+
+      createTestResourceGroup();  //BASE: Creates a random resource group using the properties location
+
+      virtualNetworkName = String.format("vn-%s-%s", this.getClass().getSimpleName().toLowerCase(), System.getProperty("user.name"));
+
+      // Subnets belong to a virtual network so that needs to be created first
+      assertNotNull(createDefaultVirtualNetwork(resourceGroupName, virtualNetworkName, "10.2.0.0/16", LOCATION));
+
+      //Subnet needs to be up & running before NIC can be created
+      String subnetName = String.format("s-%s-%s", this.getClass().getSimpleName().toLowerCase(), System.getProperty("user.name"));
+      this.subnet = createDefaultSubnet(resourceGroupName, subnetName, virtualNetworkName, "10.2.0.0/23");
+      assertNotNull(subnet);
+      assertNotNull(subnet.id());
+      this.subnetId = subnet.id();
+
+
+      vmssName = String.format("%3.24s", System.getProperty("user.name") + RAND + this.getClass().getSimpleName()).toLowerCase().substring(0, 15);
+   }
+
+   private VirtualMachineScaleSetApi api() {
+      return api.getVirtualMachineScaleSetApi(resourceGroupName);
+   }
+
+   @Test
+   public void testCreate() {
+      VirtualMachineScaleSet vmss = api().createOrUpdate(vmssName, LOCATIONDESCRIPTION, getSKU(),
+         Collections.<String, String>emptyMap(), getProperties());
+      assertTrue(!vmss.name().isEmpty());
+//      waitUntilReady(vmssName);
+   }
+
+   @Test(dependsOnMethods = "testCreate")
+   public void testList() throws InterruptedException {
+      final VirtualMachineScaleSetApi vmssAPI = api.getVirtualMachineScaleSetApi(resourceGroupName);
+      assertEquals(vmssAPI.list().size(), 1);
+   }
+
+   @Test(dependsOnMethods = "testList")
+   public void testGet()  {
+      final VirtualMachineScaleSetApi vmssAPI = api.getVirtualMachineScaleSetApi(resourceGroupName);
+      assertEquals(vmssAPI.get(vmssName).name(), vmssName);
+   }
+
+   @Test(dependsOnMethods = "testGet", alwaysRun = true)
+   public void testDelete() throws Exception {
+      final VirtualMachineScaleSetApi vmssAPI = api.getVirtualMachineScaleSetApi(resourceGroupName);
+      URI uri = vmssAPI.delete(vmssName);
+      assertResourceDeleted(uri);
+   }
+
+   protected void assertResourceDeleted(URI uri) {
+      if (uri != null) {
+         assertTrue(resourceDeleted.apply(uri),
+                 String.format("Resource %s was not terminated in the configured timeout", uri));
+      }
+   }
+
+
+   /**
+    * Create a standard SKU
+    *
+    * @return VirtualMachineScaleSetSKU
+    */
+   public VirtualMachineScaleSetSKU getSKU() {
+      return VirtualMachineScaleSetSKU.create("Standard_A1", "Standard", 10);
+   }
+
+   private VirtualMachineScaleSetUpgradePolicy getUpgradePolicy() {
+      return VirtualMachineScaleSetUpgradePolicy.create("Manual");
+   }
+
+   private List<DataDisk> getDataDisks() {
+      List<DataDisk> datadisks = new ArrayList<DataDisk>();
+
+      datadisks.add(DataDisk.create(null, "10", 1, null,
+         null, "FromImage",
+         "None", getManagedDiskParameters(),
+         null));
+
+      return datadisks;
+   }
+
+   private StorageProfile getStorageProfile() {
+      return StorageProfile.create(getWindowsImageReference(), getWindowsOSDisk(), getDataDisks());
+   }
+
+   private StorageProfile getWindowsStorageProfile_Default() {
+      return StorageProfile.create(getWindowsImageReference(), getWindowsOSDisk(), null);
+   }
+
+   private StorageProfile getLinuxStorageProfile_Default() {
+      return StorageProfile.create(getLinuxImageReference(), getLinuxOSDisk(), null);
+   }
+
+   private ManagedDiskParameters getManagedDiskParameters() {
+      return ManagedDiskParameters.create(null, "Standard_LRS");
+   }
+
+   private OSDisk getWindowsOSDisk() {
+      return OSDisk.create("Windows", null, null, null, "FromImage",
+         null, getManagedDiskParameters(), null);
+   }
+
+   private OSDisk getLinuxOSDisk() {
+      return OSDisk.create("Linux", null, null, null, "FromImage",
+         null, getManagedDiskParameters(), null);
+   }
+
+   private ImageReference getWindowsImageReference() {
+      return ImageReference.create(null, "Microsoft.Windows", "Windows2016",
+         "Enterprise", "latest");
+   }
+
+   private ImageReference getLinuxImageReference() {
+      return ImageReference.create(null, "Canonical", "UbuntuServer",
+         "16.04-LTS", "latest");
+   }
+
+   private VirtualMachineScaleSetOSProfile getOSProfile() {
+      VirtualMachineScaleSetOSProfile.LinuxConfiguration linuxConfiguration =
+         VirtualMachineScaleSetOSProfile.LinuxConfiguration.create(false, null);
+      VirtualMachineScaleSetOSProfile.WindowsConfiguration windowsConfiguration = null;
+
+      return VirtualMachineScaleSetOSProfile.create(vmssName, "jclouds", "jClouds1!",
+         linuxConfiguration, windowsConfiguration, null);
+   }
+
+
+   private VirtualMachineScaleSetNetworkProfile getNetworkProfile() {
+      List<NetworkProfile.NetworkInterface> networkInterfacesList = new ArrayList<NetworkProfile.NetworkInterface>();
+
+      NetworkInterfaceCard nic = createNetworkInterfaceCard(resourceGroupName, "jc-nic-" + RAND, LOCATION, "ipConfig-" + RAND);
+      assertNotNull(nic);
+      networkInterfacesList.add(NetworkProfile.NetworkInterface.create(nic.id(), NetworkProfile.NetworkInterface.NetworkInterfaceProperties.create(true)));
+
+      List<NetworkInterfaceConfiguration> networkInterfaceConfigurations = new ArrayList<NetworkInterfaceConfiguration>();
+      List<VirtualMachineScaleSetIpConfiguration> virtualMachineScaleSetIpConfigurations = new ArrayList<VirtualMachineScaleSetIpConfiguration>();
+
+
+      VirtualMachineScaleSetPublicIPAddressConfiguration publicIPAddressConfiguration =
+         VirtualMachineScaleSetPublicIPAddressConfiguration.create("pub1", VirtualMachineScaleSetPublicIPAddressProperties.create(15));
+
+
+      VirtualMachineScaleSetIpConfigurationProperties virtualMachineScaleSetIpConfigurationProperties =
+         VirtualMachineScaleSetIpConfigurationProperties.create(publicIPAddressConfiguration,
+            this.subnet, "IPv4", null,
+            null, null);
+
+      VirtualMachineScaleSetIpConfiguration virtualMachineScaleSetIpConfiguration =
+         VirtualMachineScaleSetIpConfiguration.create("ipconfig1", virtualMachineScaleSetIpConfigurationProperties);
+
+      virtualMachineScaleSetIpConfigurations.add(virtualMachineScaleSetIpConfiguration);
+
+      VirtualMachineScaleSetNetworkSecurityGroup networkSecurityGroup = null;
+
+      ArrayList<String> dnsList = new ArrayList<String>();
+      dnsList.add("8.8.8.8");
+      VirtualMachineScaleSetDNSSettings dnsSettings =  VirtualMachineScaleSetDNSSettings.create(dnsList);
+
+      NetworkInterfaceConfigurationProperties networkInterfaceConfigurationProperties =
+         NetworkInterfaceConfigurationProperties.create(true, false, networkSecurityGroup, dnsSettings, virtualMachineScaleSetIpConfigurations);
+      NetworkInterfaceConfiguration networkInterfaceConfiguration = NetworkInterfaceConfiguration.create("nicconfig1", networkInterfaceConfigurationProperties);
+      networkInterfaceConfigurations.add(networkInterfaceConfiguration);
+
+      return VirtualMachineScaleSetNetworkProfile.create(networkInterfaceConfigurations);
+   }
+
+
+   private ExtensionProfile getExtensionProfile() {
+      List<Extension> extensions = new ArrayList<Extension>();
+
+      List<String> uris = new ArrayList<String>();
+      uris.add("https://mystorage1.blob.core.windows.net/winvmextekfacnt/SampleCmd_1.cmd");
+      ExtensionProfileSettings extensionProfileSettings = ExtensionProfileSettings.create(uris, "SampleCmd_1.cmd");
+
+      Map<String, String> protectedSettings = new HashMap<String, String>();
+      protectedSettings.put("StorageAccountKey", "jclouds-accountkey");
+
+      ExtensionProperties extensionProperties = ExtensionProperties.create("Microsoft.compute", "CustomScriptExtension",
+         "1.1", false, extensionProfileSettings,
+         protectedSettings);
+
+      Extension extension = Extension.create("extensionName", extensionProperties);
+      extensions.add(extension);
+
+      return ExtensionProfile.create(extensions);
+   }
+
+
+   private VirtualMachineScaleSetVirtualMachineProfile getVirtualMachineProfile() {
+      return VirtualMachineScaleSetVirtualMachineProfile.create(getLinuxStorageProfile_Default(), getOSProfile(), getNetworkProfile(), getExtensionProfile());
+   }
+
+   public VirtualMachineScaleSetProperties getProperties() {
+
+      return VirtualMachineScaleSetProperties.create(null, null, getUpgradePolicy(), null, getVirtualMachineProfile());
+   }
+
+   private NetworkInterfaceCard createNetworkInterfaceCard(final String resourceGroupName, String networkInterfaceCardName, String locationName, String ipConfigurationName) {
+      //Create properties object
+      final NetworkInterfaceCardProperties networkInterfaceCardProperties = NetworkInterfaceCardProperties
+         .builder()
+         .ipConfigurations(
+            Arrays.asList(IpConfiguration.create(ipConfigurationName, null, null, null, IpConfigurationProperties
+               .create(null, null, "Dynamic", IdReference.create(subnetId), null, null, null)))).build();
+
+      final Map<String, String> tags = ImmutableMap.of("jclouds", "livetest");
+      return api.getNetworkInterfaceCardApi(resourceGroupName).createOrUpdate(networkInterfaceCardName, locationName, networkInterfaceCardProperties, tags);
+   }
+
+   public String getSubscriptionid() {
+      return subscriptionid;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7368d58a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualMachineScaleSetApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualMachineScaleSetApiMockTest.java b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualMachineScaleSetApiMockTest.java
new file mode 100644
index 0000000..e0420fa
--- /dev/null
+++ b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualMachineScaleSetApiMockTest.java
@@ -0,0 +1,453 @@
+/*
+ * 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.DataDisk;
+import org.jclouds.azurecompute.arm.domain.Extension;
+import org.jclouds.azurecompute.arm.domain.ExtensionProfile;
+import org.jclouds.azurecompute.arm.domain.ExtensionProfileSettings;
+import org.jclouds.azurecompute.arm.domain.ExtensionProperties;
+import org.jclouds.azurecompute.arm.domain.IdReference;
+import org.jclouds.azurecompute.arm.domain.ImageReference;
+import org.jclouds.azurecompute.arm.domain.ManagedDiskParameters;
+import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCard;
+import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCardProperties;
+import org.jclouds.azurecompute.arm.domain.NetworkInterfaceConfiguration;
+import org.jclouds.azurecompute.arm.domain.NetworkInterfaceConfigurationProperties;
+import org.jclouds.azurecompute.arm.domain.NetworkProfile;
+import org.jclouds.azurecompute.arm.domain.OSDisk;
+import org.jclouds.azurecompute.arm.domain.Secrets;
+import org.jclouds.azurecompute.arm.domain.StorageProfile;
+import org.jclouds.azurecompute.arm.domain.Subnet;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSet;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetDNSSettings;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetIpConfiguration;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetIpConfigurationProperties;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetNetworkProfile;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetOSProfile;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetProperties;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetPublicIPAddressConfiguration;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetPublicIPAddressProperties;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetSKU;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetUpgradePolicy;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineScaleSetVirtualMachineProfile;
+import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiMockTest;
+import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.google.common.collect.Iterables.isEmpty;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+
+@Test(groups = "unit", testName = "VirtualMachineScaleSetAPIMockTest", singleThreaded = true)
+public class VirtualMachineScaleSetApiMockTest extends BaseAzureComputeApiMockTest {
+
+   private final String resourcegroup = "myresourcegroup";
+   private final String vmssname = "jclouds-vmssname";
+
+   public void testGet() throws InterruptedException {
+      server.enqueue(jsonResponse("/virtualmachinescalesetget.json").setResponseCode(200));
+      final VirtualMachineScaleSetApi vmssAPI = api.getVirtualMachineScaleSetApi(resourcegroup);
+      assertEquals(vmssAPI.get(vmssname).name(), vmssname);
+      assertSent(server,
+              "GET", "/subscriptions/SUBSCRIPTIONID/resourceGroups/myresourcegroup/" +
+                      "providers/Microsoft.Compute"
+            + "/VirtualMachineScaleSets/jclouds-vmssname?api-version=2017-03-30");
+   }
+
+   public void testGetWhen404() throws InterruptedException {
+      server.enqueue(jsonResponse("/virtualmachinescalesetgetwhen404.json").setResponseCode(404));
+      final VirtualMachineScaleSetApi vmssAPI = api.getVirtualMachineScaleSetApi(resourcegroup);
+      VirtualMachineScaleSet vmss = vmssAPI.get(vmssname + 1);
+      assertSent(server,
+              "GET",
+              "/subscriptions/SUBSCRIPTIONID/resourceGroups/myresourcegroup/providers/" +
+                      "Microsoft.Compute/VirtualMachineScaleSets/" +
+                      vmssname + "1?api-version=2017-03-30");
+      assertNull(vmss);
+   }
+
+   public void testCreateOrUpdate() throws InterruptedException {
+      server.enqueue(
+              jsonResponse(
+                      "/virtualmachinescalesetresponsecreateorupdate.json").setResponseCode(200));
+      final VirtualMachineScaleSetApi vmssAPI = api.getVirtualMachineScaleSetApi(resourcegroup);
+      VirtualMachineScaleSet vmss = CreateOrUpdateVMSS(vmssAPI);
+
+      assertNotNull(vmss);
+      assertSent(server,
+              "PUT",
+              "/subscriptions/SUBSCRIPTIONID/resourceGroups/myresourcegroup/providers/" +
+                      "Microsoft.Compute"
+                      + "/VirtualMachineScaleSets/" + vmssname + "?api-version=2017-03-30",
+              "{\n" +
+                      "  \"location\": \"eastus\",\n" +
+                      "  \"sku\": {\n" +
+                      "    \"name\": \"Standard_A1\",\n" +
+                      "    \"tier\": \"Standard\",\n" +
+                      "    \"capacity\": 10\n" +
+                      "  },\n" +
+                      "  \"properties\": {\n" +
+                      "    \"singlePlacementGroup\": true,\n" +
+                      "    \"overProvision\": true,\n" +
+                      "    \"upgradePolicy\": {\n" +
+                      "      \"mode\": \"Manual\"\n" +
+                      "    },\n" +
+                      "    \"virtualMachineProfile\": {\n" +
+                      "      \"storageProfile\": {\n" +
+                      "        \"imageReference\": {\n" +
+                      "          \"publisher\": \"Canonical\",\n" +
+                      "          \"offer\": \"UbuntuServer\",\n" +
+                      "          \"sku\": \"16.04-LTS\",\n" +
+                      "          \"version\": \"latest\"\n" +
+                      "        },\n" +
+                      "        \"osDisk\": {\n" +
+                      "          \"osType\": \"Windows\",\n" +
+                      "          \"createOption\": \"FromImage\",\n" +
+                      "          \"managedDisk\": {\n" +
+                      "            \"storageAccountType\": \"Standard_LRS\"\n" +
+                      "          }\n" +
+                      "        },\n" +
+                      "        \"dataDisks\": [{\n" +
+                      "          \"diskSizeGB\": \"10\",\n" +
+                      "          \"lun\": 1,\n" +
+                      "          \"createOption\": \"Unrecognized\",\n" +
+                      "          \"caching\": \"None\",\n" +
+                      "          \"managedDisk\": {\n" +
+                      "            \"storageAccountType\": \"Standard_LRS\"\n" +
+                      "          }\n" +
+                      "        }\n" +
+                      "        ]\n" +
+                      "      },\n" +
+                      "      \"osProfile\": {\n" +
+                      "        \"computerNamePrefix\": \"jclouds-vmssname\",\n" +
+                      "        \"adminUsername\": \"admin\",\n" +
+                      "        \"adminPassword\": \"password\",\n" +
+                      "        \"linuxConfiguration\": {\n" +
+                      "          \"disablePasswordAuthentication\": false\n" +
+                      "        },\n" +
+                      "        \"secrets\": []\n" +
+                      "      },\n" +
+                      "      \"networkProfile\": {\n" +
+                      "        \"networkInterfaceConfigurations\": [{\n" +
+                      "          \"name\": \"nicconfig1\",\n" +
+                      "          \"properties\": {\n" +
+                      "            \"primary\": true,\n" +
+                      "            \"enableAcceleratedNetworking\": false,\n" +
+                      "            \"dnsSettings\": {\n" +
+                      "              \"dnsServers\": [\"8.8.8.8\"]\n" +
+                      "            },\n" +
+                      "            \"ipConfigurations\": [{\n" +
+                      "              \"name\": \"ipconfig1\",\n" +
+                      "              \"properties\": {\n" +
+                      "                \"publicIPAddressConfiguration\": {\n" +
+                      "                  \"name\": \"pub1\",\n" +
+                      "                  \"properties\": {\n" +
+                      "                    \"idleTimeoutInMinutes\": 15\n" +
+                      "                  }\n" +
+                      "                },\n" +
+                      "                \"subnet\": {\n" +
+                      "                  \"name\": \"virtualNetworkName\",\n" +
+                      "                  \"id\": \"/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxx/resourceGroups/" +
+                      "jcloud-eastus/providers/Microsoft.Network/virtualNetworks/" +
+                      "jclouds-eastus-virtualNetworkName/subnets/jclouds-eastus-subnet\",\n" +
+                      "                  \"properties\": {}\n" +
+                      "                },\n" +
+                      "                \"privateIPAddressVersion\": \"IPv4\",\n" +
+                      "                \"loadBalancerBackendAddressPools\": [],\n" +
+                      "                \"loadBalancerInboundNatPools\": []\n" +
+                      "              }\n" +
+                      "            }\n" +
+                      "            ]\n" +
+                      "          }\n" +
+                      "        }\n" +
+                      "        ]\n" +
+                      "      },\n" +
+                      "      \"extensionProfile\": {\n" +
+                      "        \"extensions\": [{\n" +
+                      "          \"name\": \"extensionName\",\n" +
+                      "          \"properties\": {\n" +
+                      "            \"publisher\": \"Microsoft.compute\",\n" +
+                      "            \"type\": \"CustomScriptExtension\",\n" +
+                      "            \"typeHandlerVersion\": \"1.1\",\n" +
+                      "            \"autoUpgradeMinorVersion\": false,\n" +
+                      "            \"settings\": {\n" +
+                      "              \"fileUris\": [\"https://mystorage1.blob.core.windows.net/winvmextekfacnt/" +
+                      "SampleCmd_1.cmd\"],\n" +
+                      "              \"commandToExecute\": \"SampleCmd_1.cmd\"\n" +
+                      "            },\n" +
+                      "            \"protectedSettings\": {\n" +
+                      "              \"StorageAccountKey\": \"jclouds-accountkey\"\n" +
+                      "            }\n" +
+                      "          }\n" +
+                      "        }\n" +
+                      "        ]\n" +
+                      "      }\n" +
+                      "    }\n" +
+                      "  }\n" +
+                      "}\n"
+              );
+   }
+
+   private VirtualMachineScaleSet CreateOrUpdateVMSS(VirtualMachineScaleSetApi vmssAPI) {
+      return vmssAPI.createOrUpdate(
+              vmssname,
+              "eastus",
+              VirtualMachineScaleSetSKU.create(
+                      "Standard_A1",
+                      "Standard",
+                      10),
+              null,
+              VirtualMachineScaleSetProperties.create(
+                      true,
+                      true,
+                      VirtualMachineScaleSetUpgradePolicy.create("Manual"),
+                      null,
+                      VirtualMachineScaleSetVirtualMachineProfile.create(
+                              StorageProfile.create(
+                                      ImageReference.create(
+                                              null,
+                                              "Canonical",
+                                              "UbuntuServer",
+                                              "16.04-LTS",
+                                              "latest"),
+                                      OSDisk.create(
+                                              "Windows",
+                                              null,
+                                              null,
+                                              null,
+                                              "FromImage",
+                                              null,
+                                              ManagedDiskParameters.create(
+                                                      null,
+                                                      "Standard_LRS"),
+                                              null),
+                                      Arrays.asList(DataDisk.create(
+                                              null,
+                                              "10",
+                                              1,
+                                              null,
+                                              null,
+                                              "FromImage",
+                                              "None",
+                                              ManagedDiskParameters.create(
+                                                      null,
+                                                      "Standard_LRS"),
+                                              null))),
+                              VirtualMachineScaleSetOSProfile.create(
+                                      "jclouds-vmssname",
+                                      "admin",
+                                      "password",
+                                      VirtualMachineScaleSetOSProfile.LinuxConfiguration.create(
+                                              false,
+                                              null),
+                                      null,
+                                      new ArrayList<Secrets>()),
+                              getNetworkProfile(),
+                              getExtensionProfile()
+
+                      )
+              ));
+   }
+
+
+   private VirtualMachineScaleSetNetworkProfile getNetworkProfile() {
+      List<NetworkProfile.NetworkInterface> networkInterfacesList =
+              new ArrayList<NetworkProfile.NetworkInterface>();
+
+      NetworkInterfaceCard nic =
+              createNetworkInterfaceCard(
+                      "jc-nic-" + 123,
+                      "eastus");
+      networkInterfacesList.add(NetworkProfile.NetworkInterface.create(
+              nic.id(),
+              NetworkProfile.NetworkInterface.NetworkInterfaceProperties.create(true)));
+
+      List<NetworkInterfaceConfiguration> networkInterfaceConfigurations =
+              new ArrayList<NetworkInterfaceConfiguration>();
+      List<VirtualMachineScaleSetIpConfiguration> virtualMachineScaleSetIpConfigurations =
+              new ArrayList<VirtualMachineScaleSetIpConfiguration>();
+
+
+      VirtualMachineScaleSetPublicIPAddressConfiguration publicIPAddressConfiguration =
+              VirtualMachineScaleSetPublicIPAddressConfiguration.create(
+                      "pub1",
+                      VirtualMachineScaleSetPublicIPAddressProperties.create(15));
+
+
+      VirtualMachineScaleSetIpConfigurationProperties virtualMachineScaleSetIpConfigurationProperties =
+              VirtualMachineScaleSetIpConfigurationProperties.create(
+                      publicIPAddressConfiguration,
+                      createDefaultSubnet(
+                              "virtualNetworkName"
+                      ),
+                      "IPv4",
+                      null,
+                      null,
+                      null);
+
+      VirtualMachineScaleSetIpConfiguration virtualMachineScaleSetIpConfiguration =
+              VirtualMachineScaleSetIpConfiguration.create(
+                      "ipconfig1",
+                      virtualMachineScaleSetIpConfigurationProperties);
+
+      virtualMachineScaleSetIpConfigurations.add(virtualMachineScaleSetIpConfiguration);
+
+      ArrayList<String> dnsList = new ArrayList<String>();
+      dnsList.add("8.8.8.8");
+      VirtualMachineScaleSetDNSSettings dnsSettings =  VirtualMachineScaleSetDNSSettings.create(dnsList);
+
+      NetworkInterfaceConfigurationProperties networkInterfaceConfigurationProperties =
+              NetworkInterfaceConfigurationProperties.create(
+                      true,
+                      false,
+                      null,
+                      dnsSettings,
+                      virtualMachineScaleSetIpConfigurations);
+      NetworkInterfaceConfiguration networkInterfaceConfiguration =
+              NetworkInterfaceConfiguration.create(
+                      "nicconfig1",
+                      networkInterfaceConfigurationProperties);
+      networkInterfaceConfigurations.add(networkInterfaceConfiguration);
+
+      return VirtualMachineScaleSetNetworkProfile.create(networkInterfaceConfigurations);
+   }
+
+
+   private NetworkInterfaceCard createNetworkInterfaceCard(
+           String networkInterfaceCardName, String locationName) {
+      //Create properties object
+      NetworkInterfaceCardProperties networkInterfaceCardProperties =
+              NetworkInterfaceCardProperties.create(
+                      null,
+                      null,
+                      false,
+                      null,
+                      IdReference.create(
+                              "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxx/resourceGroups/" +
+                                      "jcloud-eastus/providers/" +
+                                      "Microsoft.Network/virtualNetworks/" +
+                                      "jclouds-eastus-virtualNetworkName/subnets/" +
+                                      "jclouds-eastus-subnet")
+              );
+
+      Map<String, String> tags = ImmutableMap.of("jclouds", "livetest");
+      return NetworkInterfaceCard.create(
+              networkInterfaceCardName,
+              "",
+              null,
+              locationName,
+              networkInterfaceCardProperties, tags);
+   }
+
+   protected Subnet createDefaultSubnet(final String subnetName) {
+      Subnet.SubnetProperties properties = Subnet.SubnetProperties.create(
+              null,
+              null,
+              null);
+      return Subnet.create(
+              subnetName,
+              "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxx/resourceGroups/jcloud-eastus/providers/" +
+                      "Microsoft.Network/virtualNetworks/jclouds-eastus-virtualNetworkName/subnets/" +
+                      "jclouds-eastus-subnet",
+              null,
+              properties);
+   }
+
+   private ExtensionProfile getExtensionProfile() {
+      List<Extension> extensions = new ArrayList<Extension>();
+
+      List<String> uris = new ArrayList<String>();
+      uris.add("https://mystorage1.blob.core.windows.net/winvmextekfacnt/SampleCmd_1.cmd");
+
+      Map<String, String> protectedSettings = new HashMap<String, String>();
+      protectedSettings.put("StorageAccountKey", "jclouds-accountkey");
+
+      Extension extension = Extension.create(
+              "extensionName",
+              ExtensionProperties.create(
+                      "Microsoft.compute",
+                      "CustomScriptExtension",
+                      "1.1",
+                      false,
+                      ExtensionProfileSettings.create(
+                              uris,
+                              "SampleCmd_1.cmd"),
+                      protectedSettings));
+      extensions.add(extension);
+
+      return ExtensionProfile.create(extensions);
+   }
+
+   public void testList() throws InterruptedException {
+      server.enqueue(jsonResponse("/virtualmachinescalesetlist.json").setResponseCode(200));
+      final VirtualMachineScaleSetApi vmssAPI = api.getVirtualMachineScaleSetApi(resourcegroup);
+      assertEquals(vmssAPI.list().size(), 1);
+      assertSent(server,
+              "GET",
+              "/subscriptions/SUBSCRIPTIONID/resourceGroups/myresourcegroup/providers/" +
+                      "Microsoft.Compute"
+              + "/VirtualMachineScaleSets?api-version=2017-03-30");
+   }
+
+   public void testListWhen404() throws InterruptedException {
+      server.enqueue(
+              jsonResponse("/virtualmachinescalesetlistwhen404.json").setResponseCode(404));
+      final VirtualMachineScaleSetApi vmssAPI = api.getVirtualMachineScaleSetApi(
+              resourcegroup + "1");
+      List<VirtualMachineScaleSet> vmssList = vmssAPI.list();
+      assertSent(server,
+              "GET",
+              "/subscriptions/SUBSCRIPTIONID/resourceGroups/myresourcegroup1/providers/" +
+                      "Microsoft.Compute"
+              + "/VirtualMachineScaleSets?api-version=2017-03-30");
+      assertTrue(isEmpty(vmssList));
+   }
+
+
+   public void testDeleteWhen404() throws InterruptedException {
+      server.enqueue(jsonResponse("/virtualmachinescalesetlist.json").setResponseCode(404));
+      final VirtualMachineScaleSetApi vmssAPI = api.getVirtualMachineScaleSetApi(resourcegroup);
+      assertNull(vmssAPI.delete(vmssname));
+      assertSent(server,
+              "DELETE",
+              "/subscriptions/SUBSCRIPTIONID/resourceGroups/myresourcegroup/providers/" +
+                      "Microsoft.Compute"
+              + "/VirtualMachineScaleSets/" + vmssname + "?api-version=2017-03-30");
+
+   }
+
+   public void testDelete() throws InterruptedException {
+      server.enqueue(response202WithHeader());
+      final VirtualMachineScaleSetApi vmssAPI = api.getVirtualMachineScaleSetApi(resourcegroup);
+      assertNotNull(vmssAPI.delete(vmssname));
+      assertSent(server,
+              "DELETE",
+              "/subscriptions/SUBSCRIPTIONID/resourceGroups/myresourcegroup/providers/" +
+                      "Microsoft.Compute"
+              + "/VirtualMachineScaleSets/jclouds-vmssname?api-version=2017-03-30");
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7368d58a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/internal/BaseAzureComputeApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/internal/BaseAzureComputeApiMockTest.java b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/internal/BaseAzureComputeApiMockTest.java
index f704e5f..1a83407 100644
--- a/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/internal/BaseAzureComputeApiMockTest.java
+++ b/providers/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/internal/BaseAzureComputeApiMockTest.java
@@ -75,6 +75,7 @@ public class BaseAzureComputeApiMockTest {
    
    protected Properties setupProperties() {
       Properties properties = new Properties();
+
       properties.put(CREDENTIAL_TYPE, BEARER_TOKEN_CREDENTIALS.toString());
       properties.put("oauth.endpoint", "https://login.microsoftonline.com/tenant-id/oauth2/token");
       return properties;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7368d58a/providers/azurecompute-arm/src/test/resources/virtualmachine.json
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/test/resources/virtualmachine.json b/providers/azurecompute-arm/src/test/resources/virtualmachine.json
index 17d89b5..e3e8d6b 100644
--- a/providers/azurecompute-arm/src/test/resources/virtualmachine.json
+++ b/providers/azurecompute-arm/src/test/resources/virtualmachine.json
@@ -36,7 +36,6 @@
             "id": "/subscriptions/SUBSCRIPTIONID/resourceGroups/myResourceGroup/providers/Microsoft.Compute/disks/osDisk",
             "storageAccountType": "Standard_LRS"
           },
-          "createOption":"Empty",
           "caching": "ReadWrite"
         }
       ]

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7368d58a/providers/azurecompute-arm/src/test/resources/virtualmachinescalesetget.json
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/test/resources/virtualmachinescalesetget.json b/providers/azurecompute-arm/src/test/resources/virtualmachinescalesetget.json
new file mode 100644
index 0000000..c99eb39
--- /dev/null
+++ b/providers/azurecompute-arm/src/test/resources/virtualmachinescalesetget.json
@@ -0,0 +1,64 @@
+{
+  "sku": {
+    "name": "Standard_A1",
+    "tier": "Standard",
+    "capacity": 4
+  },
+  "properties": {
+    "singlePlacementGroup": true,
+    "upgradePolicy": {
+      "mode": "Manual"
+    },
+    "virtualMachineProfile": {
+      "osProfile": {
+        "computerNamePrefix": "vmmsprefix",
+        "adminUsername": "jclouds",
+        "linuxConfiguration": {
+          "disablePasswordAuthentication": false
+        },
+        "secrets": []
+      },
+      "storageProfile": {
+        "osDisk": {
+          "createOption": "FromImage",
+          "caching": "None",
+          "managedDisk": {
+            "storageAccountType": "Standard_LRS"
+          }
+        },
+        "imageReference": {
+          "publisher": "Canonical",
+          "offer": "UbuntuServer",
+          "sku": "16.04-LTS",
+          "version": "latest"
+        }
+      },
+      "networkProfile": {"networkInterfaceConfigurations":[{"name":"nicconfig1","properties":{"primary":true,"enableAcceleratedNetworking":false,"dnsSettings":{"dnsServers":["8.8.8.8"]},"ipConfigurations":[{"name":"ipconfig1","properties":{"publicIPAddressConfiguration":{"name":"pub1","properties":{"idleTimeoutInMinutes":15}},"subnet":{"id":"/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxx/resourceGroups/jcloud-eastus/providers/Microsoft.Network/virtualNetworks/jclouds-eastus-virtualNetworkName/subnets/jclouds-eastus-subnet"},"privateIPAddressVersion":"IPv4"}}]}}]},
+      "extensionProfile": {
+        "extensions": [
+          {
+            "properties": {
+              "publisher": "Microsoft.compute",
+              "type": "CustomScriptExtension",
+              "typeHandlerVersion": "1.1",
+              "autoUpgradeMinorVersion": false,
+              "settings": {"fileUris":["https://mystorage1.blob.core.windows.net/winvmextekfacnt/SampleCmd_1.cmd"],"commandToExecute":"SampleCmd_1.cmd"}
+            },
+            "name": "extensionName"
+          }
+        ]
+      }
+    },
+    "provisioningState": "Creating",
+    "overprovision": true,
+    "uniqueId": "xxxxx-xxxx-xxxx-xxxx-xxxxxx"
+  },
+  "type": "Microsoft.Compute/virtualMachineScaleSets",
+  "location": "eastus",
+  "tags": {
+    "test": "test"
+  },
+  "id": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxx/resourceGroups/jcloud-eastus/providers/Microsoft.Compute/virtualMachineScaleSets/jclouds-vmssname",
+  "name": "jclouds-vmssname"
+}
+

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7368d58a/providers/azurecompute-arm/src/test/resources/virtualmachinescalesetgetwhen404.json
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/test/resources/virtualmachinescalesetgetwhen404.json b/providers/azurecompute-arm/src/test/resources/virtualmachinescalesetgetwhen404.json
new file mode 100644
index 0000000..b6fbeaa
--- /dev/null
+++ b/providers/azurecompute-arm/src/test/resources/virtualmachinescalesetgetwhen404.json
@@ -0,0 +1,6 @@
+{
+  "error": {
+    "code": "ResourceNotFound",
+    "message": "The Resource 'Microsoft.Compute/virtualMachineScaleSets/jclouds-vmssname1' under resource group 'jcloud-eastus' was not found."
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7368d58a/providers/azurecompute-arm/src/test/resources/virtualmachinescalesetlist.json
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/test/resources/virtualmachinescalesetlist.json b/providers/azurecompute-arm/src/test/resources/virtualmachinescalesetlist.json
new file mode 100644
index 0000000..b5bd063
--- /dev/null
+++ b/providers/azurecompute-arm/src/test/resources/virtualmachinescalesetlist.json
@@ -0,0 +1,93 @@
+{
+  "value": [{
+    "sku": {
+      "name": "Standard_A1",
+      "tier": "Standard",
+      "capacity": 4
+    },
+    "properties": {
+      "singlePlacementGroup": true,
+      "upgradePolicy": {
+        "mode": "Manual",
+        "automaticOSUpgrade": false
+      },
+      "virtualMachineProfile": {
+        "osProfile": {
+          "computerNamePrefix": "vmmsprefix",
+          "adminUsername": "jclouds",
+          "linuxConfiguration": {
+            "disablePasswordAuthentication": false
+          },
+          "secrets": []
+        },
+        "storageProfile": {
+          "osDisk": {
+            "createOption": "FromImage",
+            "caching": "None",
+            "managedDisk": {
+              "storageAccountType": "Standard_LRS"
+            }
+          },
+          "imageReference": {
+            "publisher": "Canonical",
+            "offer": "UbuntuServer",
+            "sku": "16.04-LTS",
+            "version": "latest"
+          }
+        },
+        "networkProfile": {
+          "networkInterfaceConfigurations": [{
+            "name": "nicconfig1",
+            "properties": {
+              "primary": true,
+              "enableAcceleratedNetworking": false,
+              "dnsSettings": {
+                "dnsServers": ["8.8.8.8"]
+              },
+              "ipConfigurations": [{
+                "name": "ipconfig1",
+                "properties": {
+                  "publicIPAddressConfiguration": {
+                    "name": "pub1",
+                    "properties": {
+                      "idleTimeoutInMinutes": 15
+                    }
+                  },
+                  "subnet": {
+                    "id": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxx/resourceGroups/jcloud-eastus/providers/Microsoft.Network/virtualNetworks/jclouds-eastus-virtualNetworkName/subnets/jclouds-eastus-subnet"
+                  },
+                  "privateIPAddressVersion": "IPv4"
+                }
+              }]
+            }
+          }]
+        },
+        "extensionProfile": {
+          "extensions": [{
+            "properties": {
+              "publisher": "Microsoft.compute",
+              "type": "CustomScriptExtension",
+              "typeHandlerVersion": "1.1",
+              "autoUpgradeMinorVersion": false,
+              "settings": {
+                "fileUris": ["https://mystorage1.blob.core.windows.net/winvmextekfacnt/SampleCmd_1.cmd"],
+                "commandToExecute": "SampleCmd_1.cmd"
+              }
+            },
+            "name": "extensionName"
+          }]
+        }
+      },
+      "provisioningState": "Failed",
+      "overprovision": true,
+      "uniqueId": "xxxxx-xxxx-xxxx-xxxx-xxxxxx"
+    },
+    "type": "Microsoft.Compute/virtualMachineScaleSets",
+    "location": "eastus",
+    "tags": {
+      "test": "test"
+    },
+    "id": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxx/resourceGroups/jcloud-eastus/providers/Microsoft.Compute/virtualMachineScaleSets/jclouds-vmssname",
+    "name": "jclouds-vmssname"
+  }]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7368d58a/providers/azurecompute-arm/src/test/resources/virtualmachinescalesetlistwhen404.json
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/test/resources/virtualmachinescalesetlistwhen404.json b/providers/azurecompute-arm/src/test/resources/virtualmachinescalesetlistwhen404.json
new file mode 100644
index 0000000..635083c
--- /dev/null
+++ b/providers/azurecompute-arm/src/test/resources/virtualmachinescalesetlistwhen404.json
@@ -0,0 +1,6 @@
+{
+  "error": {
+    "code": "ResourceGroupNotFound",
+    "message": "Resource group 'jcloud-eastus1' could not be found."
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7368d58a/providers/azurecompute-arm/src/test/resources/virtualmachinescalesetresponsecreateorupdate.json
----------------------------------------------------------------------
diff --git a/providers/azurecompute-arm/src/test/resources/virtualmachinescalesetresponsecreateorupdate.json b/providers/azurecompute-arm/src/test/resources/virtualmachinescalesetresponsecreateorupdate.json
new file mode 100644
index 0000000..20ecd71
--- /dev/null
+++ b/providers/azurecompute-arm/src/test/resources/virtualmachinescalesetresponsecreateorupdate.json
@@ -0,0 +1,103 @@
+{
+  "location": "eastus",
+  "sku": {
+    "name": "Standard_A1",
+    "tier": "Standard",
+    "capacity": 10
+  },
+  "properties": {
+    "singlePlacementGroup": true,
+    "overProvision": true,
+    "upgradePolicy": {
+      "mode": "Manual"
+    },
+    "virtualMachineProfile": {
+      "storageProfile": {
+        "imageReference": {
+          "publisher": "Canonical",
+          "offer": "UbuntuServer",
+          "sku": "16.04-LTS",
+          "version": "latest"
+        },
+        "osDisk": {
+          "osType": "Windows",
+          "createOption": "FromImage",
+          "managedDisk": {
+            "storageAccountType": "Standard_LRS"
+          }
+        },
+        "dataDisks": [{
+          "diskSizeGB": "10",
+          "lun": 1,
+          "createOption": "Unrecognized",
+          "caching": "None",
+          "managedDisk": {
+            "storageAccountType": "Standard_LRS"
+          }
+        }
+        ]
+      },
+      "osProfile": {
+        "computerNamePrefix": "jclouds-vmssname",
+        "adminUsername": "jclouds",
+        "adminPassword": "jClouds1!",
+        "linuxConfiguration": {
+          "disablePasswordAuthentication": "False"
+        },
+        "secrets": []
+      },
+      "networkProfile": {
+        "networkInterfaceConfigurations": [{
+          "name": "nicconfig1",
+          "properties": {
+            "primary": true,
+            "enableAcceleratedNetworking": false,
+            "dnsSettings": {
+              "dnsServers": ["8.8.8.8"]
+            },
+            "ipConfigurations": [{
+              "name": "ipconfig1",
+              "properties": {
+                "publicIPAddressConfiguration": {
+                  "name": "pub1",
+                  "properties": {
+                    "idleTimeoutInMinutes": 15
+                  }
+                },
+                "subnet": {
+                  "name": "virtualNetworkName",
+                  "id": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxx/resourceGroups/jcloud-eastus/providers/Microsoft.Network/virtualNetworks/jclouds-eastus-virtualNetworkName/subnets/jclouds-eastus-subnet",
+                  "properties": {}
+                },
+                "privateIPAddressVersion": "IPv4",
+                "loadBalancerBackendAddressPools": [],
+                "loadBalancerInboundNatPools": []
+              }
+            }
+            ]
+          }
+        }
+        ]
+      },
+      "extensionProfile": {
+        "extensions": [{
+          "name": "extensionName",
+          "properties": {
+            "publisher": "Microsoft.compute",
+            "type": "CustomScriptExtension",
+            "typeHandlerVersion": "1.1",
+            "autoUpgradeMinorVersion": false,
+            "settings": {
+              "fileUris": ["https://mystorage1.blob.core.windows.net/winvmextekfacnt/SampleCmd_1.cmd"],
+              "commandToExecute": "SampleCmd_1.cmd"
+            },
+            "protectedSettings": {
+              "StorageAccountKey": "jclouds-accountkey"
+            }
+          }
+        }
+        ]
+      }
+    }
+  }
+}