From c81018efcba2a1f6f73f072afce0ec33e532c0fa Mon Sep 17 00:00:00 2001 From: Dominique Broeglin Date: Sun, 9 Jun 2024 16:58:19 +0000 Subject: [PATCH 01/15] Initializing AZD support from Azure-Samples/azd-starter-bicep * Copied `infra` and `azure.yaml` * Merged parts of `devcontainer.json` --- .devcontainer/devcontainer.json | 7 +- azure.yaml | 30 + infra/abbreviations.json | 136 ++ infra/core/config/configstore.bicep | 48 + .../database/postgresql/flexibleserver.bicep | 65 + infra/core/host/container-app-upsert.bicep | 110 ++ infra/core/host/container-app.bicep | 169 +++ .../host/container-apps-environment.bicep | 41 + infra/core/host/container-apps.bicep | 40 + infra/core/host/container-registry.bicep | 137 ++ .../applicationinsights-dashboard.bicep | 1236 +++++++++++++++++ infra/core/monitor/applicationinsights.bicep | 31 + infra/core/monitor/loganalytics.bicep | 22 + infra/core/monitor/monitoring.bicep | 33 + .../security/aks-managed-cluster-access.bicep | 27 + infra/core/security/configstore-access.bicep | 21 + infra/core/security/keyvault-access.bicep | 22 + infra/core/security/keyvault-secret.bicep | 31 + infra/core/security/keyvault.bicep | 27 + infra/core/security/registry-access.bicep | 19 + infra/core/security/role.bicep | 21 + infra/core/storage/storage-account.bicep | 101 ++ infra/core/testing/loadtesting.bicep | 15 + infra/main.bicep | 66 + infra/main.parameters.json | 12 + 25 files changed, 2465 insertions(+), 2 deletions(-) create mode 100644 azure.yaml create mode 100644 infra/abbreviations.json create mode 100644 infra/core/config/configstore.bicep create mode 100644 infra/core/database/postgresql/flexibleserver.bicep create mode 100644 infra/core/host/container-app-upsert.bicep create mode 100644 infra/core/host/container-app.bicep create mode 100644 infra/core/host/container-apps-environment.bicep create mode 100644 infra/core/host/container-apps.bicep create mode 100644 infra/core/host/container-registry.bicep create mode 100644 infra/core/monitor/applicationinsights-dashboard.bicep create mode 100644 infra/core/monitor/applicationinsights.bicep create mode 100644 infra/core/monitor/loganalytics.bicep create mode 100644 infra/core/monitor/monitoring.bicep create mode 100644 infra/core/security/aks-managed-cluster-access.bicep create mode 100644 infra/core/security/configstore-access.bicep create mode 100644 infra/core/security/keyvault-access.bicep create mode 100644 infra/core/security/keyvault-secret.bicep create mode 100644 infra/core/security/keyvault.bicep create mode 100644 infra/core/security/registry-access.bicep create mode 100644 infra/core/security/role.bicep create mode 100644 infra/core/storage/storage-account.bicep create mode 100644 infra/core/testing/loadtesting.bicep create mode 100644 infra/main.bicep create mode 100644 infra/main.parameters.json diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 0a0d4f9..7c65df1 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -16,15 +16,18 @@ "installBicep": true }, "ghcr.io/devcontainers/features/github-cli:1": {}, - "ghcr.io/azure/azure-dev/azd:latest": {} + "ghcr.io/azure/azure-dev/azd:latest": {}, + "ghcr.io/devcontainers/features/docker-in-docker:2": {} }, // Configure tool-specific properties. "customizations": { "vscode": { "extensions": [ + "GitHub.vscode-github-actions", "ms-azuretools.azure-dev", - "ms-azuretools.vscode-bicep" + "ms-azuretools.vscode-bicep", + "ms-azuretools.vscode-docker" ] } }, diff --git a/azure.yaml b/azure.yaml new file mode 100644 index 0000000..351d11a --- /dev/null +++ b/azure.yaml @@ -0,0 +1,30 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json + +# This is an example starter azure.yaml file containing several example services in comments below. +# Make changes as needed to describe your application setup. +# To learn more about the azure.yaml file, visit https://learn.microsoft.com/en-us/azure/developer/azure-developer-cli/azd-schema + +# Name of the application. +name: azd-starter +# services: +# ## An example for a python API service. +# ## The service is named 'python-api'. +# ## The language is 'python'. +# ## The source code is located in the project (azure.yaml) directory. +# ## The service will be hosted on Azure App Service. +# python-api: +# language: python +# project: ./ +# host: appservice +# ## An example for a NodeJS API, located in src/api. +# nodejs-api: +# language: js +# project: ./src/api +# host: appservice +# ## An example for a React front-end app. +# ## The src/react-app/build folder is where the app is built to after `npm run build`. +# react-web: +# language: js +# project: ./src/react-app +# host: appservice +# dist: build diff --git a/infra/abbreviations.json b/infra/abbreviations.json new file mode 100644 index 0000000..292beef --- /dev/null +++ b/infra/abbreviations.json @@ -0,0 +1,136 @@ +{ + "analysisServicesServers": "as", + "apiManagementService": "apim-", + "appConfigurationStores": "appcs-", + "appManagedEnvironments": "cae-", + "appContainerApps": "ca-", + "authorizationPolicyDefinitions": "policy-", + "automationAutomationAccounts": "aa-", + "blueprintBlueprints": "bp-", + "blueprintBlueprintsArtifacts": "bpa-", + "cacheRedis": "redis-", + "cdnProfiles": "cdnp-", + "cdnProfilesEndpoints": "cdne-", + "cognitiveServicesAccounts": "cog-", + "cognitiveServicesFormRecognizer": "cog-fr-", + "cognitiveServicesTextAnalytics": "cog-ta-", + "computeAvailabilitySets": "avail-", + "computeCloudServices": "cld-", + "computeDiskEncryptionSets": "des", + "computeDisks": "disk", + "computeDisksOs": "osdisk", + "computeGalleries": "gal", + "computeSnapshots": "snap-", + "computeVirtualMachines": "vm", + "computeVirtualMachineScaleSets": "vmss-", + "containerInstanceContainerGroups": "ci", + "containerRegistryRegistries": "cr", + "containerServiceManagedClusters": "aks-", + "databricksWorkspaces": "dbw-", + "dataFactoryFactories": "adf-", + "dataLakeAnalyticsAccounts": "dla", + "dataLakeStoreAccounts": "dls", + "dataMigrationServices": "dms-", + "dBforMySQLServers": "mysql-", + "dBforPostgreSQLServers": "psql-", + "devicesIotHubs": "iot-", + "devicesProvisioningServices": "provs-", + "devicesProvisioningServicesCertificates": "pcert-", + "documentDBDatabaseAccounts": "cosmos-", + "eventGridDomains": "evgd-", + "eventGridDomainsTopics": "evgt-", + "eventGridEventSubscriptions": "evgs-", + "eventHubNamespaces": "evhns-", + "eventHubNamespacesEventHubs": "evh-", + "hdInsightClustersHadoop": "hadoop-", + "hdInsightClustersHbase": "hbase-", + "hdInsightClustersKafka": "kafka-", + "hdInsightClustersMl": "mls-", + "hdInsightClustersSpark": "spark-", + "hdInsightClustersStorm": "storm-", + "hybridComputeMachines": "arcs-", + "insightsActionGroups": "ag-", + "insightsComponents": "appi-", + "keyVaultVaults": "kv-", + "kubernetesConnectedClusters": "arck", + "kustoClusters": "dec", + "kustoClustersDatabases": "dedb", + "loadTesting": "lt-", + "logicIntegrationAccounts": "ia-", + "logicWorkflows": "logic-", + "machineLearningServicesWorkspaces": "mlw-", + "managedIdentityUserAssignedIdentities": "id-", + "managementManagementGroups": "mg-", + "migrateAssessmentProjects": "migr-", + "networkApplicationGateways": "agw-", + "networkApplicationSecurityGroups": "asg-", + "networkAzureFirewalls": "afw-", + "networkBastionHosts": "bas-", + "networkConnections": "con-", + "networkDnsZones": "dnsz-", + "networkExpressRouteCircuits": "erc-", + "networkFirewallPolicies": "afwp-", + "networkFirewallPoliciesWebApplication": "waf", + "networkFirewallPoliciesRuleGroups": "wafrg", + "networkFrontDoors": "fd-", + "networkFrontdoorWebApplicationFirewallPolicies": "fdfp-", + "networkLoadBalancersExternal": "lbe-", + "networkLoadBalancersInternal": "lbi-", + "networkLoadBalancersInboundNatRules": "rule-", + "networkLocalNetworkGateways": "lgw-", + "networkNatGateways": "ng-", + "networkNetworkInterfaces": "nic-", + "networkNetworkSecurityGroups": "nsg-", + "networkNetworkSecurityGroupsSecurityRules": "nsgsr-", + "networkNetworkWatchers": "nw-", + "networkPrivateDnsZones": "pdnsz-", + "networkPrivateLinkServices": "pl-", + "networkPublicIPAddresses": "pip-", + "networkPublicIPPrefixes": "ippre-", + "networkRouteFilters": "rf-", + "networkRouteTables": "rt-", + "networkRouteTablesRoutes": "udr-", + "networkTrafficManagerProfiles": "traf-", + "networkVirtualNetworkGateways": "vgw-", + "networkVirtualNetworks": "vnet-", + "networkVirtualNetworksSubnets": "snet-", + "networkVirtualNetworksVirtualNetworkPeerings": "peer-", + "networkVirtualWans": "vwan-", + "networkVpnGateways": "vpng-", + "networkVpnGatewaysVpnConnections": "vcn-", + "networkVpnGatewaysVpnSites": "vst-", + "notificationHubsNamespaces": "ntfns-", + "notificationHubsNamespacesNotificationHubs": "ntf-", + "operationalInsightsWorkspaces": "log-", + "portalDashboards": "dash-", + "powerBIDedicatedCapacities": "pbi-", + "purviewAccounts": "pview-", + "recoveryServicesVaults": "rsv-", + "resourcesResourceGroups": "rg-", + "searchSearchServices": "srch-", + "serviceBusNamespaces": "sb-", + "serviceBusNamespacesQueues": "sbq-", + "serviceBusNamespacesTopics": "sbt-", + "serviceEndPointPolicies": "se-", + "serviceFabricClusters": "sf-", + "signalRServiceSignalR": "sigr", + "sqlManagedInstances": "sqlmi-", + "sqlServers": "sql-", + "sqlServersDataWarehouse": "sqldw-", + "sqlServersDatabases": "sqldb-", + "sqlServersDatabasesStretch": "sqlstrdb-", + "storageStorageAccounts": "st", + "storageStorageAccountsVm": "stvm", + "storSimpleManagers": "ssimp", + "streamAnalyticsCluster": "asa-", + "synapseWorkspaces": "syn", + "synapseWorkspacesAnalyticsWorkspaces": "synw", + "synapseWorkspacesSqlPoolsDedicated": "syndp", + "synapseWorkspacesSqlPoolsSpark": "synsp", + "timeSeriesInsightsEnvironments": "tsi-", + "webServerFarms": "plan-", + "webSitesAppService": "app-", + "webSitesAppServiceEnvironment": "ase-", + "webSitesFunctions": "func-", + "webStaticSites": "stapp-" +} \ No newline at end of file diff --git a/infra/core/config/configstore.bicep b/infra/core/config/configstore.bicep new file mode 100644 index 0000000..96818f1 --- /dev/null +++ b/infra/core/config/configstore.bicep @@ -0,0 +1,48 @@ +metadata description = 'Creates an Azure App Configuration store.' + +@description('The name for the Azure App Configuration store') +param name string + +@description('The Azure region/location for the Azure App Configuration store') +param location string = resourceGroup().location + +@description('Custom tags to apply to the Azure App Configuration store') +param tags object = {} + +@description('Specifies the names of the key-value resources. The name is a combination of key and label with $ as delimiter. The label is optional.') +param keyValueNames array = [] + +@description('Specifies the values of the key-value resources.') +param keyValueValues array = [] + +@description('The principal ID to grant access to the Azure App Configuration store') +param principalId string + +resource configStore 'Microsoft.AppConfiguration/configurationStores@2023-03-01' = { + name: name + location: location + sku: { + name: 'standard' + } + tags: tags +} + +resource configStoreKeyValue 'Microsoft.AppConfiguration/configurationStores/keyValues@2023-03-01' = [for (item, i) in keyValueNames: { + parent: configStore + name: item + properties: { + value: keyValueValues[i] + tags: tags + } +}] + +module configStoreAccess '../security/configstore-access.bicep' = { + name: 'app-configuration-access' + params: { + configStoreName: name + principalId: principalId + } + dependsOn: [configStore] +} + +output endpoint string = configStore.properties.endpoint diff --git a/infra/core/database/postgresql/flexibleserver.bicep b/infra/core/database/postgresql/flexibleserver.bicep new file mode 100644 index 0000000..7e26b1a --- /dev/null +++ b/infra/core/database/postgresql/flexibleserver.bicep @@ -0,0 +1,65 @@ +metadata description = 'Creates an Azure Database for PostgreSQL - Flexible Server.' +param name string +param location string = resourceGroup().location +param tags object = {} + +param sku object +param storage object +param administratorLogin string +@secure() +param administratorLoginPassword string +param databaseNames array = [] +param allowAzureIPsFirewall bool = false +param allowAllIPsFirewall bool = false +param allowedSingleIPs array = [] + +// PostgreSQL version +param version string + +// Latest official version 2022-12-01 does not have Bicep types available +resource postgresServer 'Microsoft.DBforPostgreSQL/flexibleServers@2022-12-01' = { + location: location + tags: tags + name: name + sku: sku + properties: { + version: version + administratorLogin: administratorLogin + administratorLoginPassword: administratorLoginPassword + storage: storage + highAvailability: { + mode: 'Disabled' + } + } + + resource database 'databases' = [for name in databaseNames: { + name: name + }] + + resource firewall_all 'firewallRules' = if (allowAllIPsFirewall) { + name: 'allow-all-IPs' + properties: { + startIpAddress: '0.0.0.0' + endIpAddress: '255.255.255.255' + } + } + + resource firewall_azure 'firewallRules' = if (allowAzureIPsFirewall) { + name: 'allow-all-azure-internal-IPs' + properties: { + startIpAddress: '0.0.0.0' + endIpAddress: '0.0.0.0' + } + } + + resource firewall_single 'firewallRules' = [for ip in allowedSingleIPs: { + name: 'allow-single-${replace(ip, '.', '')}' + properties: { + startIpAddress: ip + endIpAddress: ip + } + }] + +} + +output POSTGRES_DOMAIN_NAME string = postgresServer.properties.fullyQualifiedDomainName diff --git a/infra/core/host/container-app-upsert.bicep b/infra/core/host/container-app-upsert.bicep new file mode 100644 index 0000000..5e05f89 --- /dev/null +++ b/infra/core/host/container-app-upsert.bicep @@ -0,0 +1,110 @@ +metadata description = 'Creates or updates an existing Azure Container App.' +param name string +param location string = resourceGroup().location +param tags object = {} + +@description('The environment name for the container apps') +param containerAppsEnvironmentName string + +@description('The number of CPU cores allocated to a single container instance, e.g., 0.5') +param containerCpuCoreCount string = '0.5' + +@description('The maximum number of replicas to run. Must be at least 1.') +@minValue(1) +param containerMaxReplicas int = 10 + +@description('The amount of memory allocated to a single container instance, e.g., 1Gi') +param containerMemory string = '1.0Gi' + +@description('The minimum number of replicas to run. Must be at least 1.') +@minValue(1) +param containerMinReplicas int = 1 + +@description('The name of the container') +param containerName string = 'main' + +@description('The name of the container registry') +param containerRegistryName string = '' + +@description('Hostname suffix for container registry. Set when deploying to sovereign clouds') +param containerRegistryHostSuffix string = 'azurecr.io' + +@allowed([ 'http', 'grpc' ]) +@description('The protocol used by Dapr to connect to the app, e.g., HTTP or gRPC') +param daprAppProtocol string = 'http' + +@description('Enable or disable Dapr for the container app') +param daprEnabled bool = false + +@description('The Dapr app ID') +param daprAppId string = containerName + +@description('Specifies if the resource already exists') +param exists bool = false + +@description('Specifies if Ingress is enabled for the container app') +param ingressEnabled bool = true + +@description('The type of identity for the resource') +@allowed([ 'None', 'SystemAssigned', 'UserAssigned' ]) +param identityType string = 'None' + +@description('The name of the user-assigned identity') +param identityName string = '' + +@description('The name of the container image') +param imageName string = '' + +@description('The secrets required for the container') +@secure() +param secrets object = {} + +@description('The environment variables for the container') +param env array = [] + +@description('Specifies if the resource ingress is exposed externally') +param external bool = true + +@description('The service binds associated with the container') +param serviceBinds array = [] + +@description('The target port for the container') +param targetPort int = 80 + +resource existingApp 'Microsoft.App/containerApps@2023-05-02-preview' existing = if (exists) { + name: name +} + +module app 'container-app.bicep' = { + name: '${deployment().name}-update' + params: { + name: name + location: location + tags: tags + identityType: identityType + identityName: identityName + ingressEnabled: ingressEnabled + containerName: containerName + containerAppsEnvironmentName: containerAppsEnvironmentName + containerRegistryName: containerRegistryName + containerRegistryHostSuffix: containerRegistryHostSuffix + containerCpuCoreCount: containerCpuCoreCount + containerMemory: containerMemory + containerMinReplicas: containerMinReplicas + containerMaxReplicas: containerMaxReplicas + daprEnabled: daprEnabled + daprAppId: daprAppId + daprAppProtocol: daprAppProtocol + secrets: secrets + external: external + env: env + imageName: !empty(imageName) ? imageName : exists ? existingApp.properties.template.containers[0].image : '' + targetPort: targetPort + serviceBinds: serviceBinds + } +} + +output defaultDomain string = app.outputs.defaultDomain +output imageName string = app.outputs.imageName +output name string = app.outputs.name +output uri string = app.outputs.uri diff --git a/infra/core/host/container-app.bicep b/infra/core/host/container-app.bicep new file mode 100644 index 0000000..c64fc82 --- /dev/null +++ b/infra/core/host/container-app.bicep @@ -0,0 +1,169 @@ +metadata description = 'Creates a container app in an Azure Container App environment.' +param name string +param location string = resourceGroup().location +param tags object = {} + +@description('Allowed origins') +param allowedOrigins array = [] + +@description('Name of the environment for container apps') +param containerAppsEnvironmentName string + +@description('CPU cores allocated to a single container instance, e.g., 0.5') +param containerCpuCoreCount string = '0.5' + +@description('The maximum number of replicas to run. Must be at least 1.') +@minValue(1) +param containerMaxReplicas int = 10 + +@description('Memory allocated to a single container instance, e.g., 1Gi') +param containerMemory string = '1.0Gi' + +@description('The minimum number of replicas to run. Must be at least 1.') +param containerMinReplicas int = 1 + +@description('The name of the container') +param containerName string = 'main' + +@description('The name of the container registry') +param containerRegistryName string = '' + +@description('Hostname suffix for container registry. Set when deploying to sovereign clouds') +param containerRegistryHostSuffix string = 'azurecr.io' + +@description('The protocol used by Dapr to connect to the app, e.g., http or grpc') +@allowed([ 'http', 'grpc' ]) +param daprAppProtocol string = 'http' + +@description('The Dapr app ID') +param daprAppId string = containerName + +@description('Enable Dapr') +param daprEnabled bool = false + +@description('The environment variables for the container') +param env array = [] + +@description('Specifies if the resource ingress is exposed externally') +param external bool = true + +@description('The name of the user-assigned identity') +param identityName string = '' + +@description('The type of identity for the resource') +@allowed([ 'None', 'SystemAssigned', 'UserAssigned' ]) +param identityType string = 'None' + +@description('The name of the container image') +param imageName string = '' + +@description('Specifies if Ingress is enabled for the container app') +param ingressEnabled bool = true + +param revisionMode string = 'Single' + +@description('The secrets required for the container') +@secure() +param secrets object = {} + +@description('The service binds associated with the container') +param serviceBinds array = [] + +@description('The name of the container apps add-on to use. e.g. redis') +param serviceType string = '' + +@description('The target port for the container') +param targetPort int = 80 + +resource userIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' existing = if (!empty(identityName)) { + name: identityName +} + +// Private registry support requires both an ACR name and a User Assigned managed identity +var usePrivateRegistry = !empty(identityName) && !empty(containerRegistryName) + +// Automatically set to `UserAssigned` when an `identityName` has been set +var normalizedIdentityType = !empty(identityName) ? 'UserAssigned' : identityType + +module containerRegistryAccess '../security/registry-access.bicep' = if (usePrivateRegistry) { + name: '${deployment().name}-registry-access' + params: { + containerRegistryName: containerRegistryName + principalId: usePrivateRegistry ? userIdentity.properties.principalId : '' + } +} + +resource app 'Microsoft.App/containerApps@2023-05-02-preview' = { + name: name + location: location + tags: tags + // It is critical that the identity is granted ACR pull access before the app is created + // otherwise the container app will throw a provision error + // This also forces us to use an user assigned managed identity since there would no way to + // provide the system assigned identity with the ACR pull access before the app is created + dependsOn: usePrivateRegistry ? [ containerRegistryAccess ] : [] + identity: { + type: normalizedIdentityType + userAssignedIdentities: !empty(identityName) && normalizedIdentityType == 'UserAssigned' ? { '${userIdentity.id}': {} } : null + } + properties: { + managedEnvironmentId: containerAppsEnvironment.id + configuration: { + activeRevisionsMode: revisionMode + ingress: ingressEnabled ? { + external: external + targetPort: targetPort + transport: 'auto' + corsPolicy: { + allowedOrigins: union([ 'https://portal.azure.com', 'https://ms.portal.azure.com' ], allowedOrigins) + } + } : null + dapr: daprEnabled ? { + enabled: true + appId: daprAppId + appProtocol: daprAppProtocol + appPort: ingressEnabled ? targetPort : 0 + } : { enabled: false } + secrets: [for secret in items(secrets): { + name: secret.key + value: secret.value + }] + service: !empty(serviceType) ? { type: serviceType } : null + registries: usePrivateRegistry ? [ + { + server: '${containerRegistryName}.${containerRegistryHostSuffix}' + identity: userIdentity.id + } + ] : [] + } + template: { + serviceBinds: !empty(serviceBinds) ? serviceBinds : null + containers: [ + { + image: !empty(imageName) ? imageName : 'mcr.microsoft.com/azuredocs/containerapps-helloworld:latest' + name: containerName + env: env + resources: { + cpu: json(containerCpuCoreCount) + memory: containerMemory + } + } + ] + scale: { + minReplicas: containerMinReplicas + maxReplicas: containerMaxReplicas + } + } + } +} + +resource containerAppsEnvironment 'Microsoft.App/managedEnvironments@2023-05-01' existing = { + name: containerAppsEnvironmentName +} + +output defaultDomain string = containerAppsEnvironment.properties.defaultDomain +output identityPrincipalId string = normalizedIdentityType == 'None' ? '' : (empty(identityName) ? app.identity.principalId : userIdentity.properties.principalId) +output imageName string = imageName +output name string = app.name +output serviceBind object = !empty(serviceType) ? { serviceId: app.id, name: name } : {} +output uri string = ingressEnabled ? 'https://${app.properties.configuration.ingress.fqdn}' : '' diff --git a/infra/core/host/container-apps-environment.bicep b/infra/core/host/container-apps-environment.bicep new file mode 100644 index 0000000..20f4632 --- /dev/null +++ b/infra/core/host/container-apps-environment.bicep @@ -0,0 +1,41 @@ +metadata description = 'Creates an Azure Container Apps environment.' +param name string +param location string = resourceGroup().location +param tags object = {} + +@description('Name of the Application Insights resource') +param applicationInsightsName string = '' + +@description('Specifies if Dapr is enabled') +param daprEnabled bool = false + +@description('Name of the Log Analytics workspace') +param logAnalyticsWorkspaceName string + +resource containerAppsEnvironment 'Microsoft.App/managedEnvironments@2023-05-01' = { + name: name + location: location + tags: tags + properties: { + appLogsConfiguration: { + destination: 'log-analytics' + logAnalyticsConfiguration: { + customerId: logAnalyticsWorkspace.properties.customerId + sharedKey: logAnalyticsWorkspace.listKeys().primarySharedKey + } + } + daprAIInstrumentationKey: daprEnabled && !empty(applicationInsightsName) ? applicationInsights.properties.InstrumentationKey : '' + } +} + +resource logAnalyticsWorkspace 'Microsoft.OperationalInsights/workspaces@2022-10-01' existing = { + name: logAnalyticsWorkspaceName +} + +resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing = if (daprEnabled && !empty(applicationInsightsName)) { + name: applicationInsightsName +} + +output defaultDomain string = containerAppsEnvironment.properties.defaultDomain +output id string = containerAppsEnvironment.id +output name string = containerAppsEnvironment.name diff --git a/infra/core/host/container-apps.bicep b/infra/core/host/container-apps.bicep new file mode 100644 index 0000000..1c656e2 --- /dev/null +++ b/infra/core/host/container-apps.bicep @@ -0,0 +1,40 @@ +metadata description = 'Creates an Azure Container Registry and an Azure Container Apps environment.' +param name string +param location string = resourceGroup().location +param tags object = {} + +param containerAppsEnvironmentName string +param containerRegistryName string +param containerRegistryResourceGroupName string = '' +param containerRegistryAdminUserEnabled bool = false +param logAnalyticsWorkspaceName string +param applicationInsightsName string = '' + +module containerAppsEnvironment 'container-apps-environment.bicep' = { + name: '${name}-container-apps-environment' + params: { + name: containerAppsEnvironmentName + location: location + tags: tags + logAnalyticsWorkspaceName: logAnalyticsWorkspaceName + applicationInsightsName: applicationInsightsName + } +} + +module containerRegistry 'container-registry.bicep' = { + name: '${name}-container-registry' + scope: !empty(containerRegistryResourceGroupName) ? resourceGroup(containerRegistryResourceGroupName) : resourceGroup() + params: { + name: containerRegistryName + location: location + adminUserEnabled: containerRegistryAdminUserEnabled + tags: tags + } +} + +output defaultDomain string = containerAppsEnvironment.outputs.defaultDomain +output environmentName string = containerAppsEnvironment.outputs.name +output environmentId string = containerAppsEnvironment.outputs.id + +output registryLoginServer string = containerRegistry.outputs.loginServer +output registryName string = containerRegistry.outputs.name diff --git a/infra/core/host/container-registry.bicep b/infra/core/host/container-registry.bicep new file mode 100644 index 0000000..d14731c --- /dev/null +++ b/infra/core/host/container-registry.bicep @@ -0,0 +1,137 @@ +metadata description = 'Creates an Azure Container Registry.' +param name string +param location string = resourceGroup().location +param tags object = {} + +@description('Indicates whether admin user is enabled') +param adminUserEnabled bool = false + +@description('Indicates whether anonymous pull is enabled') +param anonymousPullEnabled bool = false + +@description('Azure ad authentication as arm policy settings') +param azureADAuthenticationAsArmPolicy object = { + status: 'enabled' +} + +@description('Indicates whether data endpoint is enabled') +param dataEndpointEnabled bool = false + +@description('Encryption settings') +param encryption object = { + status: 'disabled' +} + +@description('Export policy settings') +param exportPolicy object = { + status: 'enabled' +} + +@description('Metadata search settings') +param metadataSearch string = 'Disabled' + +@description('Options for bypassing network rules') +param networkRuleBypassOptions string = 'AzureServices' + +@description('Public network access setting') +param publicNetworkAccess string = 'Enabled' + +@description('Quarantine policy settings') +param quarantinePolicy object = { + status: 'disabled' +} + +@description('Retention policy settings') +param retentionPolicy object = { + days: 7 + status: 'disabled' +} + +@description('Scope maps setting') +param scopeMaps array = [] + +@description('SKU settings') +param sku object = { + name: 'Basic' +} + +@description('Soft delete policy settings') +param softDeletePolicy object = { + retentionDays: 7 + status: 'disabled' +} + +@description('Trust policy settings') +param trustPolicy object = { + type: 'Notary' + status: 'disabled' +} + +@description('Zone redundancy setting') +param zoneRedundancy string = 'Disabled' + +@description('The log analytics workspace ID used for logging and monitoring') +param workspaceId string = '' + +// 2023-11-01-preview needed for metadataSearch +resource containerRegistry 'Microsoft.ContainerRegistry/registries@2023-11-01-preview' = { + name: name + location: location + tags: tags + sku: sku + properties: { + adminUserEnabled: adminUserEnabled + anonymousPullEnabled: anonymousPullEnabled + dataEndpointEnabled: dataEndpointEnabled + encryption: encryption + metadataSearch: metadataSearch + networkRuleBypassOptions: networkRuleBypassOptions + policies:{ + quarantinePolicy: quarantinePolicy + trustPolicy: trustPolicy + retentionPolicy: retentionPolicy + exportPolicy: exportPolicy + azureADAuthenticationAsArmPolicy: azureADAuthenticationAsArmPolicy + softDeletePolicy: softDeletePolicy + } + publicNetworkAccess: publicNetworkAccess + zoneRedundancy: zoneRedundancy + } + + resource scopeMap 'scopeMaps' = [for scopeMap in scopeMaps: { + name: scopeMap.name + properties: scopeMap.properties + }] +} + +// TODO: Update diagnostics to be its own module +// Blocking issue: https://github.com/Azure/bicep/issues/622 +// Unable to pass in a `resource` scope or unable to use string interpolation in resource types +resource diagnostics 'Microsoft.Insights/diagnosticSettings@2021-05-01-preview' = if (!empty(workspaceId)) { + name: 'registry-diagnostics' + scope: containerRegistry + properties: { + workspaceId: workspaceId + logs: [ + { + category: 'ContainerRegistryRepositoryEvents' + enabled: true + } + { + category: 'ContainerRegistryLoginEvents' + enabled: true + } + ] + metrics: [ + { + category: 'AllMetrics' + enabled: true + timeGrain: 'PT1M' + } + ] + } +} + +output id string = containerRegistry.id +output loginServer string = containerRegistry.properties.loginServer +output name string = containerRegistry.name diff --git a/infra/core/monitor/applicationinsights-dashboard.bicep b/infra/core/monitor/applicationinsights-dashboard.bicep new file mode 100644 index 0000000..d082e66 --- /dev/null +++ b/infra/core/monitor/applicationinsights-dashboard.bicep @@ -0,0 +1,1236 @@ +metadata description = 'Creates a dashboard for an Application Insights instance.' +param name string +param applicationInsightsName string +param location string = resourceGroup().location +param tags object = {} + +// 2020-09-01-preview because that is the latest valid version +resource applicationInsightsDashboard 'Microsoft.Portal/dashboards@2020-09-01-preview' = { + name: name + location: location + tags: tags + properties: { + lenses: [ + { + order: 0 + parts: [ + { + position: { + x: 0 + y: 0 + colSpan: 2 + rowSpan: 1 + } + metadata: { + inputs: [ + { + name: 'id' + value: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + } + { + name: 'Version' + value: '1.0' + } + ] + #disable-next-line BCP036 + type: 'Extension/AppInsightsExtension/PartType/AspNetOverviewPinnedPart' + asset: { + idInputName: 'id' + type: 'ApplicationInsights' + } + defaultMenuItemId: 'overview' + } + } + { + position: { + x: 2 + y: 0 + colSpan: 1 + rowSpan: 1 + } + metadata: { + inputs: [ + { + name: 'ComponentId' + value: { + Name: applicationInsights.name + SubscriptionId: subscription().subscriptionId + ResourceGroup: resourceGroup().name + } + } + { + name: 'Version' + value: '1.0' + } + ] + #disable-next-line BCP036 + type: 'Extension/AppInsightsExtension/PartType/ProactiveDetectionAsyncPart' + asset: { + idInputName: 'ComponentId' + type: 'ApplicationInsights' + } + defaultMenuItemId: 'ProactiveDetection' + } + } + { + position: { + x: 3 + y: 0 + colSpan: 1 + rowSpan: 1 + } + metadata: { + inputs: [ + { + name: 'ComponentId' + value: { + Name: applicationInsights.name + SubscriptionId: subscription().subscriptionId + ResourceGroup: resourceGroup().name + } + } + { + name: 'ResourceId' + value: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + } + ] + #disable-next-line BCP036 + type: 'Extension/AppInsightsExtension/PartType/QuickPulseButtonSmallPart' + asset: { + idInputName: 'ComponentId' + type: 'ApplicationInsights' + } + } + } + { + position: { + x: 4 + y: 0 + colSpan: 1 + rowSpan: 1 + } + metadata: { + inputs: [ + { + name: 'ComponentId' + value: { + Name: applicationInsights.name + SubscriptionId: subscription().subscriptionId + ResourceGroup: resourceGroup().name + } + } + { + name: 'TimeContext' + value: { + durationMs: 86400000 + endTime: null + createdTime: '2018-05-04T01:20:33.345Z' + isInitialTime: true + grain: 1 + useDashboardTimeRange: false + } + } + { + name: 'Version' + value: '1.0' + } + ] + #disable-next-line BCP036 + type: 'Extension/AppInsightsExtension/PartType/AvailabilityNavButtonPart' + asset: { + idInputName: 'ComponentId' + type: 'ApplicationInsights' + } + } + } + { + position: { + x: 5 + y: 0 + colSpan: 1 + rowSpan: 1 + } + metadata: { + inputs: [ + { + name: 'ComponentId' + value: { + Name: applicationInsights.name + SubscriptionId: subscription().subscriptionId + ResourceGroup: resourceGroup().name + } + } + { + name: 'TimeContext' + value: { + durationMs: 86400000 + endTime: null + createdTime: '2018-05-08T18:47:35.237Z' + isInitialTime: true + grain: 1 + useDashboardTimeRange: false + } + } + { + name: 'ConfigurationId' + value: '78ce933e-e864-4b05-a27b-71fd55a6afad' + } + ] + #disable-next-line BCP036 + type: 'Extension/AppInsightsExtension/PartType/AppMapButtonPart' + asset: { + idInputName: 'ComponentId' + type: 'ApplicationInsights' + } + } + } + { + position: { + x: 0 + y: 1 + colSpan: 3 + rowSpan: 1 + } + metadata: { + inputs: [] + type: 'Extension/HubsExtension/PartType/MarkdownPart' + settings: { + content: { + settings: { + content: '# Usage' + title: '' + subtitle: '' + } + } + } + } + } + { + position: { + x: 3 + y: 1 + colSpan: 1 + rowSpan: 1 + } + metadata: { + inputs: [ + { + name: 'ComponentId' + value: { + Name: applicationInsights.name + SubscriptionId: subscription().subscriptionId + ResourceGroup: resourceGroup().name + } + } + { + name: 'TimeContext' + value: { + durationMs: 86400000 + endTime: null + createdTime: '2018-05-04T01:22:35.782Z' + isInitialTime: true + grain: 1 + useDashboardTimeRange: false + } + } + ] + #disable-next-line BCP036 + type: 'Extension/AppInsightsExtension/PartType/UsageUsersOverviewPart' + asset: { + idInputName: 'ComponentId' + type: 'ApplicationInsights' + } + } + } + { + position: { + x: 4 + y: 1 + colSpan: 3 + rowSpan: 1 + } + metadata: { + inputs: [] + type: 'Extension/HubsExtension/PartType/MarkdownPart' + settings: { + content: { + settings: { + content: '# Reliability' + title: '' + subtitle: '' + } + } + } + } + } + { + position: { + x: 7 + y: 1 + colSpan: 1 + rowSpan: 1 + } + metadata: { + inputs: [ + { + name: 'ResourceId' + value: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + } + { + name: 'DataModel' + value: { + version: '1.0.0' + timeContext: { + durationMs: 86400000 + createdTime: '2018-05-04T23:42:40.072Z' + isInitialTime: false + grain: 1 + useDashboardTimeRange: false + } + } + isOptional: true + } + { + name: 'ConfigurationId' + value: '8a02f7bf-ac0f-40e1-afe9-f0e72cfee77f' + isOptional: true + } + ] + #disable-next-line BCP036 + type: 'Extension/AppInsightsExtension/PartType/CuratedBladeFailuresPinnedPart' + isAdapter: true + asset: { + idInputName: 'ResourceId' + type: 'ApplicationInsights' + } + defaultMenuItemId: 'failures' + } + } + { + position: { + x: 8 + y: 1 + colSpan: 3 + rowSpan: 1 + } + metadata: { + inputs: [] + type: 'Extension/HubsExtension/PartType/MarkdownPart' + settings: { + content: { + settings: { + content: '# Responsiveness\r\n' + title: '' + subtitle: '' + } + } + } + } + } + { + position: { + x: 11 + y: 1 + colSpan: 1 + rowSpan: 1 + } + metadata: { + inputs: [ + { + name: 'ResourceId' + value: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + } + { + name: 'DataModel' + value: { + version: '1.0.0' + timeContext: { + durationMs: 86400000 + createdTime: '2018-05-04T23:43:37.804Z' + isInitialTime: false + grain: 1 + useDashboardTimeRange: false + } + } + isOptional: true + } + { + name: 'ConfigurationId' + value: '2a8ede4f-2bee-4b9c-aed9-2db0e8a01865' + isOptional: true + } + ] + #disable-next-line BCP036 + type: 'Extension/AppInsightsExtension/PartType/CuratedBladePerformancePinnedPart' + isAdapter: true + asset: { + idInputName: 'ResourceId' + type: 'ApplicationInsights' + } + defaultMenuItemId: 'performance' + } + } + { + position: { + x: 12 + y: 1 + colSpan: 3 + rowSpan: 1 + } + metadata: { + inputs: [] + type: 'Extension/HubsExtension/PartType/MarkdownPart' + settings: { + content: { + settings: { + content: '# Browser' + title: '' + subtitle: '' + } + } + } + } + } + { + position: { + x: 15 + y: 1 + colSpan: 1 + rowSpan: 1 + } + metadata: { + inputs: [ + { + name: 'ComponentId' + value: { + Name: applicationInsights.name + SubscriptionId: subscription().subscriptionId + ResourceGroup: resourceGroup().name + } + } + { + name: 'MetricsExplorerJsonDefinitionId' + value: 'BrowserPerformanceTimelineMetrics' + } + { + name: 'TimeContext' + value: { + durationMs: 86400000 + createdTime: '2018-05-08T12:16:27.534Z' + isInitialTime: false + grain: 1 + useDashboardTimeRange: false + } + } + { + name: 'CurrentFilter' + value: { + eventTypes: [ + 4 + 1 + 3 + 5 + 2 + 6 + 13 + ] + typeFacets: {} + isPermissive: false + } + } + { + name: 'id' + value: { + Name: applicationInsights.name + SubscriptionId: subscription().subscriptionId + ResourceGroup: resourceGroup().name + } + } + { + name: 'Version' + value: '1.0' + } + ] + #disable-next-line BCP036 + type: 'Extension/AppInsightsExtension/PartType/MetricsExplorerBladePinnedPart' + asset: { + idInputName: 'ComponentId' + type: 'ApplicationInsights' + } + defaultMenuItemId: 'browser' + } + } + { + position: { + x: 0 + y: 2 + colSpan: 4 + rowSpan: 3 + } + metadata: { + inputs: [ + { + name: 'options' + value: { + chart: { + metrics: [ + { + resourceMetadata: { + id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + } + name: 'sessions/count' + aggregationType: 5 + namespace: 'microsoft.insights/components/kusto' + metricVisualization: { + displayName: 'Sessions' + color: '#47BDF5' + } + } + { + resourceMetadata: { + id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + } + name: 'users/count' + aggregationType: 5 + namespace: 'microsoft.insights/components/kusto' + metricVisualization: { + displayName: 'Users' + color: '#7E58FF' + } + } + ] + title: 'Unique sessions and users' + visualization: { + chartType: 2 + legendVisualization: { + isVisible: true + position: 2 + hideSubtitle: false + } + axisVisualization: { + x: { + isVisible: true + axisType: 2 + } + y: { + isVisible: true + axisType: 1 + } + } + } + openBladeOnClick: { + openBlade: true + destinationBlade: { + extensionName: 'HubsExtension' + bladeName: 'ResourceMenuBlade' + parameters: { + id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + menuid: 'segmentationUsers' + } + } + } + } + } + } + { + name: 'sharedTimeRange' + isOptional: true + } + ] + #disable-next-line BCP036 + type: 'Extension/HubsExtension/PartType/MonitorChartPart' + settings: {} + } + } + { + position: { + x: 4 + y: 2 + colSpan: 4 + rowSpan: 3 + } + metadata: { + inputs: [ + { + name: 'options' + value: { + chart: { + metrics: [ + { + resourceMetadata: { + id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + } + name: 'requests/failed' + aggregationType: 7 + namespace: 'microsoft.insights/components' + metricVisualization: { + displayName: 'Failed requests' + color: '#EC008C' + } + } + ] + title: 'Failed requests' + visualization: { + chartType: 3 + legendVisualization: { + isVisible: true + position: 2 + hideSubtitle: false + } + axisVisualization: { + x: { + isVisible: true + axisType: 2 + } + y: { + isVisible: true + axisType: 1 + } + } + } + openBladeOnClick: { + openBlade: true + destinationBlade: { + extensionName: 'HubsExtension' + bladeName: 'ResourceMenuBlade' + parameters: { + id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + menuid: 'failures' + } + } + } + } + } + } + { + name: 'sharedTimeRange' + isOptional: true + } + ] + #disable-next-line BCP036 + type: 'Extension/HubsExtension/PartType/MonitorChartPart' + settings: {} + } + } + { + position: { + x: 8 + y: 2 + colSpan: 4 + rowSpan: 3 + } + metadata: { + inputs: [ + { + name: 'options' + value: { + chart: { + metrics: [ + { + resourceMetadata: { + id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + } + name: 'requests/duration' + aggregationType: 4 + namespace: 'microsoft.insights/components' + metricVisualization: { + displayName: 'Server response time' + color: '#00BCF2' + } + } + ] + title: 'Server response time' + visualization: { + chartType: 2 + legendVisualization: { + isVisible: true + position: 2 + hideSubtitle: false + } + axisVisualization: { + x: { + isVisible: true + axisType: 2 + } + y: { + isVisible: true + axisType: 1 + } + } + } + openBladeOnClick: { + openBlade: true + destinationBlade: { + extensionName: 'HubsExtension' + bladeName: 'ResourceMenuBlade' + parameters: { + id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + menuid: 'performance' + } + } + } + } + } + } + { + name: 'sharedTimeRange' + isOptional: true + } + ] + #disable-next-line BCP036 + type: 'Extension/HubsExtension/PartType/MonitorChartPart' + settings: {} + } + } + { + position: { + x: 12 + y: 2 + colSpan: 4 + rowSpan: 3 + } + metadata: { + inputs: [ + { + name: 'options' + value: { + chart: { + metrics: [ + { + resourceMetadata: { + id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + } + name: 'browserTimings/networkDuration' + aggregationType: 4 + namespace: 'microsoft.insights/components' + metricVisualization: { + displayName: 'Page load network connect time' + color: '#7E58FF' + } + } + { + resourceMetadata: { + id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + } + name: 'browserTimings/processingDuration' + aggregationType: 4 + namespace: 'microsoft.insights/components' + metricVisualization: { + displayName: 'Client processing time' + color: '#44F1C8' + } + } + { + resourceMetadata: { + id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + } + name: 'browserTimings/sendDuration' + aggregationType: 4 + namespace: 'microsoft.insights/components' + metricVisualization: { + displayName: 'Send request time' + color: '#EB9371' + } + } + { + resourceMetadata: { + id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + } + name: 'browserTimings/receiveDuration' + aggregationType: 4 + namespace: 'microsoft.insights/components' + metricVisualization: { + displayName: 'Receiving response time' + color: '#0672F1' + } + } + ] + title: 'Average page load time breakdown' + visualization: { + chartType: 3 + legendVisualization: { + isVisible: true + position: 2 + hideSubtitle: false + } + axisVisualization: { + x: { + isVisible: true + axisType: 2 + } + y: { + isVisible: true + axisType: 1 + } + } + } + } + } + } + { + name: 'sharedTimeRange' + isOptional: true + } + ] + #disable-next-line BCP036 + type: 'Extension/HubsExtension/PartType/MonitorChartPart' + settings: {} + } + } + { + position: { + x: 0 + y: 5 + colSpan: 4 + rowSpan: 3 + } + metadata: { + inputs: [ + { + name: 'options' + value: { + chart: { + metrics: [ + { + resourceMetadata: { + id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + } + name: 'availabilityResults/availabilityPercentage' + aggregationType: 4 + namespace: 'microsoft.insights/components' + metricVisualization: { + displayName: 'Availability' + color: '#47BDF5' + } + } + ] + title: 'Average availability' + visualization: { + chartType: 3 + legendVisualization: { + isVisible: true + position: 2 + hideSubtitle: false + } + axisVisualization: { + x: { + isVisible: true + axisType: 2 + } + y: { + isVisible: true + axisType: 1 + } + } + } + openBladeOnClick: { + openBlade: true + destinationBlade: { + extensionName: 'HubsExtension' + bladeName: 'ResourceMenuBlade' + parameters: { + id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + menuid: 'availability' + } + } + } + } + } + } + { + name: 'sharedTimeRange' + isOptional: true + } + ] + #disable-next-line BCP036 + type: 'Extension/HubsExtension/PartType/MonitorChartPart' + settings: {} + } + } + { + position: { + x: 4 + y: 5 + colSpan: 4 + rowSpan: 3 + } + metadata: { + inputs: [ + { + name: 'options' + value: { + chart: { + metrics: [ + { + resourceMetadata: { + id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + } + name: 'exceptions/server' + aggregationType: 7 + namespace: 'microsoft.insights/components' + metricVisualization: { + displayName: 'Server exceptions' + color: '#47BDF5' + } + } + { + resourceMetadata: { + id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + } + name: 'dependencies/failed' + aggregationType: 7 + namespace: 'microsoft.insights/components' + metricVisualization: { + displayName: 'Dependency failures' + color: '#7E58FF' + } + } + ] + title: 'Server exceptions and Dependency failures' + visualization: { + chartType: 2 + legendVisualization: { + isVisible: true + position: 2 + hideSubtitle: false + } + axisVisualization: { + x: { + isVisible: true + axisType: 2 + } + y: { + isVisible: true + axisType: 1 + } + } + } + } + } + } + { + name: 'sharedTimeRange' + isOptional: true + } + ] + #disable-next-line BCP036 + type: 'Extension/HubsExtension/PartType/MonitorChartPart' + settings: {} + } + } + { + position: { + x: 8 + y: 5 + colSpan: 4 + rowSpan: 3 + } + metadata: { + inputs: [ + { + name: 'options' + value: { + chart: { + metrics: [ + { + resourceMetadata: { + id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + } + name: 'performanceCounters/processorCpuPercentage' + aggregationType: 4 + namespace: 'microsoft.insights/components' + metricVisualization: { + displayName: 'Processor time' + color: '#47BDF5' + } + } + { + resourceMetadata: { + id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + } + name: 'performanceCounters/processCpuPercentage' + aggregationType: 4 + namespace: 'microsoft.insights/components' + metricVisualization: { + displayName: 'Process CPU' + color: '#7E58FF' + } + } + ] + title: 'Average processor and process CPU utilization' + visualization: { + chartType: 2 + legendVisualization: { + isVisible: true + position: 2 + hideSubtitle: false + } + axisVisualization: { + x: { + isVisible: true + axisType: 2 + } + y: { + isVisible: true + axisType: 1 + } + } + } + } + } + } + { + name: 'sharedTimeRange' + isOptional: true + } + ] + #disable-next-line BCP036 + type: 'Extension/HubsExtension/PartType/MonitorChartPart' + settings: {} + } + } + { + position: { + x: 12 + y: 5 + colSpan: 4 + rowSpan: 3 + } + metadata: { + inputs: [ + { + name: 'options' + value: { + chart: { + metrics: [ + { + resourceMetadata: { + id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + } + name: 'exceptions/browser' + aggregationType: 7 + namespace: 'microsoft.insights/components' + metricVisualization: { + displayName: 'Browser exceptions' + color: '#47BDF5' + } + } + ] + title: 'Browser exceptions' + visualization: { + chartType: 2 + legendVisualization: { + isVisible: true + position: 2 + hideSubtitle: false + } + axisVisualization: { + x: { + isVisible: true + axisType: 2 + } + y: { + isVisible: true + axisType: 1 + } + } + } + } + } + } + { + name: 'sharedTimeRange' + isOptional: true + } + ] + #disable-next-line BCP036 + type: 'Extension/HubsExtension/PartType/MonitorChartPart' + settings: {} + } + } + { + position: { + x: 0 + y: 8 + colSpan: 4 + rowSpan: 3 + } + metadata: { + inputs: [ + { + name: 'options' + value: { + chart: { + metrics: [ + { + resourceMetadata: { + id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + } + name: 'availabilityResults/count' + aggregationType: 7 + namespace: 'microsoft.insights/components' + metricVisualization: { + displayName: 'Availability test results count' + color: '#47BDF5' + } + } + ] + title: 'Availability test results count' + visualization: { + chartType: 2 + legendVisualization: { + isVisible: true + position: 2 + hideSubtitle: false + } + axisVisualization: { + x: { + isVisible: true + axisType: 2 + } + y: { + isVisible: true + axisType: 1 + } + } + } + } + } + } + { + name: 'sharedTimeRange' + isOptional: true + } + ] + #disable-next-line BCP036 + type: 'Extension/HubsExtension/PartType/MonitorChartPart' + settings: {} + } + } + { + position: { + x: 4 + y: 8 + colSpan: 4 + rowSpan: 3 + } + metadata: { + inputs: [ + { + name: 'options' + value: { + chart: { + metrics: [ + { + resourceMetadata: { + id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + } + name: 'performanceCounters/processIOBytesPerSecond' + aggregationType: 4 + namespace: 'microsoft.insights/components' + metricVisualization: { + displayName: 'Process IO rate' + color: '#47BDF5' + } + } + ] + title: 'Average process I/O rate' + visualization: { + chartType: 2 + legendVisualization: { + isVisible: true + position: 2 + hideSubtitle: false + } + axisVisualization: { + x: { + isVisible: true + axisType: 2 + } + y: { + isVisible: true + axisType: 1 + } + } + } + } + } + } + { + name: 'sharedTimeRange' + isOptional: true + } + ] + #disable-next-line BCP036 + type: 'Extension/HubsExtension/PartType/MonitorChartPart' + settings: {} + } + } + { + position: { + x: 8 + y: 8 + colSpan: 4 + rowSpan: 3 + } + metadata: { + inputs: [ + { + name: 'options' + value: { + chart: { + metrics: [ + { + resourceMetadata: { + id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsights.name}' + } + name: 'performanceCounters/memoryAvailableBytes' + aggregationType: 4 + namespace: 'microsoft.insights/components' + metricVisualization: { + displayName: 'Available memory' + color: '#47BDF5' + } + } + ] + title: 'Average available memory' + visualization: { + chartType: 2 + legendVisualization: { + isVisible: true + position: 2 + hideSubtitle: false + } + axisVisualization: { + x: { + isVisible: true + axisType: 2 + } + y: { + isVisible: true + axisType: 1 + } + } + } + } + } + } + { + name: 'sharedTimeRange' + isOptional: true + } + ] + #disable-next-line BCP036 + type: 'Extension/HubsExtension/PartType/MonitorChartPart' + settings: {} + } + } + ] + } + ] + } +} + +resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing = { + name: applicationInsightsName +} diff --git a/infra/core/monitor/applicationinsights.bicep b/infra/core/monitor/applicationinsights.bicep new file mode 100644 index 0000000..850e9fe --- /dev/null +++ b/infra/core/monitor/applicationinsights.bicep @@ -0,0 +1,31 @@ +metadata description = 'Creates an Application Insights instance based on an existing Log Analytics workspace.' +param name string +param dashboardName string = '' +param location string = resourceGroup().location +param tags object = {} +param logAnalyticsWorkspaceId string + +resource applicationInsights 'Microsoft.Insights/components@2020-02-02' = { + name: name + location: location + tags: tags + kind: 'web' + properties: { + Application_Type: 'web' + WorkspaceResourceId: logAnalyticsWorkspaceId + } +} + +module applicationInsightsDashboard 'applicationinsights-dashboard.bicep' = if (!empty(dashboardName)) { + name: 'application-insights-dashboard' + params: { + name: dashboardName + location: location + applicationInsightsName: applicationInsights.name + } +} + +output connectionString string = applicationInsights.properties.ConnectionString +output id string = applicationInsights.id +output instrumentationKey string = applicationInsights.properties.InstrumentationKey +output name string = applicationInsights.name diff --git a/infra/core/monitor/loganalytics.bicep b/infra/core/monitor/loganalytics.bicep new file mode 100644 index 0000000..33f9dc2 --- /dev/null +++ b/infra/core/monitor/loganalytics.bicep @@ -0,0 +1,22 @@ +metadata description = 'Creates a Log Analytics workspace.' +param name string +param location string = resourceGroup().location +param tags object = {} + +resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2021-12-01-preview' = { + name: name + location: location + tags: tags + properties: any({ + retentionInDays: 30 + features: { + searchVersion: 1 + } + sku: { + name: 'PerGB2018' + } + }) +} + +output id string = logAnalytics.id +output name string = logAnalytics.name diff --git a/infra/core/monitor/monitoring.bicep b/infra/core/monitor/monitoring.bicep new file mode 100644 index 0000000..7476125 --- /dev/null +++ b/infra/core/monitor/monitoring.bicep @@ -0,0 +1,33 @@ +metadata description = 'Creates an Application Insights instance and a Log Analytics workspace.' +param logAnalyticsName string +param applicationInsightsName string +param applicationInsightsDashboardName string = '' +param location string = resourceGroup().location +param tags object = {} + +module logAnalytics 'loganalytics.bicep' = { + name: 'loganalytics' + params: { + name: logAnalyticsName + location: location + tags: tags + } +} + +module applicationInsights 'applicationinsights.bicep' = { + name: 'applicationinsights' + params: { + name: applicationInsightsName + location: location + tags: tags + dashboardName: applicationInsightsDashboardName + logAnalyticsWorkspaceId: logAnalytics.outputs.id + } +} + +output applicationInsightsConnectionString string = applicationInsights.outputs.connectionString +output applicationInsightsId string = applicationInsights.outputs.id +output applicationInsightsInstrumentationKey string = applicationInsights.outputs.instrumentationKey +output applicationInsightsName string = applicationInsights.outputs.name +output logAnalyticsWorkspaceId string = logAnalytics.outputs.id +output logAnalyticsWorkspaceName string = logAnalytics.outputs.name diff --git a/infra/core/security/aks-managed-cluster-access.bicep b/infra/core/security/aks-managed-cluster-access.bicep new file mode 100644 index 0000000..aedb080 --- /dev/null +++ b/infra/core/security/aks-managed-cluster-access.bicep @@ -0,0 +1,27 @@ +metadata description = 'Assigns RBAC role to the specified AKS cluster and principal.' + +@description('The AKS cluster name used as the target of the role assignments.') +param clusterName string + +@description('The principal ID to assign the role to.') +param principalId string + +@description('The principal type to assign the role to.') +@allowed(['Device','ForeignGroup','Group','ServicePrincipal','User']) +param principalType string = 'User' + +var aksClusterAdminRole = subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'b1ff04bb-8a4e-4dc4-8eb5-8693973ce19b') + +resource aksRole 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + scope: aksCluster // Use when specifying a scope that is different than the deployment scope + name: guid(subscription().id, resourceGroup().id, principalId, aksClusterAdminRole) + properties: { + roleDefinitionId: aksClusterAdminRole + principalType: principalType + principalId: principalId + } +} + +resource aksCluster 'Microsoft.ContainerService/managedClusters@2023-10-02-preview' existing = { + name: clusterName +} diff --git a/infra/core/security/configstore-access.bicep b/infra/core/security/configstore-access.bicep new file mode 100644 index 0000000..de72b94 --- /dev/null +++ b/infra/core/security/configstore-access.bicep @@ -0,0 +1,21 @@ +@description('Name of Azure App Configuration store') +param configStoreName string + +@description('The principal ID of the service principal to assign the role to') +param principalId string + +resource configStore 'Microsoft.AppConfiguration/configurationStores@2023-03-01' existing = { + name: configStoreName +} + +var configStoreDataReaderRole = subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '516239f1-63e1-4d78-a4de-a74fb236a071') + +resource configStoreDataReaderRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid(subscription().id, resourceGroup().id, principalId, configStoreDataReaderRole) + scope: configStore + properties: { + roleDefinitionId: configStoreDataReaderRole + principalId: principalId + principalType: 'ServicePrincipal' + } +} diff --git a/infra/core/security/keyvault-access.bicep b/infra/core/security/keyvault-access.bicep new file mode 100644 index 0000000..316775f --- /dev/null +++ b/infra/core/security/keyvault-access.bicep @@ -0,0 +1,22 @@ +metadata description = 'Assigns an Azure Key Vault access policy.' +param name string = 'add' + +param keyVaultName string +param permissions object = { secrets: [ 'get', 'list' ] } +param principalId string + +resource keyVaultAccessPolicies 'Microsoft.KeyVault/vaults/accessPolicies@2022-07-01' = { + parent: keyVault + name: name + properties: { + accessPolicies: [ { + objectId: principalId + tenantId: subscription().tenantId + permissions: permissions + } ] + } +} + +resource keyVault 'Microsoft.KeyVault/vaults@2022-07-01' existing = { + name: keyVaultName +} diff --git a/infra/core/security/keyvault-secret.bicep b/infra/core/security/keyvault-secret.bicep new file mode 100644 index 0000000..7441b29 --- /dev/null +++ b/infra/core/security/keyvault-secret.bicep @@ -0,0 +1,31 @@ +metadata description = 'Creates or updates a secret in an Azure Key Vault.' +param name string +param tags object = {} +param keyVaultName string +param contentType string = 'string' +@description('The value of the secret. Provide only derived values like blob storage access, but do not hard code any secrets in your templates') +@secure() +param secretValue string + +param enabled bool = true +param exp int = 0 +param nbf int = 0 + +resource keyVaultSecret 'Microsoft.KeyVault/vaults/secrets@2022-07-01' = { + name: name + tags: tags + parent: keyVault + properties: { + attributes: { + enabled: enabled + exp: exp + nbf: nbf + } + contentType: contentType + value: secretValue + } +} + +resource keyVault 'Microsoft.KeyVault/vaults@2022-07-01' existing = { + name: keyVaultName +} diff --git a/infra/core/security/keyvault.bicep b/infra/core/security/keyvault.bicep new file mode 100644 index 0000000..663ec00 --- /dev/null +++ b/infra/core/security/keyvault.bicep @@ -0,0 +1,27 @@ +metadata description = 'Creates an Azure Key Vault.' +param name string +param location string = resourceGroup().location +param tags object = {} + +param principalId string = '' + +resource keyVault 'Microsoft.KeyVault/vaults@2022-07-01' = { + name: name + location: location + tags: tags + properties: { + tenantId: subscription().tenantId + sku: { family: 'A', name: 'standard' } + accessPolicies: !empty(principalId) ? [ + { + objectId: principalId + permissions: { secrets: [ 'get', 'list' ] } + tenantId: subscription().tenantId + } + ] : [] + } +} + +output endpoint string = keyVault.properties.vaultUri +output id string = keyVault.id +output name string = keyVault.name diff --git a/infra/core/security/registry-access.bicep b/infra/core/security/registry-access.bicep new file mode 100644 index 0000000..fc66837 --- /dev/null +++ b/infra/core/security/registry-access.bicep @@ -0,0 +1,19 @@ +metadata description = 'Assigns ACR Pull permissions to access an Azure Container Registry.' +param containerRegistryName string +param principalId string + +var acrPullRole = subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '7f951dda-4ed3-4680-a7ca-43fe172d538d') + +resource aksAcrPull 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + scope: containerRegistry // Use when specifying a scope that is different than the deployment scope + name: guid(subscription().id, resourceGroup().id, principalId, acrPullRole) + properties: { + roleDefinitionId: acrPullRole + principalType: 'ServicePrincipal' + principalId: principalId + } +} + +resource containerRegistry 'Microsoft.ContainerRegistry/registries@2023-01-01-preview' existing = { + name: containerRegistryName +} diff --git a/infra/core/security/role.bicep b/infra/core/security/role.bicep new file mode 100644 index 0000000..0b30cfd --- /dev/null +++ b/infra/core/security/role.bicep @@ -0,0 +1,21 @@ +metadata description = 'Creates a role assignment for a service principal.' +param principalId string + +@allowed([ + 'Device' + 'ForeignGroup' + 'Group' + 'ServicePrincipal' + 'User' +]) +param principalType string = 'ServicePrincipal' +param roleDefinitionId string + +resource role 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid(subscription().id, resourceGroup().id, principalId, roleDefinitionId) + properties: { + principalId: principalId + principalType: principalType + roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionId) + } +} diff --git a/infra/core/storage/storage-account.bicep b/infra/core/storage/storage-account.bicep new file mode 100644 index 0000000..6149fb2 --- /dev/null +++ b/infra/core/storage/storage-account.bicep @@ -0,0 +1,101 @@ +metadata description = 'Creates an Azure storage account.' +param name string +param location string = resourceGroup().location +param tags object = {} + +@allowed([ + 'Cool' + 'Hot' + 'Premium' ]) +param accessTier string = 'Hot' +param allowBlobPublicAccess bool = true +param allowCrossTenantReplication bool = true +param allowSharedKeyAccess bool = true +param containers array = [] +param corsRules array = [] +param defaultToOAuthAuthentication bool = false +param deleteRetentionPolicy object = {} +@allowed([ 'AzureDnsZone', 'Standard' ]) +param dnsEndpointType string = 'Standard' +param files array = [] +param kind string = 'StorageV2' +param minimumTlsVersion string = 'TLS1_2' +param queues array = [] +param shareDeleteRetentionPolicy object = {} +param supportsHttpsTrafficOnly bool = true +param tables array = [] +param networkAcls object = { + bypass: 'AzureServices' + defaultAction: 'Allow' +} +@allowed([ 'Enabled', 'Disabled' ]) +param publicNetworkAccess string = 'Enabled' +param sku object = { name: 'Standard_LRS' } + +resource storage 'Microsoft.Storage/storageAccounts@2023-01-01' = { + name: name + location: location + tags: tags + kind: kind + sku: sku + properties: { + accessTier: accessTier + allowBlobPublicAccess: allowBlobPublicAccess + allowCrossTenantReplication: allowCrossTenantReplication + allowSharedKeyAccess: allowSharedKeyAccess + defaultToOAuthAuthentication: defaultToOAuthAuthentication + dnsEndpointType: dnsEndpointType + minimumTlsVersion: minimumTlsVersion + networkAcls: networkAcls + publicNetworkAccess: publicNetworkAccess + supportsHttpsTrafficOnly: supportsHttpsTrafficOnly + } + + resource blobServices 'blobServices' = if (!empty(containers)) { + name: 'default' + properties: { + cors: { + corsRules: corsRules + } + deleteRetentionPolicy: deleteRetentionPolicy + } + resource container 'containers' = [for container in containers: { + name: container.name + properties: { + publicAccess: contains(container, 'publicAccess') ? container.publicAccess : 'None' + } + }] + } + + resource fileServices 'fileServices' = if (!empty(files)) { + name: 'default' + properties: { + cors: { + corsRules: corsRules + } + shareDeleteRetentionPolicy: shareDeleteRetentionPolicy + } + } + + resource queueServices 'queueServices' = if (!empty(queues)) { + name: 'default' + properties: { + + } + resource queue 'queues' = [for queue in queues: { + name: queue.name + properties: { + metadata: {} + } + }] + } + + resource tableServices 'tableServices' = if (!empty(tables)) { + name: 'default' + properties: {} + } +} + +output id string = storage.id +output name string = storage.name +output primaryEndpoints object = storage.properties.primaryEndpoints diff --git a/infra/core/testing/loadtesting.bicep b/infra/core/testing/loadtesting.bicep new file mode 100644 index 0000000..4678108 --- /dev/null +++ b/infra/core/testing/loadtesting.bicep @@ -0,0 +1,15 @@ +param name string +param location string = resourceGroup().location +param managedIdentity bool = false +param tags object = {} + +resource loadTest 'Microsoft.LoadTestService/loadTests@2022-12-01' = { + name: name + location: location + tags: tags + identity: { type: managedIdentity ? 'SystemAssigned' : 'None' } + properties: { + } +} + +output loadTestingName string = loadTest.name diff --git a/infra/main.bicep b/infra/main.bicep new file mode 100644 index 0000000..cc8db90 --- /dev/null +++ b/infra/main.bicep @@ -0,0 +1,66 @@ +targetScope = 'subscription' + +// The main bicep module to provision Azure resources. +// For a more complete walkthrough to understand how this file works with azd, +// see https://learn.microsoft.com/en-us/azure/developer/azure-developer-cli/make-azd-compatible?pivots=azd-create + +@minLength(1) +@maxLength(64) +@description('Name of the the environment which is used to generate a short unique hash used in all resources.') +param environmentName string + +@minLength(1) +@description('Primary location for all resources') +param location string + +// Optional parameters to override the default azd resource naming conventions. +// Add the following to main.parameters.json to provide values: +// "resourceGroupName": { +// "value": "myGroupName" +// } +param resourceGroupName string = '' + +var abbrs = loadJsonContent('./abbreviations.json') + +// tags that should be applied to all resources. +var tags = { + // Tag all resources with the environment name. + 'azd-env-name': environmentName +} + +// Generate a unique token to be used in naming resources. +// Remove linter suppression after using. +#disable-next-line no-unused-vars +var resourceToken = toLower(uniqueString(subscription().id, environmentName, location)) + +// Name of the service defined in azure.yaml +// A tag named azd-service-name with this value should be applied to the service host resource, such as: +// Microsoft.Web/sites for appservice, function +// Example usage: +// tags: union(tags, { 'azd-service-name': apiServiceName }) +#disable-next-line no-unused-vars +var apiServiceName = 'python-api' + +// Organize resources in a resource group +resource rg 'Microsoft.Resources/resourceGroups@2021-04-01' = { + name: !empty(resourceGroupName) ? resourceGroupName : '${abbrs.resourcesResourceGroups}${environmentName}' + location: location + tags: tags +} + +// Add resources to be provisioned below. +// A full example that leverages azd bicep modules can be seen in the todo-python-mongo template: +// https://github.com/Azure-Samples/todo-python-mongo/tree/main/infra + + + +// Add outputs from the deployment here, if needed. +// +// This allows the outputs to be referenced by other bicep deployments in the deployment pipeline, +// or by the local machine as a way to reference created resources in Azure for local development. +// Secrets should not be added here. +// +// Outputs are automatically saved in the local azd environment .env file. +// To see these outputs, run `azd env get-values`, or `azd env get-values --output json` for json output. +output AZURE_LOCATION string = location +output AZURE_TENANT_ID string = tenant().tenantId diff --git a/infra/main.parameters.json b/infra/main.parameters.json new file mode 100644 index 0000000..f1600cf --- /dev/null +++ b/infra/main.parameters.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "environmentName": { + "value": "${AZURE_ENV_NAME}" + }, + "location": { + "value": "${AZURE_LOCATION}" + } + } +} From 0498c0d2daffa81f5a56d413baedd9e7f792d266 Mon Sep 17 00:00:00 2001 From: Dominique Broeglin Date: Sun, 9 Jun 2024 20:03:52 +0000 Subject: [PATCH 02/15] Added container apps env, pg, observability and key vault --- infra/app/quarkus.bicep | 75 ++++++ .../database/postgresql/flexibleserver.bicep | 63 +++-- infra/main.bicep | 238 ++++++++++++++++-- infra/main.parameters.json | 12 + 4 files changed, 352 insertions(+), 36 deletions(-) create mode 100644 infra/app/quarkus.bicep diff --git a/infra/app/quarkus.bicep b/infra/app/quarkus.bicep new file mode 100644 index 0000000..397ed80 --- /dev/null +++ b/infra/app/quarkus.bicep @@ -0,0 +1,75 @@ +targetScope = 'resourceGroup' + +/* -------------------------------------------------------------------------- */ +/* PARAMETERS */ +/* -------------------------------------------------------------------------- */ + +@description('Name of the container app.') +param name string + +@description('Location in which the resources will be deployed. Default value is the resource group location.') +param location string = resourceGroup().location + +@description('Tags that will be added to all the resources. For Azure Developer CLI, "azd-env-name" should be added to the tags.') +param tags object = {} + +@description('Name of the service. This name is used to add "azd-service-name" tag to the tags for the container app. Default value is "quarkus". If you change this value, make sure to change the name of the service in "azure.yaml" file as well.') +param serviceName string = 'quarkus' + +@description('Name of the identity that will be created and used by the container app to pull image from the container registry.') +param identityName string + +@description('Name of the existing Application Insights instance that will be used by the container app.') +param applicationInsightsName string + +@description('Name of the existing container apps environment.') +param containerAppsEnvironmentName string + +@description('Name of the existing container registry that will be used by the container app.') +param containerRegistryName string + +@description('Flag that indicates whether the container app already exists or not. This is used in container app upsert to set the image name to the value of the existing container apps image name.') +param exists bool + +resource quarkusIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = { + name: identityName + location: location +} + +resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing = { + name: applicationInsightsName +} + +module quarkus '../core/host/container-app-upsert.bicep' = { + name: '${serviceName}-container-app' + params: { + name: name + location: location + tags: union(tags, { 'azd-service-name': serviceName }) + identityType: 'UserAssigned' + identityName: identityName + exists: exists + containerAppsEnvironmentName: containerAppsEnvironmentName + containerRegistryName: containerRegistryName + env: [ + { + // TODO + name: 'APPLICATIONINSIGHTS_CONNECTION_STRING' + value: applicationInsights.properties.ConnectionString + } + ] + targetPort: 80 + } +} + +@description('ID of the service principal that is used by the container app to pull image from the container registry.') +output SERVICE_QUARKUS_IDENTITY_PRINCIPAL_ID string = quarkusIdentity.properties.principalId + +@description('Name of the container app.') +output SERVICE_QUARKUS_NAME string = quarkus.outputs.name + +@description('URI of the container app.') +output SERVICE_QUARKUS_URI string = quarkus.outputs.uri + +@description('Name of the container apps image.') +output SERVICE_QUARKUS_IMAGE_NAME string = quarkus.outputs.imageName diff --git a/infra/core/database/postgresql/flexibleserver.bicep b/infra/core/database/postgresql/flexibleserver.bicep index 7e26b1a..dc9ba97 100644 --- a/infra/core/database/postgresql/flexibleserver.bicep +++ b/infra/core/database/postgresql/flexibleserver.bicep @@ -1,3 +1,4 @@ + metadata description = 'Creates an Azure Database for PostgreSQL - Flexible Server.' param name string param location string = resourceGroup().location @@ -12,12 +13,12 @@ param databaseNames array = [] param allowAzureIPsFirewall bool = false param allowAllIPsFirewall bool = false param allowedSingleIPs array = [] +param azureExtensions array = [] // PostgreSQL version param version string -// Latest official version 2022-12-01 does not have Bicep types available -resource postgresServer 'Microsoft.DBforPostgreSQL/flexibleServers@2022-12-01' = { +resource postgresServer 'Microsoft.DBforPostgreSQL/flexibleServers@2023-03-01-preview' = { location: location tags: tags name: name @@ -30,36 +31,54 @@ resource postgresServer 'Microsoft.DBforPostgreSQL/flexibleServers@2022-12-01' = highAvailability: { mode: 'Disabled' } + } resource database 'databases' = [for name in databaseNames: { name: name }] +} - resource firewall_all 'firewallRules' = if (allowAllIPsFirewall) { - name: 'allow-all-IPs' - properties: { - startIpAddress: '0.0.0.0' - endIpAddress: '255.255.255.255' - } +resource firewall_all 'Microsoft.DBforPostgreSQL/flexibleServers/firewallRules@2023-03-01-preview' = if (allowAllIPsFirewall) { + name: 'allow-all-IPs' + parent: postgresServer + properties: { + startIpAddress: '0.0.0.0' + endIpAddress: '255.255.255.255' } +} - resource firewall_azure 'firewallRules' = if (allowAzureIPsFirewall) { - name: 'allow-all-azure-internal-IPs' - properties: { - startIpAddress: '0.0.0.0' - endIpAddress: '0.0.0.0' - } +resource firewall_azure 'Microsoft.DBforPostgreSQL/flexibleServers/firewallRules@2023-03-01-preview' = if (allowAzureIPsFirewall) { + name: 'allow-all-azure-internal-IPs' + parent: postgresServer + properties: { + startIpAddress: '0.0.0.0' + endIpAddress: '0.0.0.0' + } +} + +resource firewall_single 'Microsoft.DBforPostgreSQL/flexibleServers/firewallRules@2023-03-01-preview' = [for ip in allowedSingleIPs: { + name: 'allow-single-${replace(ip, '.', '')}' + parent: postgresServer + properties: { + startIpAddress: ip + endIpAddress: ip } +}] - resource firewall_single 'firewallRules' = [for ip in allowedSingleIPs: { - name: 'allow-single-${replace(ip, '.', '')}' - properties: { - startIpAddress: ip - endIpAddress: ip - } - }] +// Workaround issue https://github.com/Azure/bicep-types-az/issues/1507 + +resource configurations 'Microsoft.DBforPostgreSQL/flexibleServers/configurations@2023-03-01-preview' = if (length(azureExtensions) > 0) { + name: 'azure.extensions' + parent: postgresServer + properties: { + value: join(azureExtensions, ',') + source: 'user-override' + } + dependsOn: [ + firewall_all, firewall_all, firewall_single + ] +} -} output POSTGRES_DOMAIN_NAME string = postgresServer.properties.fullyQualifiedDomainName diff --git a/infra/main.bicep b/infra/main.bicep index cc8db90..733f6ab 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -1,8 +1,10 @@ targetScope = 'subscription' -// The main bicep module to provision Azure resources. -// For a more complete walkthrough to understand how this file works with azd, -// see https://learn.microsoft.com/en-us/azure/developer/azure-developer-cli/make-azd-compatible?pivots=azd-create +// See also https://learn.microsoft.com/en-us/azure/developer/azure-developer-cli/make-azd-compatible?pivots=azd-create + +/******************************************************************************/ +/* PARAMETERS */ +/******************************************************************************/ @minLength(1) @maxLength(64) @@ -13,14 +15,80 @@ param environmentName string @description('Primary location for all resources') param location string +/******************************* Resource Names *******************************/ + // Optional parameters to override the default azd resource naming conventions. -// Add the following to main.parameters.json to provide values: -// "resourceGroupName": { -// "value": "myGroupName" -// } +// Add to main.parameters.json to provide values. + +@maxLength(90) +@description('Name of the resource group to deploy. If not specified, a name will be generated.') param resourceGroupName string = '' -var abbrs = loadJsonContent('./abbreviations.json') +@maxLength(63) +@description('Keyvault resource name. If not specified, a name will be generated.') +param keyVaultName string = '' + +@description('Id of the user or app to assign application roles to. AZD will set it to the current user if not specified.') +param principalId string = '' + +@maxLength(60) +@description('Name of the container apps environment to deploy. If not specified, a name will be generated. The maximum length is 60 characters.') +param containerAppsEnvironmentName string = '' + +@maxLength(50) +@description('Name of the Container Registry to deploy. If not specified, a name will be generated. The name is global and must be unique within Azure. The maximum length is 50 characters.') +param containerRegistryName string = '' + +/* Observability */ + +@maxLength(63) +@description('Name of the Log Analytics Workspace to deploy. If not specified, a name will be generated. The maximum length is 63 characters.') +param logAnalyticsWorkspaceName string = '' + +@maxLength(255) +@description('Name of the Application Insights to deploy. If not specified, a name will be generated. The maximum length is 255 characters.') +param applicationInsightsName string = '' + +@maxLength(160) +@description('Name of the Application Insights dashboard to deploy. If not specified, a name will be generated. The maximum length is 160 characters.') +param applicationInsightsDashboardName string = '' + +/* PostgreSQL */ + +@maxLength(63) +@description('Name of the PostgreSQL flexible server to deploy. If not specified, a name will be generated. The name is global and must be unique within Azure. The maximum length is 63 characters. It contains only lowercase letters, numbers and hyphens, and cannot start nor end with a hyphen.') +param postgresFlexibleServerName string = '' + +@maxLength(63) +@description('Name of the PostgreSQL flexible server database to deploy.') +param postgresDatabaseName string = 'database' + +@description('Name of the PostgreSQL admin user.') +param postgresAdminUsername string = 'pgadmin' + +@secure() +@description('PostGreSQL Server administrator password') +param postgresAdminPassword string + +/* Quarkus Telemetry */ + +@maxLength(32) +@description('Name of the Quarkus Telemetry Container App to deploy. If not specified, a name will be generated. The maximum length is 32 characters.') +param quarkusContainerAppName string = '' + +@description('Set if the Quarkus Telemetry Container aAp already exists.') +param quarkusAppExists bool = false + +/* Spring Boot Telemetry */ + +@description('Set if the SpringBoot Telemetry Container aAp already exists.') +param springBootAppExists bool = false + +/******************************************************************************/ +/* VARIABLES */ +/******************************************************************************/ + +var abbreviations = loadJsonContent('./abbreviations.json') // tags that should be applied to all resources. var tags = { @@ -28,31 +96,159 @@ var tags = { 'azd-env-name': environmentName } +/******************************* Resource Names *******************************/ + + // Generate a unique token to be used in naming resources. // Remove linter suppression after using. #disable-next-line no-unused-vars var resourceToken = toLower(uniqueString(subscription().id, environmentName, location)) +@description('Name of the environment with only alphanumeric characters. Used for resource names that require alphanumeric characters only.') +var alphaNumericEnvironmentName = replace(replace(environmentName, '-', ''), ' ', '') + +var _containerAppsEnvironmentName = !empty(containerAppsEnvironmentName) ? containerAppsEnvironmentName : take('${abbreviations.appManagedEnvironments}${environmentName}', 60) +var _containerRegistryName = !empty(containerRegistryName) ? containerRegistryName : take('${abbreviations.containerRegistryRegistries}${take(alphaNumericEnvironmentName, 35)}${resourceToken}', 50) +var _logAnalyticsName = !empty(logAnalyticsWorkspaceName) ? logAnalyticsWorkspaceName : take('${abbreviations.operationalInsightsWorkspaces}${environmentName}', 63) +var _applicationInsightsName = !empty(applicationInsightsName) ? applicationInsightsName : take('${abbreviations.insightsComponents}${environmentName}', 255) +var _applicationInsightsDashboardName = !empty(applicationInsightsDashboardName) ? applicationInsightsDashboardName : take('${abbreviations.portalDashboards}${environmentName}', 160) +var _quarkusContainerAppName = !empty(quarkusContainerAppName) ? quarkusContainerAppName : take('${abbreviations.appContainerApps}quarkus-${environmentName}', 32) +var _postgresFlexibleServerName = !empty(postgresFlexibleServerName) ? postgresFlexibleServerName : take(toLower('${abbreviations.dBforPostgreSQLServers}${take(environmentName, 44)}-${resourceToken}'), 63) +var _keyVaultName = !empty(keyVaultName) ? keyVaultName : take('${abbreviations.keyVaultVaults}${take(alphaNumericEnvironmentName, 8)}${resourceToken}', 24) +var _keyVaultSecrets = [ + { + name: 'postgres-admin-password' + value: postgresAdminPassword + } +] // Name of the service defined in azure.yaml // A tag named azd-service-name with this value should be applied to the service host resource, such as: // Microsoft.Web/sites for appservice, function // Example usage: // tags: union(tags, { 'azd-service-name': apiServiceName }) #disable-next-line no-unused-vars -var apiServiceName = 'python-api' +var quarkusServiceName = 'quarkus' + +#disable-next-line no-unused-vars +var springBootServiceName = 'spring-boot' + +/******************************************************************************/ +/* RESOURCES */ +/******************************************************************************/ // Organize resources in a resource group -resource rg 'Microsoft.Resources/resourceGroups@2021-04-01' = { - name: !empty(resourceGroupName) ? resourceGroupName : '${abbrs.resourcesResourceGroups}${environmentName}' +resource resourceGroup 'Microsoft.Resources/resourceGroups@2021-04-01' = { + name: !empty(resourceGroupName) ? resourceGroupName : '${abbreviations.resourcesResourceGroups}${environmentName}' location: location tags: tags } -// Add resources to be provisioned below. -// A full example that leverages azd bicep modules can be seen in the todo-python-mongo template: -// https://github.com/Azure-Samples/todo-python-mongo/tree/main/infra +module quarkus './app/quarkus.bicep' = { + name: 'quarkus' + scope: resourceGroup + params: { + name: _quarkusContainerAppName + location: location + tags: tags + identityName: _quarkusContainerAppName + applicationInsightsName: monitoring.outputs.applicationInsightsName + containerAppsEnvironmentName: containerAppsEnvironment.outputs.name + containerRegistryName: containerRegistry.outputs.name + exists: quarkusAppExists + } +} + +module containerAppsEnvironment 'core/host/container-apps-environment.bicep' = { + name: _containerAppsEnvironmentName + + scope: resourceGroup + params: { + name: _containerAppsEnvironmentName + location: location + tags: tags + logAnalyticsWorkspaceName: monitoring.outputs.logAnalyticsWorkspaceName + applicationInsightsName: monitoring.outputs.applicationInsightsName + } +} + +module keyVault './core/security/keyvault.bicep' = { + name: _keyVaultName + scope: resourceGroup + params: { + name: _keyVaultName + location: location + tags: tags + principalId: principalId + } +} + +module principalKeyVaultAccess './core/security/keyvault-access.bicep' = { + name: 'keyvault-access-${principalId}' + scope: resourceGroup + params: { + keyVaultName: keyVault.outputs.name + principalId: principalId + } +} + +@batchSize(1) +module keyVaultSecrets './core/security/keyvault-secret.bicep' = [for secret in _keyVaultSecrets: { + name: 'keyvault-secret-${secret.name}' + scope: resourceGroup + params: { + keyVaultName: keyVault.outputs.name + name: secret.name + secretValue: secret.value + } +}] + +module containerRegistry 'core/host/container-registry.bicep' = { + name: _containerRegistryName + scope: resourceGroup + params: { + name: _containerRegistryName + location: location + tags: tags + } +} + +module monitoring 'core/monitor/monitoring.bicep' = { + name: 'monitoring' + scope: resourceGroup + params: { + location: location + tags: tags + logAnalyticsName: _logAnalyticsName + applicationInsightsName: _applicationInsightsName + applicationInsightsDashboardName: _applicationInsightsDashboardName + } +} +module postgresServer 'core/database/postgresql/flexibleserver.bicep' = { + name: _postgresFlexibleServerName + scope: resourceGroup + params: { + name: _postgresFlexibleServerName + location: location + tags: tags + sku: { + name: 'Standard_B1ms' + tier: 'Burstable' + } + storage: { + storageSizeGB: 32 + } + version: '16' + administratorLogin: postgresAdminUsername + administratorLoginPassword: postgresAdminPassword + databaseNames: [postgresDatabaseName] + allowAzureIPsFirewall: true + } +} +/******************************************************************************/ +/* OUTPUTS */ +/******************************************************************************/ // Add outputs from the deployment here, if needed. // @@ -62,5 +258,19 @@ resource rg 'Microsoft.Resources/resourceGroups@2021-04-01' = { // // Outputs are automatically saved in the local azd environment .env file. // To see these outputs, run `azd env get-values`, or `azd env get-values --output json` for json output. + +@description('Location where all resources were installed.') output AZURE_LOCATION string = location + +@description('Azure Tenant ID.') output AZURE_TENANT_ID string = tenant().tenantId + +@description('Azure Key Vault name. Is reused to fetch PostgreSQL password in main.parameters.json') +output AZURE_KEY_VAULT_NAME string = keyVault.outputs.name + +@description('Container registry endpoint.') +output AZURE_CONTAINER_REGISTRY_ENDPOINT string = containerRegistry.outputs.loginServer + +//@description('Quarkus application URI.') +output QUARKUS_SERVICE_URI string = quarkus.outputs.SERVICE_QUARKUS_URI + diff --git a/infra/main.parameters.json b/infra/main.parameters.json index f1600cf..154ddc5 100644 --- a/infra/main.parameters.json +++ b/infra/main.parameters.json @@ -7,6 +7,18 @@ }, "location": { "value": "${AZURE_LOCATION}" + }, + "principalId": { + "value": "${AZURE_PRINCIPAL_ID}" + }, + "postgresAdminPassword": { + "value": "$(secretOrRandomPassword ${AZURE_KEY_VAULT_NAME} postgres-admin-password)" + }, + "quarkusAppExists": { + "value": "${SERVICE_QUARKUS_RESOURCE_EXISTS=false}" + }, + "springBootAppExists": { + "value": "${SERVICE_SPRING_BOOT_RESOURCE_EXISTS=false}" } } } From 9c227fab33a1c8294e8e992fa94ab80f6552593f Mon Sep 17 00:00:00 2001 From: Dominique Broeglin Date: Sun, 9 Jun 2024 23:37:30 +0200 Subject: [PATCH 03/15] Added SpringBoot Telemetry Container App --- infra/app/spring-boot.bicep | 75 +++++++++++++++++++++++++++++++++++++ infra/main.bicep | 24 +++++++++++- 2 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 infra/app/spring-boot.bicep diff --git a/infra/app/spring-boot.bicep b/infra/app/spring-boot.bicep new file mode 100644 index 0000000..46f236c --- /dev/null +++ b/infra/app/spring-boot.bicep @@ -0,0 +1,75 @@ +targetScope = 'resourceGroup' + +/* -------------------------------------------------------------------------- */ +/* PARAMETERS */ +/* -------------------------------------------------------------------------- */ + +@description('Name of the container app.') +param name string + +@description('Location in which the resources will be deployed. Default value is the resource group location.') +param location string = resourceGroup().location + +@description('Tags that will be added to all the resources. For Azure Developer CLI, "azd-env-name" should be added to the tags.') +param tags object = {} + +@description('Name of the service. This name is used to add "azd-service-name" tag to the tags for the container app. Default value is "srping-boot". If you change this value, make sure to change the name of the service in "azure.yaml" file as well.') +param serviceName string = 'spring-boot' + +@description('Name of the identity that will be created and used by the container app to pull image from the container registry.') +param identityName string + +@description('Name of the existing Application Insights instance that will be used by the container app.') +param applicationInsightsName string + +@description('Name of the existing container apps environment.') +param containerAppsEnvironmentName string + +@description('Name of the existing container registry that will be used by the container app.') +param containerRegistryName string + +@description('Flag that indicates whether the container app already exists or not. This is used in container app upsert to set the image name to the value of the existing container apps image name.') +param exists bool + +resource springBootIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = { + name: identityName + location: location +} + +resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing = { + name: applicationInsightsName +} + +module springBoot '../core/host/container-app-upsert.bicep' = { + name: '${serviceName}-container-app' + params: { + name: name + location: location + tags: union(tags, { 'azd-service-name': serviceName }) + identityType: 'UserAssigned' + identityName: identityName + exists: exists + containerAppsEnvironmentName: containerAppsEnvironmentName + containerRegistryName: containerRegistryName + env: [ + { + // TODO + name: 'APPLICATIONINSIGHTS_CONNECTION_STRING' + value: applicationInsights.properties.ConnectionString + } + ] + targetPort: 80 + } +} + +@description('ID of the service principal that is used by the container app to pull image from the container registry.') +output SERVICE_SPRING_BOOT_IDENTITY_PRINCIPAL_ID string = springBootIdentity.properties.principalId + +@description('Name of the container app.') +output SERVICE_SPRING_BOOT_NAME string = springBoot.outputs.name + +@description('URI of the container app.') +output SERVICE_SPRING_BOOT_URI string = springBoot.outputs.uri + +@description('Name of the container apps image.') +output SERVICE_SPRING_BOOT_IMAGE_NAME string = springBoot.outputs.imageName diff --git a/infra/main.bicep b/infra/main.bicep index 733f6ab..47d3f5d 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -81,6 +81,10 @@ param quarkusAppExists bool = false /* Spring Boot Telemetry */ +@maxLength(32) +@description('Name of the SpringBoot Telemetry Container App to deploy. If not specified, a name will be generated. The maximum length is 32 characters.') +param springBootContainerAppName string = '' + @description('Set if the SpringBoot Telemetry Container aAp already exists.') param springBootAppExists bool = false @@ -113,6 +117,7 @@ var _logAnalyticsName = !empty(logAnalyticsWorkspaceName) ? logAnalyticsWorkspac var _applicationInsightsName = !empty(applicationInsightsName) ? applicationInsightsName : take('${abbreviations.insightsComponents}${environmentName}', 255) var _applicationInsightsDashboardName = !empty(applicationInsightsDashboardName) ? applicationInsightsDashboardName : take('${abbreviations.portalDashboards}${environmentName}', 160) var _quarkusContainerAppName = !empty(quarkusContainerAppName) ? quarkusContainerAppName : take('${abbreviations.appContainerApps}quarkus-${environmentName}', 32) +var _springBootContainerAppName = !empty(springBootContainerAppName) ? springBootContainerAppName : take('${abbreviations.appContainerApps}spring-book-${environmentName}', 32) var _postgresFlexibleServerName = !empty(postgresFlexibleServerName) ? postgresFlexibleServerName : take(toLower('${abbreviations.dBforPostgreSQLServers}${take(environmentName, 44)}-${resourceToken}'), 63) var _keyVaultName = !empty(keyVaultName) ? keyVaultName : take('${abbreviations.keyVaultVaults}${take(alphaNumericEnvironmentName, 8)}${resourceToken}', 24) var _keyVaultSecrets = [ @@ -158,6 +163,21 @@ module quarkus './app/quarkus.bicep' = { } } +module springBoot './app/spring-boot.bicep' = { + name: 'spring-boot' + scope: resourceGroup + params: { + name: _springBootContainerAppName + location: location + tags: tags + identityName: _springBootContainerAppName + applicationInsightsName: monitoring.outputs.applicationInsightsName + containerAppsEnvironmentName: containerAppsEnvironment.outputs.name + containerRegistryName: containerRegistry.outputs.name + exists: springBootAppExists + } +} + module containerAppsEnvironment 'core/host/container-apps-environment.bicep' = { name: _containerAppsEnvironmentName @@ -271,6 +291,8 @@ output AZURE_KEY_VAULT_NAME string = keyVault.outputs.name @description('Container registry endpoint.') output AZURE_CONTAINER_REGISTRY_ENDPOINT string = containerRegistry.outputs.loginServer -//@description('Quarkus application URI.') +@description('Quarkus application URI.') output QUARKUS_SERVICE_URI string = quarkus.outputs.SERVICE_QUARKUS_URI +@description('SpringBoot application URI.') +output SPRING_BOOT_SERVICE_URI string = springBoot.outputs.SERVICE_SPRING_BOOT_URI From b267cb6bcae1956e36af02874cfb1faa608e996d Mon Sep 17 00:00:00 2001 From: Dominique Broeglin Date: Mon, 10 Jun 2024 09:14:32 +0200 Subject: [PATCH 04/15] Added AZD services for Quarkus and SpringBoot services --- azure.yaml | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/azure.yaml b/azure.yaml index 351d11a..0901fac 100644 --- a/azure.yaml +++ b/azure.yaml @@ -6,25 +6,12 @@ # Name of the application. name: azd-starter -# services: -# ## An example for a python API service. -# ## The service is named 'python-api'. -# ## The language is 'python'. -# ## The source code is located in the project (azure.yaml) directory. -# ## The service will be hosted on Azure App Service. -# python-api: -# language: python -# project: ./ -# host: appservice -# ## An example for a NodeJS API, located in src/api. -# nodejs-api: -# language: js -# project: ./src/api -# host: appservice -# ## An example for a React front-end app. -# ## The src/react-app/build folder is where the app is built to after `npm run build`. -# react-web: -# language: js -# project: ./src/react-app -# host: appservice -# dist: build +services: + quarkus: + language: java + project: code/quarkus-telemetry + host: containerapp + spring-boot: + language: java + project: code/spring-boot-telemetry + host: containerapp \ No newline at end of file From 0faef51ac074b106605e244a4ae6b8e39d14be68 Mon Sep 17 00:00:00 2001 From: Dominique Broeglin Date: Mon, 10 Jun 2024 20:56:26 +0200 Subject: [PATCH 05/15] Fixing Container Apps 'secrets' param ([object] not null | object) --- infra/core/host/container-app-upsert.bicep | 5 ++--- infra/core/host/container-app.bicep | 8 ++------ 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/infra/core/host/container-app-upsert.bicep b/infra/core/host/container-app-upsert.bicep index 5e05f89..f9c75b4 100644 --- a/infra/core/host/container-app-upsert.bicep +++ b/infra/core/host/container-app-upsert.bicep @@ -17,7 +17,7 @@ param containerMaxReplicas int = 10 param containerMemory string = '1.0Gi' @description('The minimum number of replicas to run. Must be at least 1.') -@minValue(1) +@minValue(0) param containerMinReplicas int = 1 @description('The name of the container') @@ -56,8 +56,7 @@ param identityName string = '' param imageName string = '' @description('The secrets required for the container') -@secure() -param secrets object = {} +param secrets array = [] @description('The environment variables for the container') param env array = [] diff --git a/infra/core/host/container-app.bicep b/infra/core/host/container-app.bicep index c64fc82..f67ceae 100644 --- a/infra/core/host/container-app.bicep +++ b/infra/core/host/container-app.bicep @@ -63,8 +63,7 @@ param ingressEnabled bool = true param revisionMode string = 'Single' @description('The secrets required for the container') -@secure() -param secrets object = {} +param secrets array = [] @description('The service binds associated with the container') param serviceBinds array = [] @@ -124,10 +123,7 @@ resource app 'Microsoft.App/containerApps@2023-05-02-preview' = { appProtocol: daprAppProtocol appPort: ingressEnabled ? targetPort : 0 } : { enabled: false } - secrets: [for secret in items(secrets): { - name: secret.key - value: secret.value - }] + secrets: secrets service: !empty(serviceType) ? { type: serviceType } : null registries: usePrivateRegistry ? [ { From a12ad2ac30c40a48063b7a9253f8227f0934ba17 Mon Sep 17 00:00:00 2001 From: Dominique Broeglin Date: Mon, 10 Jun 2024 20:58:53 +0200 Subject: [PATCH 06/15] Added database configuration SpringBoot & Quarksu services --- azure.yaml | 9 ++++-- infra/app/quarkus.bicep | 55 ++++++++++++++++++++++++++++++++++--- infra/app/spring-boot.bicep | 53 +++++++++++++++++++++++++++++++++-- infra/main.bicep | 16 ++++++++++- 4 files changed, 123 insertions(+), 10 deletions(-) diff --git a/azure.yaml b/azure.yaml index 0901fac..ce4d275 100644 --- a/azure.yaml +++ b/azure.yaml @@ -9,9 +9,14 @@ name: azd-starter services: quarkus: language: java - project: code/quarkus-telemetry + project: code/quarkus-telemetry/quarkus-telemetry-vegetable host: containerapp + docker: + path: Dockerfile spring-boot: language: java project: code/spring-boot-telemetry - host: containerapp \ No newline at end of file + host: containerapp + docker: + path: Dockerfile + diff --git a/infra/app/quarkus.bicep b/infra/app/quarkus.bicep index 397ed80..07dec98 100644 --- a/infra/app/quarkus.bicep +++ b/infra/app/quarkus.bicep @@ -1,8 +1,8 @@ targetScope = 'resourceGroup' -/* -------------------------------------------------------------------------- */ +/******************************************************************************/ /* PARAMETERS */ -/* -------------------------------------------------------------------------- */ +/******************************************************************************/ @description('Name of the container app.') param name string @@ -28,9 +28,30 @@ param containerAppsEnvironmentName string @description('Name of the existing container registry that will be used by the container app.') param containerRegistryName string +@description('Database connection configuration information.') +param databaseConfig databaseConfigType + +@description('Name of the Key Vault that contains the secrets.') +param keyVaultName string + @description('Flag that indicates whether the container app already exists or not. This is used in container app upsert to set the image name to the value of the existing container apps image name.') param exists bool +/******************************************************************************/ +/* TYPES */ +/******************************************************************************/ + +type databaseConfigType = { + hostname: string + name: string + username: string + port: int? +} + +/******************************************************************************/ +/* RESOURCES */ +/******************************************************************************/ + resource quarkusIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = { name: identityName location: location @@ -40,6 +61,10 @@ resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing name: applicationInsightsName } +resource keyVault 'Microsoft.KeyVault/vaults@2021-06-01-preview' existing = { + name: keyVaultName +} + module quarkus '../core/host/container-app-upsert.bicep' = { name: '${serviceName}-container-app' params: { @@ -53,15 +78,37 @@ module quarkus '../core/host/container-app-upsert.bicep' = { containerRegistryName: containerRegistryName env: [ { - // TODO - name: 'APPLICATIONINSIGHTS_CONNECTION_STRING' + name: 'QUARKUS_DATASOURCE_JDBC_URL' + value: 'jdbc:postgresql://${databaseConfig.hostname}:${databaseConfig.?port ?? 5432}/${databaseConfig.name}' + } + { + name: 'QUARKUS_DATASOURCE_USERNAME' + value: databaseConfig.username + } + { + name: 'QUARKUS_DATASOURCE_PASSWORD' + secretRef: 'postgres-admin-password' + } + { + name: 'QUARKUS_OTEL_AZURE_APPLICATIONINSIGHTS_CONNECTION_STRING' value: applicationInsights.properties.ConnectionString } ] + secrets: [ + { + name: 'postgres-admin-password' + keyVaultUrl: '${keyVault.properties.vaultUri}/secrets/postgres-admin-password' + identity: quarkusIdentity.id + } + ] targetPort: 80 } } +/******************************************************************************/ +/* OUTPUTS */ +/******************************************************************************/ + @description('ID of the service principal that is used by the container app to pull image from the container registry.') output SERVICE_QUARKUS_IDENTITY_PRINCIPAL_ID string = quarkusIdentity.properties.principalId diff --git a/infra/app/spring-boot.bicep b/infra/app/spring-boot.bicep index 46f236c..affdfd2 100644 --- a/infra/app/spring-boot.bicep +++ b/infra/app/spring-boot.bicep @@ -1,8 +1,8 @@ targetScope = 'resourceGroup' -/* -------------------------------------------------------------------------- */ +/******************************************************************************/ /* PARAMETERS */ -/* -------------------------------------------------------------------------- */ +/******************************************************************************/ @description('Name of the container app.') param name string @@ -28,9 +28,30 @@ param containerAppsEnvironmentName string @description('Name of the existing container registry that will be used by the container app.') param containerRegistryName string +@description('Database connection configuration information.') +param databaseConfig databaseConfigType + +@description('Name of the Key Vault that contains the secrets.') +param keyVaultName string + @description('Flag that indicates whether the container app already exists or not. This is used in container app upsert to set the image name to the value of the existing container apps image name.') param exists bool +/******************************************************************************/ +/* TYPES */ +/******************************************************************************/ + +type databaseConfigType = { + hostname: string + name: string + username: string + port: int? +} + +/******************************************************************************/ +/* RESOURCES */ +/******************************************************************************/ + resource springBootIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = { name: identityName location: location @@ -40,6 +61,10 @@ resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing name: applicationInsightsName } +resource keyVault 'Microsoft.KeyVault/vaults@2021-06-01-preview' existing = { + name: keyVaultName +} + module springBoot '../core/host/container-app-upsert.bicep' = { name: '${serviceName}-container-app' params: { @@ -53,15 +78,37 @@ module springBoot '../core/host/container-app-upsert.bicep' = { containerRegistryName: containerRegistryName env: [ { - // TODO + name: 'SPRING_DATASOURCE_URL' + value: 'jdbc:otel:postgresql://${databaseConfig.hostname}:${databaseConfig.?port ?? 5432}/${databaseConfig.name}' + } + { + name: 'SPRING_DATASOURCE_USERNAME' + value: databaseConfig.username + } + { + name: 'SPRING_DATASOURCE_PASSWORD' + secretRef: 'postgres-admin-password' + } + { name: 'APPLICATIONINSIGHTS_CONNECTION_STRING' value: applicationInsights.properties.ConnectionString } ] + secrets: [ + { + name: 'postgres-admin-password' + keyVaultUrl: '${keyVault.properties.vaultUri}/secrets/postgres-admin-password' + identity: springBootIdentity.id + } + ] targetPort: 80 } } +/******************************************************************************/ +/* OUTPUTS */ +/******************************************************************************/ + @description('ID of the service principal that is used by the container app to pull image from the container registry.') output SERVICE_SPRING_BOOT_IDENTITY_PRINCIPAL_ID string = springBootIdentity.properties.principalId diff --git a/infra/main.bicep b/infra/main.bicep index 47d3f5d..fd5330b 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -159,6 +159,12 @@ module quarkus './app/quarkus.bicep' = { applicationInsightsName: monitoring.outputs.applicationInsightsName containerAppsEnvironmentName: containerAppsEnvironment.outputs.name containerRegistryName: containerRegistry.outputs.name + databaseConfig: { + name: 'quarkusdb' + hostname: postgresServer.outputs.POSTGRES_DOMAIN_NAME + username: postgresAdminUsername + } + keyVaultName: keyVault.name exists: quarkusAppExists } } @@ -174,6 +180,12 @@ module springBoot './app/spring-boot.bicep' = { applicationInsightsName: monitoring.outputs.applicationInsightsName containerAppsEnvironmentName: containerAppsEnvironment.outputs.name containerRegistryName: containerRegistry.outputs.name + databaseConfig: { + name: 'springbootdb' + hostname: postgresServer.outputs.POSTGRES_DOMAIN_NAME + username: postgresAdminUsername + } + keyVaultName: keyVault.name exists: springBootAppExists } } @@ -261,7 +273,9 @@ module postgresServer 'core/database/postgresql/flexibleserver.bicep' = { version: '16' administratorLogin: postgresAdminUsername administratorLoginPassword: postgresAdminPassword - databaseNames: [postgresDatabaseName] + databaseNames: [ + 'quarkusdb', 'springbootdb' + ] allowAzureIPsFirewall: true } } From 4659cfce79e8522445163af10e915c6eb2219b31 Mon Sep 17 00:00:00 2001 From: Dominique Broeglin Date: Mon, 10 Jun 2024 23:03:19 +0200 Subject: [PATCH 07/15] Fixing keyvault & managed identities, adding SuperHero URL --- azure.yaml | 2 +- infra/app/quarkus.bicep | 15 +++++++++++++-- infra/app/spring-boot.bicep | 22 ++++++++++++++++++++-- infra/main.bicep | 2 ++ 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/azure.yaml b/azure.yaml index ce4d275..edebf1f 100644 --- a/azure.yaml +++ b/azure.yaml @@ -9,7 +9,7 @@ name: azd-starter services: quarkus: language: java - project: code/quarkus-telemetry/quarkus-telemetry-vegetable + project: code/quarkus-telemetry/quarkus-telemetry-superhero host: containerapp docker: path: Dockerfile diff --git a/infra/app/quarkus.bicep b/infra/app/quarkus.bicep index 07dec98..8575ba2 100644 --- a/infra/app/quarkus.bicep +++ b/infra/app/quarkus.bicep @@ -65,6 +65,14 @@ resource keyVault 'Microsoft.KeyVault/vaults@2021-06-01-preview' existing = { name: keyVaultName } +module quarkusKeyVaultAccess '../core/security/keyvault-access.bicep' = { + name: 'keyvault-access-${quarkusIdentity.name}' + params: { + keyVaultName: keyVault.name + principalId: quarkusIdentity.properties.principalId + } +} + module quarkus '../core/host/container-app-upsert.bicep' = { name: '${serviceName}-container-app' params: { @@ -97,12 +105,15 @@ module quarkus '../core/host/container-app-upsert.bicep' = { secrets: [ { name: 'postgres-admin-password' - keyVaultUrl: '${keyVault.properties.vaultUri}/secrets/postgres-admin-password' + keyVaultUrl: '${keyVault.properties.vaultUri}secrets/postgres-admin-password' identity: quarkusIdentity.id } ] - targetPort: 80 + targetPort: 8080 } + dependsOn: [ + quarkusKeyVaultAccess + ] } /******************************************************************************/ diff --git a/infra/app/spring-boot.bicep b/infra/app/spring-boot.bicep index affdfd2..ea701c4 100644 --- a/infra/app/spring-boot.bicep +++ b/infra/app/spring-boot.bicep @@ -34,6 +34,9 @@ param databaseConfig databaseConfigType @description('Name of the Key Vault that contains the secrets.') param keyVaultName string +@description('URL of the super hero service to call.') +param superHeroUrl string + @description('Flag that indicates whether the container app already exists or not. This is used in container app upsert to set the image name to the value of the existing container apps image name.') param exists bool @@ -65,6 +68,14 @@ resource keyVault 'Microsoft.KeyVault/vaults@2021-06-01-preview' existing = { name: keyVaultName } +module springBootKeyVaultAccess '../core/security/keyvault-access.bicep' = { + name: 'keyvault-access-${springBootIdentity.name}' + params: { + keyVaultName: keyVault.name + principalId: springBootIdentity.properties.principalId + } +} + module springBoot '../core/host/container-app-upsert.bicep' = { name: '${serviceName}-container-app' params: { @@ -89,6 +100,10 @@ module springBoot '../core/host/container-app-upsert.bicep' = { name: 'SPRING_DATASOURCE_PASSWORD' secretRef: 'postgres-admin-password' } + { + name: 'CLIENT_SUPERHERO_URL' + value: superHeroUrl + } { name: 'APPLICATIONINSIGHTS_CONNECTION_STRING' value: applicationInsights.properties.ConnectionString @@ -97,12 +112,15 @@ module springBoot '../core/host/container-app-upsert.bicep' = { secrets: [ { name: 'postgres-admin-password' - keyVaultUrl: '${keyVault.properties.vaultUri}/secrets/postgres-admin-password' + keyVaultUrl: '${keyVault.properties.vaultUri}secrets/postgres-admin-password' identity: springBootIdentity.id } ] - targetPort: 80 + targetPort: 8080 } + dependsOn: [ + springBootKeyVaultAccess + ] } /******************************************************************************/ diff --git a/infra/main.bicep b/infra/main.bicep index fd5330b..b9baee6 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -186,6 +186,7 @@ module springBoot './app/spring-boot.bicep' = { username: postgresAdminUsername } keyVaultName: keyVault.name + superHeroUrl: quarkus.outputs.SERVICE_QUARKUS_URI exists: springBootAppExists } } @@ -214,6 +215,7 @@ module keyVault './core/security/keyvault.bicep' = { } } +/* Give access to the keyvault to the current identity */ module principalKeyVaultAccess './core/security/keyvault-access.bicep' = { name: 'keyvault-access-${principalId}' scope: resourceGroup From 221414e95be2d8958bef8a21905aba3285c434c9 Mon Sep 17 00:00:00 2001 From: Sandra Ahlgrimm Date: Tue, 11 Jun 2024 12:09:42 +0000 Subject: [PATCH 08/15] cleanup, readme addings, typo --- .devcontainer/devcontainer.json | 2 +- README.md | 9 +++ .../native-image/native-image.properties | 2 - docs/assets/ai-resource-1.png | Bin 14992 -> 0 bytes docs/assets/ai-resource-2.png | Bin 14851 -> 0 bytes docs/assets/ai-resource-3.png | Bin 27874 -> 0 bytes docs/assets/banner.jpg | Bin 16039 -> 0 bytes docs/workshop.md | 33 --------- infra/main.bicep | 2 +- scripts/docker-compose/docker-compose.yml | 11 --- scripts/repo/create-github-template.sh | 70 ------------------ scripts/repo/create-packages.sh | 55 -------------- 12 files changed, 11 insertions(+), 173 deletions(-) delete mode 100644 code/spring-boot-telemetry/src/main/resources/native-image/native-image.properties delete mode 100644 docs/assets/ai-resource-1.png delete mode 100644 docs/assets/ai-resource-2.png delete mode 100644 docs/assets/ai-resource-3.png delete mode 100644 docs/assets/banner.jpg delete mode 100644 docs/workshop.md delete mode 100644 scripts/docker-compose/docker-compose.yml delete mode 100755 scripts/repo/create-github-template.sh delete mode 100755 scripts/repo/create-packages.sh diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 7c65df1..7abe461 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -40,7 +40,7 @@ // Set minimal host requirements for the container. "hostRequirements": { - "memory": "8gb" + "memory": "16gb" } // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. diff --git a/README.md b/README.md index 3f92930..6042b80 100644 --- a/README.md +++ b/README.md @@ -3,3 +3,12 @@ This repository contains code demonstrating how to enable OpenTelemetry features for GraalVM native images on Azure: * [Spring Boot](./code/spring-boot-telemetry/README.md) * [Quarkus](./code/quarkus-telemetry/README.md) + +Deploy the sample to Azure Container Apps with `azd`. + +```bash + azd auth login --use-device-code + azd provision + azd up +``` + \ No newline at end of file diff --git a/code/spring-boot-telemetry/src/main/resources/native-image/native-image.properties b/code/spring-boot-telemetry/src/main/resources/native-image/native-image.properties deleted file mode 100644 index 40d4030..0000000 --- a/code/spring-boot-telemetry/src/main/resources/native-image/native-image.properties +++ /dev/null @@ -1,2 +0,0 @@ -Args=\ - --initialize-at-build-time=com.azure.core.util.logging.ClientLogger diff --git a/docs/assets/ai-resource-1.png b/docs/assets/ai-resource-1.png deleted file mode 100644 index de86baf77f3e7dc4085d8e817d55343a96ec9f11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14992 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 diff --git a/docs/assets/ai-resource-2.png b/docs/assets/ai-resource-2.png deleted file mode 100644 index 2e1f1388953e06bfe8544cd9a5adc48d372f3d90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14851 zcmeHudpwi<|9^KXm7=>GQVyMkP$b9ENeBs*$R;@@Ih(`gP)UkVa?D}nENtc2#^`7{ zF2`ZEsW3J(VH=xmziaN#=l-{=DU(f69$>mGt+qdr7 zx^CUN?Uokj?bodnqXE|gn>PW!B{q$uty^c%VR`<{l?Vuf#Dhz-NWviDBW7%%uoye* ziLM|2<96>o@g2I4*E?^tJ#*}U?yIzYw@#lazjsYiE&1^VJG+NRVPXgV)VSUovA$}f z@rI4t3yaI&>0v39XxjxRFVn@G&;DUqTa1+nEX=Vco!Z*krtX$7FOv}9#lX+K0sZ!t zKh`c4jHID!7xoVeB}Esf6E6>}4O#q|Xt*|_de%-{bg|ED>ron`kKKEu0s+=2+T>_K zDNyM|UHUyaP|(*{c=p26iVP>KQ|&2n4EFl9Cr>|~FymWP-UYj8oSVH>u3+6Rn#I<7SrT-n`stpr8%J7iQ6xmOPA3c(w*0Di-bb)& zS!~||9?%=Ir1Xb0;?Dmi+rIN2c9eIov@c_74eHCbVOp-qY6PU0raG5EUA@EfIx&+H zo}<|pXP|0kU`U1JU88?JW_{Z(pi|nKTCn7x?y-~ytubof9mLS+t9$Q!q~II1+~F@3 zL-PsO0&)C3#hr@?oFpZ-wPzBGDGckJ1u6Ca*hMDyyrvzAZC5_OG?2J{AfD zF7h5(OAavaj>-M-4$bQ-yBN4~NEWt{RSnD0uWDSHZblJ4QST-HUWr3$P9;+83{xz37co?9FfR{wO5%l_!<&P5hY@A8GK`1D7db9xqM z!o=Im=lzP<;68oOA~ze_em5Zqf5A8go^(-=NRq+`{VnHBT~XI$v+BVt@uS7Z-}d&Of2yvA&O7vp zz$O04*pNYC7J@*%))iJI(V{uR(08Ea?rc7VTUr!3nY8Pxay`8K?PwpoM^{Lnm+kQ3 zAFj(JvEi#pmHu@t8S^zkWsV(ntUt{z)t|EZOfnb$kd$0d*{bhwV0Ka(T`tEmnEGYm zTRJw>v7<8E-1GER?CfU$XAd4`;^J~Rmk{IbP2$JyW|1m&@E`X;DLIL6mirAQ{hym% zmH8N%za`cNl*4F(p2^tujmmGhX=S}4C3G>{LK^zxM<<>dqF$ZD&@Vl3WBS)l=!T9H zyeN^~4|~W!9ouJBU+7I;8idYit-cl;-q)cI^9vHCE& z!Og|xYxy$%gcd?GegFMQm2cnUYYx^}AK4WJ(k9-fhB=)a_?=y*p9m}6tT%K>V=&*~ zs`A0`6Hfb0cRa+gUWOUIw=CUWS7w{3M~i576oOW8UB(gG>%JdI=fzX7oVk8HkwXNb{i5n``vbx6qQnfX5 zri=BlrktLGrF6PDHR4;J_8H@vht06w0rDq~)FNx?I;mJ|SsPTQ9hE1k!}c6-&|vp1 zc(p1yE2&V7wCArML7VZPRaMR@W?!%c?=DPmK+Q$iuetO7e7BR%&97~j!1A#NGFwlLM7aByb?M!y?^5VQJ15w9n(y9_UNuMqHf|WJxadN8j|z0#_Iexw^c>Y$&>QI9Bm&m{d(pdisqsMJX8!G z!rv-yjXV!nHQx-2^Q`ZCTm3cYaqFEdMJa=={hkt@jUb2x<8{+n&{oM1n)pU%#8tF#w^2=2fo1NUAuX;l)UQo`)5=#!x zA5chZ`;Df)h8sj@Tf;pa1NYJ=x63^ZovRKL?*6&9brt^DBmU_iScx@+VIl>_yAk^B zjt~)9C!_xMh7|jpiKG|-;04$(iZ5xSwFZ~H{A$aL)UJhMivv!4;$aoC9_(~45e&6zm|jpWw>1(Ma341y!IGGyDp)UwOr<<(7%&|x0#U6fW3 zg4pHIN(g#*&aC>^biBUm%3r~i{-%)3A=|JYqGvz9)0u&WcNzB`tF8K2`p9_CJ8|P7 zFX@H>wC^33(8&u7CSlrhD!M8CD$-Clf0QFE(f5UhKlk<<8YhY1r0;$2N8C z&Es8a=`G;C<`%m> zSzYPvx{8E9@#sq-r@pGwJfl-0eX<&&t83syOv-)Cojaa|kVZp~@3rOB?DKDp3yu{b zl8L<8-9e_b+X+?YYJ#8Yy7utM@5XwT^ka*yt%CDIa0TP8gAZGLAGnBtHksrC8@u`P zmB;{;lu4E4u}!hY6_1UtfG)yJl_z!lobw$AR7lXW=qv@3sOvo@bZe%-kN9BkN{;un z2+sD3=B^eIR#4q(n(b0p_(BT^?qQHi%DEm1o9pQ1pr)!Dmo*ONc^a#IRik-Eq^#)o zX&OPCj_yi8cSc^LVpC%REjtaUT0}MdiA*bAh6|*jCNRkCUF0HwLVh zfynzBqTOSN(nCBn#d)MvTn?c?{yO9gl_OY~W&kMF+Y_vxX;| z$o=sxdf-mAlkrFqJh==*n}H^h0%PJ2Jh>J9L+j)aD_`fZ+VMT%M}RsV>S7edJ?nFw zbd=t}NE?byC_WLm?Dr)r#{7(g*1HmTO5_%7`n5F}a)b~HF^Y<=oh1|0{3;hCQ`!${ zrN*RiuD;%qK3+5$eyZanL3fz{&b%zVS!#jjVo*T53|Ca_{}O{-7#WH`Mqw3bE@5Y! zuf0|cRRjdP*H@c}u~^Kz|52;nJ2j)NS*u98i{SMMM7JFV7WholfSRNt9 zMQyLjXv=47_7**$|M|OwV)wo9;@!Xzvxt<)I~by2+48{s*8~h(6jv4yCBA~0|Gf3c zp5aql`d;3o^M?;~chWruR^}WI2VXcBo>xRx_pb{zCG=|E$6LE0Dkq4Tx0B+Vf~`(| zK-}14q6`Rkx?*D@X3_A+%jc}Vo!15yt_{lxKHR$uUjBrT(GS-bTo&H^eH3D+)gIDi z6&SiOZ1o&_@)Qd2`-O#Rs=hLJ*3k0!(FnQv&bdkVICIZDXZTWdP_bRx2uCU}ch%Sj z$2%JF+zfCdj=o!cVA5#0X;Y|#X5|<{3XtK|(gQP)L)g&Zl4R7op(RD0 z%kvJHo9i;z^KirYw#~Ai9`{wdz{iWGf~rD1o1v*}Y_AhTrDb)NyJ?g90c9GB9f>I`t57;DCdj9;m0WL_3`VpS76?Dw> z2krfaBydJmm;9U&AthmUMt4PqWoK(v6}Y9q9im_c3T9G!(D!F_ac|0vQa7XTB4?*R z1@-v3)=i|WQ@({e$M!jx17+u*C$ppGzs0$-DpI2T^4*UDrTrs}rnc0JqNIEXn{x@E zHfYX=sCR1zyyEXxv7*o}_;fc`DgRs4xk6-^*VY?fj!wh))9n(OmhS!Rybx0?{jOHd z4A{NNk-GZvOzl?wC#G6pP98+{g(EZ3m|DkA^76?xvG%IQW3fOo{jiX?@h8x&pBOG^Xy9O1$9k7+R- zAHLI{H6BxvbrDo#Xm`fUJ!ewi`hl0J4UCd^AMt07V8EZ-;^xWtaBnha2(G$J)<;ME za2eMC15gQ5)J=39m;WB%;eSGn4fuA_fGZFkPkNtDw0hO}$@=1-9=Vb>IVZ%z~JpDww z=LmPmOPT^ah%^(#*Y*igAX5gR)An|bIcF6b8chv9;6^B#RSTsYVJ*+b5; z^V#|iGt}$BzPH^b<_$@%%U5}tKIJLs%=!!^s-tCG^A^YNy>oRc6`wsEZGd)VOqbK@tcMMHt&CU z{!j||jn(tI?An!ktF7?x4$JUpYvAuY&MNdWFLLwS;|nis-fwnMK_rjQtJuI<)APXK z=KWt39i7U`cb&C(z7q#5Yq4jQAST?r`p1E_(YfhxmAz*9JI*Gi>x*RX`yfmZVF-Ua zO3qQ*!yWd;UqphYZL*6E6$wNG+LT^KQDKXY-N2Up#THN80l^P#FBD7zqoEn97?O-= zwT^6HHOWqbYpe#Uh5M$f07T@W1jK?P$9#6M%z+oYsys?FVawSA0-}L6?l`va=8T-0 zBi=do*(_0DO`vM^|83?_mD39cU{)C1*|BdQEft_XPdnNTM9*p!16vB-1?)1c!Jo9} z=(J#(&o&PGU*-s=Bd5bogdd)ZVx4@TB zM`k=!T#pcG9HZrEM>%YT5+pC_yQfzT({rWQtxLa>m55O*4wTcj-Te2fqL=60d~V;~ zoIZc3cO^6io+Hv;8BaubK9dD&($o+?^YL|C{(cXQLxyWz{;>F@CqPR_WWG>Wq=-aL zi7%9fdTw22RC)vq6Uwz5+aDgt3^lV;dH78G2;hOLG}0EpL+{lcb+&UXecaRm8;Ay< z{(G49ou%tLv|(#R+H{lx7jj9Ia{CI)&A{lbXnMne*CIcZ7g-4K!}I)J%c|(CyVsAO zK{5yquvMD07M3fSRZ$tvbefk9$zbW75^mg zCr7tH7nalFwSQ$^oZwJ}@nJ(@%rsc}yYahq|mId4( zUS%ymh+O%_z$0{hO;|X5E?L~MC<~rxP~CcKZsTvz?!uzu zTml96K47w4!buh@3yYxpD=CeDbEz5wZVyf@J~N=4kMzlqDSGgASQ==rXU~lp-7P3g z_{7N)r|33@X3n{8PctWTY<=p!^;NP2YEBv8Lu-C@+^n(u(!e>2o}OP?k~n0dI(@DL z$RIyzZbimLt@eu7gz#`Rlhxh!t;;9SzuV}ZgA(duiz?j$RBKw<-h#Bf0q-x}@txZ` z#_X80HT^wgPO#z3(#eZ{%)6{1D}pV-fwRO*g8ib&d5%@PPo_4Gxn!<)MdFIeciBh$ z6s2g(xN=j&m1WO>+Pl{m?paso?7Nz^l$8j{hxY)Kp}i7?(bQYU7*Pvou|&PR(WS&1 z{r-UeaaN$%*`*}71i+Ae8i|kruow>Qubws_4Q<-2RUxcYSPqN5iMe&&s%nlugnOy~ zgZ+VztcqpH%#e5r0ZJM(mP0mK;2scT5@!5=nbSJ=Zh3EEl_#d`%966CyYC%r$e{8P zJG3bgcHSul`k<-Y{ONd$IUc-bwu@#OG`o0XT8pNIjh$=V&6qG-?&rm+BWj=GOP>|` zcT{+d^r?t(n(UE3@7n*jeOuOH11lY?5^O04#H-5c!lK^p4o~+Ky3x>v7dfihP%OHn zHk1?lA)E|DjzeIg?%Q=P z%;3If?sT+aa_om@lYBT08i@Jv8JS+MRo%Yw`m7X6IqLVT*;OqhjBMlxi5>VZ%%AwZ zni|=yjO>woSQa;~ktci{HMn3l9vQXtgBQ$OCf3l)`e~|ScvLZ9?%V${x21b7HP-H8i$u!OO7eaY1A9;Y*IxS+Bd7#aGCovvO2`OnXrCY=K)r87zjbKhLaZd_X%VTfv+0;KPlD?nCFi~Yx50B>0!I+Xf%VWYjN1wl=_z0IS;0T1EK zsLkY}QOt+XkAIHoG&)+}t`m$mv=jS{l)RT8fLn-vZ%(y1LR4L91po@T2pOoK^_f|e zv)UDF$->1(aIAc%7~Ek(`h*P>N_(sjD9m36)^S;%dck% zf5`-6ZOeLzt3-2VKbDQrgLDd9fVHAxDiuPN}Trq3YG15izR$Em+{tUVPo!eacLn#RAl2y<9*5Z zWn#>cMKch24vc`&%Q!Rpq6LwmignBMXxQjIh`6AnZ7}#6ssIuhOKU%Te+FtqUy_EN zU9kNN*8xRcr9zCZ{Orvcn3Jx?EXZ^DAuN*js%f_}w%UdaxqLXoD|8tWS9}LnH2aQS zLrtGMs8JKv5m=#Lrrl}E%q?vhL41GMJ+1FeB*J<S{xjQ_ zJd1S-%kl>x80faE>NifVXHWAdiLh&>Rrs97k#J{l%zvWHugPQdU1xdg7aE!jyWOZ> zgv7R~uVS9wl7{XADY!_v5j=g`{jZ0Go{xZoyBQcqZu?=@$eGbDjFfzEP9xP-sCaFF zaZnPF(O4+89|pl-{j3F{M86tN626Ao%p-hM{;vtxVXFwnTsj7z!*mNXJHk&x&*17t zZJ408AOy%$x3cVFpA3F(W6Xe6z3d1N6)^#*N;IDt5b#_=Yxg)QTo~OSys0=OW8#)9 z%iGadF&m%alyF84EUlmCT9j2Lsyx?$@Ey&NGF`n4pxcAC#=jqSPxH2{q4eW!UaFi{@9NBE(Q5jlPgbv>hyb zPSMtW;4|BT7yI_8mmNj$J0ZAzJPFHdOKlo7+WMh@pzQF4WejZ^rZ;1@5xBd~{uDtp zL0x@)yM$KrzFKd*WcQn^l@s$nKHra2rLAe>&|m1lL(u8<=$!J4!{fPP-E=AlM zzo41qm1U<>h$bV&idH%?O4m$7+M>ykqf@71?FhbwvGb65{MQ) zMh$HEy=G+qf^6VPmi7j5R+DY^);7|Q(l9MA(IJA_d?vDjlUz>DDD*ci@V}wRf-w7W zQ8(N8BiLmaBIOi{lS?PGB1V)jdf+kwwbWdHnmc1`s8!VRS79IZz!!kDV+E_HPlS8+ z7Md-5m2=&YdB#o@3xS2N%6Y@C7K_RBF~-~JSHXs7(LGdC+c6o(*LkcDPd|j(5$rgw zoG}@V-`sO?v4_GzuB2F1y<}NGkfWgEb(VL45p}k$t z#3eaH*w36xSQTE;J=yP2RMqyXq$dy+aF!0YbT9Ugkx(U#uNV$D<;fsWgV@I0Y-e)! zem?iQ6(Z_W6EnXxAS1WZe_`lq2l#9cL~4 zfgL;7-ujw&dW-GOd^|)J$hGV8HrGvuams=H0-0{Js=a8=;&f5!ri-FBf?d-G84xms zf>cpA`!IB>xXGmBNT6#^WBKNPG?3k6=n%2P#+IQbaHkn{+DB8vwf?sF;M$t!L~FXs z%}3qRQr9r!w|d2-EhbQljZ6=%&Dy_$$}yTW6|UG``n&06{k}HPt@S~wrFZmq0yRZy zqWB53-EtQ>SOR?5(pULgZf=AcO>nNhnOgtb*Xiwwy1{&O?rJ4t z$Jzt!f5{@+A2&jkR{DzW=8TbKFc=H{sivC*<7@kS=CRf!tu^a72RpsPe2P#Ij@y4j z$aNf-l3ZKJQUv%PN~;1`JK7lNc*sjaU{;1}%!*me@{fcM%6mnc+K~o~{Y#%BxwykX zWJtkHBj#_8r*8jiA*KH;)C?@-#xxbK)+*=+?wiLwS`+7x)ZgTQ2{{p?#1{11np*n$ z`u-0~kVr`w`s$K$?5bT0pH2K9#ZafgVhlw~Zr)!^|Hn>!?Sxag0qbM$u2C8m3u}$4 zh+ViNk`S04^dEjhIn|60q$1Jg_CI{4`RH%r!vW}`fw_;>pClQsd*wT8Zv!-@qE{h- zb5SBT=D*+Dy0V!(XaDy<47Iqe44x%N3UvZlbZ&=;>UkpScW06+zs$r2$cNN!Yo1>p z89;3KU_5!zdFV4jx6(D8B1EFb^r|n7O7eHSZw0>jx}zcPz#9+w0d1d%@_AWU(DMGG zi}TiC(IdAqsE7XNImNHPR9`3WBS7HEcUOov?(-}N4&QvE=9|Q{h0j~Ru?Wd&;3k1Q z(6|C74f_|@R9ar96`%h87PZId$i-HQ@REQ%H1#36n65gZduq`|d-;|~d(Ub_=fePs z=}sbyYj5#H9eBLNWy1?mzO@m0iZL)=Opmh>)S2;7$$q3I5bno@Y2zDfUVKg2J^vax_PA<(EdI z1%gcV$cp~8ozR(*YT9wBf0Yc^p6M}~7>jA;l&-b2pUa^To$iBDrn4k(obbIH{WbM& zD|-|suNz#;6Dc{)+DJzZmdY%T#Es z6g%5H8^&}EDllFizw5(4#Q_zfSRr_mgP)NKwCcD^@ZOEo&LRo93nrOQT2j5pv8|0! z`5aEpj8gWAb0$%(BSZ*>lvaiCubqKH7rF(}BQsD4Pq%lOa!|PJQ8q9%;Nj{@fZqeu z-wwq48u8~aV07`Btd0iAdDt6tykGsA^C+Dz=Ut{Vd9jmG$d_(dwbv-eg6?%^G$)n)f!CYBR%xH}!3Z%$>|hTy(zfv67P zC=Jy`7OexrM_>5*PWD-8J+JMVJ^agGk2GrVpJ}x&8yjI|vD5;m zA2NMg1{=L4t~pLw+7AF{JF4}BHhK_5?Omg$aK=JM(Hx6K5rm$LbJS$~l!s0?`GN|Z z-i_Tzk+l#O+)Pf9jCCqq_VpQ?BR2UaVoZ9}eO-IVNTM0xDwDT}@ZP9INvSl>^(*fz zZ{gb-(2L>O3>Lt4Hu_YsnLY&Q%4#j>d1?tNwr|ca7K!Noc{_8unyc9R}?P$H?!`<^OKGN%{Cm+-33Uq&Uu*aj}4 zuQ_4~AnXMx#*qCR_(->3X}K-d`{KC0w-z35S)LnQVS030N`f8C zm^K*Z?v5=0bs8OWmI~0LriGW3=dvEF4F>qfd^VbGDfO~vpK=)BPm;bI>nCqQuDPZo zBq*{+DQH)SW(zV-aD#9|N|!)f3Jk}BrKpY65YV-O#qZhFpK3HWrUab7y7)d3Q}FYZ z>BZ^SOjvSwv?;MuRM!`_1L#7;rK`Z~2->9^Z8#V1_$b;(<~WuwMR|fyV^;@?I*Meg z4wW=Li=2H>MXh(t3-^EJ(Nsu1PDc}*1xx0eL3*%`^mekF(0P8=bHZW3CbB;3N2>20 z;mu(75^yTTZLulwZHrtezO}#>$;tURzM7EIq+}&!)R;ACd&Lg#%`Z&EwC#Pyoa!a7 z@VPNVMPd-j`xD0%0llW3{8t`9Oq-GNZd8k5N2o{WD?`Y_7}ixs%g!tSpO*A$mrjms zlO$wB&hGS?nAG1aN1JEh>|pXru03phm@>-a`TshLxaCDrA* z)6d0oA+aQNjA8fmo7|etK+sU)v?h(~5%YWJ2q&Eq6egB|+_2ekv7O9nx;7&-U(kJ7kh0c(Rk&aXEtn$FmpzE|r zI{s39UMg>vFg=Jt0{bUWsu)bwR!qf=2EJD(wC>Vk*1rM@d-nPsDml=UqsJKoG5x&@6J0~ zS`^mzKc<%Y++frE0+PA1sf`)fRf6Xd7Oi}Hg{{mOhaFptdqSR5#zKnlVEhZM3wC;9 z3N&&g$%=`95J)Cv5b@sr{ynR|){8L3%D;*#Z5OsYw=;Lf?Gp@q2YW0VBHlzR-76v% ze;%Vb>!UDt9s;axh2D-l$sVsB;ZVp!e%2@u-(gQeWIQyyF=UJa$rnYqP4M-n=uG;f z*`vPAXWHrlX}X`Gd-7xF^2D)!;54xwZ^w+FiHqOEYvrz&5uk%L-WOx~Sl@l?bLr)D zRx1Uzn4E{RaIhob`jvH-zHN$bNs=?2!U|w5jV4+S55TDd}B80eC^gO76g}YY*Ceq9XYaPXT-G9aLVBHT3qw)#V<0@zc(k7`;^M*vBY!{wA%P#H3Ma+L3fduJzI!l=o&P;{ogxL{pVFCqF0jG6Inuc!+ z(083o=&w`DN_q>fy(le263t^zqsv3~8ASJR&pqOE-z#-akisdy8(zqF*-#wtroueE z_3(E9P_2GtikaqJQ8rIP&-qZs1`ZWnNa;%XiDI7Mzdl1~hn)H=09n9E>=-<6fjwN5 zIvW1kVz|x1sObu@Nf6>ohPva{oCF2e6IrE;QpM(?<|82;$X@G9T2Jzd#Hy!XM;e9C zz4bPjyL`YZ)$eItt(C4BC~~VRDZcAm3Mw1>%h0enT3Pg>sr34C$7_%yoJ;vM&yMt_ z$wc)>u!QoN=o^i9-+3D$|Az%Iu2bE)2bs-S-9R`{8nB;*(0!)Zr}@#Q|6Y(VG&C`W zbe$inf@o0lqBHgGeFqqXXCblSi_BQz4W-!C6X=Ls|~4-!H~_v%n|W+O#7yN;SI z3oV%pI}5D`xc_x49@I;`IsZvlAvf#FRnkN<#LCW8jmFX{-4(gF2>$jTs=&A|aeo{3 zwa7ocR3y9+z{9B+iS_RSLWr~<*IcfS1v3dV7@b7SjWN3GF_nc=7dSWn1N$el<)9A! z2~th=&Nps^%=!BGJg?x4{n~C=*7^()?r+MZ@Ho`Wo9Dz!`ajNeEx|1K({I#(LXEHK zpO))r)Ag;P;^?n~4nC54k>wiG&imw(&FYH^AHR1jdcjgY>i50?v>4a%o2y{q?dnp$ z?Z^xZJrXzR6B+}~1RrP&pv-A_&ngGBJEi;{baag*tZr|jcr|4BAB=WcZ0<@`W-sRG zP|pPLMAY_b_R6j5H2=NO=>+A8-#DekA-l3c+yJBY&Y)U=!Nu6B@5&mpeuclYW}=iF zN0<_%lvr@{b%B7>s7kZYZMyPz`+}=0r)M>pCCPT=U|}$`PG+2x$vpDcD9RPbx{Ywg zT=5t7N1(odBfrYjgfq#rbzCz$DyPT1(;7wiF*w6)6`G*RTZIB1Ika_kA*t&n>mDZ} z_B~e(b-O3u2&ewSc?X|E!<3+of=tb>*PlB470ku;GgW7|o3;X7FLs_9o375E8wvJ{vH0dqJQ}S5h0|Brb=$XhHv6;)1@N53@i;O) zY$yjCylL0iTemnpo0ilj;6ykoo9<3e)n>)=D>;Ji%0~q!1*e#-vhst~|LEg@u;L}X z%ye~lFWZG+%AES_n#RCVF75U!bQ|8z!7c*%Pz&*B?zM7Sq^4kozjz3=L`n~8y8d!!fEL9Qm!e2c6?5E% zbqQmPdQ$Q|hiqKMG`?WESBd)&enm^-n|U=b?y{WJo@@=_g<&aOH3V*uxCDC5+)IMb zaR3+&Cw?H`kSbp5DA!ujFBvtmP~N<^hMRKC@@o+Kq^{pW2LRhqBjN2IoaciBrXZ|!YxA>E*;)TRhJJAlKd943XSsCY9q z0u@J_8HaIf5Oc;$L|cvtoqUJTu%JUP#s3CAg5uFy6u(_<$8a$MH!~0gH^_-MaTKPW zj4=e6Df)Q*C-6$D%t+F@BskL3E}$R#3Zpk*o0JKrF|x4@Q^vP7qMTPhozK@|;4x6) zFB@g(T(dU)cB$hEkRwVQq%t_n{X>gC7(|z!L%n$GO4F2O+r5`p{P+Iq)M`zi+`e7g zvx5}Ox_S_ZP9mNX!%vP{nhJ<_ zB{Le`d-y}31-^QZ#4+NO;VM}Mqz75S&#;x-{G=<(edU2t25-xla~cA5u_0k{q=Tr0 z@r3Fkgp(d<&zaPV^PSA$p(!v8vpQjh5kZh!zv>Ha)Kpi5rPaFMt_U(x_1KpRwq~1Nuw^P zU*7KPHJQqCb&VFTd%UbobdM#Wcbj1r-faO%eZg$#CG^&N6W5F{dYdm<&dv1JbVEN6 z3@BafpGt2o_Z=BH_mZE*>I*@z0`Cx}$=vw)5$}TMsip#bcy3SGBAx6aoSr@9fMori z{n#0LC>%SG_2<>Q8I|R^AA3Xh=_~H&(Rx$vYdKhBID<68{(O@anY8zO&+&s~`hF^V z^Gb{*!ZyvXsDD^&c!o=R&Ey&mn~}DqP)9=w@V{O%iaQCtbNrS3`E z*>$+BF3;D}aZ3B{6l?_MH}53XmEM_f1x79AnI{oKN?9&m8c}lKh}Q!oqrs*z!jez_ z1crXW6IJA|xl+>aGtxgf6WslS<1Cw8{B=m_X7}u%;)$s2@Z@EAojJ}_DnOZ;Ihsch ze4o%^Uy{e?s9N8q_AD5F$c31Lty<}ZG(e^Jh7+ce)8AGxBvvGC|FV1A*ev#1n4O+E zXxi5x=xlxXx7Gg6EN`Y2_dV^23Jp6s?M@i5PAkjQ%%BkiI0a2gdz2fJ@1GRa%QaT) z;rq12LZtQYd;|9jVF5LevKyRFcij4Ub$LF2jD`gF)dc_DI1 zI{=1mJQVkBB=iR0PXX=Q39ib+*Wm2g-=$CBCTcScy|{j>QgG1M@3Z%U4Huf`dI^MK zO&SfL|5!06duO1eg4h^Oc1v+;<a`jzxz91^5WXROIn&;I*&Yi^TGcCdrHzd diff --git a/docs/assets/ai-resource-3.png b/docs/assets/ai-resource-3.png deleted file mode 100644 index 7d4216f586ccd384a2082491183cbce5b69238fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27874 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 NNd708pvvCM{{m^>vN8Yw diff --git a/docs/workshop.md b/docs/workshop.md deleted file mode 100644 index 7a92925..0000000 --- a/docs/workshop.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -published: false # Optional. Set to true to publish the workshop (default: false) -type: workshop # Required. -title: Full workshop title # Required. Full title of the workshop -short_title: Short title for header # Optional. Short title displayed in the header -description: This is a workshop for... # Required. -level: beginner # Required. Can be 'beginner', 'intermediate' or 'advanced' -authors: # Required. You can add as many authors as needed - - Name -contacts: # Required. Must match the number of authors - - Author's email, Twitter... -duration_minutes: 20 # Required. Estimated duration in minutes -tags: javascript, api, node.js # Required. Tags for filtering and searching -#banner_url: assets/banner.jpg # Optional. Should be a 1280x640px image -#video_url: https://youtube.com/link # Optional. Link to a video of the workshop -#audience: students # Optional. Audience of the workshop (students, pro devs, etc.) -#wt_id: # Optional. Set advocacy tracking code for supported links -#oc_id: # Optional. Set marketing tracking code for supported links -#navigation_levels: 2 # Optional. Number of levels displayed in the side menu (default: 2) -#sections_title: # Optional. Override titles for each section to be displayed in the side bar -# - Section 1 title -# - Section 2 title ---- - -# Workshop Title - -Content for first section - ---- - -## Second section - -Content for second section diff --git a/infra/main.bicep b/infra/main.bicep index b9baee6..f4e2aef 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -117,7 +117,7 @@ var _logAnalyticsName = !empty(logAnalyticsWorkspaceName) ? logAnalyticsWorkspac var _applicationInsightsName = !empty(applicationInsightsName) ? applicationInsightsName : take('${abbreviations.insightsComponents}${environmentName}', 255) var _applicationInsightsDashboardName = !empty(applicationInsightsDashboardName) ? applicationInsightsDashboardName : take('${abbreviations.portalDashboards}${environmentName}', 160) var _quarkusContainerAppName = !empty(quarkusContainerAppName) ? quarkusContainerAppName : take('${abbreviations.appContainerApps}quarkus-${environmentName}', 32) -var _springBootContainerAppName = !empty(springBootContainerAppName) ? springBootContainerAppName : take('${abbreviations.appContainerApps}spring-book-${environmentName}', 32) +var _springBootContainerAppName = !empty(springBootContainerAppName) ? springBootContainerAppName : take('${abbreviations.appContainerApps}spring-boot-${environmentName}', 32) var _postgresFlexibleServerName = !empty(postgresFlexibleServerName) ? postgresFlexibleServerName : take(toLower('${abbreviations.dBforPostgreSQLServers}${take(environmentName, 44)}-${resourceToken}'), 63) var _keyVaultName = !empty(keyVaultName) ? keyVaultName : take('${abbreviations.keyVaultVaults}${take(alphaNumericEnvironmentName, 8)}${resourceToken}', 24) var _keyVaultSecrets = [ diff --git a/scripts/docker-compose/docker-compose.yml b/scripts/docker-compose/docker-compose.yml deleted file mode 100644 index 5e81c0b..0000000 --- a/scripts/docker-compose/docker-compose.yml +++ /dev/null @@ -1,11 +0,0 @@ -version: "2" -services: - - database: - image: postgres:latest - environment: - POSTGRES_PASSWORD: changeit - POSTGRES_USER: pguser - POSTGRES_DB: test - ports: - - '5432:5432' diff --git a/scripts/repo/create-github-template.sh b/scripts/repo/create-github-template.sh deleted file mode 100755 index 1a949df..0000000 --- a/scripts/repo/create-github-template.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env bash -############################################################################## -# Usage: ./create-github-template.sh [--local] -# Creates the project template and push it to GitHub. -############################################################################## - -set -euo pipefail -cd "$(dirname "${BASH_SOURCE[0]}")" -cd ../.. - -GITHUB_REPOSITORY=${GITHUB_REPOSITORY:-} -TEMPLATE_HOME=/tmp/moaw-template - -if [[ -z "${GITHUB_REPOSITORY}" ]]; then - TEMPLATE_REPO=$(git remote get-url origin) -else - TEMPLATE_REPO=https://x-access-token:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git -fi - -echo "Preparing GitHub project template..." -echo "(temp folder: $TEMPLATE_HOME)" -rm -rf "$TEMPLATE_HOME" - -# Clone the template repo and start from the base branch to keep -# the contributors history in the main branch we'll overwrite -git clone "$TEMPLATE_REPO" "$TEMPLATE_HOME" -pushd "$TEMPLATE_HOME" -git reset --hard origin/base -git checkout -b main -popd - -find . -type d -not -path '*node_modules*' -not -path '*.git/*' -not -path '*/dist' -not -path '*dist/*' -exec mkdir -p '{}' "$TEMPLATE_HOME/{}" ';' -find . -type f -not -path '*node_modules*' -not -path '*.git/*' -not -path '*dist/*' -not -path '*/.DS_Store' -exec cp -r '{}' "$TEMPLATE_HOME/{}" ';' -cd "$TEMPLATE_HOME" - -############################################################################## -# TODO: Prepare the project template -############################################################################## - -# Remove unnecessary files -rm -rf node_modules -rm -rf .github -rm -rf TODO -rm -rf package-lock.json -rm -rf scripts/repo -rm -rf docs -rm -rf .azure -rm -rf .env -rm -rf ./*.env - -# Prepare files -echo -e "console.log('hello world!')" > index.js - -############################################################################## - -# Prepare the commit -git add . -git commit -m "chore: prepare project template" - -if [[ ${1-} == "--local" ]] || [[ -z "${GITHUB_REPOSITORY}" ]]; then - echo "Local mode: skipping GitHub push." - open "$TEMPLATE_HOME" -else - # Update git repo - git push -u origin main --force - - rm -rf "$TEMPLATE_HOME" -fi - -echo "Successfully updated project template." diff --git a/scripts/repo/create-packages.sh b/scripts/repo/create-packages.sh deleted file mode 100755 index dda939e..0000000 --- a/scripts/repo/create-packages.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env bash -############################################################################## -# Usage: ./create-packages.sh -# Creates packages for skippable sections of the workshop -############################################################################## - -set -euo pipefail -cd "$(dirname "${BASH_SOURCE[0]}")/../.." - -target_folder=dist - -rm -rf "$target_folder" -mkdir -p "$target_folder" - -copyFolder() { - local src="$1" - local dest="$target_folder/${2:-}" - find "$src" -type d -not -path '*node_modules*' -not -path '*/.git' -not -path '*.git/*' -not -path '*/dist' -not -path '*dist/*' -exec mkdir -p '{}' "$dest/{}" ';' - find "$src" -type f -not -path '*node_modules*' -not -path '*.git/*' -not -path '*dist/*' -not -path '*/.DS_Store' -exec cp -r '{}' "$dest/{}" ';' -} - -makeArchive() { - local src="$1" - local name="${2:-$src}" - local archive="$name.tar.gz" - local cwd="${3:-}" - echo "Creating $archive..." - if [[ -n "$cwd" ]]; then - pushd "$target_folder/$cwd" >/dev/null - tar -czvf "../$archive" "$src" - popd - rm -rf "$target_folder/${cwd:?}" - else - pushd "$target_folder/$cwd" >/dev/null - tar -czvf "$archive" "$src" - popd - rm -rf "$target_folder/${src:?}" - fi -} - -############################################################################## -# TODO: Create as many packages as you need -############################################################################## - -echo "Creating solution package..." -copyFolder . solution - -rm -rf "$target_folder/solution/.azure" -rm -rf "$target_folder/solution/.env" -rm -rf "$target_folder/solution/*.env" -rm -rf "$target_folder/solution/docs" -rm -rf "$target_folder/solution/scripts/repo" -rm -rf "$target_folder/solution/.github" - -makeArchive . solution solution From e5fe8b533c1ed3a8546ff081b614b874ef419eac Mon Sep 17 00:00:00 2001 From: Sandra Ahlgrimm Date: Tue, 11 Jun 2024 18:59:14 +0000 Subject: [PATCH 09/15] fix bug, add doc --- README.md | 12 +++++++++++- application-map.png | Bin 0 -> 85610 bytes .../quarkus-telemetry-superhero/Dockerfile | 2 +- code/spring-boot-telemetry/README.md | 8 ++++++-- e2e-transaction.png | Bin 0 -> 167032 bytes infra/app/quarkus.bicep | 2 +- 6 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 application-map.png create mode 100644 e2e-transaction.png diff --git a/README.md b/README.md index 6042b80..ab93412 100644 --- a/README.md +++ b/README.md @@ -11,4 +11,14 @@ Deploy the sample to Azure Container Apps with `azd`. azd provision azd up ``` - \ No newline at end of file + +The Application Map in Azure Application Insights will look like this: + +[!Application Map](application-map.png) + +And give you traces like: + +[!End to End Transaction - Trace](e2e-transaction.png) + +Delete all resources with `azd down` afterwards. + diff --git a/application-map.png b/application-map.png new file mode 100644 index 0000000000000000000000000000000000000000..a23f55f607bb8f81717005be76ab35a97c6c1ff0 GIT binary patch literal 85610 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 L_Hg2#4Q2lYrBGYM literal 0 HcmV?d00001 diff --git a/code/quarkus-telemetry/quarkus-telemetry-superhero/Dockerfile b/code/quarkus-telemetry/quarkus-telemetry-superhero/Dockerfile index afbc021..1aa1311 100644 --- a/code/quarkus-telemetry/quarkus-telemetry-superhero/Dockerfile +++ b/code/quarkus-telemetry/quarkus-telemetry-superhero/Dockerfile @@ -22,7 +22,7 @@ RUN chmod 775 /work /work/application \ && chmod -R "g+rwX" /work \ && chown -R 1001:root /work -EXPOSE 8080 +EXPOSE 8081 USER 1001 CMD ["./application", "-Dquarkus.http.host=0.0.0.0"] diff --git a/code/spring-boot-telemetry/README.md b/code/spring-boot-telemetry/README.md index 9cf400b..14aef7a 100644 --- a/code/spring-boot-telemetry/README.md +++ b/code/spring-boot-telemetry/README.md @@ -2,20 +2,24 @@ ## Start the application locally with docker compose +Run `docker compose up` to start PostgreSQL locally and build the app locally within docker. + + +## Configure the Database Connection + Store the postgresql database connection details in an .env file at 'code/spring-boot-telemetry/.env'. DATABASE_PASSWORD=db_password DATABASE_URL=db_url DATABASE_USERNAME=db_admin -Run `docker compose up` to start PostgreSQL locally and build the app locally within docker. - ## Run the application in a JVM mode ```shell script mvn package cd target java -jar spring-boot-telemetry.jar + ``` ## Run the application with GraalVM native diff --git a/e2e-transaction.png b/e2e-transaction.png new file mode 100644 index 0000000000000000000000000000000000000000..5eb4df77b52099b366890eec5d452db9d599aedd GIT binary patch literal 167032 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

