Sync eng/common directory with azure-sdk-tools for PR 1525 (#2015)
* Use SubscriptionId throughout TestResources Fixes #1454 * Resolve PR feedback * Default DeleteAfterHours to 48 for SDK team Also makes a few other adjustments for subscriptions, like restoring the previous one if available and another was specified. * Resolve PR feedback * Change deployment mode to Complete Also fixes an issue where if the user opted not to deploy to the same resource group, the script would continue execution anyway. * Use consistent aka links to satisfy link checker Only need it for the new Update-TestResources.ps1 script, but I wanted them to look consistent. Co-authored-by: Heath Stewart <heaths@microsoft.com>
This commit is contained in:
parent
80e61d8929
commit
0c1ec5c69e
@ -39,7 +39,7 @@ param (
|
||||
# Azure SDK Developer Playground subscription
|
||||
[Parameter()]
|
||||
[ValidatePattern('^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$')]
|
||||
[string] $SubscriptionId = 'faa080af-c1d8-40ad-9cce-e1a450ca5b57',
|
||||
[string] $SubscriptionId,
|
||||
|
||||
[Parameter(ParameterSetName = 'Provisioner', Mandatory = $true)]
|
||||
[ValidatePattern('^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$')]
|
||||
@ -49,8 +49,8 @@ param (
|
||||
[string] $ProvisionerApplicationSecret,
|
||||
|
||||
[Parameter()]
|
||||
[ValidateRange(0, [int]::MaxValue)]
|
||||
[int] $DeleteAfterHours,
|
||||
[ValidateRange(1, [int]::MaxValue)]
|
||||
[int] $DeleteAfterHours = 48,
|
||||
|
||||
[Parameter()]
|
||||
[string] $Location = '',
|
||||
@ -166,7 +166,7 @@ try {
|
||||
Log "Generated base name '$BaseName' for CI build"
|
||||
} elseif (!$BaseName) {
|
||||
$BaseName = "$UserName$ServiceDirectory"
|
||||
Log "BaseName was not set. Using default base name: '$BaseName'"
|
||||
Log "BaseName was not set. Using default base name '$BaseName'"
|
||||
}
|
||||
|
||||
# Make sure pre- and post-scripts are passed formerly required arguments.
|
||||
@ -200,35 +200,74 @@ try {
|
||||
# Make sure the user is logged in to create a service principal.
|
||||
$context = Get-AzContext;
|
||||
if (!$context) {
|
||||
$subscriptionName = $SubscriptionId
|
||||
Log 'User not logged in. Logging in now...'
|
||||
$context = (Connect-AzAccount).Context
|
||||
}
|
||||
|
||||
# Use cache of well-known team subs without having to be authenticated.
|
||||
$wellKnownSubscriptions = @{
|
||||
'faa080af-c1d8-40ad-9cce-e1a450ca5b57' = 'Azure SDK Developer Playground'
|
||||
'a18897a6-7e44-457d-9260-f2854c0aca42' = 'Azure SDK Engineering System'
|
||||
'2cd617ea-1866-46b1-90e3-fffb087ebf9b' = 'Azure SDK Test Resources'
|
||||
$currentSubcriptionId = $context.Subscription.Id
|
||||
|
||||
# If no subscription was specified, try to select the Azure SDK Developer Playground subscription.
|
||||
# Ignore errors to leave the automatically selected subscription.
|
||||
if ($SubscriptionId) {
|
||||
if ($currentSubcriptionId -ne $SubscriptionId) {
|
||||
Log "Selecting subscription '$SubscriptionId'"
|
||||
$null = Select-AzSubscription -Subscription $SubscriptionId
|
||||
|
||||
$exitActions += {
|
||||
Log "Selecting previous subscription '$currentSubcriptionId'"
|
||||
$null = Select-AzSubscription -Subscription $currentSubcriptionId
|
||||
}
|
||||
|
||||
# Update the context.
|
||||
$context = Get-AzContext
|
||||
}
|
||||
} else {
|
||||
if ($currentSubcriptionId -ne 'faa080af-c1d8-40ad-9cce-e1a450ca5b57') {
|
||||
Log "Attempting to select subscription 'Azure SDK Developer Playground (faa080af-c1d8-40ad-9cce-e1a450ca5b57)'"
|
||||
$null = Select-AzSubscription -Subscription 'faa080af-c1d8-40ad-9cce-e1a450ca5b57' -ErrorAction Ignore
|
||||
|
||||
# Update the context.
|
||||
$context = Get-AzContext
|
||||
}
|
||||
|
||||
if ($wellKnownSubscriptions.ContainsKey($SubscriptionId)) {
|
||||
$subscriptionName = '{0} ({1})' -f $wellKnownSubscriptions[$SubscriptionId], $SubscriptionId
|
||||
}
|
||||
$SubscriptionId = $context.Subscription.Id
|
||||
$PSBoundParameters['SubscriptionId'] = $SubscriptionId
|
||||
}
|
||||
|
||||
Log "You are not logged in; connecting to $subscriptionName"
|
||||
$context = (Connect-AzAccount -Subscription $SubscriptionId).Context
|
||||
# Use cache of well-known team subs without having to be authenticated.
|
||||
$wellKnownSubscriptions = @{
|
||||
'faa080af-c1d8-40ad-9cce-e1a450ca5b57' = 'Azure SDK Developer Playground'
|
||||
'a18897a6-7e44-457d-9260-f2854c0aca42' = 'Azure SDK Engineering System'
|
||||
'2cd617ea-1866-46b1-90e3-fffb087ebf9b' = 'Azure SDK Test Resources'
|
||||
}
|
||||
|
||||
# Print which subscription is currently selected.
|
||||
$subscriptionName = $context.Subscription.Id
|
||||
if ($wellKnownSubscriptions.ContainsKey($subscriptionName)) {
|
||||
$subscriptionName = '{0} ({1})' -f $wellKnownSubscriptions[$subscriptionName], $subscriptionName
|
||||
}
|
||||
|
||||
Log "Using subscription '$subscriptionName'"
|
||||
|
||||
# Make sure the TenantId is also updated from the current context.
|
||||
# PSBoundParameters is not updated to avoid confusing parameter sets.
|
||||
if (!$TenantId) {
|
||||
$TenantId = $context.Subscription.TenantId
|
||||
}
|
||||
|
||||
# If no test application ID is specified during an interactive session, create a new service principal.
|
||||
if (!$TestApplicationId) {
|
||||
|
||||
# Cache the created service principal in this session for frequent reuse.
|
||||
$servicePrincipal = if ($AzureTestPrincipal -and (Get-AzADServicePrincipal -ApplicationId $AzureTestPrincipal.ApplicationId)) {
|
||||
$servicePrincipal = if ($AzureTestPrincipal -and (Get-AzADServicePrincipal -ApplicationId $AzureTestPrincipal.ApplicationId) -and $AzureTestSubscription -eq $SubscriptionId) {
|
||||
Log "TestApplicationId was not specified; loading cached service principal '$($AzureTestPrincipal.ApplicationId)'"
|
||||
$AzureTestPrincipal
|
||||
} else {
|
||||
Log 'TestApplicationId was not specified; creating a new service principal'
|
||||
$global:AzureTestPrincipal = New-AzADServicePrincipal -Role Owner
|
||||
Log "TestApplicationId was not specified; creating a new service principal in subscription '$SubscriptionId'"
|
||||
$global:AzureTestPrincipal = New-AzADServicePrincipal -Role Owner -Scope "/subscriptions/$SubscriptionId"
|
||||
$global:AzureTestSubscription = $SubscriptionId
|
||||
|
||||
Log "Created service principal '$AzureTestPrincipal'"
|
||||
Log "Created service principal '$($AzureTestPrincipal.ApplicationId)'"
|
||||
$AzureTestPrincipal
|
||||
}
|
||||
|
||||
@ -251,13 +290,15 @@ try {
|
||||
if ($ProvisionerApplicationId) {
|
||||
$null = Disable-AzContextAutosave -Scope Process
|
||||
|
||||
Log "Logging into service principal '$ProvisionerApplicationId'"
|
||||
Log "Logging into service principal '$ProvisionerApplicationId'."
|
||||
Write-Warning 'Logging into service principal may fail until the principal is fully propagated.'
|
||||
|
||||
$provisionerSecret = ConvertTo-SecureString -String $ProvisionerApplicationSecret -AsPlainText -Force
|
||||
$provisionerCredential = [System.Management.Automation.PSCredential]::new($ProvisionerApplicationId, $provisionerSecret)
|
||||
|
||||
# Use the given subscription ID if provided.
|
||||
$subscriptionArgs = if ($SubscriptionId) {
|
||||
@{SubscriptionId = $SubscriptionId}
|
||||
@{Subscription = $SubscriptionId}
|
||||
} else {
|
||||
@{}
|
||||
}
|
||||
@ -292,7 +333,7 @@ try {
|
||||
|
||||
# If the ServiceDirectory is an absolute path use the last directory name
|
||||
# (e.g. D:\foo\bar\ -> bar)
|
||||
$serviceName = if (Split-Path -IsAbsolute $ServiceDirectory) {
|
||||
$serviceName = if (Split-Path -IsAbsolute $ServiceDirectory) {
|
||||
Split-Path -Leaf $ServiceDirectory
|
||||
} else {
|
||||
$ServiceDirectory
|
||||
@ -307,16 +348,15 @@ try {
|
||||
"rg-$BaseName"
|
||||
}
|
||||
|
||||
# Tag the resource group to be deleted after a certain number of hours if specified.
|
||||
$tags = @{
|
||||
Creator = $UserName
|
||||
ServiceDirectory = $ServiceDirectory
|
||||
}
|
||||
|
||||
if ($PSBoundParameters.ContainsKey('DeleteAfterHours')) {
|
||||
$deleteAfter = [DateTime]::UtcNow.AddHours($DeleteAfterHours)
|
||||
$tags.Add('DeleteAfter', $deleteAfter.ToString('o'))
|
||||
}
|
||||
# Tag the resource group to be deleted after a certain number of hours.
|
||||
Write-Warning "Any clean-up scripts running against subscription '$SubscriptionId' may delete resource group '$ResourceGroupName' after $DeleteAfterHours hours."
|
||||
$deleteAfter = [DateTime]::UtcNow.AddHours($DeleteAfterHours).ToString('o')
|
||||
$tags['DeleteAfter'] = $deleteAfter
|
||||
|
||||
if ($CI) {
|
||||
# Add tags for the current CI job.
|
||||
@ -348,11 +388,15 @@ try {
|
||||
# New-AzResourceGroup would've written an error and stopped the pipeline by default anyway.
|
||||
Write-Verbose "Successfully created resource group '$($resourceGroup.ResourceGroupName)'"
|
||||
}
|
||||
elseif (!$resourceGroup -and !$PSCmdlet.ShouldProcess($resourceGroupName)) {
|
||||
# If the -WhatIf flag was passed, there will be no resource group created. Fake it.
|
||||
$resourceGroup = [PSCustomObject]@{
|
||||
ResourceGroupName = $resourceGroupName
|
||||
Location = $Location
|
||||
elseif (!$resourceGroup) {
|
||||
if (!$PSCmdlet.ShouldProcess($resourceGroupName)) {
|
||||
# If the -WhatIf flag was passed, there will be no resource group created. Fake it.
|
||||
$resourceGroup = [PSCustomObject]@{
|
||||
ResourceGroupName = $resourceGroupName
|
||||
Location = $Location
|
||||
}
|
||||
} else {
|
||||
Write-Error "Resource group '$ResourceGroupName' already exists." -Category ResourceExists -RecommendedAction "Delete resource group '$ResourceGroupName', or overwrite it when redeploying."
|
||||
}
|
||||
}
|
||||
|
||||
@ -413,16 +457,16 @@ try {
|
||||
$lastDebugPreference = $DebugPreference
|
||||
try {
|
||||
if ($CI) {
|
||||
$DebugPreference = "Continue"
|
||||
$DebugPreference = 'Continue'
|
||||
}
|
||||
New-AzResourceGroupDeployment -Name $BaseName -ResourceGroupName $resourceGroup.ResourceGroupName -TemplateFile $templateFile -TemplateParameterObject $templateFileParameters
|
||||
New-AzResourceGroupDeployment -Name $BaseName -ResourceGroupName $resourceGroup.ResourceGroupName -TemplateFile $templateFile -TemplateParameterObject $templateFileParameters -Mode Complete -Force:$Force
|
||||
} catch {
|
||||
Write-Output @"
|
||||
Write-Output @'
|
||||
#####################################################
|
||||
# For help debugging live test provisioning issues, #
|
||||
# see http://aka.ms/azsdk/engsys/live-test-help, #
|
||||
#####################################################
|
||||
"@
|
||||
'@
|
||||
throw
|
||||
} finally {
|
||||
$DebugPreference = $lastDebugPreference
|
||||
@ -466,7 +510,7 @@ try {
|
||||
|
||||
if ($OutFile) {
|
||||
if (!$IsWindows) {
|
||||
Write-Host "File option is supported only on Windows"
|
||||
Write-Host 'File option is supported only on Windows'
|
||||
}
|
||||
|
||||
$outputFile = "$templateFile.env"
|
||||
@ -595,7 +639,11 @@ is passed to the ARM template as 'tenantId'.
|
||||
Optional subscription ID to use for new resources when logging in as a
|
||||
provisioner. You can also use Set-AzContext if not provisioning.
|
||||
|
||||
The default is the Azure SDK Developer Playground subscription ID.
|
||||
If you do not specify a SubscriptionId and are not logged in, one will be
|
||||
automatically selected for you by the Connect-AzAccount cmdlet.
|
||||
|
||||
Once you are logged in (or were previously), the selected SubscriptionId
|
||||
will be used for subsequent operations that are specific to a subscription.
|
||||
|
||||
.PARAMETER ProvisionerApplicationId
|
||||
The AAD Application ID used to provision test resources when a provisioner is
|
||||
@ -614,17 +662,14 @@ If none is specified New-TestResources.ps1 uses the TestApplicationSecret.
|
||||
This value is not passed to the ARM template.
|
||||
|
||||
.PARAMETER DeleteAfterHours
|
||||
Optional. Positive integer number of hours from the current time to set the
|
||||
Positive integer number of hours from the current time to set the
|
||||
'DeleteAfter' tag on the created resource group. The computed value is a
|
||||
timestamp of the form "2020-03-04T09:07:04.3083910Z".
|
||||
|
||||
If this value is not specified no 'DeleteAfter' tag will be assigned to the
|
||||
created resource group.
|
||||
|
||||
An optional cleanup process can delete resource groups whose "DeleteAfter"
|
||||
timestamp is less than the current time.
|
||||
|
||||
This isused for CI automation.
|
||||
This is used for CI automation.
|
||||
|
||||
.PARAMETER Location
|
||||
Optional location where resources should be created. If left empty, the default
|
||||
@ -660,8 +705,8 @@ Save test environment settings into a test-resources.json.env file next to test-
|
||||
The environment file would be scoped to the current repository directory.
|
||||
|
||||
.EXAMPLE
|
||||
Connect-AzAccount -Subscription "REPLACE_WITH_SUBSCRIPTION_ID"
|
||||
New-TestResources.ps1 -ServiceDirectory 'keyvault'
|
||||
Connect-AzAccount -Subscription 'REPLACE_WITH_SUBSCRIPTION_ID'
|
||||
New-TestResources.ps1 keyvault
|
||||
|
||||
Run this in a desktop environment to create new AAD apps and Service Principals
|
||||
that can be used to provision resources and run live tests.
|
||||
|
||||
@ -16,9 +16,9 @@ Deploys live test resources defined for a service directory to Azure.
|
||||
```
|
||||
New-TestResources.ps1 [-BaseName <String>] [-ResourceGroupName <String>] [-ServiceDirectory] <String>
|
||||
[-TestApplicationId <String>] [-TestApplicationSecret <String>] [-TestApplicationOid <String>]
|
||||
[-DeleteAfterHours <Int32>] [-Location <String>] [-Environment <String>] [-ArmTemplateParameters <Hashtable>]
|
||||
[-AdditionalParameters <Hashtable>] [-EnvironmentVariables <Hashtable>] [-CI] [-Force] [-OutFile] [-WhatIf]
|
||||
[-Confirm] [<CommonParameters>]
|
||||
[-SubscriptionId <String>] [-DeleteAfterHours <Int32>] [-Location <String>] [-Environment <String>]
|
||||
[-ArmTemplateParameters <Hashtable>] [-AdditionalParameters <Hashtable>] [-EnvironmentVariables <Hashtable>]
|
||||
[-CI] [-Force] [-OutFile] [-WhatIf] [-Confirm] [<CommonParameters>]
|
||||
```
|
||||
|
||||
### Provisioner
|
||||
@ -55,8 +55,8 @@ specified in $ProvisionerApplicationId and $ProvisionerApplicationSecret.
|
||||
|
||||
### EXAMPLE 1
|
||||
```
|
||||
Connect-AzAccount -Subscription "REPLACE_WITH_SUBSCRIPTION_ID"
|
||||
New-TestResources.ps1 -ServiceDirectory 'keyvault'
|
||||
Connect-AzAccount -Subscription 'REPLACE_WITH_SUBSCRIPTION_ID'
|
||||
New-TestResources.ps1 keyvault
|
||||
```
|
||||
|
||||
Run this in a desktop environment to create new AAD apps and Service Principals
|
||||
@ -231,16 +231,20 @@ Optional subscription ID to use for new resources when logging in as a
|
||||
provisioner.
|
||||
You can also use Set-AzContext if not provisioning.
|
||||
|
||||
The default is the Azure SDK Developer Playground subscription ID.
|
||||
If you do not specify a SubscriptionId and are not logged in, one will be
|
||||
automatically selected for you by the Connect-AzAccount cmdlet.
|
||||
|
||||
Once you are logged in (or were previously), the selected SubscriptionId
|
||||
will be used for subsequent operations that are specific to a subscription.
|
||||
|
||||
```yaml
|
||||
Type: String
|
||||
Parameter Sets: Provisioner
|
||||
Parameter Sets: (All)
|
||||
Aliases:
|
||||
|
||||
Required: False
|
||||
Position: Named
|
||||
Default value: faa080af-c1d8-40ad-9cce-e1a450ca5b57
|
||||
Default value: None
|
||||
Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
@ -286,19 +290,15 @@ Accept wildcard characters: False
|
||||
```
|
||||
|
||||
### -DeleteAfterHours
|
||||
Optional.
|
||||
Positive integer number of hours from the current time to set the
|
||||
'DeleteAfter' tag on the created resource group.
|
||||
The computed value is a
|
||||
timestamp of the form "2020-03-04T09:07:04.3083910Z".
|
||||
|
||||
If this value is not specified no 'DeleteAfter' tag will be assigned to the
|
||||
created resource group.
|
||||
|
||||
An optional cleanup process can delete resource groups whose "DeleteAfter"
|
||||
timestamp is less than the current time.
|
||||
|
||||
This isused for CI automation.
|
||||
This is used for CI automation.
|
||||
|
||||
```yaml
|
||||
Type: Int32
|
||||
@ -307,7 +307,7 @@ Aliases:
|
||||
|
||||
Required: False
|
||||
Position: Named
|
||||
Default value: 0
|
||||
Default value: 48
|
||||
Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
|
||||
@ -20,15 +20,17 @@ scenarios as well as on hosted agents for continuous integration testing.
|
||||
|
||||
To set up your Azure account to run live tests, you'll need to log into Azure,
|
||||
and set up your resources defined in test-resources.json as shown in the following
|
||||
example using Azure Search. The script will create a service principal automatically,
|
||||
example using Azure Key Vault. The script will create a service principal automatically,
|
||||
or you may create a service principal you can save and reuse subsequently.
|
||||
|
||||
Note that `-Subscription` is an optional parameter but recommended if your account
|
||||
is a member of multiple subscriptions.
|
||||
is a member of multiple subscriptions. If you didn't specify it when logging in,
|
||||
you should select your desired subscription using `Select-AzSubscription`. The
|
||||
default can be saved using `Set-AzDefault` for future sessions.
|
||||
|
||||
```powershell
|
||||
Connect-AzAccount -Subscription 'YOUR SUBSCRIPTION ID'
|
||||
eng\common\TestResources\New-TestResources.ps1 -ServiceDirectory 'search' -SubscriptionId 'YOUR SUBSCRIPTION ID'
|
||||
eng\common\TestResources\New-TestResources.ps1 keyvault
|
||||
```
|
||||
|
||||
The `OutFile` switch will be set by default if you are running this for a .NET project on Windows. This will save test environment settings
|
||||
@ -40,14 +42,14 @@ Along with some log messages, this will output environment variables based on
|
||||
your current shell like in the following example:
|
||||
|
||||
```powershell
|
||||
${env:AZURE_TENANT_ID} = '<<secret>>'
|
||||
${env:AZURE_CLIENT_ID} = '<<secret>>'
|
||||
${env:AZURE_CLIENT_SECRET} = '<<secret>>'
|
||||
${env:AZURE_SUBSCRIPTION_ID} = 'YOUR SUBSCRIPTION ID'
|
||||
${env:AZURE_RESOURCE_GROUP} = 'rg-myusername'
|
||||
${env:AZURE_LOCATION} = 'westus2'
|
||||
${env:AZURE_SEARCH_STORAGE_NAME} = 'myusernamestg'
|
||||
${env:AZURE_SEARCH_STORAGE_KEY} = '<<secret>>'
|
||||
${env:KEYVAULT_TENANT_ID} = '<<secret>>'
|
||||
${env:KEYVAULT_CLIENT_ID} = '<<secret>>'
|
||||
${env:KEYVAULT_CLIENT_SECRET} = '<<secret>>'
|
||||
${env:KEYVAULT_SUBSCRIPTION_ID} = 'YOUR SUBSCRIPTION ID'
|
||||
${env:KEYVAULT_RESOURCE_GROUP} = 'rg-myusername'
|
||||
${env:KEYVAULT_LOCATION} = 'westus2'
|
||||
${env:KEYVAULT_SKU} = 'premium'
|
||||
${env:AZURE_KEYVAULT_URL} = '<<url>>'
|
||||
```
|
||||
|
||||
For security reasons we do not set these environment variables automatically
|
||||
@ -63,26 +65,41 @@ applications started outside the terminal, you could copy and paste the
|
||||
following commands:
|
||||
|
||||
```powershell
|
||||
setx AZURE_TENANT_ID ${env:AZURE_TENANT_ID}
|
||||
setx AZURE_CLIENT_ID ${env:AZURE_CLIENT_ID}
|
||||
setx AZURE_CLIENT_SECRET ${env:AZURE_CLIENT_SECRET}
|
||||
setx AZURE_SUBSCRIPTION_ID ${env:AZURE_SUBSCRIPTION_ID}
|
||||
setx AZURE_RESOURCE_GROUP ${env:AZURE_RESOURCE_GROUP}
|
||||
setx AZURE_LOCATION ${env:AZURE_LOCATION}
|
||||
setx AZURE_SEARCH_STORAGE_NAME ${env:AZURE_SEARCH_STORAGE_NAME}
|
||||
setx AZURE_SEARCH_STORAGE_KEY ${env:AZURE_SEARCH_STORAGE_KEY}
|
||||
setx KEYVAULT_TENANT_ID ${env:KEYVAULT_TENANT_ID}
|
||||
setx KEYVAULT_CLIENT_ID ${env:KEYVAULT_CLIENT_ID}
|
||||
setx KEYVAULT_CLIENT_SECRET ${env:KEYVAULT_CLIENT_SECRET}
|
||||
setx KEYVAULT_SUBSCRIPTION_ID ${env:KEYVAULT_SUBSCRIPTION_ID}
|
||||
setx KEYVAULT_RESOURCE_GROUP ${env:KEYVAULT_RESOURCE_GROUP}
|
||||
setx KEYVAULT_LOCATION ${env:KEYVAULT_LOCATION}
|
||||
setx KEYVAULT_SKU ${env:KEYVAULT_SKU}
|
||||
setx AZURE_KEYVAULT_URL ${env:AZURE_KEYVAULT_URL}
|
||||
```
|
||||
|
||||
After running or recording live tests, if you do not plan on further testing
|
||||
you can remove the test resources you created above by running:
|
||||
[Remove-TestResources.ps1][]:
|
||||
### Cleaning up Resources
|
||||
|
||||
By default, resource groups are tagged with a `DeleteAfter` value and date according to the default or specified
|
||||
value for the `-DeleteAfterHours` switch. You can use this tag in scheduled jobs to remove older resources based
|
||||
on that date.
|
||||
|
||||
If you are not ready for the resources to be deleted, you can update the resource group by running [Update-TestResources.ps1][]:
|
||||
|
||||
```powershell
|
||||
Remove-TestResources.ps1 -BaseName 'myusername' -Force
|
||||
Update-TestResources.ps1 keyvault
|
||||
```
|
||||
|
||||
This will extend the expiration time by the default value (e.g. 48 hours) from now.
|
||||
|
||||
Alternatively, after running or recording live tests, if you do not plan on further testing
|
||||
you can immediately remove the test resources you created above by running [Remove-TestResources.ps1][]:
|
||||
|
||||
```powershell
|
||||
Remove-TestResources.ps1 keyvault -Force
|
||||
```
|
||||
|
||||
If you persisted environment variables, you should also remove those as well.
|
||||
|
||||
### Passing Additional Arguments
|
||||
|
||||
Some test-resources.json templates utilize the `AdditionalParameters` parameter to control additional resource configuration options. For example:
|
||||
|
||||
```powershell
|
||||
@ -117,10 +134,13 @@ Install-Module platyPS -Scope CurrentUser -Force
|
||||
New-MarkdownHelp -Command .\New-TestResources.ps1 -OutputFolder . -Force
|
||||
```
|
||||
|
||||
After the markdown files are generated, please make sure all "http" URIs use "https".
|
||||
|
||||
PowerShell markdown documentation created with [platyPS][].
|
||||
|
||||
[New-TestResources.ps1]: https://github.com/Azure/azure-sdk-tools/blob/master/eng/common/TestResources/New-TestResources.ps1.md
|
||||
[Remove-TestResources.ps1]: https://github.com/Azure/azure-sdk-tools/blob/master/eng/common/TestResources/Remove-TestResources.ps1.md
|
||||
[New-TestResources.ps1]: https://aka.ms/azsdk/tools/New-TestResources
|
||||
[Update-TestResources.ps1]: https://aka.ms/azsdk/tools/Update-TestResources
|
||||
[Remove-TestResources.ps1]: https://aka.ms/azsdk/tools/Remove-TestResources
|
||||
[PowerShell]: https://github.com/PowerShell/PowerShell
|
||||
[PowerShellAz]: https://docs.microsoft.com/powershell/azure/install-az-ps
|
||||
[platyPS]: https://github.com/PowerShell/platyPS
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
[CmdletBinding(DefaultParameterSetName = 'Default', SupportsShouldProcess = $true, ConfirmImpact = 'Medium')]
|
||||
param (
|
||||
# Limit $BaseName to enough characters to be under limit plus prefixes, and https://docs.microsoft.com/azure/architecture/best-practices/resource-naming.
|
||||
[Parameter(ParameterSetName = 'Default', Mandatory = $true, Position = 0)]
|
||||
[Parameter(ParameterSetName = 'Default')]
|
||||
[Parameter(ParameterSetName = 'Default+Provisioner', Mandatory = $true, Position = 0)]
|
||||
[ValidatePattern('^[-a-zA-Z0-9\.\(\)_]{0,80}(?<=[a-zA-Z0-9\(\)])$')]
|
||||
[string] $BaseName,
|
||||
@ -25,8 +25,7 @@ param (
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[string] $TenantId,
|
||||
|
||||
[Parameter(ParameterSetName = 'Default+Provisioner')]
|
||||
[Parameter(ParameterSetName = 'ResourceGroup+Provisioner')]
|
||||
[Parameter()]
|
||||
[ValidatePattern('^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$')]
|
||||
[string] $SubscriptionId,
|
||||
|
||||
@ -39,7 +38,10 @@ param (
|
||||
[Parameter(ParameterSetName = 'ResourceGroup+Provisioner', Mandatory = $true)]
|
||||
[string] $ProvisionerApplicationSecret,
|
||||
|
||||
[Parameter()]
|
||||
[Parameter(ParameterSetName = 'Default', Mandatory = $true, Position = 0)]
|
||||
[Parameter(ParameterSetName = 'Default+Provisioner')]
|
||||
[Parameter(ParameterSetName = 'ResourceGroup')]
|
||||
[Parameter(ParameterSetName = 'ResourceGroup+Provisioner')]
|
||||
[string] $ServiceDirectory,
|
||||
|
||||
[Parameter()]
|
||||
@ -118,12 +120,67 @@ if ($ProvisionerApplicationId) {
|
||||
}
|
||||
}
|
||||
|
||||
$context = Get-AzContext
|
||||
|
||||
# Make sure $BaseName is set.
|
||||
if (!$BaseName) {
|
||||
|
||||
$UserName = if ($env:USER) { $env:USER } else { "${env:USERNAME}" }
|
||||
# Remove spaces, etc. that may be in $UserName
|
||||
$UserName = $UserName -replace '\W'
|
||||
|
||||
$BaseName = "$UserName$ServiceDirectory"
|
||||
Log "BaseName was not set. Using default base name '$BaseName'"
|
||||
}
|
||||
|
||||
if (!$ResourceGroupName) {
|
||||
# Format the resource group name like in New-TestResources.ps1.
|
||||
$ResourceGroupName = "rg-$BaseName"
|
||||
}
|
||||
|
||||
if (![string]::IsNullOrWhiteSpace($ServiceDirectory)) {
|
||||
# If no subscription was specified, try to select the Azure SDK Developer Playground subscription.
|
||||
# Ignore errors to leave the automatically selected subscription.
|
||||
if ($SubscriptionId) {
|
||||
$currentSubcriptionId = $context.Subscription.Id
|
||||
if ($currentSubcriptionId -ne $SubscriptionId) {
|
||||
Log "Selecting subscription '$SubscriptionId'"
|
||||
$null = Select-AzSubscription -Subscription $SubscriptionId
|
||||
|
||||
$exitActions += {
|
||||
Log "Selecting previous subscription '$currentSubcriptionId'"
|
||||
$null = Select-AzSubscription -Subscription $currentSubcriptionId
|
||||
}
|
||||
|
||||
# Update the context.
|
||||
$context = Get-AzContext
|
||||
}
|
||||
} else {
|
||||
Log "Attempting to select subscription 'Azure SDK Developer Playground (faa080af-c1d8-40ad-9cce-e1a450ca5b57)'"
|
||||
$null = Select-AzSubscription -Subscription 'faa080af-c1d8-40ad-9cce-e1a450ca5b57' -ErrorAction Ignore
|
||||
|
||||
# Update the context.
|
||||
$context = Get-AzContext
|
||||
|
||||
$SubscriptionId = $context.Subscription.Id
|
||||
$PSBoundParameters['SubscriptionId'] = $SubscriptionId
|
||||
}
|
||||
|
||||
# Use cache of well-known team subs without having to be authenticated.
|
||||
$wellKnownSubscriptions = @{
|
||||
'faa080af-c1d8-40ad-9cce-e1a450ca5b57' = 'Azure SDK Developer Playground'
|
||||
'a18897a6-7e44-457d-9260-f2854c0aca42' = 'Azure SDK Engineering System'
|
||||
'2cd617ea-1866-46b1-90e3-fffb087ebf9b' = 'Azure SDK Test Resources'
|
||||
}
|
||||
|
||||
# Print which subscription is currently selected.
|
||||
$subscriptionName = $context.Subscription.Id
|
||||
if ($wellKnownSubscriptions.ContainsKey($subscriptionName)) {
|
||||
$subscriptionName = '{0} ({1})' -f $wellKnownSubscriptions[$subscriptionName], $subscriptionName
|
||||
}
|
||||
|
||||
Log "Selected subscription '$subscriptionName'"
|
||||
|
||||
if ($ServiceDirectory) {
|
||||
$root = [System.IO.Path]::Combine("$PSScriptRoot/../../../sdk", $ServiceDirectory) | Resolve-Path
|
||||
$preRemovalScript = Join-Path -Path $root -ChildPath 'remove-test-resources-pre.ps1'
|
||||
if (Test-Path $preRemovalScript) {
|
||||
@ -135,6 +192,9 @@ if (![string]::IsNullOrWhiteSpace($ServiceDirectory)) {
|
||||
|
||||
&$preRemovalScript @PSBoundParameters
|
||||
}
|
||||
|
||||
# Make sure environment files from New-TestResources -OutFile are removed.
|
||||
Get-ChildItem -Path $root -Filter test-resources.json.env -Recurse | Remove-Item -Force:$Force
|
||||
}
|
||||
|
||||
$verifyDeleteScript = {
|
||||
@ -169,6 +229,7 @@ $exitActions.Invoke()
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Deletes the resource group deployed for a service directory from Azure.
|
||||
|
||||
.DESCRIPTION
|
||||
Removes a resource group and all its resources previously deployed using
|
||||
New-TestResources.ps1.
|
||||
@ -177,32 +238,48 @@ you will be asked to log in with Connect-AzAccount. Alternatively, you (or a
|
||||
build pipeline) can pass $ProvisionerApplicationId and
|
||||
$ProvisionerApplicationSecret to authenticate a service principal with access to
|
||||
create resources.
|
||||
|
||||
.PARAMETER BaseName
|
||||
A name to use in the resource group and passed to the ARM template as 'baseName'.
|
||||
This will delete the resource group named 'rg-<baseName>'
|
||||
|
||||
.PARAMETER ResourceGroupName
|
||||
The name of the resource group to delete.
|
||||
|
||||
.PARAMETER TenantId
|
||||
The tenant ID of a service principal when a provisioner is specified.
|
||||
|
||||
.PARAMETER SubscriptionId
|
||||
Optional subscription ID to use for new resources when logging in as a
|
||||
Optional subscription ID to use when deleting resources when logging in as a
|
||||
provisioner. You can also use Set-AzContext if not provisioning.
|
||||
|
||||
If you do not specify a SubscriptionId and are not logged in, one will be
|
||||
automatically selected for you by the Connect-AzAccount cmdlet.
|
||||
|
||||
Once you are logged in (or were previously), the selected SubscriptionId
|
||||
will be used for subsequent operations that are specific to a subscription.
|
||||
|
||||
.PARAMETER ProvisionerApplicationId
|
||||
A service principal ID to provision test resources when a provisioner is specified.
|
||||
|
||||
.PARAMETER ProvisionerApplicationSecret
|
||||
A service principal secret (password) to provision test resources when a provisioner is specified.
|
||||
|
||||
.PARAMETER ServiceDirectory
|
||||
A directory under 'sdk' in the repository root - optionally with subdirectories
|
||||
specified - in which to discover pre removal script named 'remove-test-resources-pre.json'.
|
||||
|
||||
.PARAMETER Environment
|
||||
Name of the cloud environment. The default is the Azure Public Cloud
|
||||
('PublicCloud')
|
||||
|
||||
.PARAMETER Force
|
||||
Force removal of resource group without asking for user confirmation
|
||||
|
||||
.EXAMPLE
|
||||
Remove-TestResources.ps1 -BaseName 'uuid123' -Force
|
||||
Use the currently logged-in account to delete the resource group by the name of
|
||||
'rg-uuid123'
|
||||
Remove-TestResources.ps1 keyvault -Force
|
||||
Use the currently logged-in account to delete the resources created for Key Vault testing.
|
||||
|
||||
.EXAMPLE
|
||||
Remove-TestResources.ps1 `
|
||||
-ResourceGroupName "${env:AZURE_RESOURCEGROUP_NAME}" `
|
||||
@ -214,4 +291,5 @@ Remove-TestResources.ps1 `
|
||||
When run in the context of an Azure DevOps pipeline, this script removes the
|
||||
resource group whose name is stored in the environment variable
|
||||
AZURE_RESOURCEGROUP_NAME.
|
||||
|
||||
#>
|
||||
|
||||
@ -14,14 +14,15 @@ Deletes the resource group deployed for a service directory from Azure.
|
||||
|
||||
### Default (Default)
|
||||
```
|
||||
Remove-TestResources.ps1 [-BaseName] <String> [-ServiceDirectory <String>] [-Environment <String>] [-Force]
|
||||
[-RemoveTestResourcesRemainingArguments <Object>] [-WhatIf] [-Confirm] [<CommonParameters>]
|
||||
Remove-TestResources.ps1 [-BaseName <String>] [-SubscriptionId <String>] [-ServiceDirectory] <String>
|
||||
[-Environment <String>] [-Force] [-RemoveTestResourcesRemainingArguments <Object>] [-WhatIf] [-Confirm]
|
||||
[<CommonParameters>]
|
||||
```
|
||||
|
||||
### Default+Provisioner
|
||||
```
|
||||
Remove-TestResources.ps1 [-BaseName] <String> -TenantId <String> [-SubscriptionId <String>]
|
||||
-ProvisionerApplicationId <String> -ProvisionerApplicationSecret <String> [-ServiceDirectory <String>]
|
||||
Remove-TestResources.ps1 -BaseName <String> -TenantId <String> [-SubscriptionId <String>]
|
||||
-ProvisionerApplicationId <String> -ProvisionerApplicationSecret <String> [[-ServiceDirectory] <String>]
|
||||
[-Environment <String>] [-Force] [-RemoveTestResourcesRemainingArguments <Object>] [-WhatIf] [-Confirm]
|
||||
[<CommonParameters>]
|
||||
```
|
||||
@ -29,15 +30,16 @@ Remove-TestResources.ps1 [-BaseName] <String> -TenantId <String> [-SubscriptionI
|
||||
### ResourceGroup+Provisioner
|
||||
```
|
||||
Remove-TestResources.ps1 -ResourceGroupName <String> -TenantId <String> [-SubscriptionId <String>]
|
||||
-ProvisionerApplicationId <String> -ProvisionerApplicationSecret <String> [-ServiceDirectory <String>]
|
||||
-ProvisionerApplicationId <String> -ProvisionerApplicationSecret <String> [[-ServiceDirectory] <String>]
|
||||
[-Environment <String>] [-Force] [-RemoveTestResourcesRemainingArguments <Object>] [-WhatIf] [-Confirm]
|
||||
[<CommonParameters>]
|
||||
```
|
||||
|
||||
### ResourceGroup
|
||||
```
|
||||
Remove-TestResources.ps1 -ResourceGroupName <String> [-ServiceDirectory <String>] [-Environment <String>]
|
||||
[-Force] [-RemoveTestResourcesRemainingArguments <Object>] [-WhatIf] [-Confirm] [<CommonParameters>]
|
||||
Remove-TestResources.ps1 -ResourceGroupName <String> [-SubscriptionId <String>] [[-ServiceDirectory] <String>]
|
||||
[-Environment <String>] [-Force] [-RemoveTestResourcesRemainingArguments <Object>] [-WhatIf] [-Confirm]
|
||||
[<CommonParameters>]
|
||||
```
|
||||
|
||||
## DESCRIPTION
|
||||
@ -54,9 +56,8 @@ create resources.
|
||||
|
||||
### EXAMPLE 1
|
||||
```
|
||||
Remove-TestResources.ps1 -BaseName 'uuid123' -Force
|
||||
Use the currently logged-in account to delete the resource group by the name of
|
||||
'rg-uuid123'
|
||||
Remove-TestResources.ps1 keyvault -Force
|
||||
Use the currently logged-in account to delete the resources created for Key Vault testing.
|
||||
```
|
||||
|
||||
### EXAMPLE 2
|
||||
@ -81,11 +82,23 @@ This will delete the resource group named 'rg-\<baseName\>'
|
||||
|
||||
```yaml
|
||||
Type: String
|
||||
Parameter Sets: Default, Default+Provisioner
|
||||
Parameter Sets: Default
|
||||
Aliases:
|
||||
|
||||
Required: False
|
||||
Position: Named
|
||||
Default value: None
|
||||
Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
|
||||
```yaml
|
||||
Type: String
|
||||
Parameter Sets: Default+Provisioner
|
||||
Aliases:
|
||||
|
||||
Required: True
|
||||
Position: 1
|
||||
Position: Named
|
||||
Default value: None
|
||||
Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
@ -122,13 +135,19 @@ Accept wildcard characters: False
|
||||
```
|
||||
|
||||
### -SubscriptionId
|
||||
Optional subscription ID to use for new resources when logging in as a
|
||||
Optional subscription ID to use when deleting resources when logging in as a
|
||||
provisioner.
|
||||
You can also use Set-AzContext if not provisioning.
|
||||
|
||||
If you do not specify a SubscriptionId and are not logged in, one will be
|
||||
automatically selected for you by the Connect-AzAccount cmdlet.
|
||||
|
||||
Once you are logged in (or were previously), the selected SubscriptionId
|
||||
will be used for subsequent operations that are specific to a subscription.
|
||||
|
||||
```yaml
|
||||
Type: String
|
||||
Parameter Sets: Default+Provisioner, ResourceGroup+Provisioner
|
||||
Parameter Sets: (All)
|
||||
Aliases:
|
||||
|
||||
Required: False
|
||||
@ -174,11 +193,23 @@ specified - in which to discover pre removal script named 'remove-test-resources
|
||||
|
||||
```yaml
|
||||
Type: String
|
||||
Parameter Sets: (All)
|
||||
Parameter Sets: Default
|
||||
Aliases:
|
||||
|
||||
Required: True
|
||||
Position: 1
|
||||
Default value: None
|
||||
Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
|
||||
```yaml
|
||||
Type: String
|
||||
Parameter Sets: Default+Provisioner, ResourceGroup+Provisioner, ResourceGroup
|
||||
Aliases:
|
||||
|
||||
Required: False
|
||||
Position: Named
|
||||
Position: 1
|
||||
Default value: None
|
||||
Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
@ -187,7 +218,7 @@ Accept wildcard characters: False
|
||||
### -Environment
|
||||
Name of the cloud environment.
|
||||
The default is the Azure Public Cloud
|
||||
('AzureCloud')
|
||||
('PublicCloud')
|
||||
|
||||
```yaml
|
||||
Type: String
|
||||
|
||||
17
eng/common/TestResources/Update-TestResources.cmd
Normal file
17
eng/common/TestResources/Update-TestResources.cmd
Normal file
@ -0,0 +1,17 @@
|
||||
@echo off
|
||||
|
||||
REM Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
REM Licensed under the MIT License.
|
||||
|
||||
setlocal
|
||||
|
||||
for /f "usebackq delims=" %%i in (`where pwsh 2^>nul`) do (
|
||||
set _cmd=%%i
|
||||
)
|
||||
|
||||
if "%_cmd%"=="" (
|
||||
echo Error: PowerShell not found. Please visit https://github.com/powershell/powershell for install instructions.
|
||||
exit /b 2
|
||||
)
|
||||
|
||||
call "%_cmd%" -NoLogo -NoProfile -File "%~dpn0.ps1" %*
|
||||
206
eng/common/TestResources/Update-TestResources.ps1
Normal file
206
eng/common/TestResources/Update-TestResources.ps1
Normal file
@ -0,0 +1,206 @@
|
||||
#!/usr/bin/env pwsh
|
||||
|
||||
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
# Licensed under the MIT License.
|
||||
|
||||
#Requires -Version 6.0
|
||||
#Requires -PSEdition Core
|
||||
#Requires -Modules @{ModuleName='Az.Accounts'; ModuleVersion='1.6.4'}
|
||||
#Requires -Modules @{ModuleName='Az.Resources'; ModuleVersion='1.8.0'}
|
||||
|
||||
[CmdletBinding(DefaultParameterSetName = 'Default')]
|
||||
param (
|
||||
[Parameter(ParameterSetName = 'Default', Mandatory = $true, Position = 0)]
|
||||
[string] $ServiceDirectory,
|
||||
|
||||
[Parameter(ParameterSetName = 'Default')]
|
||||
[ValidatePattern('^[-a-zA-Z0-9\.\(\)_]{0,80}(?<=[a-zA-Z0-9\(\)])$')]
|
||||
[string] $BaseName,
|
||||
|
||||
[Parameter(ParameterSetName = 'ResourceGroup')]
|
||||
[ValidatePattern('^[-\w\._\(\)]+$')]
|
||||
[string] $ResourceGroupName,
|
||||
|
||||
[Parameter()]
|
||||
[ValidatePattern('^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$')]
|
||||
[string] $SubscriptionId,
|
||||
|
||||
[Parameter()]
|
||||
[ValidateRange(1, [int]::MaxValue)]
|
||||
[int] $DeleteAfterHours = 48
|
||||
)
|
||||
|
||||
# By default stop for any error.
|
||||
if (!$PSBoundParameters.ContainsKey('ErrorAction')) {
|
||||
$ErrorActionPreference = 'Stop'
|
||||
}
|
||||
|
||||
function Log($Message) {
|
||||
Write-Host ('{0} - {1}' -f [DateTime]::Now.ToLongTimeString(), $Message)
|
||||
}
|
||||
|
||||
function Retry([scriptblock] $Action, [int] $Attempts = 5) {
|
||||
$attempt = 0
|
||||
$sleep = 5
|
||||
|
||||
while ($attempt -lt $Attempts) {
|
||||
try {
|
||||
$attempt++
|
||||
return $Action.Invoke()
|
||||
} catch {
|
||||
if ($attempt -lt $Attempts) {
|
||||
$sleep *= 2
|
||||
|
||||
Write-Warning "Attempt $attempt failed: $_. Trying again in $sleep seconds..."
|
||||
Start-Sleep -Seconds $sleep
|
||||
} else {
|
||||
Write-Error -ErrorRecord $_
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Support actions to invoke on exit.
|
||||
$exitActions = @({
|
||||
if ($exitActions.Count -gt 1) {
|
||||
Write-Verbose 'Running registered exit actions'
|
||||
}
|
||||
})
|
||||
|
||||
# Make sure $BaseName is set.
|
||||
if (!$BaseName) {
|
||||
$UserName = if ($env:USER) { $env:USER } else { "${env:USERNAME}" }
|
||||
# Remove spaces, etc. that may be in $UserName
|
||||
$UserName = $UserName -replace '\W'
|
||||
|
||||
$BaseName = "$UserName$ServiceDirectory"
|
||||
Log "BaseName was not set. Using default base name '$BaseName'"
|
||||
}
|
||||
|
||||
# Make sure $ResourceGroupName is set.
|
||||
if (!$ResourceGroupName) {
|
||||
$ResourceGroupName = "rg-$BaseName"
|
||||
}
|
||||
|
||||
# This script is intended for interactive users. Make sure they are logged in or fail.
|
||||
$context = Get-AzContext
|
||||
if (!$context) {
|
||||
throw "You must be already logged in to use this script. Run 'Connect-AzAccount' and try again."
|
||||
}
|
||||
|
||||
# If no subscription was specified, try to select the Azure SDK Developer Playground subscription.
|
||||
# Ignore errors to leave the automatically selected subscription.
|
||||
if ($SubscriptionId) {
|
||||
$currentSubcriptionId = $context.Subscription.Id
|
||||
if ($currentSubcriptionId -ne $SubscriptionId) {
|
||||
Log "Selecting subscription '$SubscriptionId'"
|
||||
$null = Select-AzSubscription -Subscription $SubscriptionId
|
||||
|
||||
$exitActions += {
|
||||
Log "Selecting previous subscription '$currentSubcriptionId'"
|
||||
$null = Select-AzSubscription -Subscription $currentSubcriptionId
|
||||
}
|
||||
|
||||
# Update the context.
|
||||
$context = Get-AzContext
|
||||
}
|
||||
} else {
|
||||
Log "Attempting to select subscription 'Azure SDK Developer Playground (faa080af-c1d8-40ad-9cce-e1a450ca5b57)'"
|
||||
$null = Select-AzSubscription -Subscription 'faa080af-c1d8-40ad-9cce-e1a450ca5b57' -ErrorAction Ignore
|
||||
|
||||
# Update the context.
|
||||
$context = Get-AzContext
|
||||
|
||||
$SubscriptionId = $context.Subscription.Id
|
||||
$PSBoundParameters['SubscriptionId'] = $SubscriptionId
|
||||
}
|
||||
|
||||
# Use cache of well-known team subs without having to be authenticated.
|
||||
$wellKnownSubscriptions = @{
|
||||
'faa080af-c1d8-40ad-9cce-e1a450ca5b57' = 'Azure SDK Developer Playground'
|
||||
'a18897a6-7e44-457d-9260-f2854c0aca42' = 'Azure SDK Engineering System'
|
||||
'2cd617ea-1866-46b1-90e3-fffb087ebf9b' = 'Azure SDK Test Resources'
|
||||
}
|
||||
|
||||
# Print which subscription is currently selected.
|
||||
$subscriptionName = $context.Subscription.Id
|
||||
if ($wellKnownSubscriptions.ContainsKey($subscriptionName)) {
|
||||
$subscriptionName = '{0} ({1})' -f $wellKnownSubscriptions[$subscriptionName], $subscriptionName
|
||||
}
|
||||
|
||||
Log "Selected subscription '$subscriptionName'"
|
||||
|
||||
# try..finally will also trap Ctrl+C.
|
||||
try {
|
||||
Log "Getting resource group '$ResourceGroupName'"
|
||||
|
||||
$resourceGroup = Get-AzResourceGroup -Name $ResourceGroupName
|
||||
|
||||
# Update DeleteAfter
|
||||
$deleteAfter = [DateTime]::UtcNow.AddHours($DeleteAfterHours).ToString('o')
|
||||
|
||||
Log "Updating DeleteAfter to '$deleteAfter'"
|
||||
Write-Warning "Any clean-up scripts running against subscription '$SubscriptionId' may delete resource group '$ResourceGroupName' after $DeleteAfterHours hours."
|
||||
$resourceGroup.Tags['DeleteAfter'] = $deleteAfter
|
||||
|
||||
Log "Updating resource group '$ResourceGroupName'"
|
||||
Retry {
|
||||
# Allow the resource group to write to output.
|
||||
Set-AzResourceGroup -Name $ResourceGroupName -Tag $resourceGroup.Tags
|
||||
}
|
||||
} finally {
|
||||
$exitActions.Invoke()
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Updates a resource group previously deployed for a service directory.
|
||||
|
||||
.DESCRIPTION
|
||||
Updates a resource group that was created using New-TestResources.ps1.
|
||||
You can use this, for example, to update the `DeleteAfterHours` property
|
||||
to keep an existing resource group deployed for a longer period of time.
|
||||
|
||||
.PARAMETER ServiceDirectory
|
||||
A directory under 'sdk' in the repository root - optionally with subdirectories
|
||||
specified - in which to discover ARM templates named 'test-resources.json'.
|
||||
This can also be an absolute path or specify parent directories.
|
||||
|
||||
.PARAMETER BaseName
|
||||
A name to use in the resource group and passed to the ARM template as 'baseName'.
|
||||
This will update the resource group named 'rg-<baseName>'
|
||||
|
||||
.PARAMETER ResourceGroupName
|
||||
The name of the resource group to update.
|
||||
|
||||
.PARAMETER SubscriptionId
|
||||
Optional subscription ID to use when deleting resources when logging in as a
|
||||
provisioner. You can also use Set-AzContext if not provisioning.
|
||||
|
||||
If you do not specify a SubscriptionId and are not logged in, one will be
|
||||
automatically selected for you by the Connect-AzAccount cmdlet.
|
||||
|
||||
Once you are logged in (or were previously), the selected SubscriptionId
|
||||
will be used for subsequent operations that are specific to a subscription.
|
||||
|
||||
.PARAMETER DeleteAfterHours
|
||||
Positive integer number of hours from the current time to set the
|
||||
'DeleteAfter' tag on the created resource group. The computed value is a
|
||||
timestamp of the form "2020-03-04T09:07:04.3083910Z".
|
||||
|
||||
An optional cleanup process can delete resource groups whose "DeleteAfter"
|
||||
timestamp is less than the current time.
|
||||
|
||||
.EXAMPLE
|
||||
Update-TestResources.ps1 keyvault -DeleteAfterHours 24
|
||||
|
||||
Update the 'rg-${USERNAME}keyvault` resource group to be deleted after 24
|
||||
hours from now if a clean-up script is running against the current subscription.
|
||||
|
||||
.EXAMPLE
|
||||
Update-TestResources.ps1 -ResourceGroupName rg-userkeyvault -Subscription fa9c6912-f641-4226-806c-5139584b89ca
|
||||
|
||||
Update the 'rg-userkeyvault' resource group to be deleted after 48
|
||||
hours from now if a clean-up script is running against the subscription 'fa9c6912-f641-4226-806c-5139584b89ca'.
|
||||
|
||||
#>
|
||||
153
eng/common/TestResources/Update-TestResources.ps1.md
Normal file
153
eng/common/TestResources/Update-TestResources.ps1.md
Normal file
@ -0,0 +1,153 @@
|
||||
---
|
||||
external help file: -help.xml
|
||||
Module Name:
|
||||
online version:
|
||||
schema: 2.0.0
|
||||
---
|
||||
|
||||
# Update-TestResources.ps1
|
||||
|
||||
## SYNOPSIS
|
||||
Updates a resource group previously deployed for a service directory.
|
||||
|
||||
## SYNTAX
|
||||
|
||||
### Default (Default)
|
||||
```
|
||||
Update-TestResources.ps1 [-ServiceDirectory] <String> [-BaseName <String>] [-SubscriptionId <String>]
|
||||
[-DeleteAfterHours <Int32>] [<CommonParameters>]
|
||||
```
|
||||
|
||||
### ResourceGroup
|
||||
```
|
||||
Update-TestResources.ps1 [-ResourceGroupName <String>] [-SubscriptionId <String>] [-DeleteAfterHours <Int32>]
|
||||
[<CommonParameters>]
|
||||
```
|
||||
|
||||
## DESCRIPTION
|
||||
Updates a resource group that was created using New-TestResources.ps1.
|
||||
You can use this, for example, to update the \`DeleteAfterHours\` property
|
||||
to keep an existing resource group deployed for a longer period of time.
|
||||
|
||||
## EXAMPLES
|
||||
|
||||
### EXAMPLE 1
|
||||
```
|
||||
Update-TestResources.ps1 keyvault -DeleteAfterHours 24
|
||||
```
|
||||
|
||||
Update the 'rg-${USERNAME}keyvault\` resource group to be deleted after 24
|
||||
hours from now if a clean-up script is running against the current subscription.
|
||||
|
||||
### EXAMPLE 2
|
||||
```
|
||||
Update-TestResources.ps1 -ResourceGroupName rg-userkeyvault -Subscription fa9c6912-f641-4226-806c-5139584b89ca
|
||||
```
|
||||
|
||||
Update the 'rg-userkeyvault' resource group to be deleted after 48
|
||||
hours from now if a clean-up script is running against the subscription 'fa9c6912-f641-4226-806c-5139584b89ca'.
|
||||
|
||||
## PARAMETERS
|
||||
|
||||
### -ServiceDirectory
|
||||
A directory under 'sdk' in the repository root - optionally with subdirectories
|
||||
specified - in which to discover ARM templates named 'test-resources.json'.
|
||||
This can also be an absolute path or specify parent directories.
|
||||
|
||||
```yaml
|
||||
Type: String
|
||||
Parameter Sets: Default
|
||||
Aliases:
|
||||
|
||||
Required: True
|
||||
Position: 1
|
||||
Default value: None
|
||||
Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
|
||||
### -BaseName
|
||||
A name to use in the resource group and passed to the ARM template as 'baseName'.
|
||||
This will update the resource group named 'rg-\<baseName\>'
|
||||
|
||||
```yaml
|
||||
Type: String
|
||||
Parameter Sets: Default
|
||||
Aliases:
|
||||
|
||||
Required: False
|
||||
Position: Named
|
||||
Default value: None
|
||||
Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
|
||||
### -ResourceGroupName
|
||||
The name of the resource group to update.
|
||||
|
||||
```yaml
|
||||
Type: String
|
||||
Parameter Sets: ResourceGroup
|
||||
Aliases:
|
||||
|
||||
Required: False
|
||||
Position: Named
|
||||
Default value: None
|
||||
Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
|
||||
### -SubscriptionId
|
||||
Optional subscription ID to use when deleting resources when logging in as a
|
||||
provisioner.
|
||||
You can also use Set-AzContext if not provisioning.
|
||||
|
||||
If you do not specify a SubscriptionId and are not logged in, one will be
|
||||
automatically selected for you by the Connect-AzAccount cmdlet.
|
||||
|
||||
Once you are logged in (or were previously), the selected SubscriptionId
|
||||
will be used for subsequent operations that are specific to a subscription.
|
||||
|
||||
```yaml
|
||||
Type: String
|
||||
Parameter Sets: (All)
|
||||
Aliases:
|
||||
|
||||
Required: False
|
||||
Position: Named
|
||||
Default value: None
|
||||
Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
|
||||
### -DeleteAfterHours
|
||||
Positive integer number of hours from the current time to set the
|
||||
'DeleteAfter' tag on the created resource group.
|
||||
The computed value is a
|
||||
timestamp of the form "2020-03-04T09:07:04.3083910Z".
|
||||
|
||||
An optional cleanup process can delete resource groups whose "DeleteAfter"
|
||||
timestamp is less than the current time.
|
||||
|
||||
```yaml
|
||||
Type: Int32
|
||||
Parameter Sets: (All)
|
||||
Aliases:
|
||||
|
||||
Required: False
|
||||
Position: Named
|
||||
Default value: 48
|
||||
Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
|
||||
### CommonParameters
|
||||
This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](https://go.microsoft.com/fwlink/?LinkID=113216).
|
||||
|
||||
## INPUTS
|
||||
|
||||
## OUTPUTS
|
||||
|
||||
## NOTES
|
||||
|
||||
## RELATED LINKS
|
||||
Loading…
Reference in New Issue
Block a user