diff --git a/src/functions/Invoke-AzOpsPush.ps1 b/src/functions/Invoke-AzOpsPush.ps1 index 343b408f..4b45ec6f 100644 --- a/src/functions/Invoke-AzOpsPush.ps1 +++ b/src/functions/Invoke-AzOpsPush.ps1 @@ -13,6 +13,8 @@ The root path to where the entire state is being built in. .PARAMETER AzOpsMainTemplate Path to the main template used by AzOps + .PARAMETER CustomSortOrder + Switch to honor the input ordering for ChangeSet. If not used, ChangeSet will be sorted in ascending order. .EXAMPLE > Invoke-AzOpsPush -ChangeSet changeSet -StatePath $StatePath -AzOpsMainTemplate $templatePath Applies a change to Azure from the AzOps configuration. @@ -33,7 +35,10 @@ $StatePath = (Get-PSFConfigValue -FullName 'AzOps.Core.State'), [string] - $AzOpsMainTemplate = (Get-PSFConfigValue -FullName 'AzOps.Core.MainTemplate') + $AzOpsMainTemplate = (Get-PSFConfigValue -FullName 'AzOps.Core.MainTemplate'), + + [switch] + $CustomSortOrder ) begin { @@ -177,9 +182,8 @@ } if ($operation -in 'A', 'M', 'R' -or $operation -match '^R0[0-9][0-9]$') { $filename } } - if ($deleteSet) { $deleteSet = $deleteSet | Sort-Object } - if ($addModifySet) { $addModifySet = $addModifySet | Sort-Object } - # TODO: Clarify what happens with the deletes - not used after reporting them + if ($deleteSet -and -not $CustomSortOrder) { $deleteSet = $deleteSet | Sort-Object } + if ($addModifySet -and -not $CustomSortOrder) { $addModifySet = $addModifySet | Sort-Object } Write-PSFMessage -Level Important @common -String 'Invoke-AzOpsPush.Change.AddModify' foreach ($item in $addModifySet) { @@ -262,7 +266,7 @@ } $templateContent = Get-Content $deletion | ConvertFrom-Json -AsHashtable - if (-not($templateContent.resources[0].type -in "Microsoft.Authorization/policyAssignments","Microsoft.Authorization/policyExemptions","Microsoft.Authorization/roleAssignments")) { + if (-not($templateContent.resources[0].type -in "Microsoft.Authorization/policyAssignments", "Microsoft.Authorization/policyExemptions", "Microsoft.Authorization/roleAssignments")) { Write-PSFMessage -Level Warning -String 'Remove-AzOpsDeployment.SkipUnsupportedResource' -StringValues $deletion -Target $scopeObject continue } @@ -287,7 +291,7 @@ #Starting Tenant Deployment $uniqueProperties = 'Scope', 'DeploymentName', 'TemplateFilePath', 'TemplateParameterFilePath' - $deploymentList | Select-Object $uniqueProperties -Unique | Sort-Object -Property TemplateParameterFilePath | New-AzOpsDeployment -WhatIf:$WhatIfPreference + $deploymentList | Select-Object $uniqueProperties -Unique | New-AzOpsDeployment -WhatIf:$WhatIfPreference #Removal of policyAssignment, policyExemption and roleAssignment $uniqueProperties = 'Scope', 'TemplateFilePath' diff --git a/src/internal/functions/New-AzOpsDeployment.ps1 b/src/internal/functions/New-AzOpsDeployment.ps1 index a7d2f129..a15b692d 100644 --- a/src/internal/functions/New-AzOpsDeployment.ps1 +++ b/src/internal/functions/New-AzOpsDeployment.ps1 @@ -63,6 +63,7 @@ else { $scopeObject = New-AzOpsScope -Path $TemplateFilePath -StatePath $StatePath -ErrorAction Stop -WhatIf:$false } + $scopeFound = $true } catch { Write-PSFMessage -Level Warning -String 'New-AzOpsDeployment.Scope.Failed' -Target $TemplateFilePath -StringValues $TemplateFilePath, $TemplateParameterFilePath -ErrorRecord $_ @@ -84,215 +85,69 @@ #endregion #region Process Scope - #region Resource Group - if ($scopeObject.resourcegroup) { + # Configure variables/parameters and the WhatIf/Deployment cmdlets to be used per scope + $parameters = @{ + 'TemplateFile' = $TemplateFilePath + 'SkipTemplateParameterPrompt' = $true + 'Location' = (Get-PSFConfigValue -FullName 'AzOps.Core.DefaultDeploymentRegion') + } + # Resource Groups excluding Microsoft.Resources/resourceGroups that needs to be submitted at subscription scope + if ($scopeObject.resourcegroup -and $templateContent.resources[0].type -ne 'Microsoft.Resources/resourceGroups') { + Write-PSFMessage -Level Verbose -String 'New-AzOpsDeployment.ResourceGroup.Processing' -StringValues $scopeObject -Target $scopeObject Set-AzOpsContext -ScopeObject $scopeObject - if ($templateContent.resources[0].type -eq 'Microsoft.Resources/resourceGroups') { - # Since this is a deployment for resource group, it must be invoked at subscription scope - $defaultDeploymentRegion = Get-PSFConfigValue -FullName 'AzOps.Core.DefaultDeploymentRegion' - Write-PSFMessage -Level Verbose -String 'New-AzOpsDeployment.Subscription.Processing' -StringValues $defaultDeploymentRegion, $scopeObject -Target $scopeObject - - $parameters = @{ - 'TemplateFile' = $TemplateFilePath - 'Location' = $defaultDeploymentRegion - 'SkipTemplateParameterPrompt' = $true - } - if ($TemplateParameterFilePath) { - $parameters.TemplateParameterFile = $TemplateParameterFilePath - } - - if ((Get-AzContext).Subscription.Id -ne $scopeObject.subscription) { - Set-AzOpsContext -ScopeObject $scopeObject - } - if ($WhatifExcludedChangeTypes) { - $parameters.ExcludeChangeType = $WhatifExcludedChangeTypes - } - # Validate Template - $results = Get-AzSubscriptionDeploymentWhatIfResult @parameters -ErrorAction Continue -ErrorVariable resultsError - if ($parameters.ExcludeChangeType) { - $parameters.Remove('ExcludeChangeType') - } - if ($resultsError) { - if ($resultsError.exception.InnerException.Message -match 'https://aka.ms/resource-manager-parameter-files' -and $true -eq $bicepTemplate) { - Write-PSFMessage -Level Warning -String 'New-AzOpsDeployment.TemplateParameterError' -Target $scopeObject - $invalidTemplate = $true - } - else { - Write-PSFMessage -Level Warning -String 'New-AzOpsDeployment.WhatIfWarning' -Target $scopeObject -Tag Error -StringValues $resultsError.exception.InnerException.Message - throw $resultsError.exception.InnerException.Message - } - - } - elseif ($results.Error) { - Write-PSFMessage -Level Warning -String 'New-AzOpsDeployment.TemplateError' -StringValues $TemplateFilePath -Target $scopeObject - return - } - else { - Write-PSFMessage -Level Verbose -String 'Set-AzOpsWhatIfOutput.WhatIfResults' -StringValues ($results | Out-String) -Target $scopeObject - Write-PSFMessage -Level Verbose -String 'Set-AzOpsWhatIfOutput.WhatIfFile' -Target $scopeObject - Set-AzOpsWhatIfOutput -TemplatePath $TemplateFilePath -Results $results - } - - $parameters.Name = $DeploymentName - if ($PSCmdlet.ShouldProcess("Start Subscription Deployment?")) { - if (-not $invalidTemplate) { - New-AzSubscriptionDeployment @parameters - } - } - else { - # Exit deployment - Write-PSFMessage -Level Verbose -String 'New-AzOpsDeployment.SkipDueToWhatIf' - } - } - else { - Write-PSFMessage -Level Verbose -String 'New-AzOpsDeployment.ResourceGroup.Processing' -StringValues $scopeObject -Target $scopeObject - - $parameters = @{ - 'TemplateFile' = $TemplateFilePath - 'SkipTemplateParameterPrompt' = $true - 'ResourceGroupName' = $scopeObject.resourcegroup - } - if ($TemplateParameterFilePath) { - $parameters.TemplateParameterFile = $TemplateParameterFilePath - } - if ($WhatifExcludedChangeTypes) { - $parameters.ExcludeChangeType = $WhatifExcludedChangeTypes - } - $results = Get-AzResourceGroupDeploymentWhatIfResult @parameters -ErrorAction Continue -ErrorVariable resultsError - if ($parameters.ExcludeChangeType) { - $parameters.Remove('ExcludeChangeType') - } - if ($resultsError) { - $resultsErrorMessage = $resultsError.exception.InnerException.Message - if ($resultsErrorMessage -match 'https://aka.ms/resource-manager-parameter-files' -and $true -eq $bicepTemplate) { - Write-PSFMessage -Level Warning -String 'New-AzOpsDeployment.TemplateParameterError' -Target $scopeObject - $invalidTemplate = $true - } - elseif ($resultsErrorMessage -match 'DeploymentWhatIfResourceError' -and $resultsErrorMessage -match "The request to predict template deployment") { - Write-PSFMessage -Level Warning -String 'New-AzOpsDeployment.WhatIfWarning' -Target $scopeObject -Tag Error -StringValues $resultsErrorMessage - Set-AzOpsWhatIfOutput -TemplatePath $TemplateFilePath -Results ('{0}WhatIf prediction failed with error - validate changes manually before merging:{0}{1}' -f [environment]::NewLine, $resultsErrorMessage) - } - else { - Write-PSFMessage -Level Warning -String 'New-AzOpsDeployment.WhatIfWarning' -Target $scopeObject -Tag Error -StringValues $resultsErrorMessage - throw $resultsErrorMessage - } - - } - elseif ($results.Error) { - Write-PSFMessage -Level Warning -String 'New-AzOpsDeployment.TemplateError' -StringValues $TemplateFilePath -Target $scopeObject - return - } - else { - Write-PSFMessage -Level Verbose -String 'New-AzOpsDeployment.WhatIfResults' -StringValues ($results | Out-String) -Target $scopeObject - Write-PSFMessage -Level Verbose -String 'New-AzOpsDeployment.WhatIfFile' -Target $scopeObject - Set-AzOpsWhatIfOutput -TemplatePath $TemplateFilePath -Results $results - } - - $parameters.Name = $DeploymentName - if ($PSCmdlet.ShouldProcess("Start ResourceGroup Deployment?")) { - if (-not $invalidTemplate) { - New-AzResourceGroupDeployment @parameters - } - } - else { - # Exit deployment - Write-PSFMessage -Level Verbose -String 'New-AzOpsDeployment.SkipDueToWhatIf' - } - } + $whatIfCommand = 'Get-AzResourceGroupDeploymentWhatIfResult' + $deploymentCommand = 'New-AzResourceGroupDeployment' + $parameters.ResourceGroupName = $scopeObject.resourcegroup + $parameters.Remove('Location') } - #endregion Resource Group - #region Subscription + # Subscriptions elseif ($scopeObject.subscription) { - $defaultDeploymentRegion = Get-PSFConfigValue -FullName 'AzOps.Core.DefaultDeploymentRegion' Write-PSFMessage -Level Verbose -String 'New-AzOpsDeployment.Subscription.Processing' -StringValues $defaultDeploymentRegion, $scopeObject -Target $scopeObject - - if ((Get-AzContext).Subscription.Id -ne $scopeObject.subscription) { - Set-AzOpsContext -ScopeObject $scopeObject - } - - $parameters = @{ - 'TemplateFile' = $TemplateFilePath - 'Location' = $defaultDeploymentRegion - 'SkipTemplateParameterPrompt' = $true - } - if ($TemplateParameterFilePath) { - $parameters.TemplateParameterFile = $TemplateParameterFilePath - } - if ($WhatifExcludedChangeTypes) { - $parameters.ExcludeChangeType = $WhatifExcludedChangeTypes - } - $results = Get-AzSubscriptionDeploymentWhatIfResult @parameters -ErrorAction Continue -ErrorVariable resultsError - if ($parameters.ExcludeChangeType) { $parameters.Remove('ExcludeChangeType') } - if ($resultsError) { - $resultsErrorMessage = $resultsError.exception.InnerException.Message - if ($resultsErrorMessage -match 'https://aka.ms/resource-manager-parameter-files' -and $true -eq $bicepTemplate) { - Write-PSFMessage -Level Warning -String 'New-AzOpsDeployment.TemplateParameterError' -Target $scopeObject - $invalidTemplate = $true - } - elseif ($resultsErrorMessage -match 'DeploymentWhatIfResourceError' -and $resultsErrorMessage -match "The request to predict template deployment") { - Write-PSFMessage -Level Warning -String 'New-AzOpsDeployment.WhatIfWarning' -Target $scopeObject -Tag Error -StringValues $resultsErrorMessage - Set-AzOpsWhatIfOutput -TemplatePath $TemplateFilePath -Results ('{0}WhatIf prediction failed with error - validate changes manually before merging:{0}{1}' -f [environment]::NewLine, $resultsErrorMessage) - } - else { - Write-PSFMessage -Level Warning -String 'New-AzOpsDeployment.WhatIfWarning' -Target $scopeObject -Tag Error -StringValues $resultsErrorMessage - throw $resultsErrorMessage - } - } - elseif ($results.Error) { - Write-PSFMessage -Level Warning -String 'New-AzOpsDeployment.TemplateError' -StringValues $TemplateFilePath -Target $scopeObject - return - } - else { - Write-PSFMessage -Level Verbose -String 'New-AzOpsDeployment.WhatIfResults' -StringValues ($results | Out-String) -Target $scopeObject - Write-PSFMessage -Level Verbose -String 'New-AzOpsDeployment.WhatIfFile' -Target $scopeObject - Set-AzOpsWhatIfOutput -TemplatePath $TemplateFilePath -Results $results - } - - $parameters.Name = $DeploymentName - if ($PSCmdlet.ShouldProcess("Start Subscription Deployment?")) { - if (-not $invalidTemplate) { - New-AzSubscriptionDeployment @parameters - } - } - else { - # Exit deployment - Write-PSFMessage -Level Verbose -String 'New-AzOpsDeployment.SkipDueToWhatIf' - } + Set-AzOpsContext -ScopeObject $scopeObject + $whatIfCommand = 'Get-AzSubscriptionDeploymentWhatIfResult' + $deploymentCommand = 'New-AzSubscriptionDeployment' } - #endregion Subscription - #region Management Group + # Management Groups elseif ($scopeObject.managementGroup) { - $defaultDeploymentRegion = Get-PSFConfigValue -FullName 'AzOps.Core.DefaultDeploymentRegion' Write-PSFMessage -Level Verbose -String 'New-AzOpsDeployment.ManagementGroup.Processing' -StringValues $defaultDeploymentRegion, $scopeObject -Target $scopeObject - - $parameters = @{ - 'TemplateFile' = $TemplateFilePath - 'Location' = $defaultDeploymentRegion - 'ManagementGroupId' = $scopeObject.managementgroup - 'SkipTemplateParameterPrompt' = $true - } + $parameters.ManagementGroupId = $scopeObject.managementgroup + $whatIfCommand = 'Get-AzManagementGroupDeploymentWhatIfResult' + $deploymentCommand = 'New-AzManagementGroupDeployment' + } + # Tenant deployments + elseif ($scopeObject.type -eq 'root' -and $scopeObject.scope -eq '/') { + Write-PSFMessage -Level Verbose -String 'New-AzOpsDeployment.Root.Processing' -StringValues $defaultDeploymentRegion, $scopeObject -Target $scopeObject + $whatIfCommand = 'Get-AzTenantDeploymentWhatIfResult' + $deploymentCommand = 'New-AzTenantDeployment' + } + else { + Write-PSFMessage -Level Warning -String 'New-AzOpsDeployment.Scope.Unidentified' -Target $scopeObject -StringValues $scopeObject + $scopeFound = $false + } + # Proceed with WhatIf or Deployment if scope was found + if ($scopeFound) { if ($TemplateParameterFilePath) { $parameters.TemplateParameterFile = $TemplateParameterFilePath } if ($WhatifExcludedChangeTypes) { $parameters.ExcludeChangeType = $WhatifExcludedChangeTypes } - $results = Get-AzManagementGroupDeploymentWhatIfResult @parameters -ErrorAction SilentlyContinue -ErrorVariable resultsError - if ($parameters.ExcludeChangeType) { - $parameters.Remove('ExcludeChangeType') - } + # Get predictive deployment results from WhatIf API + $results = & $whatIfCommand @parameters -ErrorAction Continue -ErrorVariable resultsError if ($resultsError) { $resultsErrorMessage = $resultsError.exception.InnerException.Message + # Ignore errors for bicep modules if ($resultsErrorMessage -match 'https://aka.ms/resource-manager-parameter-files' -and $true -eq $bicepTemplate) { Write-PSFMessage -Level Warning -String 'New-AzOpsDeployment.TemplateParameterError' -Target $scopeObject $invalidTemplate = $true } + # Handle WhatIf prediction errors elseif ($resultsErrorMessage -match 'DeploymentWhatIfResourceError' -and $resultsErrorMessage -match "The request to predict template deployment") { Write-PSFMessage -Level Warning -String 'New-AzOpsDeployment.WhatIfWarning' -Target $scopeObject -Tag Error -StringValues $resultsErrorMessage Set-AzOpsWhatIfOutput -TemplatePath $TemplateFilePath -Results ('{0}WhatIf prediction failed with error - validate changes manually before merging:{0}{1}' -f [environment]::NewLine, $resultsErrorMessage) } else { - Write-PSFMessage -Level Warning -String 'New-AzOpsDeployment.WhatIfWarning' -Target $scopeObject -Tag Error -StringValues $resultsErrorMe + Write-PSFMessage -Level Warning -String 'New-AzOpsDeployment.WhatIfWarning' -Target $scopeObject -Tag Error -StringValues $resultsErrorMessage throw $resultsErrorMessage } } @@ -305,67 +160,20 @@ Write-PSFMessage -Level Verbose -String 'New-AzOpsDeployment.WhatIfFile' -Target $scopeObject Set-AzOpsWhatIfOutput -TemplatePath $TemplateFilePath -Results $results } - - $parameters.Name = $DeploymentName - if ($PSCmdlet.ShouldProcess("Start ManagementGroup Deployment?")) { - if (-not $invalidTemplate) { - New-AzManagementGroupDeployment @parameters - } - } - else { - # Exit deployment - Write-PSFMessage -Level Verbose -String 'New-AzOpsDeployment.SkipDueToWhatIf' - } - } - #endregion Management Group - #region Root - elseif ($scopeObject.type -eq 'root' -and $scopeObject.scope -eq '/') { - $defaultDeploymentRegion = Get-PSFConfigValue -FullName 'AzOps.Core.DefaultDeploymentRegion' - Write-PSFMessage -Level Verbose -String 'New-AzOpsDeployment.Root.Processing' -StringValues $defaultDeploymentRegion, $scopeObject -Target $scopeObject - - $parameters = @{ - 'TemplateFile' = $TemplateFilePath - 'location' = $defaultDeploymentRegion - 'SkipTemplateParameterPrompt' = $true - } - if ($TemplateParameterFilePath) { - $parameters.TemplateParameterFile = $TemplateParameterFilePath - } - if ($WhatifExcludedChangeTypes) { - $parameters.ExcludeChangeType = $WhatifExcludedChangeTypes - } - $results = Get-AzTenantDeploymentWhatIfResult @parameters -ErrorAction Continue -ErrorVariable resultsError + # Remove ExcludeChangeType parameter as it doesn't exist for deployment cmdlets if ($parameters.ExcludeChangeType) { $parameters.Remove('ExcludeChangeType') } - if ($resultsError) { - Write-PSFMessage -Level Warning -String 'New-AzOpsDeployment.WhatIfWarning' -StringValues $resultsError.Exception.Message -Target $scopeObject - } - elseif ($results.Error) { - Write-PSFMessage -Level Warning -String 'New-AzOpsDeployment.TemplateError' -StringValues $TemplateFilePath -Target $scopeObject - return - } - else { - Write-PSFMessage -Level Verbose -String 'New-AzOpsDeployment.WhatIfResults' -StringValues ($results | Out-String) -Target $scopeObject - Write-PSFMessage -Level Verbose -String 'New-AzOpsDeployment.WhatIfFile' -Target $scopeObject - Set-AzOpsWhatIfOutput -TemplatePath $TemplateFilePath -Results $results - } - $parameters.Name = $DeploymentName - if ($PSCmdlet.ShouldProcess("Start Tenant Deployment?")) { - New-AzTenantDeployment @parameters + if ($PSCmdlet.ShouldProcess("Start $($scopeObject.type) Deployment with $deploymentCommand?")) { + if (-not $invalidTemplate) { + & $deploymentCommand @parameters + } } else { # Exit deployment Write-PSFMessage -Level Verbose -String 'New-AzOpsDeployment.SkipDueToWhatIf' } } - #endregion Root - #region Unidentified - else { - Write-PSFMessage -Level Warning -String 'New-AzOpsDeployment.Scope.Unidentified' -Target $scopeObject -StringValues $scopeObject - } - #endregion Unidentified - #endregion Process Scope } } \ No newline at end of file diff --git a/src/tests/integration/Repository.Tests.ps1 b/src/tests/integration/Repository.Tests.ps1 index cd4df38f..1e1cccae 100644 --- a/src/tests/integration/Repository.Tests.ps1 +++ b/src/tests/integration/Repository.Tests.ps1 @@ -263,6 +263,10 @@ Describe "Repository" { $script:logAnalyticsWorkspaceSavedSearchesDirectory = ($script:logAnalyticsWorkspaceSavedSearchesPath).Directory $script:logAnalyticsWorkspaceSavedSearchesFile = ($script:logAnalyticsWorkspaceSavedSearchesPath).FullName Write-PSFMessage -Level Debug -Message "logAnalyticsWorkspaceSavedSearchesFile: $($script:logAnalyticsWorkspaceSavedSearchesFile)" -FunctionName "BeforeAll" + + $script:bicepTemplatePath = Get-ChildItem -Path "$($global:testRoot)/templates/bicep*" | Copy-Item -Destination $script:subscriptionDirectory -PassThru -Force + $script:bicepDeploymentName = "AzOps-{0}-{1}" -f $($script:bicepTemplatePath[0].Name.Replace(".bicep", '')), $deploymentLocationId + $script:bicepResourceGroupName = ((Get-Content -Path ($Script:bicepTemplatePath.FullName[1])) | ConvertFrom-Json).parameters.resourceGroupName.value #endregion Paths #Test push based on pulled resources @@ -274,6 +278,7 @@ Describe "Repository" { "A`t$script:resourceGroupFile", "A`t$script:routeTableFile", "A`t$script:ruleCollectionGroupsFile" + "A`t$($script:bicepTemplatePath.FullName[0])" ) Invoke-AzOpsPush -ChangeSet $changeSet @@ -544,6 +549,18 @@ Describe "Repository" { } #endregion + #region Deploy Resource Group via bicep + It "Bicep deployment should be successful" { + $script:bicepDeployment = Get-AzSubscriptionDeployment -Name $script:bicepDeploymentName + $bicepDeployment.ProvisioningState | Should -Be "Succeeded" + } + + It "Resource Group deployed through bicep should exist" { + $script:bicepResourceGroup = Get-AzResourceGroup -ResourceGroupName $script:bicepResourceGroupName + $bicepResourceGroup.ResourceGroupName | Should -Be $script:bicepResourceGroupName + } + #endregion + #region Scope - Role Assignment (./root/tenant root group/test/platform/management/subscription-0/roleassignments) It "Role Assignment directory should exist" { Test-Path -Path $script:roleAssignmentsDirectory | Should -BeTrue @@ -806,7 +823,7 @@ Describe "Repository" { $resourceGroup = Get-AzResourceGroup -Name "Application" if ($resourceGroup) { Write-PSFMessage -Level Verbose -Message "Removing Resource Groups" -FunctionName "AfterAll" - Remove-ResourceGroups -SubscriptionName $subscription.Name -ResourceGroupNames @($resourceGroup.ResourceGroupName) + Remove-ResourceGroups -SubscriptionName $subscription.Name -ResourceGroupNames @($resourceGroup.ResourceGroupName, $script:bicepResourceGroupName) } #endregion remove deployed resources diff --git a/src/tests/templates/biceptest.bicep b/src/tests/templates/biceptest.bicep new file mode 100644 index 00000000..ea66f709 --- /dev/null +++ b/src/tests/templates/biceptest.bicep @@ -0,0 +1,10 @@ +targetScope = 'subscription' +@description('Name of the resource group') +param resourceGroupName string + +resource myRg 'Microsoft.Resources/resourceGroups@2021-04-01' = { + name: resourceGroupName + location: 'northeurope' + tags: {} + properties: {} +} diff --git a/src/tests/templates/biceptest.parameters.json b/src/tests/templates/biceptest.parameters.json new file mode 100644 index 00000000..ed3a49a5 --- /dev/null +++ b/src/tests/templates/biceptest.parameters.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "resourceGroupName": { + "value": "bicepTest" + } + } +} \ No newline at end of file