/** * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for * license information. */ package com.microsoft.azure.management.compute; import com.microsoft.azure.PagedList; import com.microsoft.azure.management.network.LoadBalancer; import com.microsoft.azure.management.network.Network; import com.microsoft.azure.management.resources.ResourceGroup; import com.microsoft.azure.management.resources.fluentcore.arm.Region; import com.microsoft.rest.RestClient; import org.junit.Assert; import org.junit.Test; public class VirtualMachineScaleSetManagedDiskOperationsTests extends ComputeManagementTest { private static String RG_NAME = ""; private static Region region = Region.US_EAST; @Override protected void initializeClients(RestClient restClient, String defaultSubscription, String domain) { RG_NAME = generateRandomResourceName("javacsmrg", 15); super.initializeClients(restClient, defaultSubscription, domain); } @Override protected void cleanUpResources() { resourceManager.resourceGroups().deleteByName(RG_NAME); } @Test public void canCreateUpdateVirtualMachineScaleSetFromPIRWithManagedDisk() throws Exception { final String vmssName = generateRandomResourceName("vmss", 10); ResourceGroup resourceGroup = this.resourceManager.resourceGroups() .define(RG_NAME) .withRegion(region) .create(); Network network = this.networkManager .networks() .define(generateRandomResourceName("vmssvnet", 15)) .withRegion(region) .withExistingResourceGroup(resourceGroup) .withAddressSpace("10.0.0.0/28") .withSubnet("subnet1", "10.0.0.0/28") .create(); LoadBalancer publicLoadBalancer = createHttpLoadBalancers(region, resourceGroup, "1"); VirtualMachineScaleSet vmScaleSet = this.computeManager.virtualMachineScaleSets() .define(vmssName) .withRegion(region) .withExistingResourceGroup(resourceGroup) .withSku(VirtualMachineScaleSetSkuTypes.STANDARD_D5_V2) .withExistingPrimaryNetworkSubnet(network, "subnet1") .withExistingPrimaryInternetFacingLoadBalancer(publicLoadBalancer) .withoutPrimaryInternalLoadBalancer() .withPopularLinuxImage(KnownLinuxVirtualMachineImage.UBUNTU_SERVER_16_04_LTS) .withRootUsername("jvuser") .withRootPassword("123OData!@#123") .withNewDataDisk(100) .withNewDataDisk(100, 1, CachingTypes.READ_WRITE) .withNewDataDisk(100, 2, CachingTypes.READ_ONLY) .create(); VirtualMachineScaleSetVMs virtualMachineScaleSetVMs = vmScaleSet.virtualMachines(); PagedList<VirtualMachineScaleSetVM> virtualMachines = virtualMachineScaleSetVMs.list(); Assert.assertEquals(virtualMachines.size(), vmScaleSet.capacity()); for (VirtualMachineScaleSetVM vm : virtualMachines) { Assert.assertTrue(vm.isOSBasedOnPlatformImage()); Assert.assertFalse(vm.isOSBasedOnCustomImage()); Assert.assertFalse(vm.isOSBasedOnStoredImage()); Assert.assertTrue(vm.isManagedDiskEnabled()); Assert.assertNotNull(vm.unmanagedDataDisks()); Assert.assertEquals(vm.unmanagedDataDisks().size(), 0); Assert.assertNotNull(vm.dataDisks()); Assert.assertEquals(vm.dataDisks().size(), 3); } vmScaleSet.update() .withoutDataDisk(0) .withNewDataDisk(50) .apply(); virtualMachineScaleSetVMs = vmScaleSet.virtualMachines(); virtualMachines = virtualMachineScaleSetVMs.list(); Assert.assertEquals(virtualMachines.size(), vmScaleSet.capacity()); for (VirtualMachineScaleSetVM vm : virtualMachines) { Assert.assertNotNull(vm.dataDisks()); Assert.assertEquals(vm.dataDisks().size(), 3); } } @Test public void canCreateVirtualMachineScaleSetFromCustomImageWithManagedDisk() throws Exception { final String userName = "tirekicker"; final String password = "12NewPA$$w0rd!"; final String publicIpDnsLabel = generateRandomResourceName("pip", 10); final String customImageName = generateRandomResourceName("img", 10); final String vmssName = generateRandomResourceName("vmss", 10); ResourceGroup resourceGroup = this.resourceManager.resourceGroups() .define(RG_NAME) .withRegion(region) .create(); VirtualMachine vm = this.computeManager.virtualMachines().define(generateRandomResourceName("vm", 10)) .withRegion(region) .withExistingResourceGroup(resourceGroup) .withNewPrimaryNetwork("10.0.0.0/28") .withPrimaryPrivateIPAddressDynamic() .withNewPrimaryPublicIPAddress(publicIpDnsLabel) .withPopularLinuxImage(KnownLinuxVirtualMachineImage.UBUNTU_SERVER_16_04_LTS) .withRootUsername(userName) .withRootPassword(password) .withUnmanagedDisks() .defineUnmanagedDataDisk("disk-1") .withNewVhd(100) .withLun(1) .attach() .defineUnmanagedDataDisk("disk-2") .withNewVhd(50) .withLun(2) .attach() .withSize(VirtualMachineSizeTypes.STANDARD_D3_V2) .create(); Assert.assertNotNull(vm); deprovisionAgentInLinuxVM(vm.getPrimaryPublicIPAddress().fqdn(), 22, userName, password); vm.deallocate(); vm.generalize(); VirtualMachineCustomImage virtualMachineCustomImage = this.computeManager.virtualMachineCustomImages() .define(customImageName) .withRegion(region) .withExistingResourceGroup(resourceGroup) .fromVirtualMachine(vm) .create(); Assert.assertNotNull(virtualMachineCustomImage); Network network = this.networkManager .networks() .define(generateRandomResourceName("vmssvnet", 15)) .withRegion(region) .withExistingResourceGroup(resourceGroup) .withAddressSpace("10.0.0.0/28") .withSubnet("subnet1", "10.0.0.0/28") .create(); LoadBalancer publicLoadBalancer = createHttpLoadBalancers(region, resourceGroup, "1"); VirtualMachineScaleSet vmScaleSet = this.computeManager.virtualMachineScaleSets() .define(vmssName) .withRegion(region) .withExistingResourceGroup(resourceGroup) .withSku(VirtualMachineScaleSetSkuTypes.STANDARD_D5_V2) .withExistingPrimaryNetworkSubnet(network, "subnet1") .withExistingPrimaryInternetFacingLoadBalancer(publicLoadBalancer) .withoutPrimaryInternalLoadBalancer() .withLinuxCustomImage(virtualMachineCustomImage.id()) .withRootUsername(userName) .withRootPassword(password) .create(); VirtualMachineScaleSetVMs virtualMachineScaleSetVMs = vmScaleSet.virtualMachines(); PagedList<VirtualMachineScaleSetVM> virtualMachines = virtualMachineScaleSetVMs.list(); Assert.assertEquals(virtualMachines.size(), vmScaleSet.capacity()); for (VirtualMachineScaleSetVM vm1 : virtualMachines) { Assert.assertTrue(vm1.isOSBasedOnCustomImage()); Assert.assertFalse(vm1.isOSBasedOnPlatformImage()); Assert.assertFalse(vm1.isOSBasedOnStoredImage()); Assert.assertTrue(vm1.isManagedDiskEnabled()); Assert.assertNotNull(vm1.unmanagedDataDisks()); Assert.assertEquals(vm1.unmanagedDataDisks().size(), 0); Assert.assertNotNull(vm1.dataDisks()); Assert.assertEquals(vm1.dataDisks().size(), 2); // Disks from data disk image from custom image Assert.assertTrue(vm1.dataDisks().containsKey(1)); VirtualMachineDataDisk disk = vm1.dataDisks().get(1); Assert.assertEquals(disk.size(), 100); Assert.assertTrue(vm1.dataDisks().containsKey(2)); disk = vm1.dataDisks().get(2); Assert.assertEquals(disk.size(), 50); } vmScaleSet.deallocate(); // Updating and adding disk as part of VMSS Update seems consistency failing, CRP is aware of // this, hence until it is fixed comment-out the test // // { // "startTime": "2017-01-25T06:10:55.2243509+00:00", // "endTime": "2017-01-25T06:11:07.8649525+00:00", // "status": "Failed", // "error": { // "code": "InternalExecutionError", // "message": "An internal execution error occurred." // }, // "name": "6786df83-ed3f-4d7a-bf58-d295b96fef46" // } // // vmScaleSet.update() // .withDataDiskUpdated(1, 200) // update not supported // .withNewDataDisk(100) // .apply(); // // vmScaleSet.start(); // // virtualMachineScaleSetVMs = vmScaleSet.virtualMachines(); // virtualMachines = virtualMachineScaleSetVMs.list(); // for (VirtualMachineScaleSetVM vm1 : virtualMachines) { // Assert.assertTrue(vm1.isOSBasedOnCustomImage()); // Assert.assertFalse(vm1.isOSBasedOnPlatformImage()); // Assert.assertFalse(vm1.isOSBasedOnStoredImage()); // Assert.assertTrue(vm1.isManagedDiskEnabled()); // Assert.assertNotNull(vm1.unmanagedDataDisks()); // Assert.assertEquals(vm1.unmanagedDataDisks().size(), 0); // Assert.assertNotNull(vm1.dataDisks()); // Assert.assertEquals(vm1.dataDisks().size(), 3); // Assert.assertTrue(vm1.dataDisks().containsKey(1)); // VirtualMachineDataDisk disk = vm1.dataDisks().get(1); // Assert.assertEquals(disk.size(), 200); // Assert.assertTrue(vm1.dataDisks().containsKey(2)); // disk = vm1.dataDisks().get(2); // Assert.assertEquals(disk.size(), 50); // Assert.assertTrue(vm1.dataDisks().containsKey(0)); // disk = vm1.dataDisks().get(0); // Assert.assertEquals(disk.size(), 100); // } } }