utilities/e2e-template-assets/scripts/Copy-VhdToStorageAccount.ps1 (103 lines of code) (raw):

<# .SYNOPSIS Copy a VHD baked from a given Image Template to a given destination storage account blob container .DESCRIPTION Copy a VHD baked from a given Image Template to a given destination storage account blob container .PARAMETER ImageTemplateName Mandatory. The name of the Image Template .PARAMETER ImageTemplateResourceGroup Mandatory. The resource group name of the Image Template .PARAMETER DestinationStorageAccountName Mandatory. The name of the destination storage account .PARAMETER DestinationContainerName Optional. The name of the existing destination blob container .PARAMETER VhdName Optional. Specify a different name for the destination VHD file .PARAMETER WaitForComplete Optional. Run the command synchronously. Wait for the completion of the copy. .EXAMPLE ./Copy-VhdToStorageAccount -ImageTemplateName 'vhd-img-template-001-2022-07-29-15-54-01' -ImageTemplateResourceGroup 'validation-rg' -DestinationStorageAccountName 'vhdstorage001' Copy a VHD created by Image Template 'vhd-img-template-001-2022-07-29-15-54-01' in resource group 'validation-rg' to destination storage account 'vhdstorage001' in blob container named 'vhds'. Save the VHD file as 'vhd-img-template-001-2022-07-29-15-54-01.vhd'. .EXAMPLE ./Copy-VhdToStorageAccount -ImageTemplateName 'vhd-img-template-001-2022-07-29-15-54-01' -ImageTemplateResourceGroup 'validation-rg' -DestinationStorageAccountName 'vhdstorage001' -VhdName 'vhd-img-template-001' -WaitForComplete Copy a VHD baked by Image Template 'vhd-img-template-001-2022-07-29-15-54-01' in resource group 'validation-rg' to destination storage account 'vhdstorage001' in a blob container named 'vhds' and wait for the completion of the copy. Save the VHD file as 'vhd-img-template-001.vhd'. #> [CmdletBinding(SupportsShouldProcess)] param ( [Parameter(Mandatory = $true)] [string] $ImageTemplateName, [Parameter(Mandatory = $true)] [string] $ImageTemplateResourceGroup, [Parameter(Mandatory = $true)] [string] $DestinationStorageAccountName, [Parameter(Mandatory = $false)] [string] $DestinationContainerName = 'vhds', [Parameter(Mandatory = $false)] [string] $VhdName = $ImageTemplateName, [Parameter(Mandatory = $false)] [switch] $WaitForComplete ) begin { Write-Debug ('{0} entered' -f $MyInvocation.MyCommand) # Install required modules $currentVerbosePreference = $VerbosePreference $VerbosePreference = 'SilentlyContinue' $requiredModules = @( @{ Name = 'Az.ImageBuilder'; Version = '0.4.0' }, @{ Name = 'Az.Storage'; Version = '6.0.0' } ) foreach ($module in $requiredModules) { $installationInput = @{ Name = $module.Name Repository = 'PSGallery' Scope = 'CurrentUser' Force = $true } if ($Module.Version) { $installationInput['RequiredVersion'] = $module.Version } Install-Module @installationInput if ($installed = Get-Module -Name $module.Name -ListAvailable) { Write-Verbose ('Installed module [{0}] with version [{1}]' -f $installed.Name, $installed.Version) -Verbose } } $VerbosePreference = $currentVerbosePreference } process { # Retrieving and initializing parameters before the blob copy Write-Verbose 'Initializing source storage account parameters before the blob copy' -Verbose Write-Verbose ('Retrieving source storage account from Image Template [{0}] in resource group [{1}]' -f $imageTemplateName, $imageTemplateResourceGroup) -Verbose Get-InstalledModule $imgtRunOutput = Get-AzImageBuilderTemplateRunOutput -ImageTemplateName $imageTemplateName -ResourceGroupName $imageTemplateResourceGroup | Where-Object ArtifactUri -NE $null $sourceUri = $imgtRunOutput.ArtifactUri $sourceStorageAccountName = $sourceUri.Split('//')[1].Split('.')[0] $storageAccountList = Get-AzStorageAccount $sourceStorageAccount = $storageAccountList | Where-Object StorageAccountName -EQ $sourceStorageAccountName $sourceStorageAccountContext = $sourceStorageAccount.Context $sourceStorageAccountRGName = $sourceStorageAccount.ResourceGroupName Write-Verbose ('Retrieving artifact uri [{0}] stored in resource group [{1}]' -f $sourceUri, $sourceStorageAccountRGName) -Verbose Write-Verbose 'Initializing destination storage account parameters before the blob copy' -Verbose $destinationStorageAccount = $storageAccountList | Where-Object StorageAccountName -EQ $destinationStorageAccountName $destinationStorageAccountContext = $destinationStorageAccount.Context $destinationBlobName = "$vhdName.vhd" Write-Verbose ('Planning for destination blob name [{0}] in container [{1}] and storage account [{2}]' -f $destinationBlobName, $destinationContainerName, $destinationStorageAccountName) -Verbose # Copying the VHD to a destination blob container $resourceActionInputObject = @{ AbsoluteUri = $sourceUri Context = $sourceStorageAccountContext DestContext = $destinationStorageAccountContext DestBlob = $destinationBlobName DestContainer = $destinationContainerName Force = $true } if ($PSCmdlet.ShouldProcess('Storage blob copy of VHD [{0}]' -f $destinationBlobName, 'Start')) { $destBlob = Start-AzStorageBlobCopy @resourceActionInputObject Write-Verbose ('Copied/initialized copy of VHD from URI [{0}] to container [{1}] in storage account [{2}]' -f $sourceUri, $destinationContainerName, $destinationStorageAccountName) -Verbose } if ($WaitForComplete) { $destBlob | Get-AzStorageBlobCopyState -WaitForComplete } } end { Write-Debug ('{0} exited' -f $MyInvocation.MyCommand) }