utilities/pipelines/resourcePublish/Get-ModulesMissingFromTemplateSpecsRG.ps1 (135 lines of code) (raw):
<#
.SYNOPSIS
Get a list of all modules (path & version) in the given TemplatePath that do not exist as a Template Spec in the given Resource Group
.DESCRIPTION
Get a list of all modules (path & version) in the given TemplatePath that do not exist as a Template Spec in the given Resource Group
.PARAMETER TemplateFilePath
Mandatory. The Template File Path to process
.PARAMETER TemplateSpecsRGName
Mandatory. The Resource Group to search in
.PARAMETER PublishLatest
Optional. Publish an absolute latest version.
Note: This version may include breaking changes and is not recommended for production environments
.PARAMETER UseApiSpecsAlignedName
Optional. If set to true, the module name looked for is aligned with the Azure API naming. If not, it's one aligned with the module's folder path. See the following examples:
- True: microsoft.keyvault.vaults.secrets
- False: key-vault.vault.secret
.EXAMPLE
Get-ModulesMissingFromTemplateSpecsRG -TemplateFilePath 'C:\ResourceModules\modules\key-vault\vault\main.bicep' -TemplateSpecsRGName 'artifacts-rg'
Check if either the Key Vault module or any of its children (e.g. 'secret') is missing in the Resource Group 'artifacts-rg'
Returns for example:
Name Value
---- -----
Version 0.4.0
TemplateFilePath C:\ResourceModules\modules\key-vault\vault\access-policy\main.bicep
Version 0.4
TemplateFilePath C:\ResourceModules\modules\key-vault\vault\access-policy\main.bicep
Version 0
TemplateFilePath C:\ResourceModules\modules\key-vault\vault\access-policy\main.bicep
Version latest
TemplateFilePath C:\ResourceModules\modules\key-vault\vault\access-policy\main.bicep
Version 0.4.0
TemplateFilePath C:\ResourceModules\modules\key-vault\vault\key\main.bicep
Version 0.4
TemplateFilePath C:\ResourceModules\modules\key-vault\vault\key\main.bicep
Version 0
TemplateFilePath C:\ResourceModules\modules\key-vault\vault\key\main.bicep
Version latest
TemplateFilePath C:\ResourceModules\modules\key-vault\vault\key\main.bicep
Version 0.4.0
TemplateFilePath C:\ResourceModules\modules\key-vault\vault\secret\main.bicep
Version 0.4
TemplateFilePath C:\ResourceModules\modules\key-vault\vault\secret\main.bicep
Version 0
TemplateFilePath C:\ResourceModules\modules\key-vault\vault\secret\main.bicep
Version latest
TemplateFilePath C:\ResourceModules\modules\key-vault\vault\secret\main.bicep
Version 0.5.0
TemplateFilePath C:\ResourceModules\modules\key-vault\vault\main.bicep
Version 0.5
TemplateFilePath C:\ResourceModules\modules\key-vault\vault\main.bicep
Version 0
TemplateFilePath C:\ResourceModules\modules\key-vault\vault\main.bicep
Version latest
TemplateFilePath C:\ResourceModules\modules\key-vault\vault\main.bicep
#>
function Get-ModulesMissingFromTemplateSpecsRG {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string] $TemplateFilePath,
[Parameter(Mandatory = $true)]
[string] $TemplateSpecsRGName,
[Parameter(Mandatory = $false)]
[bool] $PublishLatest = $true,
[Parameter(Mandatory = $false)]
[bool] $UseApiSpecsAlignedName = $false
)
begin {
Write-Debug ('{0} entered' -f $MyInvocation.MyCommand)
# Load used functions
. (Join-Path $PSScriptRoot 'Get-TemplateSpecsName.ps1')
}
process {
# Get all children, bicep templates only
$availableModuleTemplatePaths = (Get-ChildItem -Path (Split-Path $TemplateFilePath) -Recurse -Include @('main.bicep')).FullName
# Get all children, ARM templates only
$availableModuleTemplatePathsARM = (Get-ChildItem -Path (Split-Path $TemplateFilePath) -Recurse -Include @('main.json')).FullName
# Add ARM templates to the list of available modules only if there is no bicep template for the same module
foreach ($path in $availableModuleTemplatePathsARM) {
if ($availableModuleTemplatePaths -contains $path.Replace('.json', '.bicep')) { continue }
$availableModuleTemplatePaths += $path
}
$availableModuleTemplatePaths = $availableModuleTemplatePaths | Sort-Object
if (-not (Get-AzResourceGroup -ResourceGroupName $TemplateSpecsRGName -ErrorAction 'SilentlyContinue')) {
$missingTemplatePaths = $availableModuleTemplatePaths
} else {
# Test all children against Resource Group
$missingTemplatePaths = @()
foreach ($templatePath in $availableModuleTemplatePaths) {
# Get a valid Template Spec name
$templateSpecsIdentifier = Get-TemplateSpecsName -TemplateFilePath $templatePath -UseApiSpecsAlignedName $UseApiSpecsAlignedName
$null = Get-AzTemplateSpec -ResourceGroupName $TemplateSpecsRGName -Name $templateSpecsIdentifier -ErrorAction 'SilentlyContinue' -ErrorVariable 'result'
if ($result.exception.Response.StatusCode -eq 'NotFound') {
$missingTemplatePaths += $templatePath
}
}
}
# Collect any that are not part of the ACR, fetch their version and return the result array
$modulesToPublish = @()
foreach ($missingTemplatePath in $missingTemplatePaths) {
$moduleVersionsToPublish = @(
# Patch version
@{
TemplateFilePath = $missingTemplatePath
Version = '{0}.0' -f (Get-Content (Join-Path (Split-Path $missingTemplatePath) 'version.json') -Raw | ConvertFrom-Json).version
},
# Minor version
@{
TemplateFilePath = $missingTemplatePath
Version = (Get-Content (Join-Path (Split-Path $missingTemplatePath) 'version.json') -Raw | ConvertFrom-Json).version
},
# Major version
@{
TemplateFilePath = $missingTemplatePath
Version = ((Get-Content (Join-Path (Split-Path $missingTemplatePath) 'version.json') -Raw | ConvertFrom-Json).version -split '\.')[0]
}
)
if ($PublishLatest) {
$moduleVersionsToPublish += @{
TemplateFilePath = $missingTemplatePath
Version = 'latest'
}
}
$modulesToPublish += $moduleVersionsToPublish
Write-Verbose ('Missing module [{0}] will be considered for publishing with version(s) [{1}]' -f $missingTemplatePath, ($moduleVersionsToPublish.Version -join ', ')) -Verbose
}
if ($modulesToPublish.count -eq 0) {
Write-Verbose 'No modules missing in the target environment' -Verbose
}
return $modulesToPublish
}
end {
Write-Debug ('{0} exited' -f $MyInvocation.MyCommand)
}
}