diff --git a/builds/e2e/longhaul.yaml b/builds/e2e/longhaul.yaml index a6e7e64a46a..4ae1afa4ef0 100644 --- a/builds/e2e/longhaul.yaml +++ b/builds/e2e/longhaul.yaml @@ -60,6 +60,36 @@ jobs: aziotis.artifact.name: 'packages_ubuntu-20.04_amd64' aziotis.package.filter: 'aziot-identity-service_*_amd64.deb' quickstart.artifactName: 'IotEdgeQuickstart.linux-x64.tar.gz' + - task: AzureCLI@2 + displayName: 'Get SAS URI for Blob Storage Account' + inputs: + azureSubscription: $(azure.subscription) + scriptType: 'bash' + scriptLocation: 'inlineScript' + inlineScript: | + # Hardcoded resource group and storage account name + resource_group="iotedge-deploy" + storage_account="iotedgeconnectivitytest" + + # Set container name with current date + container_name="logs$(date +%Y%m%d)" + + # Set expiry time for the SAS token + expiry_time="$(date --utc --date "+12 hours" +"%Y-%m-%dT%H:%MZ")" + + # Generate the SAS token for the container + sasToken="$(az storage container generate-sas --account-name "$storage_account" --name "$container_name" --https-only --expiry "$expiry_time" --as-user --auth-mode login --permissions drwl --output tsv)" + if [ $? -ne 0 ]; then + echo "Failed to generate SAS token: $sasToken" + exit 1 + fi + + echo "SAS token for Azure Storage account acquired. Expires $expiry_time" + + # Construct the SAS URI + endpoint="$(az storage account show --name "$storage_account" --resource-group "$resource_group" --query 'primaryEndpoints.blob' -o tsv)" + sasUri="$endpoint$container_name?$sasToken" + echo "##vso[task.setvariable variable=testBlobStoreSas;issecret=true]$sasUri" - template: templates/longhaul-deploy.yaml parameters: release.label: 'lh$(agent.group)' @@ -97,7 +127,7 @@ jobs: test.testMode: 'LongHaul' test.useTRC: '$(useTRC)' test.deploymentFileName: 'long_haul_deployment.template.json' - testResultCoordinator.storageAccountConnectionString: '$(EdgeLonghaulStorageAccountConnString)' + testResultCoordinator.blobStorageAccountUriWithSasToken: '$(testBlobStoreSas)' clientModuleTransportType: 'All' ################################################################################ @@ -122,6 +152,36 @@ jobs: aziotis.artifact.name: 'packages_debian-11-slim_arm32v7' aziotis.package.filter: 'aziot-identity-service_*_armhf.deb' quickstart.artifactName: 'IotEdgeQuickstart.linux-arm.tar.gz' + - task: AzureCLI@2 + displayName: 'Get SAS URI for Blob Storage Account' + inputs: + azureSubscription: $(azure.subscription) + scriptType: 'bash' + scriptLocation: 'inlineScript' + inlineScript: | + # Hardcoded resource group and storage account name + resource_group="iotedge-deploy" + storage_account="iotedgeconnectivitytest" + + # Set container name with current date + container_name="logs$(date +%Y%m%d)" + + # Set expiry time for the SAS token + expiry_time="$(date --utc --date "+12 hours" +"%Y-%m-%dT%H:%MZ")" + + # Generate the SAS token for the container + sasToken="$(az storage container generate-sas --account-name "$storage_account" --name "$container_name" --https-only --expiry "$expiry_time" --as-user --auth-mode login --permissions drwl --output tsv)" + if [ $? -ne 0 ]; then + echo "Failed to generate SAS token." + exit 1 + fi + + echo "SAS token for Azure Storage account acquired. Expires $expiry_time" + + # Construct the SAS URI + endpoint="$(az storage account show --name "$storage_account" --resource-group "$resource_group" --query 'primaryEndpoints.blob' -o tsv)" + sasUri="$endpoint$container_name?$sasToken" + echo "##vso[task.setvariable variable=testBlobStoreSas;issecret=true]$sasUri" - template: templates/longhaul-deploy.yaml parameters: release.label: 'lh$(agent.group)' @@ -158,7 +218,7 @@ jobs: test.testMode: 'LongHaul' test.useTRC: '$(useTRC)' test.deploymentFileName: 'long_haul_deployment_constrained.template.json' - testResultCoordinator.storageAccountConnectionString: '$(EdgeLonghaulStorageAccountConnString)' + testResultCoordinator.blobStorageAccountUriWithSasToken: '$(testBlobStoreSas)' clientModuleTransportType: 'amqp' ################################################################################ @@ -183,6 +243,36 @@ jobs: aziotis.artifact.name: 'packages_debian-11-slim_arm32v7' aziotis.package.filter: 'aziot-identity-service_*_armhf.deb' quickstart.artifactName: 'IotEdgeQuickstart.linux-arm.tar.gz' + - task: AzureCLI@2 + displayName: 'Get SAS URI for Blob Storage Account' + inputs: + azureSubscription: $(azure.subscription) + scriptType: 'bash' + scriptLocation: 'inlineScript' + inlineScript: | + # Hardcoded resource group and storage account name + resource_group="iotedge-deploy" + storage_account="iotedgeconnectivitytest" + + # Set container name with current date + container_name="logs$(date +%Y%m%d)" + + # Set expiry time for the SAS token + expiry_time="$(date --utc --date "+12 hours" +"%Y-%m-%dT%H:%MZ")" + + # Generate the SAS token for the container + sasToken="$(az storage container generate-sas --account-name "$storage_account" --name "$container_name" --https-only --expiry "$expiry_time" --as-user --auth-mode login --permissions drwl --output tsv)" + if [ $? -ne 0 ]; then + echo "Failed to generate SAS token." + exit 1 + fi + + echo "SAS token for Azure Storage account acquired. Expires $expiry_time" + + # Construct the SAS URI + endpoint="$(az storage account show --name "$storage_account" --resource-group "$resource_group" --query 'primaryEndpoints.blob' -o tsv)" + sasUri="$endpoint$container_name?$sasToken" + echo "##vso[task.setvariable variable=testBlobStoreSas;issecret=true]$sasUri" - template: templates/longhaul-deploy.yaml parameters: release.label: 'lh$(agent.group)' @@ -219,7 +309,7 @@ jobs: test.testMode: 'LongHaul' test.useTRC: '$(useTRC)' test.deploymentFileName: 'long_haul_deployment_constrained.template.json' - testResultCoordinator.storageAccountConnectionString: '$(EdgeLonghaulStorageAccountConnString)' + testResultCoordinator.blobStorageAccountUriWithSasToken: '$(testBlobStoreSas)' clientModuleTransportType: 'mqtt' ################################################################################ @@ -244,6 +334,36 @@ jobs: aziotis.artifact.name: 'packages_ubuntu-20.04_aarch64' aziotis.package.filter: 'aziot-identity-service_*_arm64.deb' quickstart.artifactName: 'IotEdgeQuickstart.linux-arm64.tar.gz' + - task: AzureCLI@2 + displayName: 'Get SAS URI for Blob Storage Account' + inputs: + azureSubscription: $(azure.subscription) + scriptType: 'bash' + scriptLocation: 'inlineScript' + inlineScript: | + # Hardcoded resource group and storage account name + resource_group="iotedge-deploy" + storage_account="iotedgeconnectivitytest" + + # Set container name with current date + container_name="logs$(date +%Y%m%d)" + + # Set expiry time for the SAS token + expiry_time="$(date --utc --date "+12 hours" +"%Y-%m-%dT%H:%MZ")" + + # Generate the SAS token for the container + sasToken="$(az storage container generate-sas --account-name "$storage_account" --name "$container_name" --https-only --expiry "$expiry_time" --as-user --auth-mode login --permissions drwl --output tsv)" + if [ $? -ne 0 ]; then + echo "Failed to generate SAS token." + exit 1 + fi + + echo "SAS token for Azure Storage account acquired. Expires $expiry_time" + + # Construct the SAS URI + endpoint="$(az storage account show --name "$storage_account" --resource-group "$resource_group" --query 'primaryEndpoints.blob' -o tsv)" + sasUri="$endpoint$container_name?$sasToken" + echo "##vso[task.setvariable variable=testBlobStoreSas;issecret=true]$sasUri" - template: templates/longhaul-deploy.yaml parameters: release.label: 'lh$(agent.group)' @@ -281,7 +401,7 @@ jobs: test.testMode: 'LongHaul' test.useTRC: '$(useTRC)' test.deploymentFileName: 'long_haul_deployment_constrained.template.json' - testResultCoordinator.storageAccountConnectionString: '$(EdgeLonghaulStorageAccountConnString)' + testResultCoordinator.blobStorageAccountUriWithSasToken: '$(testBlobStoreSas)' clientModuleTransportType: 'amqp' ################################################################################ @@ -306,6 +426,36 @@ jobs: aziotis.artifact.name: 'packages_ubuntu-20.04_aarch64' aziotis.package.filter: 'aziot-identity-service_*_arm64.deb' quickstart.artifactName: 'IotEdgeQuickstart.linux-arm64.tar.gz' + - task: AzureCLI@2 + displayName: 'Get SAS URI for Blob Storage Account' + inputs: + azureSubscription: $(azure.subscription) + scriptType: 'bash' + scriptLocation: 'inlineScript' + inlineScript: | + # Hardcoded resource group and storage account name + resource_group="iotedge-deploy" + storage_account="iotedgeconnectivitytest" + + # Set container name with current date + container_name="logs$(date +%Y%m%d)" + + # Set expiry time for the SAS token + expiry_time="$(date --utc --date "+12 hours" +"%Y-%m-%dT%H:%MZ")" + + # Generate the SAS token for the container + sasToken="$(az storage container generate-sas --account-name "$storage_account" --name "$container_name" --https-only --expiry "$expiry_time" --as-user --auth-mode login --permissions drwl --output tsv)" + if [ $? -ne 0 ]; then + echo "Failed to generate SAS token." + exit 1 + fi + + echo "SAS token for Azure Storage account acquired. Expires $expiry_time" + + # Construct the SAS URI + endpoint="$(az storage account show --name "$storage_account" --resource-group "$resource_group" --query 'primaryEndpoints.blob' -o tsv)" + sasUri="$endpoint$container_name?$sasToken" + echo "##vso[task.setvariable variable=testBlobStoreSas;issecret=true]$sasUri" - template: templates/longhaul-deploy.yaml parameters: release.label: 'lh$(agent.group)' @@ -343,7 +493,7 @@ jobs: test.testMode: 'LongHaul' test.useTRC: '$(useTRC)' test.deploymentFileName: 'long_haul_deployment_constrained.template.json' - testResultCoordinator.storageAccountConnectionString: '$(EdgeLonghaulStorageAccountConnString)' + testResultCoordinator.blobStorageAccountUriWithSasToken: '$(testBlobStoreSas)' clientModuleTransportType: 'mqtt' ################################################################################ @@ -367,6 +517,36 @@ jobs: aziotis.package.filter: 'aziot-identity-service-?.*.x86_64.rpm' identityServiceArtifactName: packages_mariner-2_amd64 quickstart.artifactName: 'IotEdgeQuickstart.linux-x64.tar.gz' + - task: AzureCLI@2 + displayName: 'Get SAS URI for Blob Storage Account' + inputs: + azureSubscription: $(azure.subscription) + scriptType: 'bash' + scriptLocation: 'inlineScript' + inlineScript: | + # Hardcoded resource group and storage account name + resource_group="iotedge-deploy" + storage_account="iotedgeconnectivitytest" + + # Set container name with current date + container_name="logs$(date +%Y%m%d)" + + # Set expiry time for the SAS token + expiry_time="$(date --utc --date "+12 hours" +"%Y-%m-%dT%H:%MZ")" + + # Generate the SAS token for the container + sasToken="$(az storage container generate-sas --account-name "$storage_account" --name "$container_name" --https-only --expiry "$expiry_time" --as-user --auth-mode login --permissions drwl --output tsv)" + if [ $? -ne 0 ]; then + echo "Failed to generate SAS token." + exit 1 + fi + + echo "SAS token for Azure Storage account acquired. Expires $expiry_time" + + # Construct the SAS URI + endpoint="$(az storage account show --name "$storage_account" --resource-group "$resource_group" --query 'primaryEndpoints.blob' -o tsv)" + sasUri="$endpoint$container_name?$sasToken" + echo "##vso[task.setvariable variable=testBlobStoreSas;issecret=true]$sasUri" - task: DeleteFiles@1 inputs: SourceFolder: '$(Agent.HomeDirectory)/../artifacts/' @@ -409,6 +589,6 @@ jobs: test.testMode: 'LongHaul' test.useTRC: '$(useTRC)' test.deploymentFileName: 'long_haul_deployment.template.json' - testResultCoordinator.storageAccountConnectionString: '$(EdgeLonghaulStorageAccountConnString)' + testResultCoordinator.blobStorageAccountUriWithSasToken: '$(testBlobStoreSas)' clientModuleTransportType: 'All' packageType: 'rpm' diff --git a/builds/e2e/templates/longhaul-deploy.yaml b/builds/e2e/templates/longhaul-deploy.yaml index b7d154d5372..fe8a2e0a6af 100644 --- a/builds/e2e/templates/longhaul-deploy.yaml +++ b/builds/e2e/templates/longhaul-deploy.yaml @@ -32,7 +32,7 @@ parameters: test.testMode: '' test.useTRC: '' test.deploymentFileName: '' - testResultCoordinator.storageAccountConnectionString: '' + testResultCoordinator.blobStorageAccountUriWithSasToken: '' clientModuleTransportType: '' packageType: 'deb' @@ -91,7 +91,7 @@ steps: -metricsScrapeFrequencyInSecs "${{ parameters['metricsCollector.scrapeFrequencyInSecs'] }}" \ -metricsUploadTarget "${{ parameters['metricsCollector.uploadTarget'] }}" \ -deploymentFileName "${{ parameters['test.deploymentFileName'] }}" \ - -storageAccountConnectionString "${{ parameters['testResultCoordinator.storageAccountConnectionString'] }}" \ + -blobStorageAccountUriWithSasToken "$(testBlobStoreSas)" \ -testRuntimeLogLevel "${{ parameters['test.runtimeLogLevel'] }}" \ -testInfo "$testInfo" \ -twinUpdateSize "${{ parameters['twinTester.twinUpdateSize'] }}" \ diff --git a/builds/e2e/templates/longhaul-setup.yaml b/builds/e2e/templates/longhaul-setup.yaml index 094136208e5..c92313d286a 100644 --- a/builds/e2e/templates/longhaul-setup.yaml +++ b/builds/e2e/templates/longhaul-setup.yaml @@ -28,7 +28,6 @@ steps: SnitchLongHaulAlertUrl, kvLogAnalyticWorkspaceId, kvLogAnalyticSharedKey, - EdgeLonghaulStorageAccountConnString, GitHubAccessToken - task: AzureKeyVault@1 displayName: 'Azure Key Vault: $(azure.keyVault)' diff --git a/builds/e2e/templates/nested-deploy-config.yaml b/builds/e2e/templates/nested-deploy-config.yaml index c696a50723a..2446ba77d32 100644 --- a/builds/e2e/templates/nested-deploy-config.yaml +++ b/builds/e2e/templates/nested-deploy-config.yaml @@ -29,7 +29,7 @@ steps: -containerRegistryPassword "$(edgebuilds-azurecr-io-pwd)" \ -iotHubConnectionString "$(IotHub-ConnStr)" \ -deploymentFileName "${{ parameters.deploymentFile }}" \ - -storageAccountConnectionString "$(EdgeConnectivityStorageAccountConnString)" \ + -blobStorageAccountUriWithSasToken "$(testBlobStoreSas)" \ -edgeRuntimeBuildNumber "$(Build.BuildNumber)" \ -customEdgeAgentImage "$(customEdgeAgent.image)" \ -customEdgeHubImage "$(customEdgeHub.image)" \ diff --git a/builds/e2e/templates/nested-get-secrets.yaml b/builds/e2e/templates/nested-get-secrets.yaml index a73090e7ace..cb9fa09c3e9 100644 --- a/builds/e2e/templates/nested-get-secrets.yaml +++ b/builds/e2e/templates/nested-get-secrets.yaml @@ -10,8 +10,6 @@ steps: edgebuilds-azurecr-io-pwd, kvLogAnalyticWorkspaceId, kvLogAnalyticSharedKey, - EdgeConnectivityStorageAccountConnString, - EdgeLonghaulStorageAccountConnString, GitHubAccessToken, edgebuild-service-principal-secret, @@ -40,3 +38,33 @@ steps: echo "Azure DevOps AAD token acquired. Expires $(echo $aadTokenInfo | jq -r .expiresOn)" aadToken=$(echo $aadTokenInfo | jq -r .accessToken) echo "##vso[task.setvariable variable=IotEdgePAT;issecret=true]$aadToken" + - task: AzureCLI@2 + displayName: 'Get SAS URI for Blob Storage Account' + inputs: + azureSubscription: $(azure.subscription) + scriptType: 'bash' + scriptLocation: 'inlineScript' + inlineScript: | + # Hardcoded resource group and storage account name + resource_group="iotedge-deploy" + storage_account="iotedgeconnectivitytest" + + # Set container name with current date + container_name="logs$(date +%Y%m%d)" + + # Set expiry time for the SAS token + expiry_time="$(date --utc --date "+12 hours" +"%Y-%m-%dT%H:%MZ")" + + # Generate the SAS token for the container + sasToken="$(az storage container generate-sas --account-name "$storage_account" --name "$container_name" --https-only --expiry "$expiry_time" --as-user --auth-mode login --permissions drwl --output tsv)" + if [ $? -ne 0 ]; then + echo "Failed to generate SAS token." + exit 1 + fi + + echo "SAS token for Azure Storage account acquired. Expires $expiry_time" + + # Construct the SAS URI + endpoint="$(az storage account show --name "$storage_account" --resource-group "$resource_group" --query 'primaryEndpoints.blob' -o tsv)" + sasUri="$endpoint$container_name?$sasToken" + echo "##vso[task.setvariable variable=testBlobStoreSas;issecret=true]$sasUri" diff --git a/builds/e2e/templates/nested-longhaul-deploy-amd64.yaml b/builds/e2e/templates/nested-longhaul-deploy-amd64.yaml index 64809c835a6..cb9fd026e27 100644 --- a/builds/e2e/templates/nested-longhaul-deploy-amd64.yaml +++ b/builds/e2e/templates/nested-longhaul-deploy-amd64.yaml @@ -59,7 +59,7 @@ jobs: metricsCollector.hostPlatform: '$(hostPlatform)' longHaul.parentHostname: '$(parentName)' longHaul.parentEdgeDevice: '$(parentDeviceId)' - testResultCoordinator.storageAccountConnectionString: '$(EdgeLonghaulStorageAccountConnString)' + testResultCoordinator.blobStorageAccountUriWithSasToken: '$(testBlobStoreSas)' quickstart.package.name: '$(quickstart.package.name)' testInfo.testName: "${{ parameters['testInfo.testName'] }}" upstream.protocol: "${{ parameters['upstream.protocol'] }}" diff --git a/builds/e2e/templates/nested-longhaul-deploy.yaml b/builds/e2e/templates/nested-longhaul-deploy.yaml index f73c004cbf4..9ffd7f531c7 100644 --- a/builds/e2e/templates/nested-longhaul-deploy.yaml +++ b/builds/e2e/templates/nested-longhaul-deploy.yaml @@ -30,7 +30,7 @@ parameters: test.runtimeLogLevel: '' longHaul.parentHostname: '' longHaul.parentEdgeDevice: '' - testResultCoordinator.storageAccountConnectionString: '' + testResultCoordinator.blobStorageAccountUriWithSasToken: '' quickstart.package.name: '' upstream.protocol: '' @@ -176,7 +176,7 @@ steps: -metricsScrapeFrequencyInSecs "${{ parameters['metricsCollector.scrapeFrequencyInSecs'] }}" \ -metricsUploadTarget "${{ parameters['metricsCollector.uploadTarget'] }}" \ -deploymentFileName "${{ parameters['test.deploymentFileName'] }}" \ - -storageAccountConnectionString "${{ parameters['testResultCoordinator.storageAccountConnectionString'] }}" \ + -blobStorageAccountUriWithSasToken "$(testBlobStoreSas)" \ -testRuntimeLogLevel "${{ parameters['test.runtimeLogLevel'] }}" \ -testInfo "$testInfo" \ -twinUpdateSize "${{ parameters['twinTester.twinUpdateSize'] }}" \ diff --git a/e2e_deployment_files/edgehub_restart_deployment.template.json b/e2e_deployment_files/edgehub_restart_deployment.template.json index b7f6d6ccbd6..73e05219ed3 100644 --- a/e2e_deployment_files/edgehub_restart_deployment.template.json +++ b/e2e_deployment_files/edgehub_restart_deployment.template.json @@ -229,8 +229,8 @@ "IOT_HUB_CONNECTION_STRING": { "value": "" }, - "STORAGE_ACCOUNT_CONNECTION_STRING": { - "value": "" + "BLOB_STORE_SAS": { + "value": "" }, "NetworkControllerRunProfile": { "value": "" diff --git a/e2e_deployment_files/long_haul_deployment.template.json b/e2e_deployment_files/long_haul_deployment.template.json index d2b38b2ccd6..64b66af660e 100644 --- a/e2e_deployment_files/long_haul_deployment.template.json +++ b/e2e_deployment_files/long_haul_deployment.template.json @@ -406,8 +406,8 @@ "logUploadEnabled": { "value": "" }, - "STORAGE_ACCOUNT_CONNECTION_STRING": { - "value": "" + "BLOB_STORE_SAS": { + "value": "" }, "NetworkControllerRunProfile": { "value": "" diff --git a/e2e_deployment_files/long_haul_deployment_constrained.template.json b/e2e_deployment_files/long_haul_deployment_constrained.template.json index 07111927c05..378585e6968 100644 --- a/e2e_deployment_files/long_haul_deployment_constrained.template.json +++ b/e2e_deployment_files/long_haul_deployment_constrained.template.json @@ -262,8 +262,8 @@ "logUploadEnabled": { "value": "" }, - "STORAGE_ACCOUNT_CONNECTION_STRING": { - "value": "" + "BLOB_STORE_SAS": { + "value": "" }, "NetworkControllerRunProfile": { "value": "" diff --git a/e2e_deployment_files/nestededge_bottomLayerBaseDeployment_long_haul_amqp.template.json b/e2e_deployment_files/nestededge_bottomLayerBaseDeployment_long_haul_amqp.template.json index 939e395472a..48651d64a7e 100644 --- a/e2e_deployment_files/nestededge_bottomLayerBaseDeployment_long_haul_amqp.template.json +++ b/e2e_deployment_files/nestededge_bottomLayerBaseDeployment_long_haul_amqp.template.json @@ -385,8 +385,8 @@ "logUploadEnabled": { "value": "" }, - "STORAGE_ACCOUNT_CONNECTION_STRING": { - "value": "" + "BLOB_STORE_SAS": { + "value": "" }, "NetworkControllerRunProfile": { "value": "" diff --git a/scripts/linux/nested-edge-deploy-agent.sh b/scripts/linux/nested-edge-deploy-agent.sh index d0bd1c4271c..a99465925c4 100644 --- a/scripts/linux/nested-edge-deploy-agent.sh +++ b/scripts/linux/nested-edge-deploy-agent.sh @@ -154,7 +154,7 @@ function process_args() { IOT_HUB_CONNECTION_STRING="$arg" saveNextArg=0 elif [ $saveNextArg -eq 8 ]; then - STORAGE_ACCOUNT_CONNECTION_STRING="$arg" + BLOB_STORE_SAS="$arg" saveNextArg=0 elif [ $saveNextArg -eq 9 ]; then DEPLOYMENT_FILE_NAME="$arg" @@ -203,7 +203,7 @@ function process_args() { '-containerRegistryUsername' ) saveNextArg=5;; '-containerRegistryPassword' ) saveNextArg=6;; '-iotHubConnectionString' ) saveNextArg=7;; - '-storageAccountConnectionString' ) saveNextArg=8;; + '-blobStorageAccountUriWithSasToken' ) saveNextArg=8;; '-deploymentFileName' ) saveNextArg=9;; '-edgeRuntimeBuildNumber' ) saveNextArg=10;; '-customEdgeAgentImage' ) saveNextArg=11;; @@ -237,7 +237,7 @@ function process_args() { [[ -z "$CONTAINER_REGISTRY_PASSWORD" ]] && { print_error 'Container registry password is required'; exit 1; } [[ -z "$DEPLOYMENT_FILE_NAME" ]] && { print_error 'Deployment file name is required'; exit 1; } [[ -z "$IOT_HUB_CONNECTION_STRING" ]] && { print_error 'IoT hub connection string is required'; exit 1; } - [[ -z "$STORAGE_ACCOUNT_CONNECTION_STRING" ]] && { print_error 'Storage account connection string is required'; exit 1; } + [[ -z "$BLOB_STORE_SAS" ]] && { print_error 'Blob storage URI is required'; exit 1; } echo 'Required parameters are provided' }