deployer/scripts/install_backend_printing.ps1 (116 lines of code) (raw):
#!/bin/bash
$WORKLOAD_ENVIRONMENT_CODE = $Env:WORKLOAD_ENVIRONMENT_CODE
$ENTRA_ID_TENANT_ID = $Env:ENTRA_ID_TENANT_ID
$AZURE_SUBSCRIPTION_ID = $Env:AZURE_SUBSCRIPTION_ID
$CONTROL_PLANE_SERVICE_PRINCIPAL_NAME = $Env:CONTROL_PLANE_SERVICE_PRINCIPAL_NAME
$CONTROL_PLANE_RESOURCE_GROUP_NAME = $Env:CONTROL_PLANE_ENVIRONMENT_CODE + "-RG"
$STORAGE_ACCOUNT_NAME = $Env:CONTROL_PLANE_ENVIRONMENT_CODE.ToLower() + "tstatebgprinting"
$ACR_NAME = $Env:CONTAINER_REGISTRY_NAME
$CONTAINER_NAME = "tfstate"
$ENABLE_LOGGING_ON_FUNCTION_APP = $Env:ENABLE_LOGGING_ON_FUNCTION_APP
$variables = @("WORKLOAD_ENVIRONMENT_CODE",
"ENTRA_ID_TENANT_ID",
"AZURE_SUBSCRIPTION_ID",
"CONTROL_PLANE_SERVICE_PRINCIPAL_NAME",
"CONTROL_PLANE_RESOURCE_GROUP_NAME",
"STORAGE_ACCOUNT_NAME",
"CONTAINER_NAME",
"ACR_NAME",
"ENABLE_LOGGING_ON_FUNCTION_APP")
foreach ($var in $variables) {
if ([string]::IsNullOrEmpty((Get-Variable -Name $var).Value)) {
Write-Host "$var is null or empty!" -ForegroundColor Red
}
}
if ($ENTRA_ID_TENANT_ID.Length -eq 0) {
az login --output none --only-show-errors
}
else {
az login --output none --tenant $ENTRA_ID_TENANT_ID --only-show-errors
}
az config set extension.use_dynamic_install=yes_without_prompt --only-show-errors
if ($AZURE_SUBSCRIPTION_ID.Length -eq 0) {
Write-Host "$AZURE_SUBSCRIPTION_ID is not set!" -ForegroundColor Red
$AZURE_SUBSCRIPTION_ID = Read-Host "Please enter a subscription ID"
}
az account set --subscription $AZURE_SUBSCRIPTION_ID
$app_registration = (az ad sp list --all --filter "startswith(displayName,'$CONTROL_PLANE_SERVICE_PRINCIPAL_NAME')" --query "[?displayName=='$CONTROL_PLANE_SERVICE_PRINCIPAL_NAME'].displayName | [0]" --only-show-errors)
$scopes = "/subscriptions/$AZURE_SUBSCRIPTION_ID"
if ($app_registration.Length -gt 0) {
Write-Host "Found an existing Service Principal:" $CONTROL_PLANE_SERVICE_PRINCIPAL_NAME
$ExistingData = (az ad sp list --all --filter "startswith(displayName,'$CONTROL_PLANE_SERVICE_PRINCIPAL_NAME')" --query "[?displayName=='$CONTROL_PLANE_SERVICE_PRINCIPAL_NAME']| [0]" --only-show-errors) | ConvertFrom-Json
$ARM_CLIENT_ID = $ExistingData.appId
$ARM_OBJECT_ID = $ExistingData.Id
$ENTRA_ID_TENANT_ID = $ExistingData.appOwnerOrganizationId
$confirmation = Read-Host "Reset the Service Principal password y/n?"
if ($confirmation -eq 'y') {
$ARM_CLIENT_SECRET = (az ad sp credential reset --id $ARM_CLIENT_ID --append --query "password" --out tsv --only-show-errors).Replace("""", "")
}
else {
$ARM_CLIENT_SECRET = Read-Host "Please enter the Service Principal password"
}
}
else {
Write-Host "Creating the Service Principal" $CONTROL_PLANE_SERVICE_PRINCIPAL_NAME -ForegroundColor Green
$SPN_DATA = (az ad sp create-for-rbac --role "Contributor" --scopes $scopes --name $CONTROL_PLANE_SERVICE_PRINCIPAL_NAME --only-show-errors) | ConvertFrom-Json
$ARM_CLIENT_SECRET = $SPN_DATA.password
$ExistingData = (az ad sp list --all --filter "startswith(displayName,'$CONTROL_PLANE_SERVICE_PRINCIPAL_NAME')" --query "[?displayName=='$CONTROL_PLANE_SERVICE_PRINCIPAL_NAME'] | [0]" --only-show-errors) | ConvertFrom-Json
$ARM_CLIENT_ID = $ExistingData.appId
$ENTRA_ID_TENANT_ID = $ExistingData.appOwnerOrganizationId
$ARM_OBJECT_ID = $ExistingData.Id
}
Write-Host "Service Principal Name:" $CONTROL_PLANE_SERVICE_PRINCIPAL_NAME
# Assign the Service Principal to the User Access Administrator role
az role assignment create --assignee $ARM_CLIENT_ID --role "Contributor" --subscription $AZURE_SUBSCRIPTION_ID --scope /subscriptions/$AZURE_SUBSCRIPTION_ID --output none
az role assignment create --assignee $ARM_CLIENT_ID --role "User Access Administrator" --subscription $AZURE_SUBSCRIPTION_ID --scope /subscriptions/$AZURE_SUBSCRIPTION_ID --output none
Set-Location -Path $ENV:SAPPRINT_PATH
# check if the repository exists, if it does, remove it
if (Test-Path "universal-print-for-sap-starter-pack") {
Remove-Item "./universal-print-for-sap-starter-pack" -Recurse -Force
}
# Clone the git repository
Write-Host "######## Cloning the code repo ########" -ForegroundColor Green
git clone https://github.com/Azure/universal-print-for-sap-starter-pack.git
Set-Location -Path "./universal-print-for-sap-starter-pack"
git checkout main
# Create resource group
az group create --name $CONTROL_PLANE_RESOURCE_GROUP_NAME --location eastus --only-show-errors
# Create the Azure container registry and build the docker image
Write-Host "######## Build the docker image and push it to the ACR registry ########" -ForegroundColor Green
az acr create --name $ACR_NAME --resource-group $CONTROL_PLANE_RESOURCE_GROUP_NAME --sku Basic
Start-Sleep -Seconds 10 # Wait for the ACR to be created
az acr show --name $ACR_NAME --resource-group $CONTROL_PLANE_RESOURCE_GROUP_NAME
az acr login --name $ACR_NAME --resource-group $CONTROL_PLANE_RESOURCE_GROUP_NAME --expose-token
az acr build --registry $ACR_NAME --resource-group $CONTROL_PLANE_RESOURCE_GROUP_NAME --image bgprinting:latest --file ./backend-printing/Dockerfile ./backend-printing --no-logs
Write-Host "######## Creating storage account to store the terraform state ########" -ForegroundColor Green
# Create storage account
az storage account create --resource-group $CONTROL_PLANE_RESOURCE_GROUP_NAME --name $STORAGE_ACCOUNT_NAME --sku Standard_LRS --encryption-services blob --only-show-errors
az storage account update --resource-group $CONTROL_PLANE_RESOURCE_GROUP_NAME --name $STORAGE_ACCOUNT_NAME --https-only true --allow-blob-public-access false --only-show-errors
az storage container create --name $CONTAINER_NAME --account-name $STORAGE_ACCOUNT_NAME --only-show-errors
$Env:TF_VAR_tenant_id = $ENTRA_ID_TENANT_ID
$Env:TF_VAR_subscription_id = $AZURE_SUBSCRIPTION_ID
$Env:TF_VAR_client_id = $ARM_CLIENT_ID
$Env:TF_VAR_client_secret = $ARM_CLIENT_SECRET
$Env:TF_VAR_object_id = $ARM_OBJECT_ID
$Env:TF_VAR_location = $Env:LOCATION
$Env:TF_VAR_environment = $Env:WORKLOAD_ENVIRONMENT_CODE
$Env:TF_VAR_virtual_network_id = $Env:SAP_VIRTUAL_NETWORK_ID
$Env:TF_VAR_subnet_address_prefixes = $Env:BGPRINT_SUBNET_ADDRESS_PREFIX
$Env:TF_VAR_container_registry_url = $ACR_NAME + ".azurecr.io"
$Env:TF_VAR_container_image_name = "bgprinting"
$Env:TF_VAR_control_plane_rg = $CONTROL_PLANE_RESOURCE_GROUP_NAME
$ENV:TF_VAR_enable_logging_on_function_app = $ENABLE_LOGGING_ON_FUNCTION_APP
$terraform_key = $WORKLOAD_ENVIRONMENT_CODE + ".terraform.tfstate"
$terraform_directory = "./deployer/terraform"
# Initialize the terraform
Write-Host "######## Initializing Terraform ########" -ForegroundColor Green
terraform -chdir="$terraform_directory" init -reconfigure -upgrade -backend-config="key=$terraform_key" -backend-config="storage_account_name=$STORAGE_ACCOUNT_NAME" -backend-config="resource_group_name=$CONTROL_PLANE_RESOURCE_GROUP_NAME" -backend-config="container_name=$CONTAINER_NAME" -backend-config="tenant_id=$ENTRA_ID_TENANT_ID" -backend-config="client_id=$ARM_CLIENT_ID" -backend-config="client_secret=$ARM_CLIENT_SECRET" -backend-config="subscription_id=$AZURE_SUBSCRIPTION_ID"
# Refresh the terraform
Write-Host "######## Refreshing Terraform ########" -ForegroundColor Green
terraform -chdir="$terraform_directory" refresh
# Plan the terraform
Write-Host "######## Planning the Terraform ########" -ForegroundColor Green
terraform -chdir="$terraform_directory" plan -compact-warnings -json -no-color -parallelism=5
# Apply the terraform
Write-Host "######## Applying the Terraform ########" -ForegroundColor Green
terraform -chdir="$terraform_directory" apply -auto-approve -compact-warnings -json -no-color -parallelism=5