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"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+}