diff --git a/infra/azuredeploy.json b/infra/azuredeploy.json index 3eeea3a3f..c9f2274be 100644 --- a/infra/azuredeploy.json +++ b/infra/azuredeploy.json @@ -144,11 +144,10 @@ "location": "[resourceGroup().location]", "resourceToken": "[toLower(uniqueString(subscription().id, resourceGroup().name, variables('location')))]", "asaInstanceName": "[format('{0}{1}', variables('abbrs').springApps, variables('resourceToken'))]", - "adminServerAppName": "admin-server", "customersServiceAppName": "customers-service", "vetsServiceAppName": "vets-service", "visitsServiceAppName": "visits-service", - "apiGatewayAppName": "api-gateway", + "frontendAppName": "frontend", "logAnalyticsName": "[format('{0}{1}', variables('abbrs').operationalInsightsWorkspaces, variables('resourceToken'))]", "applicationInsightsName": "[format('{0}{1}', variables('abbrs').insightsComponents, variables('resourceToken'))]", "applicationInsightsDashboardName": "[format('{0}{1}', variables('abbrs').portalDashboards, variables('resourceToken'))]", @@ -168,7 +167,7 @@ "resources": [ { "type": "Microsoft.AppPlatform/Spring", - "apiVersion": "2023-05-01-preview", + "apiVersion": "2023-11-01-preview", "name": "[variables('asaInstanceName')]", "location": "[variables('location')]", "tags": "[variables('tags')]", @@ -179,7 +178,7 @@ }, { "type": "Microsoft.AppPlatform/Spring/buildServices", - "apiVersion": "2023-05-01-preview", + "apiVersion": "2023-11-01-preview", "name": "[concat(variables('asaInstanceName'), '/default')]", "dependsOn": [ "[resourceId('Microsoft.AppPlatform/Spring', variables('asaInstanceName'))]" @@ -190,36 +189,7 @@ }, { "type": "Microsoft.AppPlatform/Spring/apps", - "apiVersion": "2023-05-01-preview", - "name": "[format('{0}/{1}', variables('asaInstanceName'), variables('adminServerAppName'))]", - "location": "[variables('location')]", - "dependsOn": [ - "[resourceId('Microsoft.AppPlatform/Spring', variables('asaInstanceName'))]" - ], - "properties": { - "public": true, - "httpsOnly": false, - "temporaryDisk": { - "sizeInGB": 5, - "mountPath": "/tmp" - }, - "persistentDisk": { - "sizeInGB": 0, - "mountPath": "/persistent" - }, - "enableEndToEndTLS": false, - "ingressSettings": { - "readTimeoutInSeconds": 300, - "sendTimeoutInSeconds": 60, - "sessionCookieMaxAge": 0, - "sessionAffinity": "None", - "backendProtocol": "Default" - } - } - }, - { - "type": "Microsoft.AppPlatform/Spring/apps", - "apiVersion": "2023-05-01-preview", + "apiVersion": "2023-11-01-preview", "name": "[format('{0}/{1}', variables('asaInstanceName'), variables('customersServiceAppName'))]", "location": "[variables('location')]", "dependsOn": [ @@ -247,7 +217,7 @@ }, { "type": "Microsoft.AppPlatform/Spring/apps", - "apiVersion": "2023-05-01-preview", + "apiVersion": "2023-11-01-preview", "name": "[format('{0}/{1}', variables('asaInstanceName'), variables('vetsServiceAppName'))]", "location": "[variables('location')]", "dependsOn": [ @@ -275,7 +245,7 @@ }, { "type": "Microsoft.AppPlatform/Spring/apps", - "apiVersion": "2023-05-01-preview", + "apiVersion": "2023-11-01-preview", "name": "[format('{0}/{1}', variables('asaInstanceName'), variables('visitsServiceAppName'))]", "location": "[variables('location')]", "dependsOn": [ @@ -303,14 +273,14 @@ }, { "type": "Microsoft.AppPlatform/Spring/apps", - "apiVersion": "2023-05-01-preview", - "name": "[format('{0}/{1}', variables('asaInstanceName'), variables('apiGatewayAppName'))]", + "apiVersion": "2023-11-01-preview", + "name": "[format('{0}/{1}', variables('asaInstanceName'), variables('frontendAppName'))]", "location": "[variables('location')]", "dependsOn": [ "[resourceId('Microsoft.AppPlatform/Spring', variables('asaInstanceName'))]" ], "properties": { - "public": true, + "public": false, "httpsOnly": false, "temporaryDisk": { "sizeInGB": 5, @@ -332,29 +302,7 @@ }, { "type": "Microsoft.AppPlatform/Spring/apps/deployments", - "apiVersion": "2023-05-01-preview", - "name": "[format('{0}/{1}/{2}', variables('asaInstanceName'), variables('adminServerAppName'), 'default')]", - "dependsOn": [ - "[resourceId('Microsoft.AppPlatform/Spring/apps', variables('asaInstanceName'), variables('adminServerAppName'))]" - - ], - "properties": { - "active": true, - "deploymentSettings": { - "resourceRequests": { - "cpu": "1", - "memory": "2Gi" - } - }, - "source": { - "type": "BuildResult", - "buildResultId": "" - } - } - }, - { - "type": "Microsoft.AppPlatform/Spring/apps/deployments", - "apiVersion": "2023-05-01-preview", + "apiVersion": "2023-11-01-preview", "name": "[format('{0}/{1}/{2}', variables('asaInstanceName'), variables('customersServiceAppName'), 'default')]", "dependsOn": [ "[resourceId('Microsoft.AppPlatform/Spring/apps', variables('asaInstanceName'), variables('customersServiceAppName'))]" @@ -375,7 +323,7 @@ }, { "type": "Microsoft.AppPlatform/Spring/apps/deployments", - "apiVersion": "2023-05-01-preview", + "apiVersion": "2023-11-01-preview", "name": "[format('{0}/{1}/{2}', variables('asaInstanceName'), variables('vetsServiceAppName'), 'default')]", "dependsOn": [ "[resourceId('Microsoft.AppPlatform/Spring/apps', variables('asaInstanceName'), variables('vetsServiceAppName'))]" @@ -396,7 +344,7 @@ }, { "type": "Microsoft.AppPlatform/Spring/apps/deployments", - "apiVersion": "2023-05-01-preview", + "apiVersion": "2023-11-01-preview", "name": "[format('{0}/{1}/{2}', variables('asaInstanceName'), variables('visitsServiceAppName'), 'default')]", "dependsOn": [ "[resourceId('Microsoft.AppPlatform/Spring/apps', variables('asaInstanceName'), variables('visitsServiceAppName'))]" @@ -417,10 +365,10 @@ }, { "type": "Microsoft.AppPlatform/Spring/apps/deployments", - "apiVersion": "2023-05-01-preview", - "name": "[format('{0}/{1}/{2}', variables('asaInstanceName'), variables('apiGatewayAppName'), 'default')]", + "apiVersion": "2023-11-01-preview", + "name": "[format('{0}/{1}/{2}', variables('asaInstanceName'), variables('frontendAppName'), 'default')]", "dependsOn": [ - "[resourceId('Microsoft.AppPlatform/Spring/apps', variables('asaInstanceName'), variables('apiGatewayAppName'))]" + "[resourceId('Microsoft.AppPlatform/Spring/apps', variables('asaInstanceName'), variables('frontendAppName'))]" ], "properties": { "active": true, @@ -465,11 +413,10 @@ "location": "[variables('location')]", "dependsOn": [ "[resourceId('Microsoft.Authorization/roleAssignments', variables('name_roleAssignmentName'))]", - "[resourceId('Microsoft.AppPlatform/Spring/apps/deployments', variables('asaInstanceName'), variables('adminServerAppName'), 'default')]", "[resourceId('Microsoft.AppPlatform/Spring/apps/deployments', variables('asaInstanceName'), variables('customersServiceAppName'), 'default')]", "[resourceId('Microsoft.AppPlatform/Spring/apps/deployments', variables('asaInstanceName'), variables('vetsServiceAppName'), 'default')]", "[resourceId('Microsoft.AppPlatform/Spring/apps/deployments', variables('asaInstanceName'), variables('visitsServiceAppName'), 'default')]", - "[resourceId('Microsoft.AppPlatform/Spring/apps/deployments', variables('asaInstanceName'), variables('apiGatewayAppName'), 'default')]" + "[resourceId('Microsoft.AppPlatform/Spring/apps/deployments', variables('asaInstanceName'), variables('frontendAppName'), 'default')]" ], "kind": "AzurePowerShell", "identity": { @@ -501,7 +448,7 @@ }, { "type": "Microsoft.AppPlatform/Spring/buildservices/builders/buildpackBindings", - "apiVersion": "2023-05-01-preview", + "apiVersion": "2023-11-01-preview", "name": "[concat(variables('asaInstanceName'), '/default/default/default')]", "dependsOn": [ "[resourceId('Microsoft.Resources/deploymentScripts', variables('const_checkingBuilderStateDeploymentName'))]" @@ -1762,7 +1709,7 @@ }, { "type": "Microsoft.AppPlatform/Spring/monitoringSettings", - "apiVersion": "2023-05-01-preview", + "apiVersion": "2023-11-01-preview", "name": "[format('{0}/{1}', variables('asaInstanceName'), 'default')]", "dependsOn": [ "[resourceId('Microsoft.AppPlatform/Spring', variables('asaInstanceName'))]", @@ -1798,7 +1745,7 @@ }, { "type": "Microsoft.AppPlatform/Spring/applicationAccelerators", - "apiVersion": "2023-05-01-preview", + "apiVersion": "2023-11-01-preview", "name": "[concat(variables('asaInstanceName'), '/default')]", "dependsOn": [ "[resourceId('Microsoft.AppPlatform/Spring', variables('asaInstanceName'))]" @@ -1806,7 +1753,7 @@ }, { "type": "Microsoft.AppPlatform/Spring/applicationLiveViews", - "apiVersion": "2023-05-01-preview", + "apiVersion": "2023-11-01-preview", "name": "[concat(variables('asaInstanceName'), '/default')]", "dependsOn": [ "[resourceId('Microsoft.AppPlatform/Spring', variables('asaInstanceName'))]" @@ -1814,7 +1761,7 @@ }, { "type": "Microsoft.AppPlatform/Spring/configurationServices", - "apiVersion": "2023-05-01-preview", + "apiVersion": "2023-11-01-preview", "name": "[concat(variables('asaInstanceName'), '/default')]", "dependsOn": [ "[resourceId('Microsoft.AppPlatform/Spring', variables('asaInstanceName'))]" @@ -1844,13 +1791,13 @@ }, { "type": "Microsoft.AppPlatform/Spring/devToolPortals", - "apiVersion": "2023-05-01-preview", + "apiVersion": "2023-11-01-preview", "name": "[concat(variables('asaInstanceName'), '/default')]", "dependsOn": [ "[resourceId('Microsoft.AppPlatform/Spring', variables('asaInstanceName'))]" ], "properties": { - "public": false, + "public": true, "features": { "applicationAccelerator": { "state": "Enabled" @@ -1863,7 +1810,7 @@ }, { "type": "Microsoft.AppPlatform/Spring/gateways", - "apiVersion": "2023-05-01-preview", + "apiVersion": "2023-11-01-preview", "name": "[concat(variables('asaInstanceName'), '/default')]", "dependsOn": [ "[resourceId('Microsoft.AppPlatform/Spring', variables('asaInstanceName'))]" @@ -1874,7 +1821,7 @@ "capacity": 2 }, "properties": { - "public": false, + "public": true, "httpsOnly": false, "resourceRequests": { "cpu": "1", @@ -1885,9 +1832,86 @@ } } }, + { + "type": "Microsoft.AppPlatform/Spring/gateways/routeConfigs", + "apiVersion": "2023-03-01-preview", + "name": "[format('{0}/{1}/{2}', variables('asaInstanceName'), 'default', variables('customersServiceAppName'))]", + "dependsOn": [ + "[resourceId('Microsoft.AppPlatform/Spring/gateways', variables('asaInstanceName'), 'default')]", + "[resourceId('Microsoft.AppPlatform/Spring', variables('asaInstanceName'))]", + "[resourceId('Microsoft.AppPlatform/Spring/apps', variables('asaInstanceName'), variables('customersServiceAppName'))]" + ], + "properties": { + "appResourceId": "[resourceId('Microsoft.AppPlatform/Spring/apps', variables('asaInstanceName'), variables('customersServiceAppName'))]", + "routes": [ + { + "filters": [ "StripPrefix=2" ], + "predicates": [ "Path=/api/customer/**" ] + } + ] + } + }, + { + "type": "Microsoft.AppPlatform/Spring/gateways/routeConfigs", + "apiVersion": "2023-03-01-preview", + "name": "[format('{0}/{1}/{2}', variables('asaInstanceName'), 'default', variables('vetsServiceAppName'))]", + "dependsOn": [ + "[resourceId('Microsoft.AppPlatform/Spring/gateways', variables('asaInstanceName'), 'default')]", + "[resourceId('Microsoft.AppPlatform/Spring', variables('asaInstanceName'))]", + "[resourceId('Microsoft.AppPlatform/Spring/apps', variables('asaInstanceName'), variables('vetsServiceAppName'))]" + ], + "properties": { + "appResourceId": "[resourceId('Microsoft.AppPlatform/Spring/apps', variables('asaInstanceName'), variables('vetsServiceAppName'))]", + "routes": [ + { + "filters": [ "StripPrefix=2" ], + "predicates": [ "Path=/api/vet/**" ] + } + ] + } + }, + { + "type": "Microsoft.AppPlatform/Spring/gateways/routeConfigs", + "apiVersion": "2023-03-01-preview", + "name": "[format('{0}/{1}/{2}', variables('asaInstanceName'), 'default', variables('visitsServiceAppName'))]", + "dependsOn": [ + "[resourceId('Microsoft.AppPlatform/Spring/gateways', variables('asaInstanceName'), 'default')]", + "[resourceId('Microsoft.AppPlatform/Spring', variables('asaInstanceName'))]", + "[resourceId('Microsoft.AppPlatform/Spring/apps', variables('asaInstanceName'), variables('visitsServiceAppName'))]" + ], + "properties": { + "appResourceId": "[resourceId('Microsoft.AppPlatform/Spring/apps', variables('asaInstanceName'), variables('visitsServiceAppName'))]", + "routes": [ + { + "filters": [ "StripPrefix=2" ], + "predicates": [ "Path=/api/visit/**" ] + } + ] + } + }, + { + "type": "Microsoft.AppPlatform/Spring/gateways/routeConfigs", + "apiVersion": "2023-03-01-preview", + "name": "[format('{0}/{1}/{2}', variables('asaInstanceName'), 'default', variables('frontendAppName'))]", + "dependsOn": [ + "[resourceId('Microsoft.AppPlatform/Spring/gateways', variables('asaInstanceName'), 'default')]", + "[resourceId('Microsoft.AppPlatform/Spring', variables('asaInstanceName'))]", + "[resourceId('Microsoft.AppPlatform/Spring/apps', variables('asaInstanceName'), variables('frontendAppName'))]" + ], + "properties": { + "appResourceId": "[resourceId('Microsoft.AppPlatform/Spring/apps', variables('asaInstanceName'), variables('frontendAppName'))]", + "routes": [ + { + "filters": [ "StripPrefix=0" ], + "predicates": [ "Path=/**" ], + "order": 1000 + } + ] + } + }, { "type": "Microsoft.AppPlatform/Spring/serviceRegistries", - "apiVersion": "2023-05-01-preview", + "apiVersion": "2023-11-01-preview", "name": "[concat(variables('asaInstanceName'), '/default')]", "dependsOn": [ "[resourceId('Microsoft.AppPlatform/Spring', variables('asaInstanceName'))]" @@ -1895,7 +1919,7 @@ }, { "type": "Microsoft.AppPlatform/Spring/apiPortals", - "apiVersion": "2023-05-01-preview", + "apiVersion": "2023-11-01-preview", "name": "[concat(variables('asaInstanceName'), '/default')]", "dependsOn": [ "[resourceId('Microsoft.AppPlatform/Spring', variables('asaInstanceName'))]", @@ -1916,7 +1940,7 @@ }, { "type": "Microsoft.AppPlatform/Spring/buildServices/agentPools", - "apiVersion": "2023-05-01-preview", + "apiVersion": "2023-11-01-preview", "name": "[concat(variables('asaInstanceName'), '/default/default')]", "dependsOn": [ "[resourceId('Microsoft.AppPlatform/Spring/buildServices', variables('asaInstanceName'), 'default')]" @@ -1966,13 +1990,13 @@ } ], "outputs": { - "API Gateway URL": { + "Spring Cloud Gateway URL": { "type": "string", - "value": "[reference(resourceId('Microsoft.AppPlatform/Spring/apps', variables('asaInstanceName'), variables('apiGatewayAppName')), '2023-05-01-preview').url]" + "value": "[concat('https://', reference(resourceId('Microsoft.AppPlatform/Spring/gateways', variables('asaInstanceName'), 'default'), '2023-11-01-preview').url)]" }, - "Admin Server URL": { + "Application Live View URL": { "type": "string", - "value": "[reference(resourceId('Microsoft.AppPlatform/Spring/apps', variables('asaInstanceName'), variables('adminServerAppName')), '2023-05-01-preview').url]" + "value": "[concat('https://', reference(resourceId('Microsoft.AppPlatform/Spring/DevToolPortals', variables('asaInstanceName'), 'default'), '2023-11-01-preview').url, '/app-live-view')]" } } } diff --git a/infra/scripts/check-provision-state.ps1 b/infra/scripts/check-provision-state.ps1 index f087bd649..181852e50 100644 --- a/infra/scripts/check-provision-state.ps1 +++ b/infra/scripts/check-provision-state.ps1 @@ -17,7 +17,7 @@ if (!$asaServiceName) { throw "The Azure Spring Apps service name is not successfully retrieved, please retry another deployment." } -$apiUrl = 'https://management.azure.com/subscriptions/' + $subscriptionId + '/resourceGroups/' + $resourceGroup + '/providers/Microsoft.AppPlatform/Spring/' + $asaServiceName + '/buildServices/default/builders/default?api-version=2023-05-01-preview' +$apiUrl = 'https://management.azure.com/subscriptions/' + $subscriptionId + '/resourceGroups/' + $resourceGroup + '/providers/Microsoft.AppPlatform/Spring/' + $asaServiceName + '/buildServices/default/builders/default?api-version=2023-11-01-preview' $state = $null $timeout = New-TimeSpan -Seconds 900 Write-Output "Check the status of Build Service Builder provisioning state within $timeout ..." diff --git a/infra/scripts/deploy-jar-to-asa.sh b/infra/scripts/deploy-jar-to-asa.sh index a6c8571a2..dad5e5494 100644 --- a/infra/scripts/deploy-jar-to-asa.sh +++ b/infra/scripts/deploy-jar-to-asa.sh @@ -18,39 +18,38 @@ if [[ -z "$ASA_SERVICE_NAME" ]]; then exit 1 fi -base_url="https://github.com/Azure-Samples/spring-petclinic-microservices/releases/download" -auth_header="no-auth" -version="3.0.1" -declare -a artifact_arr=("admin-server" "customers-service" "vets-service" "visits-service" "api-gateway") +declare -A app_module_path_map +declare -a artifact_arr=("customers-service" "vets-service" "visits-service") +app_module_path_map[${artifact_arr[0]}]="spring-petclinic-customers-service" +app_module_path_map[${artifact_arr[1]}]="spring-petclinic-vets-service" +app_module_path_map[${artifact_arr[2]}]="spring-petclinic-visits-service" az extension add --name spring --upgrade +git clone https://github.com/Azure-Samples/spring-petclinic-microservices.git +cd spring-petclinic-microservices -deployJar() { - jar_file_name="$1-$version.jar" - source_url="$base_url/v$version/$jar_file_name" - # Download binary - echo "Downloading binary from $source_url to $jar_file_name" - if [ "$auth_header" == "no-auth" ]; then - curl -L "$source_url" -o $jar_file_name - else - curl -H "Authorization: $auth_header" "$source_url" -o $jar_file_name - fi - +deployJavaCode() { config_file_pattern="application,$1" - az spring application-configuration-service bind --resource-group $RESOURCE_GROUP --service $ASA_SERVICE_NAME --app $1 - az spring service-registry bind --resource-group $RESOURCE_GROUP --service $ASA_SERVICE_NAME --app $1 - az spring app deploy --resource-group $RESOURCE_GROUP --service $ASA_SERVICE_NAME --name $1 --artifact-path $jar_file_name --config-file-pattern $config_file_pattern + az spring application-configuration-service bind --subscription $SUBSCRIPTION_ID --resource-group $RESOURCE_GROUP --service $ASA_SERVICE_NAME --app $1 + az spring service-registry bind --subscription $SUBSCRIPTION_ID --resource-group $RESOURCE_GROUP --service $ASA_SERVICE_NAME --app $1 + az spring app deploy --subscription $SUBSCRIPTION_ID --resource-group $RESOURCE_GROUP --service $ASA_SERVICE_NAME --name $1 --source-path --config-file-pattern $config_file_pattern --build-env BP_MAVEN_BUILT_MODULE=${app_module_path_map[$1]} BP_JVM_VERSION=17 +} + +deployFrontendCode() { + az spring app deploy --subscription $SUBSCRIPTION_ID --resource-group $RESOURCE_GROUP --service $ASA_SERVICE_NAME --name frontend --build-env BP_WEB_SERVER=nginx --source-path ./spring-petclinic-frontend } for item in "${artifact_arr[@]}" do - deployJar $item & + deployJavaCode "$item" & done +deployFrontendCode & + jobs_count=$(jobs -p | wc -l) # Loop until all jobs are done -while [ $jobs_count -gt 0 ]; do +while [ "$jobs_count" -gt 0 ]; do wait -n exit_status=$? @@ -62,7 +61,7 @@ while [ $jobs_count -gt 0 ]; do fi done -echo "Deployed to Azure Spring Cloud successfully." +echo "Deployed to Azure Spring Apps successfully." # Delete uami generated before exiting the script -az identity delete --ids ${AZ_SCRIPTS_USER_ASSIGNED_IDENTITY} \ No newline at end of file +az identity delete --ids ${AZ_SCRIPTS_USER_ASSIGNED_IDENTITY}