From 5cd7cf5d71c0e78df89c79a2773c74a8de269b9a Mon Sep 17 00:00:00 2001 From: 3891sinneD Date: Mon, 10 Feb 2025 19:35:09 +0100 Subject: [PATCH 1/3] New PR --- avm/res/compute/virtual-machine/README.md | 197 ++++++++++++++++++ avm/res/compute/virtual-machine/main.bicep | 2 +- avm/res/compute/virtual-machine/main.json | 4 +- .../e2e/windows.zrsdisks/dependencies.bicep | 30 +++ .../e2e/windows.zrsdisks/main.test.bicep | 99 +++++++++ 5 files changed, 329 insertions(+), 3 deletions(-) create mode 100644 avm/res/compute/virtual-machine/tests/e2e/windows.zrsdisks/dependencies.bicep create mode 100644 avm/res/compute/virtual-machine/tests/e2e/windows.zrsdisks/main.test.bicep diff --git a/avm/res/compute/virtual-machine/README.md b/avm/res/compute/virtual-machine/README.md index 6142237210..aab86e5706 100644 --- a/avm/res/compute/virtual-machine/README.md +++ b/avm/res/compute/virtual-machine/README.md @@ -51,6 +51,7 @@ The following section provides usage examples for the module, which were used to - [Deploying Windows VM with premium SSDv2 data disk](#example-10-deploying-windows-vm-with-premium-ssdv2-data-disk) - [Using disk encryption set for the VM.](#example-11-using-disk-encryption-set-for-the-vm) - [Adding the VM to a VMSS.](#example-12-adding-the-vm-to-a-vmss) +- [Deploying Windows VM in a defined zone with a premium zrs data disk](#example-13-deploying-windows-vm-in-a-defined-zone-with-a-premium-zrs-data-disk) ### Example 1: _Using automanage for the VM._ @@ -4736,6 +4737,202 @@ param virtualMachineScaleSetResourceId = ''

+### Example 13: _Deploying Windows VM in a defined zone with a premium zrs data disk_ + +This instance deploys the module with a premium zrs data disk. + + +

+ +via Bicep module + +```bicep +module virtualMachine 'br/public:avm/res/compute/virtual-machine:' = { + name: 'virtualMachineDeployment' + params: { + // Required parameters + adminUsername: 'localAdminUser' + imageReference: { + offer: 'WindowsServer' + publisher: 'MicrosoftWindowsServer' + sku: '2022-datacenter-azure-edition' + version: 'latest' + } + name: 'cvmwinssdv2' + nicConfigurations: [ + { + ipConfigurations: [ + { + name: 'ipconfig01' + subnetResourceId: '' + } + ] + nicSuffix: '-nic-01' + } + ] + osDisk: { + caching: 'ReadWrite' + diskSizeGB: 128 + managedDisk: { + storageAccountType: 'Premium_ZRS' + } + } + osType: 'Windows' + vmSize: 'Standard_D2s_v3' + zone: 2 + // Non-required parameters + adminPassword: '' + dataDisks: [ + { + caching: 'None' + diskSizeGB: 1024 + managedDisk: { + storageAccountType: 'Premium_ZRS' + } + } + ] + location: '' + } +} +``` + +
+

+ +

+ +via JSON parameters file + +```json +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", + "contentVersion": "1.0.0.0", + "parameters": { + // Required parameters + "adminUsername": { + "value": "localAdminUser" + }, + "imageReference": { + "value": { + "offer": "WindowsServer", + "publisher": "MicrosoftWindowsServer", + "sku": "2022-datacenter-azure-edition", + "version": "latest" + } + }, + "name": { + "value": "cvmwinssdv2" + }, + "nicConfigurations": { + "value": [ + { + "ipConfigurations": [ + { + "name": "ipconfig01", + "subnetResourceId": "" + } + ], + "nicSuffix": "-nic-01" + } + ] + }, + "osDisk": { + "value": { + "caching": "ReadWrite", + "diskSizeGB": 128, + "managedDisk": { + "storageAccountType": "Premium_ZRS" + } + } + }, + "osType": { + "value": "Windows" + }, + "vmSize": { + "value": "Standard_D2s_v3" + }, + "zone": { + "value": 2 + }, + // Non-required parameters + "adminPassword": { + "value": "" + }, + "dataDisks": { + "value": [ + { + "caching": "None", + "diskSizeGB": 1024, + "managedDisk": { + "storageAccountType": "Premium_ZRS" + } + } + ] + }, + "location": { + "value": "" + } + } +} +``` + +
+

+ +

+ +via Bicep parameters file + +```bicep-params +using 'br/public:avm/res/compute/virtual-machine:' + +// Required parameters +param adminUsername = 'localAdminUser' +param imageReference = { + offer: 'WindowsServer' + publisher: 'MicrosoftWindowsServer' + sku: '2022-datacenter-azure-edition' + version: 'latest' +} +param name = 'cvmwinssdv2' +param nicConfigurations = [ + { + ipConfigurations: [ + { + name: 'ipconfig01' + subnetResourceId: '' + } + ] + nicSuffix: '-nic-01' + } +] +param osDisk = { + caching: 'ReadWrite' + diskSizeGB: 128 + managedDisk: { + storageAccountType: 'Premium_ZRS' + } +} +param osType = 'Windows' +param vmSize = 'Standard_D2s_v3' +param zone = 2 +// Non-required parameters +param adminPassword = '' +param dataDisks = [ + { + caching: 'None' + diskSizeGB: 1024 + managedDisk: { + storageAccountType: 'Premium_ZRS' + } + } +] +param location = '' +``` + +
+

+ ## Parameters **Required parameters** diff --git a/avm/res/compute/virtual-machine/main.bicep b/avm/res/compute/virtual-machine/main.bicep index 63aca72621..08b883d80e 100644 --- a/avm/res/compute/virtual-machine/main.bicep +++ b/avm/res/compute/virtual-machine/main.bicep @@ -516,7 +516,7 @@ resource managedDataDisks 'Microsoft.Compute/disks@2024-03-02' = [ diskIOPSReadWrite: dataDisk.?diskIOPSReadWrite diskMBpsReadWrite: dataDisk.?diskMBpsReadWrite } - zones: zone != 0 ? array(string(zone)) : null + zones: zone != 0 && !contains(dataDisk.managedDisk.storageAccountType, 'ZRS') ? array(string(zone)) : null } ] diff --git a/avm/res/compute/virtual-machine/main.json b/avm/res/compute/virtual-machine/main.json index 04fbf9f843..9983718b3c 100644 --- a/avm/res/compute/virtual-machine/main.json +++ b/avm/res/compute/virtual-machine/main.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "0.33.13.18514", - "templateHash": "11202694269777473963" + "templateHash": "15913197495952327322" }, "name": "Virtual Machines", "description": "This module deploys a Virtual Machine with one or multiple NICs and optionally one or multiple public IPs." @@ -1018,7 +1018,7 @@ "diskIOPSReadWrite": "[tryGet(coalesce(parameters('dataDisks'), createArray())[copyIndex()], 'diskIOPSReadWrite')]", "diskMBpsReadWrite": "[tryGet(coalesce(parameters('dataDisks'), createArray())[copyIndex()], 'diskMBpsReadWrite')]" }, - "zones": "[if(not(equals(parameters('zone'), 0)), array(string(parameters('zone'))), null())]" + "zones": "[if(and(not(equals(parameters('zone'), 0)), not(contains(coalesce(parameters('dataDisks'), createArray())[copyIndex()].managedDisk.storageAccountType, 'ZRS'))), array(string(parameters('zone'))), null())]" }, "vm": { "type": "Microsoft.Compute/virtualMachines", diff --git a/avm/res/compute/virtual-machine/tests/e2e/windows.zrsdisks/dependencies.bicep b/avm/res/compute/virtual-machine/tests/e2e/windows.zrsdisks/dependencies.bicep new file mode 100644 index 0000000000..68972ec7ec --- /dev/null +++ b/avm/res/compute/virtual-machine/tests/e2e/windows.zrsdisks/dependencies.bicep @@ -0,0 +1,30 @@ +@description('Required. The name of the Virtual Network to create.') +param virtualNetworkName string + +@description('Optional. The location to deploy to.') +param location string = resourceGroup().location + +var addressPrefix = '10.0.0.0/16' + +resource virtualNetwork 'Microsoft.Network/virtualNetworks@2023-04-01' = { + name: virtualNetworkName + location: location + properties: { + addressSpace: { + addressPrefixes: [ + addressPrefix + ] + } + subnets: [ + { + name: 'defaultSubnet' + properties: { + addressPrefix: cidrSubnet(addressPrefix, 16, 0) + } + } + ] + } +} + +@description('The resource ID of the created Virtual Network Subnet.') +output subnetResourceId string = virtualNetwork.properties.subnets[0].id diff --git a/avm/res/compute/virtual-machine/tests/e2e/windows.zrsdisks/main.test.bicep b/avm/res/compute/virtual-machine/tests/e2e/windows.zrsdisks/main.test.bicep new file mode 100644 index 0000000000..4cbb1ca41d --- /dev/null +++ b/avm/res/compute/virtual-machine/tests/e2e/windows.zrsdisks/main.test.bicep @@ -0,0 +1,99 @@ +targetScope = 'subscription' + +metadata name = 'Deploying Windows VM in a defined zone with a premium zrs data disk' +metadata description = 'This instance deploys the module with a premium zrs data disk.' + +// ========== // +// Parameters // +// ========== // + +@description('Optional. The name of the resource group to deploy for testing purposes.') +@maxLength(90) +param resourceGroupName string = 'dep-${namePrefix}-compute.virtualMachines-${serviceShort}-rg' + +// Capacity constraints for VM type +#disable-next-line no-hardcoded-location +var enforcedLocation = 'uksouth' + +@description('Optional. A short identifier for the kind of deployment. Should be kept short to not run into resource-name length-constraints.') +param serviceShort string = 'cvmwinssdv2' + +@description('Optional. The password to leverage for the login.') +@secure() +param password string = newGuid() + +@description('Optional. A token to inject into the name of each resource.') +param namePrefix string = '#_namePrefix_#' + +// ============ // +// Dependencies // +// ============ // + +// General resources +// ================= +resource resourceGroup 'Microsoft.Resources/resourceGroups@2021-04-01' = { + name: resourceGroupName + location: enforcedLocation +} + +module nestedDependencies 'dependencies.bicep' = { + scope: resourceGroup + name: '${uniqueString(deployment().name, enforcedLocation)}-nestedDependencies' + params: { + location: enforcedLocation + virtualNetworkName: 'dep-${namePrefix}-vnet-${serviceShort}' + } +} + +// ============== // +// Test Execution // +// ============== // +@batchSize(1) +module testDeployment '../../../main.bicep' = [ + for iteration in ['init', 'idem']: { + scope: resourceGroup + name: '${uniqueString(deployment().name, enforcedLocation)}-test-${serviceShort}-${iteration}' + params: { + location: enforcedLocation + name: '${namePrefix}${serviceShort}' + adminUsername: 'localAdminUser' + imageReference: { + publisher: 'MicrosoftWindowsServer' + offer: 'WindowsServer' + sku: '2022-datacenter-azure-edition' + version: 'latest' + } + zone: 2 + nicConfigurations: [ + { + ipConfigurations: [ + { + name: 'ipconfig01' + subnetResourceId: nestedDependencies.outputs.subnetResourceId + } + ] + nicSuffix: '-nic-01' + } + ] + osDisk: { + diskSizeGB: 128 + caching: 'ReadWrite' + managedDisk: { + storageAccountType: 'Premium_ZRS' + } + } + dataDisks: [ + { + diskSizeGB: 1024 + caching: 'None' + managedDisk: { + storageAccountType: 'Premium_ZRS' + } + } + ] + osType: 'Windows' + vmSize: 'Standard_D2s_v3' + adminPassword: password + } + } +] From 8739598b5aa3220f3584add7b368b22f397f376d Mon Sep 17 00:00:00 2001 From: 3891sinneD <106011261+3891sinneD@users.noreply.github.com> Date: Fri, 21 Feb 2025 11:46:26 +0100 Subject: [PATCH 2/3] Update main.test.bicep --- .../virtual-machine/tests/e2e/windows.zrsdisks/main.test.bicep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avm/res/compute/virtual-machine/tests/e2e/windows.zrsdisks/main.test.bicep b/avm/res/compute/virtual-machine/tests/e2e/windows.zrsdisks/main.test.bicep index 4cbb1ca41d..7c45341946 100644 --- a/avm/res/compute/virtual-machine/tests/e2e/windows.zrsdisks/main.test.bicep +++ b/avm/res/compute/virtual-machine/tests/e2e/windows.zrsdisks/main.test.bicep @@ -16,7 +16,7 @@ param resourceGroupName string = 'dep-${namePrefix}-compute.virtualMachines-${se var enforcedLocation = 'uksouth' @description('Optional. A short identifier for the kind of deployment. Should be kept short to not run into resource-name length-constraints.') -param serviceShort string = 'cvmwinssdv2' +param serviceShort string = 'cvmwinzrs' @description('Optional. The password to leverage for the login.') @secure() From 89ff7ae603d00db318ce8db9a7ed9a69737f5526 Mon Sep 17 00:00:00 2001 From: 3891sinneD Date: Fri, 21 Feb 2025 14:32:30 +0100 Subject: [PATCH 3/3] updated readme --- avm/res/compute/virtual-machine/README.md | 6 +-- avm/res/compute/virtual-machine/main.json | 60 +++++++++++------------ 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/avm/res/compute/virtual-machine/README.md b/avm/res/compute/virtual-machine/README.md index aab86e5706..f32b46dd9e 100644 --- a/avm/res/compute/virtual-machine/README.md +++ b/avm/res/compute/virtual-machine/README.md @@ -4758,7 +4758,7 @@ module virtualMachine 'br/public:avm/res/compute/virtual-machine:' = { sku: '2022-datacenter-azure-edition' version: 'latest' } - name: 'cvmwinssdv2' + name: 'cvmwinzrs' nicConfigurations: [ { ipConfigurations: [ @@ -4821,7 +4821,7 @@ module virtualMachine 'br/public:avm/res/compute/virtual-machine:' = { } }, "name": { - "value": "cvmwinssdv2" + "value": "cvmwinzrs" }, "nicConfigurations": { "value": [ @@ -4894,7 +4894,7 @@ param imageReference = { sku: '2022-datacenter-azure-edition' version: 'latest' } -param name = 'cvmwinssdv2' +param name = 'cvmwinzrs' param nicConfigurations = [ { ipConfigurations: [ diff --git a/avm/res/compute/virtual-machine/main.json b/avm/res/compute/virtual-machine/main.json index 9983718b3c..65e5c08730 100644 --- a/avm/res/compute/virtual-machine/main.json +++ b/avm/res/compute/virtual-machine/main.json @@ -5,8 +5,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "15913197495952327322" + "version": "0.33.93.31351", + "templateHash": "17400759374906943003" }, "name": "Virtual Machines", "description": "This module deploys a Virtual Machine with one or multiple NICs and optionally one or multiple public IPs." @@ -1301,8 +1301,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "9361328819285350634" + "version": "0.33.93.31351", + "templateHash": "17423406578946107257" } }, "definitions": { @@ -2905,8 +2905,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "10459557628823249787" + "version": "0.33.93.31351", + "templateHash": "2171772621334669730" }, "name": "Virtual Machine Extensions", "description": "This module deploys a Virtual Machine Extension." @@ -3116,8 +3116,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "10459557628823249787" + "version": "0.33.93.31351", + "templateHash": "2171772621334669730" }, "name": "Virtual Machine Extensions", "description": "This module deploys a Virtual Machine Extension." @@ -3323,8 +3323,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "10459557628823249787" + "version": "0.33.93.31351", + "templateHash": "2171772621334669730" }, "name": "Virtual Machine Extensions", "description": "This module deploys a Virtual Machine Extension." @@ -3525,8 +3525,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "10459557628823249787" + "version": "0.33.93.31351", + "templateHash": "2171772621334669730" }, "name": "Virtual Machine Extensions", "description": "This module deploys a Virtual Machine Extension." @@ -3732,8 +3732,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "10459557628823249787" + "version": "0.33.93.31351", + "templateHash": "2171772621334669730" }, "name": "Virtual Machine Extensions", "description": "This module deploys a Virtual Machine Extension." @@ -3934,8 +3934,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "10459557628823249787" + "version": "0.33.93.31351", + "templateHash": "2171772621334669730" }, "name": "Virtual Machine Extensions", "description": "This module deploys a Virtual Machine Extension." @@ -4144,8 +4144,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "10459557628823249787" + "version": "0.33.93.31351", + "templateHash": "2171772621334669730" }, "name": "Virtual Machine Extensions", "description": "This module deploys a Virtual Machine Extension." @@ -4358,8 +4358,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "10459557628823249787" + "version": "0.33.93.31351", + "templateHash": "2171772621334669730" }, "name": "Virtual Machine Extensions", "description": "This module deploys a Virtual Machine Extension." @@ -4566,8 +4566,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "10459557628823249787" + "version": "0.33.93.31351", + "templateHash": "2171772621334669730" }, "name": "Virtual Machine Extensions", "description": "This module deploys a Virtual Machine Extension." @@ -4770,8 +4770,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "10459557628823249787" + "version": "0.33.93.31351", + "templateHash": "2171772621334669730" }, "name": "Virtual Machine Extensions", "description": "This module deploys a Virtual Machine Extension." @@ -4983,8 +4983,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "10459557628823249787" + "version": "0.33.93.31351", + "templateHash": "2171772621334669730" }, "name": "Virtual Machine Extensions", "description": "This module deploys a Virtual Machine Extension." @@ -5192,8 +5192,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "10459557628823249787" + "version": "0.33.93.31351", + "templateHash": "2171772621334669730" }, "name": "Virtual Machine Extensions", "description": "This module deploys a Virtual Machine Extension." @@ -5387,8 +5387,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "16309659094506585930" + "version": "0.33.93.31351", + "templateHash": "5910828956272534599" }, "name": "Recovery Service Vaults Protection Container Protected Item", "description": "This module deploys a Recovery Services Vault Protection Container Protected Item."