!oT$!_%qX2b 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

{+esN(!+3+{ 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 Q_rS~Zz@e{zHS4*510DFm+yDRo literal 0 HcmV?d00001 diff --git a/infra/app/quarkus.bicep b/infra/app/quarkus.bicep index 8575ba2..1686ef5 100644 --- a/infra/app/quarkus.bicep +++ b/infra/app/quarkus.bicep @@ -109,7 +109,7 @@ module quarkus '../core/host/container-app-upsert.bicep' = { identity: quarkusIdentity.id } ] - targetPort: 8080 + targetPort: 8081 } dependsOn: [ quarkusKeyVaultAccess From 4d404e4e161e303af12c56367b3797833cf9c4a3 Mon Sep 17 00:00:00 2001 From: Sandra Ahlgrimm Date: Tue, 11 Jun 2024 19:18:55 +0000 Subject: [PATCH 10/15] more docs in readme --- README.md | 15 ++++++++++++--- .../application-map.png | Bin .../e2e-transaction.png | Bin images/postman.png | Bin 0 -> 82297 bytes 4 files changed, 12 insertions(+), 3 deletions(-) rename application-map.png => images/application-map.png (100%) rename e2e-transaction.png => images/e2e-transaction.png (100%) create mode 100644 images/postman.png diff --git a/README.md b/README.md index ab93412..b22bab0 100644 --- a/README.md +++ b/README.md @@ -4,21 +4,30 @@ This repository contains code demonstrating how to enable OpenTelemetry features * [Spring Boot](./code/spring-boot-telemetry/README.md) * [Quarkus](./code/quarkus-telemetry/README.md) -Deploy the sample to Azure Container Apps with `azd`. +Setup the infrastructure, and deploy the sample to Azure Container Apps with [azd](https://learn.microsoft.com/azure/developer/azure-developer-cli/). ```bash + # Login to Azure azd auth login --use-device-code + + # Provision the Infrastructure with the Region and ShortCut set for namings azd provision + + # Deploy the apps azd up ``` +Create some traffic, for instance with Postman: +![Postman Traffic](./images/postman.png) + + The Application Map in Azure Application Insights will look like this: -[!Application Map](application-map.png) +![Application Map](./images/application-map.png) And give you traces like: -[!End to End Transaction - Trace](e2e-transaction.png) +![End to End Transaction - Trace](./images/e2e-transaction.png) Delete all resources with `azd down` afterwards. diff --git a/application-map.png b/images/application-map.png similarity index 100% rename from application-map.png rename to images/application-map.png diff --git a/e2e-transaction.png b/images/e2e-transaction.png similarity index 100% rename from e2e-transaction.png rename to images/e2e-transaction.png diff --git a/images/postman.png b/images/postman.png new file mode 100644 index 0000000000000000000000000000000000000000..c3744e52400a59ce8a55d628afd0385fe2142bf7 GIT binary patch literal 82297 zcmb@tWmH>T*EWh2C|<0^p=falTC5Z+?rz0`6DaNlid%7acXzj>6n6;_D8*fZ%g6n^ z&pqDr=R4#4ICG5bWUuUn=B zKAyHU?q`{uxucMDb8{0(O;i4zl;0sLFc4`~MpBB1j4W~>6!$>_jmHB% zo+gea{8{o}E9A10{`d3W{#+8g|5_Yo5b)o2Np`ICf7|ieIRD>HP@OgF|2p`*{_UUZ z$DKn>tfqPjj%g!sD79aHjj)XQ?Ck6v+>(a5<|EF~U&yh<&Rx6MXB6Fwv(ZhEY2h&&z-L6#rioA76M`gvi&cW4Xd`)c{;6^%i_`~wb$&-c(8@NdXkf54oO z3zH^Y3e9fsW<-9lIDm$k4ZDUS+Jx)GbQ{gHz3_77>cMA)qyd%6UN~Rgj?@jJxG+e& za}j$Qog-E8VIuX#n@NqSTDvZuw6lXGR1tKW>KpFQeE@$C0+{5ZCwFb`MEHVY|B8%|$w(uV%esuc zq3pliN)7qq`xn>a^p0*&V@7HRGw!xe-s2Ay3tpEkMG!E6kk@Ly)tl_G?B;JD>j|{0 zJ+>dd5^uM%=0eZl-hnA4T*;C{c0AzgK>+g0zkfuxBo~Xo=doP|sQNRD3dZ7qmaFcO zY5_ITV14`4n$xt zRa6@H;wSZY-^{jDmn>CbV0+c*Qkmzj=Y%h_=Gah5_DQBJnDL#6{kjEuBfH=4aI7+d z60?WsF~{|SJ&)5Xp2FzVA89#M;uTaP;XTS&E>UW_jyD;Gst5h(snMR^wDk=Qb!YZD zm_JRhw(YQZSTUq0`lL5I#5~2XJGxH8>+Hz5N=A)$vj-Rv7Y0^B5Etqin~p-c5}slN zF~#~Ask$O{Ct@H!o4s`6RvkunVsAEcU=S+Mq?7~y1K!E=67kNGE_jjtWId#^)Kv<{ zP9=Er+63 z`y}cTJB3^(DfM`i7FWNm1rnF3*YC@9DB4RnSs&d;H-YW#`AY-fI~@>S|c|)VXnMhF+Qm6HboA59h#K zdZzE%LWn<_;2&>d_D39+Te}zdsbwA`dnr9|{kdzF>FHTH*!w8vfvi^ocS+b#(V)t0#uY1>5mL^{(2x}d@@=|&yAhIyhdUI^>qXW1fsCJ$aU_aH2 zG|z48IsvQuQy`e?@jSM>P$ja=c-`;nE*h00svG2<^RowsXwD$Y=Z~UKB#R^L;>0vx z$kA;;veS0Oz|bV>Y@2{Kx=!BcdGC6&-fhfot)sL*?isRBn<54qqL?la{})0FMex9 zKtb#7yMI3Q)&7<2UpYkC_<5fSY}V+cP6Zz^P@r(DI6Z*Sd}syQFUnJ8ohQ=s_m2jKVKHVcP2JKRoPB^R0u_T zfqI}TJv49?hFoXw_dO4Mc3HEeY^uV;@hv#=Y*b>V?p%X$o(yfG}dlLF#HNZ7?&rgJE!rkE#`&75A7}$d6Z1nTQsl>f~+l;lN z(PY~Y%?wMs$8o&lW-nQMr=&Ty>4AG?MT=qKJT$HQ?sSo=psVM5nvCyd$2I-sjIY%B zusN3Z3P$Ew-vGaGl%Q7c;h9OQfgB=$zSon^+NmUlu=HYg_llg*&;J#~ol0#d4ok@W zJc{(>r;`$eK~AtDhyRZs0fw5ot?4DvkiWwTuKd3lJ=V#O^IK}2mxbbg1#8i zOU0Op+YCqiD3p*&5kebE!e081)tQi}x`_v^r*9NgoBrm9N9#zGk^2HZ#M&fcnbh0+?=CC(6blSzr+l{_B98>9G&1;nCTty1QF&U689$Ypm{qk92YB&iAvPp;eB+ z>`>GlPeQt_#IRECa>=G~b~peSjyk56L;9oefla4*_J$lbx>)D^rWCz3t1UPz+}6@3 zJ-lvaK0mF{?rl?7Ey;;#)fuwr=#!7Y=uOdT{piVc>~Zps(P-fD)M#{C*k0m3KWDMc zILU?YPwRAZcSzN)(KABw)6t0^%zWDV#$4ff#JuzLy2orf`rCH(;A{@g&}0tQ%RHo* zw!u$K_@-pa$|8o6LTmj{51jrd~Ygu<|dqB(E_8kH$G;cp%%9*W6;bsQ&_uTEe6P#-Ej$?1Tsr2#eoVPrJ z*zZJ$Y;=z$dfc99fF*U7Lr9gQqV`wKT}Tq6%2JF04fiFa+Ub78&&wX0#+&KR{!D12 zKb$C=6c2*O3u@F2tL|Lk2yCMlAC7;!33#5SvcHzN&ub-n1`mc4L?2uDq%Gh`*yA3Y z=RP??usSP4$W~d5^QTm_75&j3k_Qq#ZCL%1%fLXk%f%`Oy1fHv_06WVD-$LA%1IyeMF^E54 zTJ6!Tu-hlGA%y(y6h6udwk1inXS!@wc3Y*xk{ccTg8=gRX_DpNXfFg~R8?4g(bZjSA%lE*G&=$!HWW+B%}T z+V*Rj-N3;0>e#>N!wPkoXT!k13$f|}-0%Bp9<*{19|6T_4b!QX?+i-V!zMPaDh|vb{;rO)x7ZFI%fvF*=)5@( zNjC>sYc>$T@gcCX;rL8`8@tkHcpkho+EM#UIk)Cf`H;7_(t+kqkj8yu0tAs6cbhYZ zF7P)?@I%it?nmAAO7uRtK2E)VcaY;XxcJo8o>O^Y^$SA4^>86ZeJ0aYw{d&zVoiMB zJ=o*wD6TfQrq3V*k<*m#V*__TpWEw0^Govm7rh+?cEgkc)1bN)g5t>m4c-SfjF< zw#f)b81r}gSrRy)tvosukux?3dA`QSvHvw+v~jOE$uq`fH8(5pw>o}cQqKkLrnW=aNsZewj=rJ*=%t_@#dXx~q{JG?aIUOeJuQ2vi$jX5kWfDc zfZ|SCrcGF|Zt0L&LiXB=vzPscsO?j`@@!K@a&0raHg>iU=*I+N>t_}!t_llO3B_r-P`e6KiL;}fSe0{#%RfiR`n-1R4asgYFBqd-RS<=nd=!isXfT+Hg^sw>81@T?ojW|_dbdnWEU zIM)4)%OE0xHz6!Y1=L~11^C11D7|fHwk!Pbf}ruypXh94c3d!aJw%-e8yUVMaNUt$tH)Cy zd$`6fkK%LR`-i*~Ql@Usqo2 zo`MYp+U@lIf36IYQ|7&M#o!6Dl$3npeb`7yy#<@EB(&+R@?%rf2MwmZ8=Rf?>XXNZsT)Gl-}Vb1U8Kf6Oq zD_!ztUAx;cfAIMt=5n%R=z3IcARygs*%==8R5aH#Ze;JMr}eV$Yw5}ptCJ{`eH=;6Ocv-) zezx9aF7iqFd-??SGSwAXJUtJc3b_Tdd*9BpVs(R9sAb05K72TTKmvKsJwf|K#F33y zs4}A3NZOCM{c)-X#h!VzuL=9G{Ri*;uV!|89=8zu{iys|(E=Lq8$e<)H@4Iwg^!D% zmG5`*8R|!px=qk4Dy;aJ9XcjE0><%B7%H?Z>Z~DFqv~^wFWSXqt(jc!)rb!vTqo-5 z$A;$QLaX$$G!nAT_YJ4X{Fh#su-jB#0CI%+s^(AKWw!>k%hCr*Xz{$smc1QU|C9yIkZ0cPD zw0UYw8`gheibgo=V)p7S;oE-5C0TXs7tx*s;cVcu)4wc{btOuch0&h)2|3x79kRr} zMU=7z)&`@MCIr%EDv`80LM*>|`}7P#{Ziz6?eHnRt2&{IzCzi#Mp^ndl}o~3Q*IQl+uMP zE(Lu|yEdk62o4#mTNIXOq_KfQR^zu(p7$x$e2^6vHUUVdMZ0ppmu*o^{=@_p>)Npo z!5(JLx|{wzD1dDU*_$hji0v{bSL%J8tbJMYr_Q4Ol;3NKq@Uy28eFng6_QK zi!n00tg*U~u0@1Kh&%pvL7%Vp73-5@9lY^6#2)l~jqXd_>o!n8-fFs-3x5*spNd6y zEU5-NsUBWd+(EC1BNZ09N%kvO=Y;Jwe(AAlwWmH}hkPLk&TDqduLZGjM}^*39J}y6 zWphv8b#LEH{h9=66!ywJw$?8%e0iCtlmI(-aZR&inoVKN z^V!*m3D63J%$+UbtV+8{bWn_t^ZxqG4oW?+Zw}hdRK95JuxA>6`eB52A}Ap#>5!D? zrmL$)FDfdUd5wjq$`$n=VDl~44VfA+ajKH&&tOr#ap&LuM5v_y^VgUwQElf z;-jf61ao5BCgUs;e{PPEekOv?E8RmmFY3;%Exn2b{a0y6E?w9iR6%!*(L3p}mC*dw z@Ky?Ek-az@(PqDm%odXp-`4A+Y|)WuuG9u6nm?l7a4~GylT@+elmG-aw3Nw9D%1z~OCLC!d)TM71S4e5N`nbLJMFQ?lMQh@p_*%>ImsyK=OTjb;NoEaSJkk@%o66 zfADe&;3TW`+UWFqlrcvHTUc6z?1fy(*nVQD(a>PVAH<$;9$uA#m^0XLgMjT@fw@;# z4?T6nLM+Vwl-=gUJhaRxOcH)E$pj;(I)z zHIy@FwwVlo%oP>bRJ)G$j;O;h&%vXFQQQ^oTDy9QFVMZ}9%m2`Jfl}O$L<^<-UB_B z;@4-pb5xlub;Pbeht8*FrD3v4)PT+>8?Gw6u>)xZ^x(%=!_eJOpfa?vk)! zcg|jM(Fg*UbtlbpHR%|ci=k#x3+B1DEWn()O*Zy&Y*{v`#YYqptN&f$I)!N$Q z$OG%L|u+Vm^y(CC@91$x4;Im+}b5Y!4-#qAB?`(@c% zS;?X_snDo!6b1AZ`ugaM>4L6$7W6_a$R+>pp^yW_b7sF@g?|_!4Z(l5L|Qz7KuL{< zT#`63tdA<5;LVh<(r=~Z&x|zxTJ%c-{A=$}$HM+KgO|Ym+y2eug}nH${rZPt`PcqG zolqp_I)6TB)=|7B?hG%W@|AXhU{l_Ik>HlTBG&Cx$ z|NkV!{>!2L-x#!{&q>UhmnDtRtlTC18Asvt1;+wg0&6y%ejkPQ>e@ahJ z&tIdXgV`e9F4jYHtxjfygoL}I|M5!1kHJ^_^HpT3KLeOk`ujgWmife)-5oA92>3m; zvY$;bTFp1vY7Y(#ZFHP;OE@@Gd;Ma_j}Q-B|K{g@yrP>0%iy!0mSAT1Zzv+9v&n4c zE6eV~9$0F`0V6|^@0>1oRabXL;jbcVFbJD6Y5_vfbk0&8fq09vQl|*%jVW&0o;M+LCe-2%em19t~P%V(g zejHArwPKhumtCUCk5C?W72FB`PwWpDLr63k;`2$uUcNq}s7oeM-J;(4XnZODKTiFd zL;Jr}q~uFx|6{6nMMXt>$}e2V(&g@ygnxPK|1GcnNt4bUUc?uM6w>K=@scB&E<}%+ zp#P=}tZ3nd%KTfo7?H`*yoXOilYg!_4VamkaW&pjYXB;)xIyiA7wgP)IJET|t?-gL zjH~a%emDR4@#-=B1E=i7!=FeF7vtOHl#~)N!55NMBRpwP5LT%RxI9?ERZQpU>kC4w zvzcQi7jXQ9%Vuc7W;MT+!k-6UH_{QarbK?3B5&#JjAuEG@h>%g$K$b` zEydGowkx}j0K&R`1-|_aJ7!7$Bn~LH#8;hl*_%d*6?+oECm_)5tu*X#BNp=${^+`2 z2q|6Rdxq2gQ#UWudB_#->GsrUXqZ9O-FG(d=kY8dO~xMYZw>bFj*-95LdUHVk4kDo zsxMLhyS+_AON*SAmWC*FAGCtaztWq+_y%u@2efAJ=zq9aN8?H(Dr)p-jIT2jRf-?E zEofXMN2HL>gHFb0*ZX|$|2(120DCXqP?F=Pmy}c-UuvCvwI}&l=E0sR6w6ES928{B z?TU_vm-J5TaZg#3bF`f6@~~mT6dXmu{K?cQW!2|mtlVw+sZ#fUQ46 zkvBJ+u~W4s5a5L3RBkrLm!N3HKATu z?&%=ykO#5cf#x^=HYQ*C7Nt50HRO{>?jkXU@$?d;Z2;9t%}A%TLV^j%^iNYewT(kx zA-~0%I#<89*k7)PCHE+kldoz_n!UTvy9%TC6AHp_kG*0t%bS;Gv}46__q}ALpm+`sKszMf(KZ^-BT#OOFUBi?er~K8zhQ zayU5@Z;t;*9Uv9_>X+nPInjOnxBoDq=iRFnJ9-9nUzC`X97hWSMPt6I;mjA8(E9qu z9M`;FIUtP0DYO0({u!(4>pgd23CF;d{A`rb+z*zxWH*tI3kxVFR+HE4Q3nOyaw{~I zYpPZcIbqc;Z6L>x0(VpFTt^nI6t&=_);low4~LeF53HfMRNz!DGmRteiUjKLM5ye# z-B1J(vEVmz^D;UL2S`G*r`Y{rLTgtLrL;xJEUV9-aK_nZH?@PqmY&BdQiiOqw|Z7b zj`s-@e};1!XC9S~{LbmJeb3#@Di2O`$;ogHOF|Q=b2e4oi_TVwe!1cfyLnG8Iup$j zfXc)OeFPqH48QUtf_$Ie8?_r=zYWgrX<*qFZW1aUp%TmoaA4%j@+IimYPEP@JBYlB z`Q~j|WSLxODzX~$RB^T*C;BcSFmrEPV1`TYI+TMbVY|@mSiP(rW|~~`JSPJAv>D0) zFKhdf0~k&vz>|_&<{X)rfWQ}wYve~SN6A2)s)nQH9#W2TjUB3DOiI^?B8*SOPXA1~ zjE~_iSyY{fRWn{6f2Uu`UHTkfl;lu5=}>8uz0E=}6PHH)W||PEc2yyu8eSIMY#+UO zZpG)eeUPs*o;{>HnD-nO`m-`pZaIH0?PslS|CYr1>x?2-srbQBw@NULp~m#~;}Z@R zl_)8PPcdfL%lJWe>~MFv=Lgz;$6*u&>Uq?96b+$=iwg^tQ@C|Ipc-ggt5T8@)r^@l z^ShZIU2T>wyhnK<&)mQue-Uz6_dKyJlTnh{W>S%tjx02KX#T9Uec{wKNSsLM^V*UJw5jKEiX`M^)g1ehGP1LX^93#| z(umyx_ui)B;hj}TPzYbxi!TSHKop#3E&QfGj3sJ-c1r0Pn98`RnmXqN=DjdruJLm* z%5i6h2bRX{*TPuy*QL+V8}*r5X_Qh`p?1i&+4XPes_(PwhXYKOrNx-2q+N~@1*VE9b`o9{RlEjuIJ zy>iRXlELV1hz-1~qRZIFRWapWk%0OKIWA=5V79E_KCq+O+4k!M^Jo))Q1hW?ryin% z=fOfvY|i7MWmq)!gYEkPx-G6n0gK>9L*NOW;>?<{hEUI1_$Hk0Q!yqh{+9}O1MHql zH`8N)^4GKMdE!A*OLHcjP}dIADQ`Mt9zwk;y{5@_S6gLE5M=bF8k(oaYaQn5nrJa# z_#){P&)R-`&(NdtsM+=*d5fIWPmxUUxtzOLD1KHrBQNREi*-xjy9kkphH_FmkKOab z#YBO4P;aaX_hH*kHs(hq*`-cTK(SI*gxzMJ;j%!2bi9Rbv)xiYq!giCV~Q%1ZuQ*7 z=)DpJ`=_UIgUrR8(EctN$K$`cyoV1=7n+x${Kw#p8h4WsSW2#^jiu&WB0<}_t9u=WD5_XOqD1E2D~mmyWK{&89xZJB?Qt&F#aLgII;*9Xt4Y(* z8Vfs|=5i32J^T4A#r}r|8PV3SQ$}s?G({B#bTifDOKN7k~9WL?IM5?99TP>g3 z*Ya+>k|*rr!MK*>Eh;dw@Y8LgplZYM^&qje&<$EfGnBi{x*fa)QJp|V zPp&VmPl&?$KP+-1%&z-3!Li<%7k-OF3K#Vs_3hu56>Y0uKomAFX5&>iJxXFLuN2OH zQLPk;%%V~GOoCJtC{xW-Uo8|~dFiGkCjQ<1JA`ocM3azi4mrp(#NAP)euT%!EAq_k zFhal>Hhf z)z|XccWpl5+^Lz-Ji2Ib^2_lR>4Hv)##pA!af^JXghz$mWSFPAuk}p~h+9Q_?Q+S5 zq``I+tKi?p2Yf~KcB-9wlD7r*2`i43WZdjPD<}MlGY&{=YD~#m*U74C8rz*~UVm^p zFZ0~9K_Yo*6|+j$4^`GtvDF*Qh8F`VoZ?0H%j!x&91Xmy6jvH*GT0mkLPr-|J0`_p z`}O`E&4WiA8xj*Y)r2~>OB9_Wc--t5ja(XJ&fy%+yXrXaPR=nu^s6QB!nV2Df$zPlcy?mI{+TcoU z)!-P`Lv^t;p$&?UZ?V!!Y*fJAMD6)s#(P3jz4t=&4|SC93>`gQ2~Kc^%)9JNxNY3# zYwk8eJAQ}CuD;sL6X)-D@Ha+L#R&J;MAXd|&J#CvWBN2#_gyL*`8P3Nq(hvapme)Q z>li$OTa~=Yy1p-ub=5f&nr#(AVqK?x4}W(__LKB&j1JWC{XwGY_nWs@Af`_tXRl1y z!?Qt)2i87gTf<xmGnQl;3?5#*Uqk-n;WU;GZ z=4wi`?~aRZE5^G&!Pnf5&C=WzsDcKtNZ zln#cm_2sL;EPY1S{m@ID_>eCsDP!MRc86#`2~axoWr$m=3v9Lq-x<{m@)%-{&SUc( zi*)tpXwRR&;{-L_mJFo|If#Qc>-}7|E<8?SYu206YQ9e22rimq#TY;IB)#Ivg6gCg(0h^YUG2mYC_hkUD z?-r~)54F{*om&GSL4mNpFyKU=8D$5tvNZH-iUOm`$L%1gQS%=`}yP>r{+)7 z$P{jWcn^rZO}Wm!MAlzt4hsa4`W#X06uh<_C)t6_rB;-zMtgxDa(u6B$fuabBClsJ zvI$V(zA?_l?@`+VwYg(sV7eo;7oDrZ9L*C$fcOX-@|X^>_>GBOz1+U>0qyAeA#k&B zOwAnkt^6<#vdPsJ_k;{ASLYzZ0qx1wcfzSa?0g-#mmcW7HX&_S!z1%)SRBP;`ulZP zSu#frD3C|{4YQg(sEaDqVyvcjcj3a@4NyPz*07Q~-6J1!`E8}dUBinqvAN~U=P4w8 zVayDM?w>|4FlW&~3Gqj$JE}6Q)y4KFIlx#Zy|^LAh z*!ZE)@_4YYD6QK%v0QrbEh{wderVc4w2vMAt*bItqLv^5%p7s-Pt}?FR5_O;wPkTy zJBg*?a@5H&VNkz;ZvX{=VlURMKiPUMG37Q?opWu@=tadK4z9_->RHu6GqmE`<}wQO z0}F$HgEIHUzTbNJSz~7MTAJR)$XrLyUn>qRgC!^e>Sk?8my#_-xd}qO0-b=pb|2EK zvdcrsMr_B7kbp6+X|c#)ch8cd-;zc__ZhGUX_N^%0S0mINFTqA;CHi}B#e_R&hjrv z(A=!CIErxs_7scUuQTM>a zY2c=GIPC{51g39cU96+IX?2}&xG+VO=k|fc>FI@t!_&MBhixuAT*tt+vDyjAyB?_| z5Jmk4rd?|V(H(TT6^rUvqu@J;0Deoe_90^M3Y5gnOW{dS5kkeTMapo?K_R8fOF1j# zZI#EjIlRY@yvm*nXbjjTHb%C*w(I}QD;AWLzf_%q@d|#DR%nxNQK@Hg8GP4m&Xa)F z@tCHw-X_C5*l%|)&)ZJ|VVk}7BH9MNw+(F=ab2ki7OMIDcQ|Cyt4WblU1Nb%SueRi z_*Z<7&}=v_rFhvnH?&;M8l=`R2zRUrfiBm@Yjka9uS3-AR?URX-LFK|599>3tQNqv98a1Y>}Yzz+J3pMIuB9ynHJ7jd%yC?TdH>IhnRC+eY)H!ZMv$Q`|m{W1q+a7 zsxKErBDcoyl=yx^^&?A<{jZKXCn+}_)Ez;nJB41!z*ek7y z#4BWV9n(&+Y+vEyi~Jh35WK~24L0(+Sru8;fpCz=GQGFuA-8z}dV0mxT=CZn_FVgS zC+7;g({E9rS{oFrCoE(mbUMYsJ)=usu3r@wQ~UZNnvw}UEr%RlpKyhQxu5>BTvGd! z1w5wJ0kYaAY;UIzU-vf~%?lqL&|H@u07dc_q$V1ioQr?GRdvzJ%RXbDr$HGI?m;O_ zbuq-}PEiU35N?-bakI1nJ46?cc#b7SHjPsvl;D7~F)TBs98g_R@G=wt=;?5TSHyf; z95o)70X`~yX)<=Me|wKQ^5a!`2=PcyFOkBC*q^S{iPXR3$-FSEYNnAWle8GOg=7(t z`IqsYIQ4FpnvP@!_SEQZJLa>z;#Lq^gz)kZhP!LOqbbYiC??f>tF^A+z)t^9sAYo_ zCtgsu4s*nY_iD_uhKuW40Ul}l2$_VKrnNGfxTAkbvx4?=I>@_dU553_*lukPLK5sOBn*|+Fd z+0o)P9aNtK*{v?l3t{qG{;6~t$ez4rremD_bbLjxLxaeSUT6p< zLWf6#7O(OIsiaD*=D9*(vsB3OX5R-gYJaU!`~N&qXU_~4QA$!7QQo)spP^OaSbLM} ziGTc9-k->3AoZOl`Lt0|V+T=XL(hkj52Mlp#sdpK^(?EGzcO1Wpjk=7KZzK!Ci}IJ zofeK5hQ?G?^401U#4!$yLa}X7UTWc0fuF{rZRT)uJrYn&sG{@L=pbW`Prl9a{eiho zUFovP+V^6)v6Y57vQro9g~q({0Qh%%SUMzx7BBji-m_#fZ&V23LclAsNCW{mixw~JJa|7PKS)-5onnp2Work3J zRIECB5`6@(zH28091^&LkPQ96YCDn9k`a@^mPNAs|tIKN1V zYnOSQU#*S4Lm~g=G~vV;^B0n<>b+`vI;-Hk`vZ+iu`d9nJtR#^P3oZJYv8@&#V^42BcGoy2J?1KXKbw#D-Kyh5D8lue$b^_Fn%7wCG{G$qaPtQw0qAzlxCSF`?>r51V zhapN)vm+Y1+w~WN>{gSzwog{jNERbWzwCYk#FPG|F-ubIrXy&>|I)#Q=mahq zr5`sQl*+Lno&i%^PrjiegTk%A_!J5la9__4KLuPHB(bgrdrdh%seKapXSj)iW9d(A zH$8oyCFE(Aji`F8Pwo3+XY*jJle-*KP%j?{JilkL_q;nWUvynqdj6)bp=EXepWKvo z_A57}yNB``Ka<9ACdf_A@~Uds6wje14=ZpvyB1xcN^^Lo1-=^pi}=N6Ouly%29+7% z_P)2!Vyv&P*U%QeB2)zMI$yiLznXE<|6Ncrv-jhhLFuw45Ss=4r|fs>G2=PY3xY$8 zP;#@YPr3q#bp>r}5$HwzkK4)(EaM}*pR+?ZKERJues7Bg@)t_aHa!_*tdp%Xn=nhM zF9@r@h(C0QHlW<{zG+Q?a1L+eU__*ltvC&YxP$JwEK&RJHMwQB7jz}TYd(>WT{&Ag zyj-&)U$a7MceSGhqdCbu9hevh1iN1E4gFFeFI>Lmww38Rus0rc*rQ_|pYE%m?&HPH znr7N;iEKbiDQr$o+b>%N2z5f+eexr`dUyAn?gdvoN~}TBI!B@vp)3}{m?oEsBbskykQ!R z_S(8Zk+MxLIC97H}_bTzk;1MRV7lwh;$mK zK2*jGM60&N?ZZ(b5>u#H2Tp2%`Eal>e1QMz{QAQD`?1=K$mg{ax`s38g#d_kFxvM%J)`l)9ZkjB&lS>WI+ z(d7L-nwuF^)y314S^W;pqx5RZ;NxJP&fb2#g4P>Bn|?vuAk0Pz4eUk?LIw4`$e(;& z=?C~G^W)!&-(fUpX%3?l(@D*=8b9?>F!KWL8@>c8rP!p6ow$~`YZ2npLA$(LN)lj* z*83&i*T?&@Ovb+OBpV1TBcqInbG2@R^c-h{O;%E3Dau%hb zBHIAvX787MzE#U^;Qlrz)&XJAX!N|nD5=G`+su!&eiH7~9D$KK~2Thrqnxme_NZXoSrwCf}>D3vbcm7cO{O><8cyv!%GNze)-#` za3426i>7)z)yvXR)IuT@N7G`f@19>ch&JPDS9CMpae`&B!=vEt0iGDVc=_(6;Hdf% zuJiQ$Ry$y`1LytY-LQcBpQwEf>-{2xyN2QNfaLO^6ZFLcxd{zKu2pv3@|;U0b(||d z4z{GDAQ52kHb>K<-r}-?{6U!65Ef8y*qv2E+863x*gPm&P`S&LyB&#SI_D-EtY`08 zQS8T30v9P`yC$)iA3@2dN3)$-$nR}Xp8k2-b;~z#Y7jDC6^$~!L~)CW@Sqp_4t9$# z2lfOmSm=s9O2{_0K&U$< zs$#)q3q_Rk)s+$WaSQUI;Td6X@U2=j>Y^wMd{W~-N%a%+qWv=Pph^vk966D($*{AF zIrV1W;=V6z6Fp1LXlCH`{orlo>%V&T5W-+281m08>N2@1)YbC+r(^q@}i zSS5YC5r>~GW-%v?DC#HaKP&T@~Rq1S2H_XBcg8W-{4 z2e@OGs9KPMZ_g9Ex7_Y-34=*VqwTh3s)87WnFNSG{|$}E&STqAGjtZ^;D!HMpzo6% z<3>-Ey#vZ7T&-bXT} zwy5DrzZuZ;fY{PFJ`is#5~lsIjTj8TQN1Z#Ws~hl)HDCQ%o&d$o6D#97idHpn9|7h zelPQAxk=sLFqp>L829p9k-?kg^hdY@lDk4JL*hltdSGXU=M)u_R*9V?GY{-d zo#$>!6Ope*J$d!4?{Ro>?*%uWMDMw8p)r2HFa1ud-FGi0y{pp>T7-J*y;DZI6vs}! z=Ul*a-%_BX`{@f}!w5hd7q+;Y7Gl;x1W%8G)60ZkSB*hed{#AU7)#KMGwP!x6nVkK zTi8C?)v(_)>B`07tIi^r-JX3Z%y@~yV{agI>fW*af-T-=?b97E5c$zv;rR`&arQ=s z@cZN?n9De~*vMbYj^Qggk%#)*d8G{__xtPiWWzJ2nFBV=?vbWry#1*HwC45j>drd;bNW<61A=}ckD^ebGJ^Dw>+Jd z7I`;f%lU7AgqTv{Ft8v8B4^v#{cb_*|8$l?WBo7<8VB#GsokRL+$hSA*R!bR8|^lZ zyo8$+Hfn*wS|!(vZj1vfF8nBX@bZ?H7_&^OFLS^~>@{^C(BQSK;NpW?l#m^h#N%rIcoK zAh3Kp5#U?@U^*G~yT&T>Vp=*)BRVOBc;J2XlRO#lTx%>|OHCYr_Z&1bWjpPNIvy6r z{NCEE$p87Ny~Zk;O~06woBiZPDxez?>L)lq|McKV;Us_28k&=*$r5BqqJy*_XdGo$yquNC)o{;qSq1On`%giTVN z^_Y|}4Cn}%y_z+y{!)uJKfVc%1L*{=v5Z%qax8LcsL_Kl#5gUcX$vCv#f5lB@op zsbh#H7p=JQ<$rGhkUKgRzD8Aq9Oc!fOpwp6S9 z^Or9lg0V!{z`x8}0=Y4))Z?+tTZ{|PnKUq{G;d03pXzo;o0`jzV7fq$7wfVXpQ9x3Z+-ZEBR!sKH9z1hvt z3?mGBKzEJe zM)%x<;$iR-QPZf~B(dxKfloE6e+swH?eq&n_^4^(7^01DQXeSTpsyyh^vQp&Q{(7o zTl?Heh{P;gZXeY&+yWqGe^NxkYk}bpG}Rx}7uQSeo8gggZI;e+-v1W9EWSPk^9J;M zum%>#b7aHJ>K7mm*Cv_0;4TT0tj@rf8a@`OEKK6wy7gs-Q7kU5$vi8+5C|s*bb6#G zP5Zm<4&Q`qdxussm%0SBA8qE{_@xPj_0rnCrQ=pMpk+yum>ha3bf!eRAd=UwKd?3; zJUg0;qH}uW(YSG<-u$62uJ87IV0G2Z%xqfO`wzidBJ;g%1Ln4IbB(9@!hWG$6XI;D z$O*9-|6w2z`?<)czXnUs`RJT@-aJ#)oPTDa=1TB{9Y)-~{#Li#f*aPRJ5Bt|vXSK@HMHYu&^ycAC1m7n*CwsBoPCnzC*eOd#x~ zb|<&t;XK&JRDS2&jbjcPD64md`_MWU{a$P;_S37Ss^@SIm zZv}L|6}e%wa%Yndb#RHfeH_kPEVrc|nS7Bc3jU(F6>O9WLX_}HUJ=g7!>}nm?Ky#L zeI#&|orw)n)_ht)i`#`AFd=pF&RNFbTk)G(WX0vf?_JtChpg*70-|ejz8sA)WLBHM z$ujSkh+U?QDmtUs=c^`)&EwaIdi$z8}eDRu0lz1pohU4txU=ObPUXL=O$13&H8z1koeK& z__xagV+2FhJ99<*Q=8Y~(Jnt{>=G`uNz?bYLK`Aj?ncQxi`+C{&Zmc4+nVVh4R``Q z*DT>?X1@?=RIp(@v6a&3u(&33V2kNsYS-oSZqWuLXl73K9l8^>tkHrhDHD!W&q};l z{>+~JD^Znsx?ymf<}-4nve~3?Nwk3mniTr-kSe(|Rn@hZq9O46pK6_)PoiW$4^U=y zu=SZGMNqBa{=I?mnwTjlRaTP@@fn1$d~WzgVS(oIA)h`0lAX>OcZHWFuc7Qcw&<)c zdeO7+ool4ZU15_5O%hU{zG`dmcvG7-~O4%`%q8^ z5&OhvV{`e!W(ftpQaOy~Cu9!}rhtUe^tYZ^>}`S)CMuB3$_2CEn|vCCBK}ewsfP30 z>869fBnN)&UTqHTC9<3M)lkIyS)5B(W!_QSAJcOy|JEQvZRa-zXGN6cUL1<2Ib2IG z)e`Doh1*Fg~rlPy`(=2cG0rQ2vd?dlueho9{d}b)%Cogc*tY|cRs7V+-KJXq|)=s zE%c>BBf67`IEP>l1F?p*nFazcxJaBrAC+c(jeWfdq`87jG#i?Trcj(oK=>uE{G_enQg1r9qls6br(H=Z&Ta)vMYVE^cR zy1-fH6?Q6aG;7Wp_WN)A;|`OLb0h4zN<5ILUu3Ys)RL>QF8n=_bqh;#)i?M+Hxp7r z8zEJagTG?KdqsHqRwEO8+}mr_70oJzmS56sw(|w0)lN9MWlmo198NaY@>iLIc=ppl z>x~x7L!CKPz-lRrG&j>p6!A~tPEKFx-_jeRriQ_Z%uts2{_3lIPgeo2=h2GOIz7L& z8Qam+pevb1Yg_F#jPOX3)566+es74iS|+c5C;3Q81@BX#lSh*R5u0=TYVM}qz@xoV zR5j1=<_w>3{`qvxzMd;QlZ6Rww$-l`zS{k7*$z-Gp`|$IW=rCG0UhGwze3mdo!nJ| zix3?cRZ3@5KGYMv?(@GB!?C;HH8g{;zj4#ejQ+NbBH9^r;W`0IO6mQv$l9?JT}d#X z-4nB)igTc0&M|FGqtmhYh;*rT6x)z-WjOGN-1%-+m=*YGQNi=@!66s zq>UI|glLsO1xnszhEo*`hWE8|Z-88DX-yU0LK!3Ooc7+f5)E-kd8VPZVgGC{8WIt8 z(QWIpORrv-B=)TTxIG8d4M#gBOr;et8L1b$#=~sYMgie?ZPr*&nl-<#{vfB6mW(t$ z6k>!IuEegXa`Rm>O#tM&5ina;WY-*(Tccik!l-pz4=;kg?C*^i9+x%zGYs~gUFlv zO1$mKia=K0RSG{@o|^O3T&+Qy?Ryk*%aVhbV^HsKk&=k~44ORSEQT}#l2?)kjO&__ z@d*`M9!{12lHEM`iH0Fhd6F}EFirPh?@2`ji(M|J!ePorJgR&MzSe70t|D5i2WbjPK3Kp?8?8b##l5p z_&nP=2`pQSi_Bg>MZ#&{B+bYOHw4)SR@H+ab++Uxe=Xlt|$A3-> zqC4Cv6z$#XxO{qlV@zi=Srle_4b+PG`+E>j({YPQS&;1$H4yU7x2U)s>;Bm}RP2so zS`KCOekIy*+F%v^-qmq~$-7Yd2Q=HDIc{(fD^`_@kV$q?SBO5l^tT@7Wo`+}%%8O?SO_KDY1~#-qEyHxZe)ALYvJJaw5B zyxd6PXB8(t(({u~qVLKGuwM!U#;hbRPW&pinp)==@VwCzy1zK{W-_|-=IzbQY?ks% z2$<<}yP4SND-#bwWw6o$p3sDjy7Bnjcaz9WV?l2bEeKfjzkwk)dM|}-+I4wxV@L(n zKz3}O;grXy5fYWx7S;(zp9KsZ-q9#hGLJH8)KsyN67I6Z&9d6)8!w#-VRDhV4tl@( zs3STL*M4_$BcyK0+I=W(S^At_^Ts^yq_SU)gs?L_Uw!S=-si}It2 zGk1sR#hur6PkU%AjZLIDP%l1-FA;0b)>O$^rTs=jqj_OL*H_A4^G%F5^BR~!hickTDTle+ z59&IXEg_eW*`wZRUoD=TvMtU*vuP+H0zRzHM)q~|NeBzO2*&L-QJa}AM4*KP; z-+zj9+-i<6Oj7u*f3=xKZ~O|;uNAtnH4C3)H@#c;9OB&IxoC4ofeRlR(B2%`56lSk zCh&Ii0SW7~Hq>FblRaavf9<4%Uo?O8&x(75^^FA<@r2F;Zxp_Uz5X>9dl$bD80dR- zdy1{!?cKuT1FwuNU9ubZBSWM?Yb2x64=#`^VP1*I6|jMv*hk-IVk<8$9egERIYh_? z2Y#G!Vw(o>cWbXmU0#qX9(BE#7!@l~F=!0UMLRiy-tYYYP=mXvuaXPp>{gC_o)%Y- zLZ^#p;v7o_e3#aP6UPhK`3e#@l`2U`BQpYI`yB>WUJmr*$qs=(O$)TVEtSJr6QX`h+u6n-b%hSYT87{z&3%OtA7B z#IT77se;S4RMiR>InFo<`A3G|xh_6+?az&0adZTX##$PmtU&?1WzX~8ToacGCgF{O_l@hnr9_3{3^?Wq>RP8cy9f|E^+dKN@1Igml560-I>~Bz@u{=% z7uhrqhWsuL?)Snu-^a&89(*sn_l2di7$Z{s4dBbfSyOkfewVJU8=~->3Md%iSZ<0; z3)r0bm{3?0Ek&WdN=*`38F8!Sj%Lb*M0k*0BS_dx7cF&JK0?~XY0v(kBjxp!&~`3Q zZ^z0NBl`3^pSGUz_EL9BNcFHwq&W|?mO~w;u}AJz#1V}4PMKz!$1VRG^8inRu-Nuk zsC7>lRzwK%4LgC2o)4LKD~vR8ea?v857j&B{^JaLPko9dD$Y1pPql+@FQJ~G;a#PJ z71X`wus-N6ul+$@T+!cNHb{gIE=NE>BW%BR(PBrc{9he&xK+MdY}$P4c~cr9)60IK zNdM(@NacoU`cy>jnh%Qs&+F>kehYtWT-k(=TW6ea=+1=K)REPA5D^w~OtrAb-Ni?| zCywtzGBeD5B6OU}K;%3}F;y$JF>M*=lo_8;avpb|l^1QiQ6^DkyK5IQwN}De;lfb0 zglCN1!za~j$5GgTGC-YVI;d^XA~Y32(ScT@B%or6rQX}nQZBIKOK#~`xN?i*yx`_! z2r}--xOsMcO}?Gv1Wsg2=&Uw`Pt8~BJI`?u?R=Zhs(x*4aLL@)(b8q zi$XL15Y`+oXHLwMD79A))!$@m*$KK{r@17vravQPi`4Sb+u{2Z05@WDyRXqXQ%j(c zYUZFOvFq7MG+v=edIqvx{s<}S?XTrs_FU4{pJ^kq5b_W`k6jAwD{GBmxvI)-$!eI_mWGa=;(dAq9gj!k^{G8Fo`2oBA($83xme$W)S$fg z!5BKLukC}L=?jas+kn@A!)Gwe1))=ZJTC}wew~XAgwe0qLmhZ{%#oZ1eH;41kebAx z71!AsWS0^7gY_uCZ}W%EJ!@eeKX4$R?<#&Hytzv2(a-uf4r-cw?>SY}y42FNO?ca=W0TKP8drYUQ&iI9|sP z;lf$wRHReT7W1)1l=W>w_mIsbkjqE`-5o$zVA>O0(riKkW%L!%>`_BlEhC3lq?@-n zqr$c1jZLK-SJ*B`61EF@Jdw1x?;ijYD!c;{KcSYmG7Ad{%y^8kt+VDa^L%IT5DiJ zw#_+Q)zu_XygiGIyj;3FSQ_-wb6Vd;!T;d1b%8X__7Ix}fK-wXnCk2THM5s@2N0ue z1kNQaGyKH8;CH%#ZPKUG!x9xokBE!b!$RQU#})^JWxos@&I!mcRk+{&H0mvHfX$3a ztiBpz&`$Ti)WRY8L}>Tr3L`z&hxog$(g7WN!uax0%HaGZ|6gHXrk89!TQo#2pohubv8>17k5 z){+w$l})OAB>m2f5RCpI%7VmtOT7m8-!H(=i!;UAYOdWNmkP>tghY(lQ4?FblYd)sHS};Tp4F41N}Q5Aj-7WKd2$2 z#%;nb`##X45pbf(I7nW_b2*J+SkN6^kz}Hi+i!e0N}|^t%Tc#2g)ap{yu-V(t!4~y zc;$bwG2wZe%o?$!oU2zzyE&{eSVb!0tAjFBqFq^mXwh*qf1sf&X(1d?G9F>fyTI_x z*tQCanpWhdWz>{>sI62p!ZbpAE#BZ3h+Q{Biwh=|u> zkkC{AdV;1Bo)1?6Mr9PqM!F03);r&EwBGXg{UR&OP6j`pnE&}pOkEVpH61QtR}9Kd zP;8ff?~1fHRnBHuLSZjI(-2r!1~0(iaX8%3{aUHFG{}0%VO@fnRV$@jE#sqezLzTi zp0%z5aa?btilbod(dSwS*g3s*9(YYth1nkF9r5wVCl?XA|E^0wQvEKl3r7C?jehBO zuO-q@dLO?SN@w(N!$jlpzr{XuWu3p#e~$b zG32D-(x^8Fqe^L;bw|?NNa}?3ww>Ow{=7~jl0%fD8`7iShM7XAG(?G-wFPlRGPX(7P{BU%C-u5F zu7mYCp;p(iB1++l?>Nl?P{hv$U?fMf5bGsdr1-|b%oc;haZQnL^3RjsM3U^EF}3a_ zymKeeJn50Hy82kF5cr$J&z7IRAsu4Vgf!`nb?)=jO6RB&W`XtEQqF2r(s{rW-=4^B z>Q?O5@TBX`{yDG$5Dt8O2U{o92rEbf?TaRTY}EQF!rMg>lCyjG40Bk>-ao3?!4_7A zu0%TYWBz_-XY9^Bos0%|qIAjoZq)2{U90ManUHub!^Uvdc?K(>jH=FP_*@WNt6!b} zE(3oynfu^sH}w<@Uz74Zt?azKEPs{6>Gw1?GPOW+=VGO)Beg>x!>9#ce*Kp4-t$~w zqU~@MM}wK$8b`4w_b1?5kq{J++;PeTG5-`LHFu*-m^+)v4t9+Uq4PmHs1LE#)a#6^ zA$lF(2Wgtgh^&2e{tVB|a6cpup5)naKmIBtMxFFT&SpDxMkuX;-DghZ!of+1OW$JZ_>YD7wSCD}y0lt4P8K z;8S(?ABvx$!tCY{BsIgOAUu50<~!NoD)uPebh&e|X^I^f7SbI$)6fCCvv_$iwtFZ3 zmhWLS#&ERj)yb|qG$>S%z=J3)psImT{u6#B*GPJ0d%zEKr_8Hhi0V%FvPEQO7)^6b z4IH$%65N=9BGlXZvJ>R?^5Xkb+Z02KD_-m?e`p#HYKTeUq1 ze>4e5ZWt`T2t&H>3iBP984~n3lpL%j3`|t%jSw|q4%+yLO54kAeB#Hee|D)W%dPDsFy4MGkm1BRqXX73`f7@nj%WeD6y2sj z&5O#q$-U(Cw$MAi2(0F9o#B1v!=j6M9kDm+tq|qb{U_=}{G0~0CYZD(r^@Qf0R@fi zlpT*L+~;kJ{9P0GfhAv_C8sAFv%3OfaFGax)<&7GUeb6T#Mu=yMfT&7IjsDI{LthTnq=URNW;8uSm^a_9hX)2(xCd6(X6`ItAtTYc>7MV z+NdjWIe*mEBtPI;K6B_Cs-gGHF_joc11u9MA$t~M(&K$CJNz}tUMCscfO-CCYw=0F zR|iCYOtHOJwJ~DFKG@ISfCoi(n5)R$E8>0+f#Zn|;r*4LOhiD(p6JaeK{eU=9S=4Z zZwSO!ipx)yyfB*(=Vn@8#9&JR8~Bbxw+5$YJPP;S38lv*)zPb9ai-~^^SwMi~c)4gYIylsav+_C*;}wU_|cTELlg9 zf_6>yDaOlxx0{Eg30bUQE#Qkqp1ZeUu-R(iD5_Q?eTn1ka`}DC%{-V$zl~RBD^`_ z)tY@9?%ooVEyG+Fh$g?{BW+xQtWy{wLx;_;bo$W;R=+cJaaQP@B>@^}X@6D$RzLa(ZI#*#i9(ZN-f+&?*J+7J$;LK?QaY8er%n2AB*z{P56TEBu2=JxH~G53@VAc2;aM9HBw@ctEifmP@qYNbqOvA`*gwsE%xwMeh9o+bac z<8t?tG$B9KLgmb!kKs}CZ#0V21$|x=DyMTbt2a{%MUwDJiHisBW3ce^Cu24LA!Ia- zmljSAnos=hJ~4#zfMF$~`~WkB%VwMWIUpE|c=2Zp6+@^?OlPXv1NH(SDFhFB;Og6z z*If0&fNzvip;E@TPi#TP@BcAQs{x+P13%z%*%A|ktREdsw|KAukd+&Kd_htYAvHDi zqT_;UT11r=ma4gmr;z9_vE@I#6axTF=+r7B17o2H;~al|yaHzOsi21E;_2_W0Sl&? zi4p^8NEl18X1_biA3%wLwrL87H?E@ZV=aJlpmv@&tUOVjWdq*a{MC$HriAv{Rf%D4 zF#Neep;G#?m-K_Sry>6956hA}X=0J3K?}Tx&dPo1JIa|Tl&$5o5hqj*HkvD~DL@Ah zV-HP}>0gQ_YI-mHl&%Ex{T^6^6u@qdPfnbUS7pE2OrTd+S7T=Ud3n6c{~&Lok_`G) zAUnSE()h`{mNT$GK11Y@ay?$aE-HjRB{4~ZBtFjj0RGb8&0BYAYyd;*lsu+m<`);9M85K$>jwVJ zWK2uQ#TWzx7s`o_o_*aQvLBlz=2$&!L@Y z585zB6Ejl{qFXTf8Va^!Hu?1F)28k1-5`FaagM;mKQgE!u(6T(>3Od>#RCi@|2veKcBj8k3Sn$@KQ=taXQ@(N93rt zAImS`wQP&B%<#e1Yp~eFRR;##VfRY(()iYxr~fvW!8`Zre;ozmzd93ekqCQp3Ak^YP{YQG1k zFc~GKNtz{~n2~fSjX$UjD6t4!(*#@#tCvrPHT&}0;y8$;Mm_omd6x=tBBX-)i5EAk zK{9RU?}V;PoxH6sot>SZ5=?1a{QclR|G)RIz&2k}OmQEDe^H>?O8?;nrBc=X>NG}s zx;u&_fqMVg{#`@Q-Nk(P8l%XRM7kOprdYZ_om=ME6~=~Yoeej@pZ;kYUh(}lqOm!; z<5@%i)=U~3M$h`B%0o?x1_WzAI2v#nE=~DzOgjJ>@Wis6teB8!D}Z0IZjQ7I8zym} zXrJws%C`Zr^u9|Pd*`psA|)VhtDy|W#>N6886}hHN+aL2Pmg;q{fpo2FI?dSYx&?W zknEcxK592zM9X{MJ?^sWV|jyZYVO};kY!n>>q9Dizj&auw;x~I*f#hemHQu_lOffa z2v{ZuWQ%Kp$3`ARzF|lL_@=&`@libA>ojqcEht)Iq@o!fH z(=hNP=6s7=SF_vBgBjjKQ(ePM9|Vudv+8T~eIhnpKURiaydZ-8m*DU7)ZKm zX88vrDVggtA5nNaTag^me?CyeQT(p11U=Z`B#1mqE}o%zyx2eum-cR-9-qzUylKPf za8X?N!=LFAZ~`sGB`1fdLZliT<~34f=#{g>fWJZu$)kI|4KPdPcnR7(c;eyX=CZ=)q1i!yC zysTg_3JS`9pj=?$e1V4-6hh|x_-tnis6JWS*jQOhH0lBL7dP1%%?zOI^ZiHFi)bMH z++1aij}sJ1MW&`_aR0Qw z({oIGVHVM7{x@LP^rr#y2lU^$1h}EH|7R!EB`9Y&94bpY>4d6Sl_k{n47= zA)s5Pd5KN~!Dry8J(M!9XBUdP*%;xufW07b$ZCYu;Be{v2VV9HK#afkOS(;FiHMC& z^C(uo`T8mWlRSE+`De}~CqEKvR9eL5J}L80kHn&oeW}@dZn2&(9VR!X6z9qvVm2M9 z-o`wWhWFqiqYZK1S8i|6(c!#AwnnN*{V!p*?@U~y`eW4D!D5EL_HN`qbReiw_Da9Y z*?*?1qtksdJx3>*3IELw>F}PIYGa9CYCPu8tRXPH%pIKze*i3usipkd-_jI85x+LE z%U&cMi|&WDMm86|Hp}qCF+GStb2KE7RIl67rp&e!o~MgiIqbN}rm)El6U|!6?Fx7V z&7M3|3s$IxTXvYz4w;Y6Mt+60~BWG&5xF?quj;>aEpzE=TlFM2q|@J=|$@1u|>3LgVhu@|i56O!80%npb|EtbS9$rNLv1Zf6i8~+ek-RcEL$ug#lA?^& z1?l;0;?+t}(X&EndX&PAUl)eW0m+BRgC$zrqFTjjl6T69*cS+@L`O4b13K!V-7LP{ znB}6V)JTBWow(MW8RqL{B-~M&vl0AI*wIHKHVGktx#<`D_ha1sm?$0TArT<^n8VL3 zp5{+DKEIFBg6Q(v;?;Z(t-wV57}A08EEX0>_`E`Q@v(Dx5=RE)ZIMC+X~63BN1cul zr{~7Ux%j0P464+5^;*8U6Vp4`@KvFJR^@(+#fHhlBP-ukgI(t-V<=yqC-+L0B#8e&)d z1#~Eih2%Y(CQ%wl@ll9O3TUYE@4~nT;tMG22+OYYP7IS`B0BvBno_#r2EHKGcE>B_ zk3DlWIvpbolc^uP`-TY;q>+^izWq2;ug{>^rCBi9v4xwJLS76kzTHK_IXFID>-qDGm=Lgy-Dm2pI102Y+ITjoTv2|o&&*r%I}SA z%WD>4**#MovfF|YE9M8rH%<1B51}guH-49GFOoWt{_+RYIy@&niAH<#a7ILZMkEJ8 ziR8v8Q~`4R4(6yYijXc21L&X&)_zhawIW~&ht83;?_2_rG<5S({Q!&T(QM9&(nf( z0|esG_AW^NUF2hyCSz+;ytWyEXOd^qJjSc+kQAn`O~H1_x4#EEpPJgiPS&z%@tOo9 zoAyRXgNC_>nuyoN z;5_y8KNEX%lgn2xaY5PJ$Z8YNKf7a?I?WfKRs7r+^4w~+Org-~9pG4d4oUEg9&;Qb zKcgVF6ykfgV)sTH+SLl1wJj--eZhm`X)Gd~^(0Ef4+XnpQttta>Z7~?2Q0TId~nf6 zU4;*_A)(?Tvu)&8;%mvhmwjL&bf^Gfi=m?gzw@E5@Rm#-q8!;fm^X8aiKo|#^~>{0YPv|RP#Z{UmHeJGrJ@*ZiaL<8TxFS7 zsX8?wm4cqMWH2mr?qC(>c_Z}w+0=8lMkz zCPkThg~6%7M{Mt>m2BiUj2?<61x4<~jhtlhqMWZB3>=#}f3 zYOAQzLg?y-YpX`i#R#3rQO$+2uw`6#)!A=GKek(!`A>4*9?;A7NC3v%NgLa(kWajX zI9^BwQ2QUxElV7#PI^5=iF?mUda5gLKA;Z>)aUxMx#SI9?QeV!O1_R`|M5kojx}nz zu~17F`yAr){OG@OCah(c`_s6w&`>^h#H zay~YPKch@Lq0V~>%U<0eiuRZ-`xRxYEu&@Jdzs+mJjXwqRZ~9|KIB$)A2k!y9N5^< zc`S3U;!>Qvp{dn;*I>?(VCDmXMi_bT*3}2G+tuv7JbMVkU+VTgC88Y3Q{>W5`6FQA zIh;eqyk%!oy;4;32`SfxH;!FpN9*K$yJ0T3cvrcIDrinh7uURq)qZh~&RwD}>vEKa zeF(131aqUBpB?cI9mHHzU)&}Vn9hsKVS{ zhQMmk8V1&i$0|CA@_oya(QpR9!a5I;SzF9icD zlOs?VRzK6;=2H!%BYF8dc7X8pL3vNA=oCONh9(v z-FQ*favEHPGHgfeDXcRazi0{p6)$jrX{yvWwZB_>|E*&kC_ZF+AC zpBy9l(xyS(CV4+GKUv&ytrts7*+bVzOAi@xJB7fJXQSQM`Jzt7HZ>N9yeV)i?wIPx z2Ccta-THq9+gHDb!Le*TzDo8L;>FO;M}}0nuc3#Ss= zRCFHQbUDs&iSKnwX>{2r_t+rhtK1MWGDCZQh}Ndm;UIDT!ih5c8}6+qy5*g3&#!@S zCP&X-$s6(4%nf^JO|(5++$>4k(VXjNTq=spEuj@I`LZY~kt-C!{rcLB0mSPElB1VR zIJNM@qV_46Uy7ne6ogWAn^zJzP_Bb|oUH=G5~m3w$mzt>k>TJeI>N_;o5k4^4spes z^=vjN!m%ZLW;M>?xyN;8faWymC;!FgDP8#)mgUQGDWm!QR2Z=ZE&f0$jNr-nnfg|l zqN>FE_aq%s?PLp8sr-sueD5vZAX=iixKx8~cJYQwF|d6y}o!9^>V(kzMQ#Ah3pA*X(ZdR zJUQ|?!xBm8p3?$H$?f73ECTsH6FqdI?$J5B zKU&)9#Tr>g|j#$y2h!__q z$fRhFYYR@+t1`)_IRuLtcSgzYq}aQ?8bc{Rm6qPXnv-1fCO8#5C3&LRoTWb;ju#r^ zl}zu9B;27HzvfMtl5D!Qt+B@l9#K{E+ZY_PP7QqPoZj->>?&fVxN1)f>WzHU_FDYa zeZY&sl}wqqM=|*0Pqz7n*0-YpyMm~%CKmZ`yjx_54@4oG#)N?)5T;iSHKB*$tEPoWvA64>E71?6(jZND$`RuKAfOpWTGz4}2L)2bv zwRYQUFRM4fG>tRY_(fA2d@N%RcWJPpo71U@o>c zqHc2YowE8}PBqCd*0voAZG>F6y{12I69Ifq&W5DNfk>AaLgGs>z=?!pLFbSA%T%=* zYH#!tXU(;;2JZPv&f{rz9~nF*f&EyzrPg0>m}ggCV$XCue+LYM)UPe{skE=*-cy)P4f;J?XLf&772R$sOy@ ziVz^1a{nO^!6rVbIFJ1ol15l;6SE!fabSI>@B|BHty}KcITw0edNmowcX+s4*4Kf< z3zNkV@>)fFk6gG2R!yQuvoP6#JmXu4LR!I%M4G6Dcjle=@En~x{Jd^}&JjIw@8(C{ zlOE7JHY3mh_C3~psyBuC8}usYC%b0@rg~hDu&*ogwbu0opMkEsDQs)K@6v{Wj{^M7d0q|AE>8cur;}wp_nxNqs$ELex@*ywW<98&>g4fDP zHmMz%0dGbEQuAtBY}Pm3^9DfQVP_*r7Vkk}pVP*6b}pQ?BgY;? z5h1pF_!u}0zW-#wCTqjKQ`uFlj&)VqFLc&CxYD58SJ zPC5|o!4$_XI&ZXhjZ(kIi^!eh3LG^r_4YaT3N1MJw$7t0*`KenzhGo5xi&9Q7u-S$ zs_ORC8SM(A#`8K(U=tRtZA(A=9U>>=_@`*HkK>U3!wEi)rM`xPA+I|ZwZqbmyVOfTKGG%_I)FF!Oj z6M8TzaY01Z47KZ5aBD!kPmM6|s0$fb9=#1i?Qu2Qf!FkoE+qKdX49cCM4U+5RC@ky z&x_+7<2OXk`h`Sq`V^0nP~Z0IRd;(+ziO$1h^|emPPc#h+X1cMpQ+*dO{b-x;=t6HS75t^X z@C<*eA@3^@RD6Qs#13s`&bIm2oKmt^l*{icpC$O$N)QV_%TNGlfJZ&{5S z*?_pu>UGbl7OU(LzOm?$*$`jfPCO)}P04PZe(r;0NQBVn&L z1h9}q+zZ|VgFgM8|C0#e=HJi6xCW&25S-N(MU5dCDBehk}1iorm*_G`>qI{Sca{NNB~XVV)Qe zo*o{GOSH_>qKi119G4KIUh=;$D`VPSXwyp!4%zx!nf_Ko!(7B_5>V8-fBZ0k*4y*B zZaxKkBq~Fm0s>?CJ8mxP-^htZ{`}6sUchNZN|>7KKb{MHu64}CCbS5(@r>HbKw=mu zp4WWiywHEeI)%_g_R}r!pGC{Va?AUWad8nhlJuo%lZB7 zKc#7J|F_ehR@KUQ2Af^Ca^SF5ui9(T*__b=-4JZj)533m95_(w?V&t?@dFD@{lAA& zr5+l{D8p7?Zpb^s2(1_CTMWD$IJye+B_CUkQUTz9@~7qW z75@Hetu_7*M5mlFo=Hhv_d|fJtHvC5hmK41 z8dyw0pobHsG=MZ_q8bHoGD-JLt>r}R@+Ukx*J8-4APYcFm2Pq0bInvwWHA`OPvr$` z-M8$`HQ@nU(GkBG#wk|B*QO&1kvo>}@Y#ZR1J=`eFjD|ihIoX3$4NmyOA96-i2`!N z|6}Z}!=nD8uTdqWTckUryIVrKyL*sskQPv+k?xf4?iA_n7(%3^rD3T18TI>n?|tsQ z@AIC=e{`JrWz4ltGWOE>96R?14ozNb<7zG4IO1o3LD*YcIrRTf~0;!E^5sF%9 zk3ImrEZ^~h+@*$OvPKGhe*Z%%9aML)hIwjb?f25PJ^|amzJpS@{15_IP#+aoxzU_F zkydyH+aV1UJHx>|Rc=lDK>rBqz;8pU<-Jqe&5B1}O8#GG17c`Igv3}Hw>v<^2QbDj z>FH&684P0)&zR0IkE*5ud|q!R2v3KkJ}72@Ucce}_hd>9038p8P7`p=H2fGknMfp! zd=lJ|MFvN~j})7x@+@K8_P6!;|FjxES$V8Y#buEeoG_3Xxkqa9DIdngwbYTy=C^P5<|j6*n`i zLQivkg0Zq${5ln?c(k><3t(;x5l{-*pFvJR@g^Ye=Q5z___(D3yx@RinVO*&Ak#x3 z{SWVxl%x*Fo>xs+kk_hnESNk=LWJb1fT2PmeCP!mHuL^4{omUzVCV>i(90G;_`b`df z`*UT^kPB;J9;`$Jg^9>4vAtAaWl?QWBYaZ_2p0XE*LRcxpsH$zRRIeSh?1368O?UF zngT!^C)+$7GXNJjK=n!F>IhsE5{uVl+SmOc^HR7-0JZltE2daXmmFKHtZ9R0cI~l} zrG)r>1-+NHkr$0a%l0c=-xa_)Y&isg+r$9**14;b`HFO89TvTMM5s<;R(R;Jz>BfG z*D90cdUke))DJDAv0Xg&;6_CNntcvksiAHpcR}$)J)BnKfEn4KyA{wce*;){UpTKji!AA?VIhXEjl3de(I@(lH01-G3CP z^!%}#sq<=;jhtkru!>ut>OI8<^g}tR_XU~`D}WOk$-KPM7Onq8mT)tGy2r-G1_E>R zfFkjKZkSrH0{keYQ==}chM*VbT+GL7A8jM(@&72cfW|YzfDPh6?P)7e)g}*+myx*~ zxuVUhje1k}3+W{n<9x(3KqLrT7EQO=Dc2h?{je}deOp){Uxy~GkY1$bu{)L)`q)}N zO2FS>$C`~Y@yV>!gK{mweEJsvD_L$&BPuW-9AJKOm9M05RH93*Q-`*QjOMA7Wb|L) z>XsPUZt0}*&heGPat0^|#i(b=5P{<2_yZn&HO*OxIkF;IXNE4M@){c+?HgOMpU@6t z!s@;WCy&{t``!8$aqfE3R|PbLIEt@a0xjJ@aobKjUAiOFwfQ$m(HOJ}iP13F4i;*~ zt~qV(t^~t$&8SGZAs9h^yZS!1boij)TujPuNAHmlj+{d6t?=+iYvt>p3PpgR4X7;N z?_~iA25`BFUK*feGoq{P-?T4y0X0a#K<{^Ke2sW=vS+Q)d7)w208bW5pQTV_)X}FE zx6Kr;=#kSpH+D_A>0bfWJflIedlr!JQYIr?kSN3M(fiT)hwV%*2rKshOv4OL=$~th zRSO*8GReJX@o5E`6VYPx2U_wq#2ndjs-{3qm@R(&iKn6t56{uaNMc$Ai_8}4D_ec= ztcaEyZ2)9|v)>v3iokq^v99^7*rbNf)-m4+b3I}Oo5NXj1)x>7^dA}-t;1Q9b$%4Q zsEz~dyjox^P9i&&bdu6f2Mr8=f7gHCyg-p(X4#IQ?&fSwKl28P3KWw`Qc_YZz_zd? zz**mG5t6Ymq-yP`rW)4TzqfGwgp`yBFNBwui|J*D9*PQByNVgztD>R{%>hK;rEHU# zWY6~b1R*c^LN18$OO8whGNco-+Lgco+!Uc&R5+@FS5A7AwbQEslPOWBy?B&m{;ZMo zxq3x?^A!mDR5$}74UT>5RE}#Wm%CV@530r{y&8vS2|x@2O+%@_V>|`3uxGAR6W(6l z<<%(LH~cJlMf4fuIr_GtHOf7Vm0`)BDr7C*dm9Vhd>(~q+==GV`^~_Q&6FR zFqW@6Oskj%m`au&Zh4b0e2OElYGPIT+Qd;YN@b^&7RnqoVk{S0>im+;uUjsYLmjc) z*;ft8z#5w-(MDw%tn!#9Tp4qkv*b~&$2!sIY^VO!^?rL%ZXG|jX(>JBeZ|^%|9dJs zFgPPy_){-2FH^Mr@$0#Pj>s%M%bl}ZL)HcV3q_i+=;^hX9d?KHw>vx-?f(91pxMTn z6EfQj#QukhL!8}CHE!C&ftY1S|EnS?G_pv^?>P%POUi4`y@JUVn~H^;$s<1Haz)8t zf2NO`oZr&Ajx`OyZ^veCjBM8eZ3LFP!0gJlUUvsCdF#$sW3F6>e-V$I5bikY3wDZj zcOo`N(%zjVxG#fvtHLL)-DU*->U2C*3H?2bv7O;KRVH|x;teB57%If zKKxo_5!sZKwl=mEB3>}wbzfcf-)Rl;R6tm1%-XZ>;#D51*%NUv+%4oY)}bR&f#ilSW@!O6G0AEwKo~w$^f2F)8 zSIVQexsfk=dHSH*)G1iJ;|__K<6F9Vt1YmDyycexO^1D}8j+F3k~nq0=O#D6Y1qtjXR!5wAP>n@P=xQPnzyFwO+4B(p zA(Ae@8Y^T6dZ({`9?IVP2I*kKuulSFXXVKk6QZ9 zP6TV?FW~SywmQuB&UsmgD$&sK;5*wIaeXFQ{e~(mgFt*lug+Q-)@yPn;f%klRcx8y zw;{Wi%Y$tNOt`;4<60M2&lW z;sx^jhUIN^TR^xb7#Y*&b}sta(nl71)oOd(wW)_Gjlw@&RBr(}LdfO8XP^;^{ry`F zq#-ZX-7W)!Kg(ly@B3>1UP#0tvVu|8wx0?+DLFzTP!p+RH*$Dp7y!>~z}bs)qswj? z<~&098O}X;kqiexhA@bk=G*&XV>6-muZ@qI(JIJCFB=>&*zZ)4m=?*9(U#Z^@j`81`DTy$&vug0bem(`Cs_5@ zJcYnL|BR0zqNd){tgZj+wTXG%PcfFs#xj2upoTmorq#&I$5YFQea>0Eve>^7(+1-c zgC8@i)gm-VXr-RS{DmhkqQ)^;$mte$s-?ZVErvVWeA0P!lA9{+?SUBE4v7=^vzPFY z(Jw_GwcXfjzDqpJOyNF*WUOExihhxb9^~RQuxN%W<97}S7_YA1e4}9anvPvp=O>~7 z5qRhoocoIx9I;l1R1+cz=M-SRW8nn_ek-#t4g8bNs%y>HU0#td9u!es6cE;-uU~)r znjp-r+8w=5{B;U*)%}C&o1n!kJ=5bK7SsbJG$<%Xo5en)+L+T5j~v%kj}kI6^THZS zRMtstBIA+|M1Dl4RrC4uP8MY22ahrtS=TIQVDxjcNJdIVrw|5B%`XZ;mU9QZys)6% z2@Vsj{`!u&Qkp9^Z*!70eA`c1$KCP^jZ#;4jVALe($#j_OmP7@5?XJcgtJZq>C>Yk z3^sRY)HX+cri%+aH(Y*6z8MjRnEHI~^2su3YX<0TgO*AFoqXO>t?f3HPzIbo#Rx!~ zUMuf;o%uj?u4!)wpIh-e(I3#wm7`_xpe1(x0_`Vq%k2fP5GTebYj5H@xE6#%-c0fJ z$pFwizKjB=gVxL_h0ztiR;JDywYSE}4t75xq zAmZ#BLJ3JckBaD`j1wa)=PMZV8nK(cu&-+ax z(cjT>F-Z1{yRJjlpIQehb#`k-{dcxa=eN%0J2*($sBC717TYBZl}BBN*IO*%KhoT& zrEHw6aFT)iKFgB3635M5Y-H$DB(YC+(!Bu^t80Dz!=tK+;sgajde`_ps+}sH{5yj) z1L1t09sCQmzy(|ewu}ZZJ|0uj)>7L-yP3EWcz0`m&Xqf3G9V4l?jEQYc?IjBAMXQM za>A_cr-w9IUWcQ{A!s>d>}@9VDs zWf_&R-A{du>ExP3WAnyNIstSPuG$pl7LJ@wyw@Zv?83PAp3J?%R|(T}4Cik+DKLg{ z%RG><61joug}9oUTCC%mrCzGE2E06Mgjo0ITRKJ}aPr{>BXfoE`GOF?_p!@_!R){HAN!No zg7q0AKi^T9BbaqJ^!M7ipt>aM$Jk>g7v0LlvRtj z`@Jip`JBFP5KF@~_4mm{>^!Z0fn(|NJ8UuafMO=ulOM4Y)4#p&kY-l{%UENiuB>RT zl@ztWl$0EUWpf2QwyHz*95KbQdUVGL;#j4MGzjOc)mqFkaUOe3xr}3j5;k%PT5Mxa z94SZdtoJG0gpDp1KpM|L5T$C5&b-~YL+Q{z~{WMZG*sDSh z3`yml95vDV6K`C!v3^rrVn|E#Nj^~Sq?VaK+!LC+MM()WnfWYTq+JMJc67V5V|AgS zvA2NvdBI+(wn<21^073Gz*Np9h2_C9q?*h;7TFvOq3IziHgA!kU&mT(b!PaAi71=6zaQBp%U^BaOQ(Uj5+D76^!-|%xfLD=Qhat% z*kM#LMC}oXz~kw1RMyI2*0o)kJr%zP=2+3cxG4ATo{_&}iqG(ovRhU0Hf3bXF-2h9v}2DY(v@+RW54m)5ymBr7fYA`co&zs zZ<-t^BJ^#d%cSk5*C`dDd*l=B<|Z!Ff`=C&!FM`=JHOhvx(LP(BF^z6H2A>tqAj!( zUXeEDRr!roIvw8J(8?LmVg#sJ6Bri)i*)WXCinQ};CdtBPNQ4L4fW4;&rNS3i4L}* zhekC=wBOS=n;JSRj=hJC&zvhiq;O(_fI`q+G_NntPcVqmYVE{b_SyW%3vanNd$&x% zMvPqoHb%0n_bAp`S3UV}wRy~ZR!`o;?vTu^Pd{L5)HOKLI`-EWS?_OjAn3EcU^C{z zEW2wro8tS~>wwI2ViPeNI~2OwuoN)KA_t{(O|Jz!`Js{u;RB`!PvHRs+J&*!Ulpgj zX4A=pqkg41CPmQAxy-*mN7Fd#7Z%QTR^(08dA1klC}Axs)qytF))~BQZ-6zs&rpf0 zemvuNF+D==Xj8|lRq3#7f0sW(n;kN!x!DhZfacBKy?Hf8C^SxAcllq)le03=(HFFk zNh=T)k?K_>v*}=p0sf&yjznq->>fVcVxX{t z!rndtNb9uMXk(yiJ6FB#uL;QZPA~9;^eDPJO;500_N!X=Dk&28x6lN!Y(o2k%RQ+! zbB!>Ff(d9Klph$ZP*fdz#Vhw?JX|cz!yHjJdocba>nw1B zPwBCrKBc#LUp?`aY}g3)Q{s*{UdqGMm}9Dc3z+2hgK)iK*87+%@wt>|_#4IM&<%7^ zC6LAPG(O3XZ`u(sp5A;l-#BXQcn^s>9o6nY;{CSn*%F=NIOon{oFhtE%!4hwNnnT{ zFiW50fHJu=rTEU((<?U|yp zzKbvXOeDHew`HH|q5h?_Q;fA&AMv~+J-pqGoadEJQ#G{&sNd1c*Y{rPAvLsE+SP^QnL-7a{Okpu)Lz`I|;f& z$cJMTX3&gn=fs&e4G~#c5=zhHMXf*7bYDywkN&u?1;pdGi~C+@ylc zW>eFeHzUA23~@i0r{Lto@$&MrNolW;CnQU1)S%{;e4OrZTo>VvY;Q(md~qzD_ltkd z6hHdf_xlN$i#aZio_o~BF+e+613mFb&z#3Qn`i@UA0Z7B-L&EoVT0hX*&k&?1n^l3 zK&f^Cf5O#*5Z&S*+XX6TfbRTR$=QoB+8-4YGm{n%Bh6lRT;d>T?V3hoHYZi;5yH&- z#eTWI$1>TlaCqzT>a3BaWzQliZSuc!Y1W~7@mdgdAob&OK5$Mja*k|{!de`C)MFXX zWZsuJT_epK+p)otlw?}>)LJ=i6Htj}*(=D^QJGC9P&FY2($0P$e4EwhDDX(FH+|(L z2ih~4j2!G5#^Y*(1-d@iya!<5RZ&xrpf_xq-T_d1gpT6!(%HRK)mL=y`thFsV?q7L z`}_+GY<>HWcL6lYp!^5%0H6K;Aa)w#e-!fbej+xK5c~t4C@C2L^*-S;QB`L+a5S`7 z`gbI90+bR64z6_d(cu3aMU~$bpo9VrvIf_xs)JYYNBD^U>!{n4HRc0OTZ34@`xauK z@kzEZ-i~$2q4puD1mMj~RLDuV7&e}4E~Sks~jX;=^}mtI}_P4 z6cQo7u&V%KPAe8l{mNy*i z_zx}3%R|#T=5}#fCKiV3gs#u=GJy!lf zCy_z3+HQ#>L%>}QgMG*esT7dl!2(=xQzw4^j7tL{V32;lUJr<=ujgt%?I+TyHVGu$ zsk8>om4-(|sQ03vps-sGza$p%T~uY!sxpcKkioJu0KEo!(Xc#M-SKutQ#Vt)xJ3yb zFJ_eQM%Rsxcq8&E2$rka`n4Hif)s5-&yDL5A;NNNF5J1-u>yOaAj`LoP^nLLV=MYwv3VEcv@` zcZf8BfS3Ck8waPx|G|63_k7Go;F`zTv97A?k&s!h-eioIf%|{ZTPfUnK*zs_8lUzJ zyJr;Vt?#P)LZVLhs1gj5&(&cM0G9*z5(&=ldexI5g?cp*7J#2*K{@2SAp!j@AB$9r_c;k#NFj#)x7#+vNO?=PaC%^c#`sHNfFSJw z$NG;F7dl*8z06eyV_~*8T~G|r%SrDlIMy z=}G&HvD_+|Vti~FK)Db;P6HXXx;Zmd`RJ}5Y&v>{%BfLvj{(jXpMc^|Nxj=&B(ii- zDNCq?!9W&1TkM-Z)(0UOxf}(VNvH%AjZyC?sRs6ym|~SthcApSc5y6VEb7ymBb-CE z@`e*BNS8hhd#eV)(?XB2V0t|3>>VE6yB#B=JIIjdVz9@nJ2&37_g|IChepy3g_iKML zH#po>#*#%aOrQGo>jROh!$Z4v00(QGpsuL^Dp?4A=%{H~)~~Vnkm80EXlPt-&$ej@ z+0LbxDdOEEOW?O@-;gcwVK>Ka05nG=B)FmWbS~?kvSSHXtxVV-;@xCYo91-sW2PuE zt_w~lS?s?jhD_^`<-IdOtNYz?4;gtQ`1efWs87@H?|rkCg5FIxwzb8(TsH$o9%#43 z_#TrAI)R*C^dEd#?6E(@k|)mc#Oo=%LUI8-WCqpc%jqoE)L_d16Sq?PI>6X!qMdq> z`p8|jA~B9~oub6Fmc?V*$-h2GnFAv=x%_M9Y;{;vRFn?zl+)A%rCHYXPEF;4xP<|wQJ@SnrrmTiHvGxFNTP5ibOGs`6CvK5Nl zy<}THbpHfd=qgQ9=OEkLLQ4S1v~%V!vwc6;U(*B%9|#_IJ^5?;R2I|ca41`gDlD7F zyJ;eQ8*0xd;XwlFu5VT`H~fq{dJS0UOin7D?6Ci8wqxmmCymVoj?Hns4K zVMI(Q<*ePaw-5VxH*;0TeV1cyOEl-0-n7rbqL(j5|K2YKWWYQ}Ql_F7*l)bmI16w9 zZ=rA-LORv$sh0~ekMRD9FMJy)jFSz`7Mk9=KE(d{R&gG{hm`v`OWOv}pf$nPTD-t! zBb*RQIcK?O|E}#^^k!sq+hpX!-`$-i2H;xextN@{1@s<_pzr@<@-qBqmIK|V|EfSp zxkx;*g!XyZ-4y-vgeVn*?x%U7E5GmDnC?sn`ZuKVADvK*rndk7HZBr$-+mdZ{P-ng zmaOonRAg^02IvQcq0*nvHDdp8*`>~g!pG>u5H9XZ{vW^lcR9&(IRR{m`toJteOsH> z{qq#yWPx&D4L9Q*HoT(NxmX8d@@ z`?NZ`Jvg`dH}Ft(`+My3J%_^uvcGF810nPa#i5NGP9l>V5c=jf|MpkSm(Yks70WLO z$@3n`_$R~tRj{Sb6?(AM-|KMx^ILs@OqxdijNTJ-=!*^CTggJ!2U$uAXwP624__RVaP z2@)qrYkGZr;(Yd<9?)Qb4vkhh#&`XI9nyaT4|+BK#{WC;VTk@L(yuOG`+HWj2w< zX{4>+>g&_m=g}TZBaP%P+`UC>=OSb(Jg|oPm*a!RYG3?x7rs4O36TWGs0wEO;EYYvx z833IJ?4HL4k)*u!m!LJSgIBv^4%}@*)bAe%{TlwtJ}u@ zzfvGwze8^Wwmne2Zg-x1Ts59UZ*go4G8tEyHhgmj1b+6r)J3_=bJhjE7?385!0-_Z zZ+}an&FNaFQ;F>Fy^5x_Z(k@R0MD;=-*dDyZrdGRw)u{`C&v@zA74vP9!{S~JY-RA zWh8sCRld;RciYBFv6E^)5Y>E0MHl@ox+x@Flo+F17w>!4IoQ2pc!z|(khv=Q7`rU(c2H^k_ zR9w7a7N0jN@%_2`!|Z(~+-XQ?7`Vmte^ytz@)uJ==YzVj%Hv#dT{<(O@1l+pI}W;JLu=-l1oVKYEkWXTVox`_Ezst+XIic5}21WB*A`a zMk1qw(&klrag*cXe(KxcnlJZ-DOkI_&7!kq8mPD(Axe}7ZPsy|xS8Lc6c$-7Eb;N% z8wSRV5DkfrY|cU|qa@e(3>&;C(})WT3QF$UJeC6Tc6WD20MU`T2Ot(6`Whp`Kq9b6 z7I1!cHhT}mm>Tc7&HGVre*|M}0j7?s2UB(~fG)(o2$O!JLWL_UD>HK<5WH&k;U2P^ zq)7^twO2pPX&WDT2{9}HI6gJhS?yq<((r&k!0DK5;NfQkYrb}sQP%GB+{)mV7l1~< z)gkXJyM!Sp<-3K-%!Gu5UoDf~7r!XLO^yq$m%+%>9FjcDk9EFoGOXnwVedj+QFDat zn;IN%*@t)zt9XUu2F+InO~!9`B9mFXZ>J{6l6OHYldgmie4+)ziEeb=Sbnv`W&I2O zt7^9=h_mj@hAF|S;>qR@GzfcNElXK;`w3F};SoaPbe;dfSI^yh;+9VRu<|iNDhzE4 zQNPcFwXr3&jCYD&P7y}0!q?W!PY4Ox+`6)+R=|ibE!?#-6H5;+ zrnH=+m!Ej+_XFK3Gu^Hm;nc6`T6tZy)&$XCSSP)pQ%ZI87r^WUl-}gLyteg_L+*$d z$r;90{AbxWvg(}AG<3~xpE4cFVe0mSa_E4rvqFVb%CFKfT8a9!d@xozA1_mWzX^a` z?0KUY(~gQ~zgzU^34*sFeU2l}#w6-}QLGoe6HUv8a)pmLD><{og#%Uu9EySRNj_=J z!^Pf=^bwwu?Nx+6oPDy9cZr_W$2N3_jp(q0;De9uDV>iH+lGu#x^k`Lk*y5deDbog z(ee7i0>S*toX>uOD`dAJD?UTsJ{@VK$?j6CmTpRoH(a0-_ZZY6AA?uEMobkIch}K4 zy0I;iS2B5SU1qgwbn*^EUOF#cF`XVd_Uux^TG_?fzTH>M^C+@#>$MNM=%iFQp=4YJFIxORT_R#?E=&~|kUs%^TgTeg51WxIc;A{CqSkX88<9;()qP<@! z#t5L=Q{jQmY8Z+Pq|rmU7Ha~jXgT1ql$~ShUZt;bpr-#xxHVORk;f))pC;d0St@#s z3ERVoB7RL`H9ju+AYN@*T5hr>bB8lyTh&qMKmoY*E;rgA;Fvv!Y3vC`C@bassQbZ> zYDG@DNyGpSbI5!}k;~bDm~8hsU?5lPexP;9*X_?1V={I~cIQ+%a2hF78LVGyPFSqQ znf3lBl2)o}@N_P7P_)@lSuO*os3J~*`UKbBR9#2?Yy^yTYLNYOzIr;Xw=B70zPpuA zo5fQtW!24*M@p1Va-Kz_gSKe{`}4Ou0IVgF!^yuG8$5p6FbM9(875~ z45ZSNrSuU?L3t)5C4otvFOE=|Ddy{6*o@>TPFB>rJ6t=~Vn2(v4 zDu%oP#n)zCGGH0Lv$P#@WDl5=j<9y#m^C~BGBTwDFR+K)osc~h%B2ekcWiCkl=B1% zPVfnqmReWuGVL0YXPXP>Cw}tp8|Bqw5Qb(_?KaL|$LS+rETlCiNcvb!xBC4SE8lKu zrQFZBnHel?H2B%r(=6>?m>J}`cn^#!#j`bj1^p5|+^`i^qbdS zw8GG6xyg(|fzHnTsUktdmmzNw1chn@7^iD15KK99EZ2tHj9kcJlDIZme;Z9p%>w>u)8rXH%(s z+(w12x2)xROB{D59_B@MXQN_`UZK*7 z$%)jxr26%9rF1Yi2!TRRtL(*<=oo>K>sE ziDzj0>MJ9-{0ZAsZB@oNZDE6`HB9*#a}{tC1Cg2Sg2StwFa;=l#ohJtDg7d?^TI%} z@6uYl&OzKUACUb%!IgAotLOc{DU zzKk&y z|Co=gmVH@=nWFfMu>vz?%+SbojDskIX)l^Y=`9sS0)>U#IX>mFFE3sEal;XS(|0z4UNKoMF#S z>io%elW6=`{2Et(DZvMf{IjoC=tS(po)_{on*A0z{5v3B2MF5??2DU72PD7Ge5A%7 z9fl|_^|`^`+D0(qam`5tqKlK z(ZzpECeh>! z9`CuXu6hhS1?D)`5!#f7#WG$W3DOP3WKPQOXD9HdTb$(x>BjDnY-1-{Hf=>F&u5FW zOr*xLUDmRAD}{^1!?T7Ph;F*@x7L^4d#zct>|}nnH0i-k^&3F#FphQC#ZOcheWl1D zOa*GaDmqfVo90v%FIc)O+97PS@BcsBqi#ajCPKm1FI)S4G<4)B~>Wwj0xt zQz`OGi}+SF(w@s8=UL%e|4EHQr62!I^v_f}&Hzri7krR=43EdyHg%)%7Nb`EYY(Qe zgmtaomr#C3-hSY54p0g%XkQU5HkbN%M?5$gSqjfErt+%fiLtpbKlMwBjd_U6!mS%<~j$aqBdB zphtZWCndMk4k-VLfZdLkHA%gHQM>>$?=40e)wqiE>CC$afd}niY>g&*){)CqNjZ^# zq(G>ak}7P!94BSCZaG((cRAPBG_3q-rh=ySXpw0cjT}uho)IY7sT5;TC_c0}4nIv( zI0U5O3Uh6(b^ACBJ(uE6iFZ7H5Dn|4+5#i&4#AU*VW8AQ$Pxn5jLH2g)-=~>lDp)! zoB28{EE+41%a`T;@$Td@BMSJK`yDVjNG1MCJ(b$`q*)mOHRkCmV^QJV27uJ#bw0*> znW5c05lD>q0eU#-82t3_hk?_NMfvw-Xv&Kh@;_7tNfzf0NTDnFGs0gXic~g}O@f zs%FYF?1m;IN@KkI)3?%M=gYn9*S#dv4$<;B?7q|KUUf&EK@d^jWHBh~T_+2($$_*i ztTe6*E|L~17H)<*y+!alNY;pKAc~Fzh1!~M>(Ht}&7aHYD~6BL{{S|lzfoe&Ay?b6 zE6pV@$L<`7|JuyF$l7A_#`2}CX^o#x&Y9p>21^7*k6#+FE?sfy(A-OJ=B&e8H*w<* z$o`5u%>h(igX{v>?Fv_q1Xo2A1b)rs@0o1BTT}88DP;a~U3I`v$JsWVy}Kth$9zZY zH7>ArI2v24%33NydochT6ix@z!LBbeTdf6eA3%kg>qVCs=Zia&_jgoi$HJi zWlz#JhvzX$v~|Iu@*yKHJ0Hs4XCYswinPg3Ho8}j45*S3+hP+!dHD<_4u}p>%3*)}S{)!_f))d}Pr~$v>d?I>x4RgwyyOyDXI^Yc?$sAd&-N zIRUHTMMjNPNt?|`$11umR?aYk`J)4nAWi5*`#&}d@wx_Pxr%ieY_=W{jEvK8+(i?3 zzwmo6%mj;4Zs}Mw+`-9`JntQK@_6Aa~uGTI!1Zk+;hf%KgW5qG@~qYaaw zR-6bUuh*xFxX3_0r*(_9pEt)qeOp|VjQ3ekJD@nPPU6kLBd#C1PsMJ7TbB{&dWxI5 z7pyV;#IFZIkF}(N{S;og+1%txJmN>p+qDTH;hf}_PnKA698QX$Yy<5t*CRPA0^Da{ zcFZxML)~>WNHnajHVZCyW6BDnY=$AD$E+jt-5!h{9?4Ucon43Bs6AiSlDRAPoMKkJ zI$#?mOhP7y?Rf7-o9$JfVR$drWH#y2&VSlkUI?0qC>Y^et?3;7 zB6@J%?IO4`eWw{u_3Mmlb z3RTi-N-;S)Y0x15a5X zopf8n$>%r*ncvFx8!6)2PlYEuMy?Bo@okr=JHnW!ybq&X=CJBk36~O6SZ4CdKj>dD zi)U%<9UPN)IanX5%c0nes-x0r z664N%hp*h_!gAN)1#IhC7#N9)(WN!aKAMa1D{JTpAyG2PTy~qql6oCyI6wwW2m8V& zI7v2mhNkm<-KghB@rWc!KDorQmCTJ3!%f7PtIaQz_Sg@1`Y4xmB@>)Slf~8Hs+ICA6K_f!7ilej?17;d&`UU@fe4Zz6Q7XjCXjFs1{GpR! z^(O4=utS$nioId__})|uQ`q>OA47Y%<@mCgsY%{;FeeB_PRH)KQOy zTM3^?fyp6%$^Gsi{VT*?-d0 z-a|^Kdnaq-rF~+Q$QaM+uJNZrR24OStWAO2*)cC>Hn!wFeBj6T*Mg5U2`NI+Ts!Gk#v8rvFf z59V#=LBIW^W^?paF)phLwShI@*cOx>kT6glb`I2a^8~_xy*76H=5!NcMB?$TfyoW^ z#TRBkjK5xgYuKWrGbAxFA=Ga!yddYlYziz)D(a>Yz2y0jND^=MfKALym&9>bnQbn* zk5MszvL%zFJg8}DQMwO@_I#t2Z=L0WijZC>tSYuavr%QW%c6>LA!2zkt4H=?92O`Jl&!bk8%IW zJiKEo*GpcX{8`<^0`c63v)r%CW9V2@TT@;}^IJ19DV4wF6q4DaK_$h*E-yknaI;t2 zXRVB*AAjU+^M13=zeC2Z{G>**3*|32Q~`}7rlJTge|D-VbhycOFIQP5r6kw!sqMcQ zh9oqrAQ5nrfr6gNH_&aEoqqX0ylXIQjPp;v1C3k^2w&5@7A-wl@W}*cCKx|#h2H1u zht=B|u^^zN%ib>WSufv|8}L@Egk0XMDrJYouTZu{>_rHYCL0^+(Ipoo4qDr`;S>>$ zLp|qZd2{Ll&X=vdEUVfY zAPbn4XT%t2clqw5+hUVw^z)PXn(Ot;r8>{5t!+)m*FQx`_|-_WPEV$pnH3*fJSvO` z4T=x2_W7||5|guI`=bblfa1jk_MZTXGH!Fr6rd;lCH#-38Aw8 zX?>XUV_y(Dcal~2qIj+Qc<>}J>{T(cwfhh)=VF#B^cb*Pw*Ayr85K#QQau0QRA0jM z*xqq(X)k#DUO$gmcwWcIFq1ml*Qas|cj>O@thCyE0Nt8kUCp8SF&Q|Y<+C|0cW{#@ znY%5yq(n-HN)+@_LI+I5kjU61vFlA=9|K%GpP&plpgC2~Gp9P0t2U|PrnZ60+D&WC z$Ej^agvnUAP~bsFjgl;&T@P|`T#?2U5=0vw;O(Ak^-U

u3F4Vd>q6hjxx9%L#8b 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 hW&Mv1;2nH^g`PIz%Gu`~y^976IjNVDCE~Ar{|z Date: Fri, 14 Jun 2024 19:12:44 +0200 Subject: [PATCH 11/15] Polishing naming and Bicep code --- infra/app/quarkus.bicep | 2 +- infra/app/spring-boot.bicep | 2 +- infra/main.bicep | 55 ++++++++++++++----------------------- 3 files changed, 23 insertions(+), 36 deletions(-) diff --git a/infra/app/quarkus.bicep b/infra/app/quarkus.bicep index 1686ef5..679a646 100644 --- a/infra/app/quarkus.bicep +++ b/infra/app/quarkus.bicep @@ -14,7 +14,7 @@ param location string = resourceGroup().location param tags object = {} @description('Name of the service. This name is used to add "azd-service-name" tag to the tags for the container app. Default value is "quarkus". If you change this value, make sure to change the name of the service in "azure.yaml" file as well.') -param serviceName string = 'quarkus' +param serviceName string @description('Name of the identity that will be created and used by the container app to pull image from the container registry.') param identityName string diff --git a/infra/app/spring-boot.bicep b/infra/app/spring-boot.bicep index ea701c4..f28ab51 100644 --- a/infra/app/spring-boot.bicep +++ b/infra/app/spring-boot.bicep @@ -14,7 +14,7 @@ param location string = resourceGroup().location param tags object = {} @description('Name of the service. This name is used to add "azd-service-name" tag to the tags for the container app. Default value is "srping-boot". If you change this value, make sure to change the name of the service in "azure.yaml" file as well.') -param serviceName string = 'spring-boot' +param serviceName string @description('Name of the identity that will be created and used by the container app to pull image from the container registry.') param identityName string diff --git a/infra/main.bicep b/infra/main.bicep index f4e2aef..aa0dfe5 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -59,10 +59,6 @@ param applicationInsightsDashboardName string = '' @description('Name of the PostgreSQL flexible server to deploy. If not specified, a name will be generated. The name is global and must be unique within Azure. The maximum length is 63 characters. It contains only lowercase letters, numbers and hyphens, and cannot start nor end with a hyphen.') param postgresFlexibleServerName string = '' -@maxLength(63) -@description('Name of the PostgreSQL flexible server database to deploy.') -param postgresDatabaseName string = 'database' - @description('Name of the PostgreSQL admin user.') param postgresAdminUsername string = 'pgadmin' @@ -96,16 +92,22 @@ var abbreviations = loadJsonContent('./abbreviations.json') // tags that should be applied to all resources. var tags = { - // Tag all resources with the environment name. 'azd-env-name': environmentName } /******************************* Resource Names *******************************/ +// Name of the service defined in azure.yaml +// A tag named azd-service-name with this value should be applied to the service host resource, such as: +// tags: union(tags, { 'azd-service-name': apiServiceName }) +var quarkusServiceName = 'quarkus' +var springBootServiceName = 'spring-boot' + +var quarkusDbName = '${quarkusServiceName}db' +var springBootDbName = '${springBootServiceName}db' + // Generate a unique token to be used in naming resources. -// Remove linter suppression after using. -#disable-next-line no-unused-vars var resourceToken = toLower(uniqueString(subscription().id, environmentName, location)) @description('Name of the environment with only alphanumeric characters. Used for resource names that require alphanumeric characters only.') @@ -116,7 +118,7 @@ var _containerRegistryName = !empty(containerRegistryName) ? containerRegistryNa var _logAnalyticsName = !empty(logAnalyticsWorkspaceName) ? logAnalyticsWorkspaceName : take('${abbreviations.operationalInsightsWorkspaces}${environmentName}', 63) var _applicationInsightsName = !empty(applicationInsightsName) ? applicationInsightsName : take('${abbreviations.insightsComponents}${environmentName}', 255) var _applicationInsightsDashboardName = !empty(applicationInsightsDashboardName) ? applicationInsightsDashboardName : take('${abbreviations.portalDashboards}${environmentName}', 160) -var _quarkusContainerAppName = !empty(quarkusContainerAppName) ? quarkusContainerAppName : take('${abbreviations.appContainerApps}quarkus-${environmentName}', 32) +var _quarkusContainerAppName = !empty(quarkusContainerAppName) ? quarkusContainerAppName : take('${abbreviations.appContainerApps}${quarkusServiceName}-${environmentName}', 32) var _springBootContainerAppName = !empty(springBootContainerAppName) ? springBootContainerAppName : take('${abbreviations.appContainerApps}spring-boot-${environmentName}', 32) var _postgresFlexibleServerName = !empty(postgresFlexibleServerName) ? postgresFlexibleServerName : take(toLower('${abbreviations.dBforPostgreSQLServers}${take(environmentName, 44)}-${resourceToken}'), 63) var _keyVaultName = !empty(keyVaultName) ? keyVaultName : take('${abbreviations.keyVaultVaults}${take(alphaNumericEnvironmentName, 8)}${resourceToken}', 24) @@ -126,16 +128,6 @@ var _keyVaultSecrets = [ value: postgresAdminPassword } ] -// Name of the service defined in azure.yaml -// A tag named azd-service-name with this value should be applied to the service host resource, such as: -// Microsoft.Web/sites for appservice, function -// Example usage: -// tags: union(tags, { 'azd-service-name': apiServiceName }) -#disable-next-line no-unused-vars -var quarkusServiceName = 'quarkus' - -#disable-next-line no-unused-vars -var springBootServiceName = 'spring-boot' /******************************************************************************/ /* RESOURCES */ @@ -149,10 +141,11 @@ resource resourceGroup 'Microsoft.Resources/resourceGroups@2021-04-01' = { } module quarkus './app/quarkus.bicep' = { - name: 'quarkus' + name: quarkusServiceName scope: resourceGroup params: { name: _quarkusContainerAppName + serviceName: quarkusServiceName location: location tags: tags identityName: _quarkusContainerAppName @@ -160,20 +153,21 @@ module quarkus './app/quarkus.bicep' = { containerAppsEnvironmentName: containerAppsEnvironment.outputs.name containerRegistryName: containerRegistry.outputs.name databaseConfig: { - name: 'quarkusdb' + name: quarkusDbName hostname: postgresServer.outputs.POSTGRES_DOMAIN_NAME username: postgresAdminUsername } - keyVaultName: keyVault.name + keyVaultName: keyVault.outputs.name exists: quarkusAppExists } } module springBoot './app/spring-boot.bicep' = { - name: 'spring-boot' + name: springBootServiceName scope: resourceGroup params: { name: _springBootContainerAppName + serviceName: springBootServiceName location: location tags: tags identityName: _springBootContainerAppName @@ -181,11 +175,11 @@ module springBoot './app/spring-boot.bicep' = { containerAppsEnvironmentName: containerAppsEnvironment.outputs.name containerRegistryName: containerRegistry.outputs.name databaseConfig: { - name: 'springbootdb' + name: springBootDbName hostname: postgresServer.outputs.POSTGRES_DOMAIN_NAME username: postgresAdminUsername } - keyVaultName: keyVault.name + keyVaultName: keyVault.outputs.name superHeroUrl: quarkus.outputs.SERVICE_QUARKUS_URI exists: springBootAppExists } @@ -205,7 +199,7 @@ module containerAppsEnvironment 'core/host/container-apps-environment.bicep' = { } module keyVault './core/security/keyvault.bicep' = { - name: _keyVaultName + name: 'keyVault' scope: resourceGroup params: { name: _keyVaultName @@ -276,7 +270,7 @@ module postgresServer 'core/database/postgresql/flexibleserver.bicep' = { administratorLogin: postgresAdminUsername administratorLoginPassword: postgresAdminPassword databaseNames: [ - 'quarkusdb', 'springbootdb' + quarkusDbName, springBootDbName ] allowAzureIPsFirewall: true } @@ -286,22 +280,15 @@ module postgresServer 'core/database/postgresql/flexibleserver.bicep' = { /* OUTPUTS */ /******************************************************************************/ -// Add outputs from the deployment here, if needed. -// -// This allows the outputs to be referenced by other bicep deployments in the deployment pipeline, -// or by the local machine as a way to reference created resources in Azure for local development. -// Secrets should not be added here. -// // Outputs are automatically saved in the local azd environment .env file. // To see these outputs, run `azd env get-values`, or `azd env get-values --output json` for json output. - @description('Location where all resources were installed.') output AZURE_LOCATION string = location @description('Azure Tenant ID.') output AZURE_TENANT_ID string = tenant().tenantId -@description('Azure Key Vault name. Is reused to fetch PostgreSQL password in main.parameters.json') +@description('Azure Key Vault name. Reused to fetch PostgreSQL password in main.parameters.json') output AZURE_KEY_VAULT_NAME string = keyVault.outputs.name @description('Container registry endpoint.') From 9a40068f502e69b98a3920d8a7ac26be2151c810 Mon Sep 17 00:00:00 2001 From: Dominique Broeglin Date: Fri, 14 Jun 2024 19:13:03 +0200 Subject: [PATCH 12/15] Removing unused Bicep files --- infra/core/config/configstore.bicep | 48 --------- .../security/aks-managed-cluster-access.bicep | 27 ----- infra/core/security/configstore-access.bicep | 21 ---- infra/core/storage/storage-account.bicep | 101 ------------------ infra/core/testing/loadtesting.bicep | 15 --- 5 files changed, 212 deletions(-) delete mode 100644 infra/core/config/configstore.bicep delete mode 100644 infra/core/security/aks-managed-cluster-access.bicep delete mode 100644 infra/core/security/configstore-access.bicep delete mode 100644 infra/core/storage/storage-account.bicep delete mode 100644 infra/core/testing/loadtesting.bicep diff --git a/infra/core/config/configstore.bicep b/infra/core/config/configstore.bicep deleted file mode 100644 index 96818f1..0000000 --- a/infra/core/config/configstore.bicep +++ /dev/null @@ -1,48 +0,0 @@ -metadata description = 'Creates an Azure App Configuration store.' - -@description('The name for the Azure App Configuration store') -param name string - -@description('The Azure region/location for the Azure App Configuration store') -param location string = resourceGroup().location - -@description('Custom tags to apply to the Azure App Configuration store') -param tags object = {} - -@description('Specifies the names of the key-value resources. The name is a combination of key and label with $ as delimiter. The label is optional.') -param keyValueNames array = [] - -@description('Specifies the values of the key-value resources.') -param keyValueValues array = [] - -@description('The principal ID to grant access to the Azure App Configuration store') -param principalId string - -resource configStore 'Microsoft.AppConfiguration/configurationStores@2023-03-01' = { - name: name - location: location - sku: { - name: 'standard' - } - tags: tags -} - -resource configStoreKeyValue 'Microsoft.AppConfiguration/configurationStores/keyValues@2023-03-01' = [for (item, i) in keyValueNames: { - parent: configStore - name: item - properties: { - value: keyValueValues[i] - tags: tags - } -}] - -module configStoreAccess '../security/configstore-access.bicep' = { - name: 'app-configuration-access' - params: { - configStoreName: name - principalId: principalId - } - dependsOn: [configStore] -} - -output endpoint string = configStore.properties.endpoint diff --git a/infra/core/security/aks-managed-cluster-access.bicep b/infra/core/security/aks-managed-cluster-access.bicep deleted file mode 100644 index aedb080..0000000 --- a/infra/core/security/aks-managed-cluster-access.bicep +++ /dev/null @@ -1,27 +0,0 @@ -metadata description = 'Assigns RBAC role to the specified AKS cluster and principal.' - -@description('The AKS cluster name used as the target of the role assignments.') -param clusterName string - -@description('The principal ID to assign the role to.') -param principalId string - -@description('The principal type to assign the role to.') -@allowed(['Device','ForeignGroup','Group','ServicePrincipal','User']) -param principalType string = 'User' - -var aksClusterAdminRole = subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'b1ff04bb-8a4e-4dc4-8eb5-8693973ce19b') - -resource aksRole 'Microsoft.Authorization/roleAssignments@2022-04-01' = { - scope: aksCluster // Use when specifying a scope that is different than the deployment scope - name: guid(subscription().id, resourceGroup().id, principalId, aksClusterAdminRole) - properties: { - roleDefinitionId: aksClusterAdminRole - principalType: principalType - principalId: principalId - } -} - -resource aksCluster 'Microsoft.ContainerService/managedClusters@2023-10-02-preview' existing = { - name: clusterName -} diff --git a/infra/core/security/configstore-access.bicep b/infra/core/security/configstore-access.bicep deleted file mode 100644 index de72b94..0000000 --- a/infra/core/security/configstore-access.bicep +++ /dev/null @@ -1,21 +0,0 @@ -@description('Name of Azure App Configuration store') -param configStoreName string - -@description('The principal ID of the service principal to assign the role to') -param principalId string - -resource configStore 'Microsoft.AppConfiguration/configurationStores@2023-03-01' existing = { - name: configStoreName -} - -var configStoreDataReaderRole = subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '516239f1-63e1-4d78-a4de-a74fb236a071') - -resource configStoreDataReaderRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { - name: guid(subscription().id, resourceGroup().id, principalId, configStoreDataReaderRole) - scope: configStore - properties: { - roleDefinitionId: configStoreDataReaderRole - principalId: principalId - principalType: 'ServicePrincipal' - } -} diff --git a/infra/core/storage/storage-account.bicep b/infra/core/storage/storage-account.bicep deleted file mode 100644 index 6149fb2..0000000 --- a/infra/core/storage/storage-account.bicep +++ /dev/null @@ -1,101 +0,0 @@ -metadata description = 'Creates an Azure storage account.' -param name string -param location string = resourceGroup().location -param tags object = {} - -@allowed([ - 'Cool' - 'Hot' - 'Premium' ]) -param accessTier string = 'Hot' -param allowBlobPublicAccess bool = true -param allowCrossTenantReplication bool = true -param allowSharedKeyAccess bool = true -param containers array = [] -param corsRules array = [] -param defaultToOAuthAuthentication bool = false -param deleteRetentionPolicy object = {} -@allowed([ 'AzureDnsZone', 'Standard' ]) -param dnsEndpointType string = 'Standard' -param files array = [] -param kind string = 'StorageV2' -param minimumTlsVersion string = 'TLS1_2' -param queues array = [] -param shareDeleteRetentionPolicy object = {} -param supportsHttpsTrafficOnly bool = true -param tables array = [] -param networkAcls object = { - bypass: 'AzureServices' - defaultAction: 'Allow' -} -@allowed([ 'Enabled', 'Disabled' ]) -param publicNetworkAccess string = 'Enabled' -param sku object = { name: 'Standard_LRS' } - -resource storage 'Microsoft.Storage/storageAccounts@2023-01-01' = { - name: name - location: location - tags: tags - kind: kind - sku: sku - properties: { - accessTier: accessTier - allowBlobPublicAccess: allowBlobPublicAccess - allowCrossTenantReplication: allowCrossTenantReplication - allowSharedKeyAccess: allowSharedKeyAccess - defaultToOAuthAuthentication: defaultToOAuthAuthentication - dnsEndpointType: dnsEndpointType - minimumTlsVersion: minimumTlsVersion - networkAcls: networkAcls - publicNetworkAccess: publicNetworkAccess - supportsHttpsTrafficOnly: supportsHttpsTrafficOnly - } - - resource blobServices 'blobServices' = if (!empty(containers)) { - name: 'default' - properties: { - cors: { - corsRules: corsRules - } - deleteRetentionPolicy: deleteRetentionPolicy - } - resource container 'containers' = [for container in containers: { - name: container.name - properties: { - publicAccess: contains(container, 'publicAccess') ? container.publicAccess : 'None' - } - }] - } - - resource fileServices 'fileServices' = if (!empty(files)) { - name: 'default' - properties: { - cors: { - corsRules: corsRules - } - shareDeleteRetentionPolicy: shareDeleteRetentionPolicy - } - } - - resource queueServices 'queueServices' = if (!empty(queues)) { - name: 'default' - properties: { - - } - resource queue 'queues' = [for queue in queues: { - name: queue.name - properties: { - metadata: {} - } - }] - } - - resource tableServices 'tableServices' = if (!empty(tables)) { - name: 'default' - properties: {} - } -} - -output id string = storage.id -output name string = storage.name -output primaryEndpoints object = storage.properties.primaryEndpoints diff --git a/infra/core/testing/loadtesting.bicep b/infra/core/testing/loadtesting.bicep deleted file mode 100644 index 4678108..0000000 --- a/infra/core/testing/loadtesting.bicep +++ /dev/null @@ -1,15 +0,0 @@ -param name string -param location string = resourceGroup().location -param managedIdentity bool = false -param tags object = {} - -resource loadTest 'Microsoft.LoadTestService/loadTests@2022-12-01' = { - name: name - location: location - tags: tags - identity: { type: managedIdentity ? 'SystemAssigned' : 'None' } - properties: { - } -} - -output loadTestingName string = loadTest.name From bab702544c3085213536d9d77b2de6138137ee03 Mon Sep 17 00:00:00 2001 From: Sandra Ahlgrimm Date: Wed, 18 Sep 2024 22:54:43 +0000 Subject: [PATCH 13/15] remove otel from connection string --- infra/app/spring-boot.bicep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infra/app/spring-boot.bicep b/infra/app/spring-boot.bicep index f28ab51..518181d 100644 --- a/infra/app/spring-boot.bicep +++ b/infra/app/spring-boot.bicep @@ -90,7 +90,7 @@ module springBoot '../core/host/container-app-upsert.bicep' = { env: [ { name: 'SPRING_DATASOURCE_URL' - value: 'jdbc:otel:postgresql://${databaseConfig.hostname}:${databaseConfig.?port ?? 5432}/${databaseConfig.name}' + value: 'jdbc:postgresql://${databaseConfig.hostname}:${databaseConfig.?port ?? 5432}/${databaseConfig.name}' } { name: 'SPRING_DATASOURCE_USERNAME' From 533b62f14aa29e00d9f063d4a49233725d0ead0e Mon Sep 17 00:00:00 2001 From: Sandra Ahlgrimm Date: Thu, 19 Sep 2024 04:54:40 +0000 Subject: [PATCH 14/15] fix small bug --- .devcontainer/devcontainer.json | 1 - .../examples/springboot/controller/VeggieController.java | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index e62d276..c6d0ee6 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -25,7 +25,6 @@ "version": "latest", "installBicep": true }, - "ghcr.io/devcontainers/features/github-cli:1": {}, "ghcr.io/azure/azure-dev/azd:latest": {} }, diff --git a/code/spring-boot-telemetry/src/main/java/com/azure/examples/springboot/controller/VeggieController.java b/code/spring-boot-telemetry/src/main/java/com/azure/examples/springboot/controller/VeggieController.java index 9ac9bc4..966c8ed 100644 --- a/code/spring-boot-telemetry/src/main/java/com/azure/examples/springboot/controller/VeggieController.java +++ b/code/spring-boot-telemetry/src/main/java/com/azure/examples/springboot/controller/VeggieController.java @@ -48,7 +48,7 @@ public ResponseEntity addVeggie(@RequestBody VeggieItem veggie) { } @DeleteMapping("/{id}") - public ResponseEntity deleteVeggie(@PathVariable("id") String id) { + public ResponseEntity deleteVeggie(@PathVariable("id") Long id) { veggieService.deleteVeggie(id); return ResponseEntity.ok("Veggie deleted successfully"); } @@ -60,7 +60,7 @@ public ResponseEntity> getAllVeggies() { } @GetMapping("/{id}") - public ResponseEntity getVeggieById(@PathVariable("id") String id) { + public ResponseEntity getVeggieById(@PathVariable("id") Long id) { VeggieItem veggie = veggieService.getVeggieById(id); if (veggie != null) { return ResponseEntity.ok(veggie); From a083e318946e9070a6f357c2688df0f22f5ac5e3 Mon Sep 17 00:00:00 2001 From: Sandra Ahlgrimm Date: Thu, 19 Sep 2024 12:24:13 +0000 Subject: [PATCH 15/15] update docs --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b22bab0..159e836 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ This repository contains code demonstrating how to enable OpenTelemetry features * [Quarkus](./code/quarkus-telemetry/README.md) Setup the infrastructure, and deploy the sample to Azure Container Apps with [azd](https://learn.microsoft.com/azure/developer/azure-developer-cli/). +We'll make use of bicep files that you find and update [here](./infra). To provide Infrastructure as Code for Azure, Terraform or Bicep files are recommended. Learn more about Bicep [here](https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview?tabs=bicep). ```bash # Login to Azure