scripts/pre-provision.ps1 (221 lines of code) (raw):

<# .SYNOPSIS Pre Provision Script .DESCRIPTION This script performs pre-provisioning tasks, ensuring an AD application is properly created. .PARAMETER SubscriptionId Specify a particular SubscriptionId to use. Defaults to the value of the AZURE_SUBSCRIPTION_ID environment variable if set, or null if not. .PARAMETER ApplicationId Optionally specify an ApplicationId. Defaults to the value of the AZURE_CLIENT_ID environment variable if set, otherwise creates one. .PARAMETER AzureEnvName Optionally specify an Azure environment name. Defaults to the value of the AZURE_ENV_NAME environment variable if set, or "dev" if not. .PARAMETER RequiredCliVersion Optionally specify the required Azure CLI version. Defaults to "2.60". .PARAMETER ServiceManagementReference Optionally specify a ServiceManagementReference. Defaults to an empty string if not provided. .EXAMPLE .\pre-provision.ps1 -SubscriptionId <SubscriptionId> -AzureEnvName <AzureEnvName> -RequiredCliVersion "2.60" -ServiceManagementReference <ServiceManagementReference> #> #Requires -Version 7.4 param ( [ValidateNotNullOrEmpty()] [string]$SubscriptionId = $env:AZURE_SUBSCRIPTION_ID, [ValidateNotNullOrEmpty()] [string]$ApplicationId = $env:AZURE_CLIENT_ID, [string]$AzureEnvName = $env:AZURE_ENV_NAME ? $env:AZURE_ENV_NAME : "dev", [version]$RequiredCliVersion = [version]"2.60", [string]$ServiceManagementReference = $env:AZURE_ASSET_NUMBER ? $env:AZURE_ASSET_NUMBER : [string]::Empty, [switch]$Help ) function Show-Help { Write-Host "Usage: .\hook-preprovision.ps1 [-SubscriptionId SUBSCRIPTION_ID] [-AzureEnvName AZURE_ENV_NAME] [-RequiredCliVersion REQUIRED_CLI_VERSION] [-ServiceManagementReference SERVICE_MANAGEMENT_REFERENCE]" Write-Host "Options:" Write-Host " -SubscriptionId : Optionally specify a subscription ID to use. If not provided, defaults to the AZURE_SUBSCRIPTION_ID environment variable." Write-Host " -ApplicationId : Optionally specify an application ID to use. If not provided, creates one." Write-Host " -AzureEnvName : Optionally specify an Azure environment name. Defaults to 'dev' if AZURE_ENV_NAME environment variable is not set." Write-Host " -RequiredCliVersion : Optionally specify the required Azure CLI version. Defaults to '2.60'." Write-Host " -ServiceManagementReference : Optionally specify a ServiceManagementReference. Defaults to an empty string if not provided." Write-Host " -Help : Print this help message and exit" } function Set-AzureCliVersion { try { # Get the version of the Azure CLI $azVersionOutput = az version --output json | ConvertFrom-Json $azVersion = $azVersionOutput.'azure-cli' $azVersionComparable = [version]$azVersion Write-Host "`n==================================================================" Write-Host "Azure CLI Version: $azVersionComparable" Write-Host "==================================================================" # Compare the versions if ($azVersionComparable -lt $RequiredCliVersion) { Write-Host "This script requires Azure CLI version $RequiredCliVersion or higher. You have version $azVersionComparable." exit 1 } } catch { Write-Host "Error checking Azure CLI version: $_" exit 1 } } function Update-AksExtensions { try { # Check for required extensions $requiredExtensions = @("k8s-configuration") Write-Host "`n==================================================================" Write-Host "Azure CLI Extensions: $requiredExtensions" Write-Host "==================================================================" foreach ($extension in $requiredExtensions) { $azVersionOutput = az version --output json | ConvertFrom-Json if ($azVersionOutput.extensions.$extension) { Write-Host " Found [$extension] extension. Updating..." az extension update --name $extension --allow-preview true --only-show-errors } else { Write-Host " Not Found [$extension] extension. Installing..." az extension add --name $extension --allow-preview true --only-show-errors if ($?) { Write-Host " [$extension] extension successfully installed" } else { Write-Host " Failed to install [$extension] extension" exit 1 } } } } catch { Write-Host "Error updating Azure CLI extensions: $_" exit 1 } } function Set-Login { try { # Check if the user is logged in $user = az ad signed-in-user show --query userPrincipalName -o tsv $accountInfo = az account show -o json 2>$null | ConvertFrom-Json if ($user) { Write-Host "`n==================================================================" Write-Host "Logged in as: $user" Write-Host "==================================================================" } else { Write-Host "`n==================================================================" Write-Host "Azure CLI Login Required" Write-Host "==================================================================" az login --scope https://graph.microsoft.com//.default # Recheck if the user is logged in $accountInfo = az account show -o json | ConvertFrom-Json if ($accountInfo) { Write-Host "`n==================================================================" Write-Host "Logged in as: $($accountInfo.user.name)" Write-Host "==================================================================" } else { Write-Host " Failed to log in. Exiting." exit 1 } } # Ensure the subscription ID is set if (-not $SubscriptionId) { $global:SubscriptionId = az account show --query id -o tsv azd env set AZURE_SUBSCRIPTION_ID $global:SubscriptionId Write-Host "`n==================================================================" Write-Host "Azure Subscription: $global:SubscriptionId" Write-Host "==================================================================" } else { Write-Host "`n==================================================================" Write-Host "Azure Subscription: $SubscriptionId" Write-Host "==================================================================" } } catch { Write-Host "Error during login check: $_" exit 1 } } function New-Application { try { if (-not $SubscriptionId) { $SubscriptionId = $global:SubscriptionId } if (-not $ApplicationId) { $azureClientName = "osdu-$AzureEnvName-$SubscriptionId" #$azureClientId = az ad app list --display-name $azureClientName --query "[0].appId" -o tsv Write-Host "`n==================================================================" Write-Host "Creating Application: $azureClientName" Write-Host "==================================================================" $jsonPayload = @" { 'displayName': '$azureClientName', 'signInAudience': 'AzureADMyOrg', 'serviceManagementReference': '$ServiceManagementReference', 'notes': 'OSDU Data Platform', 'web': {'redirectUris': ['https://localhost:8080/'],'implicitGrantSettings': {'enableIdTokenIssuance': 'true', 'enableAccessTokenIssuance': 'true'}}, 'spa': {'redirectUris': ['https://localhost:8080/spa']}, 'requiredResourceAccess': [{'resourceAppId': '00000003-0000-0000-c000-000000000000', 'resourceAccess': [{'id': 'e1fe6dd8-ba31-4d61-89e7-88639da4683d', 'type': 'Scope'}]}] } "@ if (-not $IsWindows) { $jsonPayload = $jsonPayload -replace "'", '"' } # Remove whitespaces $jsonPayload = $jsonPayload -replace '\s+', '' az rest --method post ` --url https://graph.microsoft.com/v1.0/applications ` --body $jsonPayload -o none Start-Sleep -Seconds 30 $ApplicationId = az ad app list --display-name $azureClientName --query "[0].appId" -o tsv az ad sp create --id $ApplicationId --only-show-errors azd env set AZURE_CLIENT_ID $ApplicationId $global:ApplicationId = $ApplicationId } } catch { Write-Host "Error creating application: $_" exit 1 } } function Set-EnvironmentVariables { if (-not $ApplicationId) { $ApplicationId = $global:ApplicationId } try { Write-Host "`n==================================================================" Write-Host "Retrieving Application: $ApplicationId" Write-Host "==================================================================" if (-not $env:AZURE_CLIENT_PRINCIPAL_OID) { Write-Host " Retrieving AZURE_CLIENT_PRINCIPAL_OID..." $azureClientPrincipalOid = az ad sp show --id $ApplicationId --query "id" -o tsv azd env set AZURE_CLIENT_PRINCIPAL_OID $azureClientPrincipalOid } if (-not $env:EMAIL_ADDRESS) { Write-Host " Retrieving User Email Address..." $emailAddress = az ad signed-in-user show --query userPrincipalName -o tsv azd env set EMAIL_ADDRESS $emailAddress } } catch { Write-Host "Error setting environment variables: $_" exit 1 } } function Set-LocalAuth { if (-not $env:AZURE_RESOURCE_GROUP) { return } try { $appConfig = az appconfig list -g $env:AZURE_RESOURCE_GROUP --query '[0].name' -o tsv if (-not $appConfig) { Write-Host "No App Configuration found in resource group: $env:AZURE_RESOURCE_GROUP" return } Write-Host "`n==================================================================" Write-Host "Disabling Local Authentication for App Configuration: $appConfig" Write-Host "==================================================================" az appconfig update -g $env:AZURE_RESOURCE_GROUP -n $appConfig --disable-local-auth false -o none } catch { Write-Host "Error disabling local authentication: $_" exit 1 } } if ($Help) { Show-Help exit 0 } Set-AzureCliVersion Update-AksExtensions Set-Login New-Application Set-EnvironmentVariables Set-LocalAuth