Skip to content

Commit 29173d1

Browse files
mgmt, virtualmachine support ephemeral os disk (Azure#27541)
* mgmt, virtualmachine support ephemeral os disk * nit, javadoc return * change test vm size * Update sdk/resourcemanager/azure-resourcemanager-compute/CHANGELOG.md Co-authored-by: Weidong Xu <weidxu@microsoft.com> * nit, javadoc fix Co-authored-by: Weidong Xu <weidxu@microsoft.com>
1 parent a5fd5cb commit 29173d1

File tree

5 files changed

+793
-15
lines changed

5 files changed

+793
-15
lines changed

sdk/resourcemanager/azure-resourcemanager-compute/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
- Supported disk encryption set in `Disk` and `VirtualMachine`.
88
- Changed to use PATCH for `GalleryImage` update.
9+
- Supported ephemeral OS disk in `VirtualMachine`.
910

1011
### Other Changes
1112

sdk/resourcemanager/azure-resourcemanager-compute/src/main/java/com/azure/resourcemanager/compute/implementation/VirtualMachineImpl.java

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,13 @@
1212
import com.azure.core.util.logging.ClientLogger;
1313
import com.azure.core.util.serializer.SerializerAdapter;
1414
import com.azure.core.util.serializer.SerializerEncoding;
15+
import com.azure.resourcemanager.authorization.AuthorizationManager;
16+
import com.azure.resourcemanager.authorization.models.BuiltInRole;
17+
import com.azure.resourcemanager.authorization.utils.RoleAssignmentHelper;
1518
import com.azure.resourcemanager.compute.ComputeManager;
19+
import com.azure.resourcemanager.compute.fluent.models.ProximityPlacementGroupInner;
20+
import com.azure.resourcemanager.compute.fluent.models.VirtualMachineInner;
21+
import com.azure.resourcemanager.compute.fluent.models.VirtualMachineUpdateInner;
1622
import com.azure.resourcemanager.compute.models.AdditionalCapabilities;
1723
import com.azure.resourcemanager.compute.models.AvailabilitySet;
1824
import com.azure.resourcemanager.compute.models.AvailabilitySetSkuTypes;
@@ -22,6 +28,9 @@
2228
import com.azure.resourcemanager.compute.models.DataDisk;
2329
import com.azure.resourcemanager.compute.models.DeleteOptions;
2430
import com.azure.resourcemanager.compute.models.DiagnosticsProfile;
31+
import com.azure.resourcemanager.compute.models.DiffDiskOptions;
32+
import com.azure.resourcemanager.compute.models.DiffDiskPlacement;
33+
import com.azure.resourcemanager.compute.models.DiffDiskSettings;
2534
import com.azure.resourcemanager.compute.models.Disk;
2635
import com.azure.resourcemanager.compute.models.DiskCreateOptionTypes;
2736
import com.azure.resourcemanager.compute.models.DiskDeleteOptionTypes;
@@ -54,32 +63,26 @@
5463
import com.azure.resourcemanager.compute.models.VirtualHardDisk;
5564
import com.azure.resourcemanager.compute.models.VirtualMachine;
5665
import com.azure.resourcemanager.compute.models.VirtualMachineCaptureParameters;
66+
import com.azure.resourcemanager.compute.models.VirtualMachineCustomImage;
5767
import com.azure.resourcemanager.compute.models.VirtualMachineDataDisk;
5868
import com.azure.resourcemanager.compute.models.VirtualMachineDiskOptions;
5969
import com.azure.resourcemanager.compute.models.VirtualMachineEncryption;
6070
import com.azure.resourcemanager.compute.models.VirtualMachineEvictionPolicyTypes;
6171
import com.azure.resourcemanager.compute.models.VirtualMachineExtension;
6272
import com.azure.resourcemanager.compute.models.VirtualMachineIdentity;
6373
import com.azure.resourcemanager.compute.models.VirtualMachineInstanceView;
64-
import com.azure.resourcemanager.compute.models.VirtualMachineCustomImage;
6574
import com.azure.resourcemanager.compute.models.VirtualMachinePriorityTypes;
6675
import com.azure.resourcemanager.compute.models.VirtualMachineSize;
6776
import com.azure.resourcemanager.compute.models.VirtualMachineSizeTypes;
6877
import com.azure.resourcemanager.compute.models.VirtualMachineUnmanagedDataDisk;
6978
import com.azure.resourcemanager.compute.models.WinRMConfiguration;
7079
import com.azure.resourcemanager.compute.models.WinRMListener;
7180
import com.azure.resourcemanager.compute.models.WindowsConfiguration;
72-
import com.azure.resourcemanager.compute.fluent.models.ProximityPlacementGroupInner;
73-
import com.azure.resourcemanager.compute.fluent.models.VirtualMachineInner;
74-
import com.azure.resourcemanager.compute.fluent.models.VirtualMachineUpdateInner;
75-
import com.azure.resourcemanager.authorization.models.BuiltInRole;
76-
import com.azure.resourcemanager.authorization.AuthorizationManager;
77-
import com.azure.resourcemanager.authorization.utils.RoleAssignmentHelper;
7881
import com.azure.resourcemanager.msi.models.Identity;
82+
import com.azure.resourcemanager.network.NetworkManager;
7983
import com.azure.resourcemanager.network.models.Network;
8084
import com.azure.resourcemanager.network.models.NetworkInterface;
8185
import com.azure.resourcemanager.network.models.PublicIpAddress;
82-
import com.azure.resourcemanager.network.NetworkManager;
8386
import com.azure.resourcemanager.resources.fluentcore.arm.AvailabilityZoneId;
8487
import com.azure.resourcemanager.resources.fluentcore.arm.ResourceId;
8588
import com.azure.resourcemanager.resources.fluentcore.arm.ResourceUtils;
@@ -88,9 +91,10 @@
8891
import com.azure.resourcemanager.resources.fluentcore.model.Creatable;
8992
import com.azure.resourcemanager.resources.fluentcore.model.Indexable;
9093
import com.azure.resourcemanager.resources.fluentcore.model.implementation.AcceptedImpl;
94+
import com.azure.resourcemanager.resources.fluentcore.utils.PagedConverter;
9195
import com.azure.resourcemanager.resources.fluentcore.utils.ResourceManagerUtils;
92-
import com.azure.resourcemanager.storage.models.StorageAccount;
9396
import com.azure.resourcemanager.storage.StorageManager;
97+
import com.azure.resourcemanager.storage.models.StorageAccount;
9498
import com.fasterxml.jackson.core.JsonProcessingException;
9599
import reactor.core.Exceptions;
96100
import reactor.core.publisher.Flux;
@@ -108,7 +112,6 @@
108112
import java.util.Set;
109113
import java.util.UUID;
110114
import java.util.concurrent.Callable;
111-
import com.azure.resourcemanager.resources.fluentcore.utils.PagedConverter;
112115

113116
/** The implementation for VirtualMachine and its create and update interfaces. */
114117
class VirtualMachineImpl
@@ -1002,6 +1005,17 @@ public VirtualMachineImpl withOSDiskDiskEncryptionSet(String diskEncryptionSetId
10021005
return this;
10031006
}
10041007

1008+
@Override
1009+
public VirtualMachineImpl withEphemeralOSDisk() {
1010+
if (this.innerModel().storageProfile().osDisk().diffDiskSettings() == null) {
1011+
this.innerModel().storageProfile().osDisk().withDiffDiskSettings(new DiffDiskSettings());
1012+
}
1013+
this.innerModel().storageProfile().osDisk().diffDiskSettings().withOption(DiffDiskOptions.LOCAL);
1014+
// For vm with ephemeral os disk, cache should be read-only
1015+
withOSDiskCaching(CachingTypes.READ_ONLY);
1016+
return this;
1017+
}
1018+
10051019
// Virtual machine optional native data disk fluent methods
10061020
@Override
10071021
public UnmanagedDataDiskImpl defineUnmanagedDataDisk(String name) {
@@ -1702,6 +1716,11 @@ public String osDiskDiskEncryptionSetId() {
17021716
return this.storageProfile().osDisk().managedDisk().diskEncryptionSet().id();
17031717
}
17041718

1719+
@Override
1720+
public boolean isOSDiskEphemeral() {
1721+
return this.storageProfile().osDisk().diffDiskSettings() != null && this.storageProfile().osDisk().diffDiskSettings().placement() != null;
1722+
}
1723+
17051724
@Override
17061725
public Map<Integer, VirtualMachineUnmanagedDataDisk> unmanagedDataDisks() {
17071726
Map<Integer, VirtualMachineUnmanagedDataDisk> dataDisks = new HashMap<>();
@@ -2654,6 +2673,14 @@ public String resourceId() {
26542673
};
26552674
}
26562675

2676+
@Override
2677+
public VirtualMachineImpl withPlacement(DiffDiskPlacement placement) {
2678+
if (placement != null) {
2679+
this.innerModel().storageProfile().osDisk().diffDiskSettings().withPlacement(placement);
2680+
}
2681+
return this;
2682+
}
2683+
26572684
/** Class to manage Data disk collection. */
26582685
private class ManagedDataDiskCollection {
26592686
private final Map<String, DataDisk> newDisksToAttach = new HashMap<>();

sdk/resourcemanager/azure-resourcemanager-compute/src/main/java/com/azure/resourcemanager/compute/models/VirtualMachine.java

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55

66
import com.azure.core.annotation.Fluent;
77
import com.azure.core.http.rest.PagedIterable;
8+
import com.azure.resourcemanager.authorization.models.BuiltInRole;
89
import com.azure.resourcemanager.compute.ComputeManager;
910
import com.azure.resourcemanager.compute.fluent.models.VirtualMachineInner;
10-
import com.azure.resourcemanager.authorization.models.BuiltInRole;
1111
import com.azure.resourcemanager.msi.models.Identity;
12+
import com.azure.resourcemanager.network.models.HasNetworkInterfaces;
1213
import com.azure.resourcemanager.network.models.Network;
1314
import com.azure.resourcemanager.network.models.NetworkInterface;
1415
import com.azure.resourcemanager.network.models.PublicIpAddress;
15-
import com.azure.resourcemanager.network.models.HasNetworkInterfaces;
1616
import com.azure.resourcemanager.resources.fluentcore.arm.AvailabilityZoneId;
1717
import com.azure.resourcemanager.resources.fluentcore.arm.models.GroupableResource;
1818
import com.azure.resourcemanager.resources.fluentcore.arm.models.Resource;
@@ -22,10 +22,11 @@
2222
import com.azure.resourcemanager.resources.fluentcore.model.Refreshable;
2323
import com.azure.resourcemanager.resources.fluentcore.model.Updatable;
2424
import com.azure.resourcemanager.storage.models.StorageAccount;
25+
import reactor.core.publisher.Mono;
26+
2527
import java.util.List;
2628
import java.util.Map;
2729
import java.util.Set;
28-
import reactor.core.publisher.Mono;
2930

3031
/** An immutable client-side representation of an Azure virtual machine. */
3132
@Fluent
@@ -284,6 +285,9 @@ Mono<RunCommandResult> runShellScriptAsync(
284285
/** @return resource ID of the disk encryption set of the OS disk */
285286
String osDiskDiskEncryptionSetId();
286287

288+
/** @return whether the os disk is ephemeral*/
289+
boolean isOSDiskEphemeral();
290+
287291
/** @return the unmanaged data disks associated with this virtual machine, indexed by LUN number */
288292
Map<Integer, VirtualMachineUnmanagedDataDisk> unmanagedDataDisks();
289293

@@ -1203,6 +1207,22 @@ interface WithOSDiskSettings {
12031207
* @return the next stage of the definition
12041208
*/
12051209
WithCreate withOSDiskDiskEncryptionSet(String diskEncryptionSetId);
1210+
1211+
/**
1212+
* Specifies the OS disk to be ephemeral.
1213+
* @return the next stage of the definition
1214+
*/
1215+
WithEphemeralOSDisk withEphemeralOSDisk();
1216+
}
1217+
1218+
/** The stage of a virtual machine definition allowing to select Ephemeral OS disk placement. */
1219+
interface WithEphemeralOSDisk {
1220+
/**
1221+
* Selects where you want to place the Ephemeral OS disk.
1222+
* @param placement placement of the Ephemeral OS disk
1223+
* @return the next stage of the definition
1224+
*/
1225+
WithManagedCreate withPlacement(DiffDiskPlacement placement);
12061226
}
12071227

12081228
/** The stage of a virtual machine definition allowing to select a VM size. */
@@ -1853,7 +1873,8 @@ interface WithCreate
18531873
DefinitionStages.WithUserAssignedManagedServiceIdentity,
18541874
DefinitionStages.WithLicenseType,
18551875
DefinitionStages.WithAdditionalCapacities,
1856-
DefinitionStages.WithNetworkInterfaceDeleteOptions {
1876+
DefinitionStages.WithNetworkInterfaceDeleteOptions,
1877+
DefinitionStages.WithEphemeralOSDisk {
18571878

18581879
/**
18591880
* Begins creating the virtual machine resource.

sdk/resourcemanager/azure-resourcemanager-compute/src/test/java/com/azure/resourcemanager/compute/VirtualMachineOperationsTests.java

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,17 @@
55

66
import com.azure.core.http.HttpPipeline;
77
import com.azure.core.http.rest.PagedIterable;
8+
import com.azure.core.management.Region;
89
import com.azure.core.management.exception.ManagementException;
910
import com.azure.core.management.profile.AzureProfile;
1011
import com.azure.core.test.annotation.DoNotRecord;
12+
import com.azure.core.util.CoreUtils;
1113
import com.azure.core.util.polling.LongRunningOperationStatus;
1214
import com.azure.core.util.polling.PollResponse;
1315
import com.azure.resourcemanager.compute.models.AvailabilitySet;
1416
import com.azure.resourcemanager.compute.models.CachingTypes;
1517
import com.azure.resourcemanager.compute.models.DeleteOptions;
18+
import com.azure.resourcemanager.compute.models.DiffDiskPlacement;
1619
import com.azure.resourcemanager.compute.models.Disk;
1720
import com.azure.resourcemanager.compute.models.DiskState;
1821
import com.azure.resourcemanager.compute.models.InstanceViewStatus;
@@ -35,7 +38,6 @@
3538
import com.azure.resourcemanager.network.models.PublicIpAddress;
3639
import com.azure.resourcemanager.network.models.SecurityRuleProtocol;
3740
import com.azure.resourcemanager.network.models.Subnet;
38-
import com.azure.core.management.Region;
3941
import com.azure.resourcemanager.resources.fluentcore.arm.models.Resource;
4042
import com.azure.resourcemanager.resources.fluentcore.model.Accepted;
4143
import com.azure.resourcemanager.resources.fluentcore.model.Creatable;
@@ -1258,6 +1260,51 @@ public void canOperateVirtualMachine() {
12581260
Assertions.assertEquals(PowerState.DEALLOCATED, vm.powerState());
12591261
}
12601262

1263+
@Test
1264+
public void canCreateVirtualMachineWithEphemeralOSDisk() {
1265+
VirtualMachine vm = computeManager.virtualMachines()
1266+
.define(vmName)
1267+
.withRegion(Region.US_WEST3)
1268+
.withNewResourceGroup(rgName)
1269+
.withNewPrimaryNetwork("10.0.0.0/28")
1270+
.withPrimaryPrivateIPAddressDynamic()
1271+
.withoutPrimaryPublicIPAddress()
1272+
.withPopularLinuxImage(KnownLinuxVirtualMachineImage.UBUNTU_SERVER_18_04_LTS)
1273+
.withRootUsername("Foo12")
1274+
.withSsh(sshPublicKey())
1275+
.withSize(VirtualMachineSizeTypes.STANDARD_DS1_V2)
1276+
.withEphemeralOSDisk()
1277+
.withPlacement(DiffDiskPlacement.CACHE_DISK)
1278+
.withNewDataDisk(1, 1, CachingTypes.READ_WRITE)
1279+
.withPrimaryNetworkInterfaceDeleteOptions(DeleteOptions.DELETE)
1280+
.create();
1281+
1282+
Assertions.assertNull(vm.osDiskDiskEncryptionSetId());
1283+
Assertions.assertTrue(vm.osDiskSize() > 0);
1284+
Assertions.assertEquals(vm.osDiskDeleteOptions(), DeleteOptions.DELETE);
1285+
Assertions.assertEquals(vm.osDiskCachingType(), CachingTypes.READ_ONLY);
1286+
Assertions.assertFalse(CoreUtils.isNullOrEmpty(vm.dataDisks()));
1287+
Assertions.assertTrue(vm.isOSDiskEphemeral());
1288+
Assertions.assertNotNull(vm.osDiskId());
1289+
1290+
String osDiskId = vm.osDiskId();
1291+
1292+
vm.update()
1293+
.withoutDataDisk(1)
1294+
.withNewDataDisk(1, 2, CachingTypes.NONE)
1295+
.withNewDataDisk(1)
1296+
.apply();
1297+
Assertions.assertEquals(vm.dataDisks().size(), 2);
1298+
1299+
vm.powerOff();
1300+
vm.start();
1301+
vm.refresh();
1302+
Assertions.assertEquals(osDiskId, vm.osDiskId());
1303+
1304+
// deallocate not supported on vm with ephemeral os disk
1305+
Assertions.assertThrows(Exception.class, vm::deallocate);
1306+
}
1307+
12611308
private CreatablesInfo prepareCreatableVirtualMachines(
12621309
Region region, String vmNamePrefix, String networkNamePrefix, String publicIpNamePrefix, int vmCount) {
12631310

0 commit comments

Comments
 (0)