FunctionApp/Modules/SessionHostReplacer/functions/Get-SHRLatestImageVersion.ps1 (91 lines of code) (raw):

function Get-SHRLatestImageVersion { [CmdletBinding()] param ( # An Image reference object. Can be from Marketplace or Shared Image Gallery. [Parameter()] [hashtable] $ImageReference, [Parameter()] [string] $Location ) # Marketplace image if ($ImageReference.publisher) { #TODO Do we need to change location here? if ($ImageReference.version -ne 'latest') { Write-PSFMessage -Level Host -Message "Image version is not set to latest. Returning version {0}" -StringValues $ImageReference.version $azImageVersion = $ImageReference.version } else { # Get the Images and select the latest version. $paramGetAzVMImage = @{ Location = $Location PublisherName = $ImageReference.publisher Offer = $ImageReference.offer Skus = $ImageReference.sku } Write-PSFMessage -Level Host -Message "Getting latest version of image {0} {1} {2} {3}" -StringValues $paramGetAzVMImage.Location, $paramGetAzVMImage.PublisherName, $paramGetAzVMImage.Offer, $paramGetAzVMImage.Skus $azImageVersion = (Get-AzVMImage @paramGetAzVMImage | Sort-Object -Property {[version] $_.Version} -Descending| Select-Object -First 1).Version Write-PSFMessage -Level Host -Message "Latest version of image is {0}" -StringValues $azImageVersion if ($azImageVersion -match "\d+\.\d+\.(?<Year>\d{2})(?<Month>\d{2})(?<Day>\d{2})") { $azImageDate = Get-Date -Date ("20{0}-{1}-{2}" -f $Matches.Year, $Matches.Month, $Matches.Day) Write-PSFMessage -Level Host -Message "Image date is {0}" -StringValues $azImageDate } else { throw "Image version does not match expected format. Could not extract image date." } } } elseif ($ImageReference.Id) { # Shared Image Gallery Write-PSFMessage -Level Host -Message 'Image is from Shared Image Gallery: {0}' -StringValues $ImageReference.Id $imageDefinitionResourceIdPattern = '^\/subscriptions\/(?<subscription>[a-z0-9\-]+)\/resourceGroups\/(?<resourceGroup>[^\/]+)\/providers\/Microsoft\.Compute\/galleries\/(?<gallery>[^\/]+)\/images\/(?<image>[^\/]+)$' $imageVersionResourceIdPattern = '^\/subscriptions\/(?<subscription>[a-z0-9\-]+)\/resourceGroups\/(?<resourceGroup>[^\/]+)\/providers\/Microsoft\.Compute\/galleries\/(?<gallery>[^\/]+)\/images\/(?<image>[^\/]+)\/versions\/(?<version>[^\/]+)$' if ($ImageReference.Id -match $imageDefinitionResourceIdPattern) { Write-PSFMessage -Level Host -Message 'Image reference is an Image Definition resource.' $imageSubscriptionId = $Matches.subscription $imageResourceGroup = $Matches.resourceGroup $imageGalleryName = $Matches.gallery $imageDefinitionName = $Matches.image $currentSubscriptionId = (Get-AzContext).Subscription.Id # Switch Subscription if needed if ($imageSubscriptionId -ne $currentSubscriptionId) { Write-PSFMessage -Level Host -Message "Switching to subscription {0}" -StringValues $imageSubscriptionId Set-AzContext -SubscriptionId $imageSubscriptionId } # Get the latest version of the image $latestImageVersion = Get-AzGalleryImageVersion -ResourceGroupName $imageResourceGroup -GalleryName $imageGalleryName -GalleryImageName $imageDefinitionName | Where-Object { $_.PublishingProfile.ExcludeFromLatest -eq $false } | Sort-Object -Property {$_.PublishingProfile.PublishedDate} -Descending | Select-Object -First 1 if (-not $latestImageVersion) { throw "No available image versions found." } Write-PSFMessage -Level Host -Message "Selected image version with resource Id {0}" -StringValues $latestImageVersion.Id $azImageVersion = $latestImageVersion.Name $azImageDate = $latestImageVersion.PublishingProfile.PublishedDate Write-PSFMessage -Level Host -Message "Image version is {0} and date is {1}" -StringValues $azImageVersion, $azImageDate.ToString('o') # Switch back to original subscription if ($imageSubscriptionId -ne $currentSubscriptionId) { Write-PSFMessage -Level Host -Message "Switching back to subscription {0}" -StringValues $currentSubscriptionId Set-AzContext -SubscriptionId $currentSubscriptionId } } elseif ($ImageReference.Id -match $imageVersionResourceIdPattern ) { Write-PSFMessage -Level Host -Message 'Image reference is an Image Version resource.' $imageVersion = Get-AzGalleryImageVersion -ResourceId $ImageReference.Id $azImageVersion = $imageVersion.Name $azImageDate = $imageVersion.PublishingProfile.PublishedDate Write-PSFMessage -Level Host -Message "Image version is {0} and date is {1}" -StringValues $azImageVersion, $azImageDate.ToString('o') } else { throw "Image reference Id does not match expected format for an Image Definition resource." } } else { throw "Image reference does not contain a publisher or Id property. ImageReference, publisher, and Id are case sensitive!!" } #return output [PSCustomObject]@{ Version = $azImageVersion Date = $azImageDate } }