From 6777d58850a1f22522e1489baefe1b726bf47f79 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 26 Sep 2024 19:53:55 +0300 Subject: [PATCH 001/409] add agora 2.0 codebase --- .../AgConfig-contoso-hypermarket.psd1 | 205 + .../PowerShell/AgConfig-contoso-motors.psd1 | 233 + .../AgConfig-contoso-supermarket.psd1 | 319 ++ .../artifacts/PowerShell/AgLogonScript.ps1 | 86 +- .../artifacts/PowerShell/Bootstrap.ps1 | 53 +- .../artifacts/PowerShell/Modules/common.psm1 | 381 +- .../Modules/contoso_hypermarket.psm1 | 185 + .../PowerShell/Modules/contoso_motors.psm1 | 309 ++ .../Modules/contoso_supermarket.psm1 | 772 +++ .../artifacts/PowerShell/PSProfile.ps1 | 1 - .../artifacts/kubernetes/K3s/installK3s.sh | 253 + .../artifacts/kubernetes/K3s/longhorn.yaml | 4571 +++++++++++++++++ .../artifacts/kubernetes/K3s/welcomeK3s.sh | 9 + .../settings/Bookmarks-contoso-hypermarket | 215 + .../settings/Bookmarks-contoso-motors | 125 + .../settings/Bookmarks-contoso-supermarket | 215 + .../artifacts/settings/mq_cloudConnector.yml | 77 +- .../.gitignore | 0 .../azure.yaml | 0 .../bicep/clientVm/clientVm.bicep | 210 + .../bicep/data/dataExplorer.bicep | 75 + .../bicep/data/eventGrid.bicep | 0 .../bicep/data/eventHub.bicep | 0 .../bicep/data/keyVault.bicep | 0 .../bicep/kubernetes/acr.bicep | 0 .../bicep/kubernetes/ubuntuRancher.bicep | 179 + .../bicep/kubernetes/ubuntuRancherNodes.bicep | 158 + .../bicep/main.azd.bicep | 6 +- .../bicep/main.azd.parameters.json | 0 .../contoso_hypermarket/bicep/main.bicep | 287 ++ .../bicep/main.parameters.json | 33 + .../bicep/mgmt/mgmtArtifacts.bicep | 0 .../bicep/mgmt/network.bicep | 368 ++ .../bicep/mgmt/policyAzureArcRGScope.bicep | 125 + .../bicep/mgmt/storageAccount.bicep | 51 + .../bicep/storage/storageAccount.bicep | 48 + .../scripts/postprovision.ps1 | 4 +- .../scripts/preprovision.ps1 | 0 .../{retail => contoso_motors}/.gitignore | 0 .../{retail => contoso_motors}/azure.yaml | 0 .../bicep/clientVm/clientVm.bicep | 9 +- .../bicep/data/dataExplorer.bicep | 0 .../contoso_motors/bicep/data/eventGrid.bicep | 184 + .../contoso_motors/bicep/data/eventHub.bicep | 61 + .../contoso_motors/bicep/data/keyVault.bicep | 71 + .../bicep/data/script.kql | 0 .../contoso_motors/bicep/kubernetes/acr.bicep | 25 + .../bicep/main.azd.bicep | 6 +- .../bicep/main.azd.parameters.json | 0 .../bicep/main.bicep | 12 +- .../bicep/main.parameters.json | 0 .../bicep/mgmt/VMInsightsDCR.bicep | 1 - .../bicep/mgmt/mgmtArtifacts.bicep | 0 .../bicep/mgmt/network.bicep | 0 .../bicep/mgmt/policyAzureArcRGScope.bicep | 16 +- .../bicep/mgmt/storageAccount.bicep | 0 .../bicep/storage/storageAccount.bicep | 0 .../scripts/postprovision.ps1 | 0 .../scripts/predown.ps1 | 0 .../scripts/preprovision.ps1 | 0 .../contoso_supermarket/.gitignore | 2 + .../contoso_supermarket/azure.yaml | 20 + .../bicep/clientVm/clientVm.bicep | 9 +- .../bicep/data/cosmosDB.bicep | 0 .../bicep/data/dataExplorer.bicep | 0 .../bicep/data/iotHub.bicep | 0 .../bicep/data/script.kql | 0 .../bicep/kubernetes/aks.bicep | 6 +- .../contoso_supermarket/bicep/main.azd.bicep | 218 + .../bicep/main.azd.parameters.json | 39 + .../bicep/main.bicep | 12 +- .../bicep/main.parameters.json | 0 .../bicep/mgmt/mgmtArtifacts.bicep | 52 + .../bicep/mgmt/network.bicep | 0 .../bicep/mgmt/policyAzureArcRGScope.bicep | 0 .../bicep/mgmt/storageAccount.bicep | 0 .../scripts/postprovision.ps1 | 84 + .../scripts/preprovision.ps1 | 248 + 78 files changed, 10465 insertions(+), 163 deletions(-) create mode 100644 azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 create mode 100644 azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 create mode 100644 azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 create mode 100644 azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 create mode 100644 azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_motors.psm1 create mode 100644 azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_supermarket.psm1 create mode 100644 azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh create mode 100644 azure_jumpstart_ag/artifacts/kubernetes/K3s/longhorn.yaml create mode 100644 azure_jumpstart_ag/artifacts/kubernetes/K3s/welcomeK3s.sh create mode 100644 azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-hypermarket create mode 100644 azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-motors create mode 100644 azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-supermarket rename azure_jumpstart_ag/{manufacturing => contoso_hypermarket}/.gitignore (100%) rename azure_jumpstart_ag/{manufacturing => contoso_hypermarket}/azure.yaml (100%) create mode 100644 azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep create mode 100644 azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataExplorer.bicep rename azure_jumpstart_ag/{manufacturing => contoso_hypermarket}/bicep/data/eventGrid.bicep (100%) rename azure_jumpstart_ag/{manufacturing => contoso_hypermarket}/bicep/data/eventHub.bicep (100%) rename azure_jumpstart_ag/{manufacturing => contoso_hypermarket}/bicep/data/keyVault.bicep (100%) rename azure_jumpstart_ag/{manufacturing => contoso_hypermarket}/bicep/kubernetes/acr.bicep (100%) create mode 100644 azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep create mode 100644 azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep rename azure_jumpstart_ag/{retail => contoso_hypermarket}/bicep/main.azd.bicep (98%) rename azure_jumpstart_ag/{retail => contoso_hypermarket}/bicep/main.azd.parameters.json (100%) create mode 100644 azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep create mode 100644 azure_jumpstart_ag/contoso_hypermarket/bicep/main.parameters.json rename azure_jumpstart_ag/{retail => contoso_hypermarket}/bicep/mgmt/mgmtArtifacts.bicep (100%) create mode 100644 azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep create mode 100644 azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/policyAzureArcRGScope.bicep create mode 100644 azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/storageAccount.bicep create mode 100644 azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep rename azure_jumpstart_ag/{retail => contoso_hypermarket}/scripts/postprovision.ps1 (96%) rename azure_jumpstart_ag/{retail => contoso_hypermarket}/scripts/preprovision.ps1 (100%) rename azure_jumpstart_ag/{retail => contoso_motors}/.gitignore (100%) rename azure_jumpstart_ag/{retail => contoso_motors}/azure.yaml (100%) rename azure_jumpstart_ag/{manufacturing => contoso_motors}/bicep/clientVm/clientVm.bicep (93%) rename azure_jumpstart_ag/{manufacturing => contoso_motors}/bicep/data/dataExplorer.bicep (100%) create mode 100644 azure_jumpstart_ag/contoso_motors/bicep/data/eventGrid.bicep create mode 100644 azure_jumpstart_ag/contoso_motors/bicep/data/eventHub.bicep create mode 100644 azure_jumpstart_ag/contoso_motors/bicep/data/keyVault.bicep rename azure_jumpstart_ag/{manufacturing => contoso_motors}/bicep/data/script.kql (100%) create mode 100644 azure_jumpstart_ag/contoso_motors/bicep/kubernetes/acr.bicep rename azure_jumpstart_ag/{manufacturing => contoso_motors}/bicep/main.azd.bicep (98%) rename azure_jumpstart_ag/{manufacturing => contoso_motors}/bicep/main.azd.parameters.json (100%) rename azure_jumpstart_ag/{manufacturing => contoso_motors}/bicep/main.bicep (93%) rename azure_jumpstart_ag/{manufacturing => contoso_motors}/bicep/main.parameters.json (100%) rename azure_jumpstart_ag/{manufacturing => contoso_motors}/bicep/mgmt/VMInsightsDCR.bicep (97%) rename azure_jumpstart_ag/{manufacturing => contoso_motors}/bicep/mgmt/mgmtArtifacts.bicep (100%) rename azure_jumpstart_ag/{manufacturing => contoso_motors}/bicep/mgmt/network.bicep (100%) rename azure_jumpstart_ag/{manufacturing => contoso_motors}/bicep/mgmt/policyAzureArcRGScope.bicep (91%) rename azure_jumpstart_ag/{manufacturing => contoso_motors}/bicep/mgmt/storageAccount.bicep (100%) rename azure_jumpstart_ag/{manufacturing => contoso_motors}/bicep/storage/storageAccount.bicep (100%) rename azure_jumpstart_ag/{manufacturing => contoso_motors}/scripts/postprovision.ps1 (100%) rename azure_jumpstart_ag/{manufacturing => contoso_motors}/scripts/predown.ps1 (100%) rename azure_jumpstart_ag/{manufacturing => contoso_motors}/scripts/preprovision.ps1 (100%) create mode 100644 azure_jumpstart_ag/contoso_supermarket/.gitignore create mode 100644 azure_jumpstart_ag/contoso_supermarket/azure.yaml rename azure_jumpstart_ag/{retail => contoso_supermarket}/bicep/clientVm/clientVm.bicep (94%) rename azure_jumpstart_ag/{retail => contoso_supermarket}/bicep/data/cosmosDB.bicep (100%) rename azure_jumpstart_ag/{retail => contoso_supermarket}/bicep/data/dataExplorer.bicep (100%) rename azure_jumpstart_ag/{retail => contoso_supermarket}/bicep/data/iotHub.bicep (100%) rename azure_jumpstart_ag/{retail => contoso_supermarket}/bicep/data/script.kql (100%) rename azure_jumpstart_ag/{retail => contoso_supermarket}/bicep/kubernetes/aks.bicep (96%) create mode 100644 azure_jumpstart_ag/contoso_supermarket/bicep/main.azd.bicep create mode 100644 azure_jumpstart_ag/contoso_supermarket/bicep/main.azd.parameters.json rename azure_jumpstart_ag/{retail => contoso_supermarket}/bicep/main.bicep (92%) rename azure_jumpstart_ag/{retail => contoso_supermarket}/bicep/main.parameters.json (100%) create mode 100644 azure_jumpstart_ag/contoso_supermarket/bicep/mgmt/mgmtArtifacts.bicep rename azure_jumpstart_ag/{retail => contoso_supermarket}/bicep/mgmt/network.bicep (100%) rename azure_jumpstart_ag/{retail => contoso_supermarket}/bicep/mgmt/policyAzureArcRGScope.bicep (100%) rename azure_jumpstart_ag/{retail => contoso_supermarket}/bicep/mgmt/storageAccount.bicep (100%) create mode 100644 azure_jumpstart_ag/contoso_supermarket/scripts/postprovision.ps1 create mode 100644 azure_jumpstart_ag/contoso_supermarket/scripts/preprovision.ps1 diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 new file mode 100644 index 0000000000..a53fdd7cf3 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -0,0 +1,205 @@ +@{ + # This is the PowerShell datafile used to provide configuration information for the Agora environment. Product keys and password are not encrypted and will be available on host during installation. + + # Directory paths + AgDirectories = @{ + AgDir = "C:\Ag" + AgPowerShellDir = "C:\Ag\PowerShell" + AgLogsDir = "C:\Ag\Logs" + AgVMDir = "C:\Ag\Virtual Machines" + AgIconDir = "C:\Ag\Icons" + AgToolsDir = "C:\Tools" + AgTempDir = "C:\Temp" + AgVHDXDir = "V:\VMs" + AgConfigMapDir = "C:\Ag\ConfigMaps" + AgL1Files = "C:\Ag\L1Files" + AgAppsRepo = "C:\Ag\AppsRepo" + AgMonitoringDir = "C:\Ag\Monitoring" + AgAdxDashboards = "C:\Ag\AdxDashboards" + AgDataEmulator = "C:\Ag\DataEmulator" + } + + # Required URLs + URLs = @{ + chocoInstallScript = 'https://chocolatey.org/install.ps1' + wslUbuntu = 'https://aka.ms/wslubuntu' + wslStoreStorage = 'https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi' + docker = 'https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe' + githubAPI = 'https://api.github.com' + grafana = 'https://api.github.com/repos/grafana/grafana/releases/latest' + azurePortal = 'https://portal.azure.com' + aksEEk3s = 'https://aka.ms/aks-edge/k3s-msi' + nginx = 'https://kubernetes.github.io/ingress-nginx' + prometheus = 'https://prometheus-community.github.io/helm-charts' + vcLibs = 'https://aka.ms/Microsoft.VCLibs.x64.14.00.Desktop.appx' + windowsTerminal = 'https://api.github.com/repos/microsoft/terminal/releases/latest' + aksEEReleases = 'https://api.github.com/repos/Azure/AKS-Edge/releases' + mqttExplorerReleases = 'https://api.github.com/repos/thomasnordquist/MQTT-Explorer/releases/latest' + } + + # Azure required registered resource providers + AzureProviders = @( + "Microsoft.Kubernetes", + "Microsoft.KubernetesConfiguration", + "Microsoft.ExtendedLocation", + "Microsoft.HybridCompute", + "Microsoft.GuestConfiguration", + "Microsoft.HybridConnectivity", + "Microsoft.DeviceRegistry", + "Microsoft.EventGrid", + "Microsoft.IoTOperationsOrchestrator", + "Microsoft.IoTOperations" + ) + + # Az CLI required extensions + AzCLIExtensions = @( + @{name="k8s-extension"; version="latest"}, + @{name="k8s-configuration"; version="latest"}, + @{name="eventgrid"; version="latest"}, + @{name="customlocation"; version="latest"}, + @{name="kusto"; version="latest"}, + @{name="storage-preview"; version="latest"}, + @{name="azure-iot-ops"; version="latest"} + ) + + # PowerShell modules + PowerShellModules = @( + 'Az.ConnectedKubernetes', + 'Az.KubernetesConfiguration', + 'Az.Kusto', + 'Az.EventGrid', + 'Az.Storage', + 'Az.EventHub' + ) + + # Chocolatey packages list + ChocolateyPackagesList = @( + 'az.powershell', + 'powershell-core', + 'bicep', + 'kubernetes-cli', + 'vcredist140', + 'microsoft-edge', + 'azcopy10', + 'vscode', + 'git', + '7zip', + 'kubectx', + 'putty.install', + 'kubernetes-helm', + 'dotnet-sdk', + 'zoomit', + 'openssl.light', + 'mqtt-explorer', + 'gh', + 'python' + ) + + # Pip packages list + PipPackagesList = @( + 'paho-mqtt' + ) + + # VSCode extensions + VSCodeExtensions = @( + 'ms-vscode-remote.remote-containers', + 'ms-vscode-remote.remote-wsl', + 'ms-vscode.powershell', + 'redhat.vscode-yaml', + 'ZainChen.json', + 'esbenp.prettier-vscode', + 'ms-kubernetes-tools.vscode-kubernetes-tools', + 'mindaro.mindaro', + 'github.vscode-pull-request-github' + ) + + # Git branches + GitBranches = @( + 'production', + 'staging', + 'canary' , + 'main' + ) + + # VHDX blob url + ProdVHDBlobURL = 'https://jumpstartprodsg.blob.core.windows.net/agora/base/prod-w11iot/AGBase.vhdx' + PreProdVHDBlobURL = 'https://jumpstartprodsg.blob.core.windows.net/agora/base/preprod-w11iot/AGBase.vhdx' + + # L1 virtual machine configuration + HostVMDrive = "V" # This value controls the drive letter where the nested virtual + L1VMMemory = 32GB # This value controls the amount of RAM for each AKS Edge Essentials host virtual machine + L1VMNumVCPU = 8 # This value controls the number of vCPUs to assign to each AKS Edge Essentials host virtual machine. + InternalSwitch = "InternalSwitch" # This value controls the Hyper-V internal switch name used by L0 Azure virtual machine. + L1Username = "Administrator" # This value controls the Admin credential username for the L1 Hyper-V virtual machines that run on the Agora-Client. + L1Password = 'Agora123!!' # This value controls the Admin credential password for the L1 Hyper-V virtual machines that run on the Agora-Client. + L1DefaultGateway = "172.20.1.1" # This value controls the default gateway IP address used by each L1 Hyper-V virtual machines that run on the Agora-Client. + L1SwitchName = "AKS-Int" # This value controls the Hyper-V internal switch name used by each L1 Hyper-V virtual machines that run on the Agora-Client. + L1NatSubnetPrefix = "172.20.1.0/24" # This value controls the network subnet used by each L1 Hyper-V virtual machines that run on the Agora-Client. + + # NAT Configuration + natHostSubnet = "192.168.128.0/24" + natHostVMSwitchName = "InternalNAT" + natConfigure = $true + natSubnet = "192.168.46.0/24" # This value is the subnet is the NAT router will use to route to AzSMGMT to access the Internet. It can be any /24 subnet and is only used for routing. + natDNS = "%staging-natDNS%" # Do not change - can be configured by passing the optional natDNS parameter to the ARM deployment. + + # AKS Edge Essentials variables + SiteConfig = @{ + Seattle = @{ + ArcClusterName = "Ag-K3s-Seattle" + FriendlyName = "Seattle" + GrafanaDataSource = "seattle" + Type = "K3s" + HelmValuesFile = "prometheus-additional-scrape-config.yaml" + } + Chicago = @{ + ArcClusterName = "Ag-K3s-Chicago" + FriendlyName = "Chicago" + GrafanaDataSource = "chicago" + Type = "K3s" + HelmValuesFile = "prometheus-additional-scrape-config.yaml" + } + } + + # Universal resource tag and resource types + TagName = 'Project' + TagValue = 'Jumpstart_Agora' + ArcServerResourceType = 'Microsoft.HybridCompute/machines' + ArcK8sResourceType = 'Microsoft.Kubernetes/connectedClusters' + AksResourceType = 'Microsoft.ContainerService/managedClusters' + + + # Observability variables + Monitoring = @{ + AdminUser = "admin" + User = "Contoso Operator" + Email = "operator@contoso.com" + Namespace = "observability" + ProdURL = "http://localhost:3000" + Dashboards = @{ + "grafana.com" = @() # Dashboards from https://grafana.com/grafana/dashboards + "custom" = @('node-exporter-full','cluster-global') # Dashboards from https://github.com/microsoft/azure_arc/tree/main/azure_jumpstart_ag/artifacts/monitoring + } + } + + Namespaces = @( + "observability" + "images-cache" + ) + + AppConfig = @{ + inferencing_deployment = @{ + GitOpsConfigName = "contoso-motors" + KustomizationName = "contoso-motors" + KustomizationPath="./contoso_manufacturing/operations" + Namespace = "contoso-motors" + Order = 1 + } + } + + # Microsoft Edge startup settings variables + EdgeSettingRegistryPath = 'HKLM:\SOFTWARE\Policies\Microsoft\Edge' + EdgeSettingValueTrue = '00000001' + EdgeSettingValueFalse = '00000000' + +} \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 new file mode 100644 index 0000000000..d2cd9b1016 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 @@ -0,0 +1,233 @@ +@{ + # This is the PowerShell datafile used to provide configuration information for the Agora environment. Product keys and password are not encrypted and will be available on host during installation. + + # Directory paths + AgDirectories = @{ + AgDir = "C:\Ag" + AgPowerShellDir = "C:\Ag\PowerShell" + AgLogsDir = "C:\Ag\Logs" + AgVMDir = "C:\Ag\Virtual Machines" + AgIconDir = "C:\Ag\Icons" + AgToolsDir = "C:\Tools" + AgTempDir = "C:\Temp" + AgVHDXDir = "V:\VMs" + AgConfigMapDir = "C:\Ag\ConfigMaps" + AgL1Files = "C:\Ag\L1Files" + AgAppsRepo = "C:\Ag\AppsRepo" + AgMonitoringDir = "C:\Ag\Monitoring" + AgAdxDashboards = "C:\Ag\AdxDashboards" + AgDataEmulator = "C:\Ag\DataEmulator" + } + + # Required URLs + URLs = @{ + chocoInstallScript = 'https://chocolatey.org/install.ps1' + wslUbuntu = 'https://aka.ms/wslubuntu' + wslStoreStorage = 'https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi' + docker = 'https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe' + githubAPI = 'https://api.github.com' + grafana = 'https://api.github.com/repos/grafana/grafana/releases/latest' + azurePortal = 'https://portal.azure.com' + aksEEk3s = 'https://aka.ms/aks-edge/k3s-msi' + nginx = 'https://kubernetes.github.io/ingress-nginx' + prometheus = 'https://prometheus-community.github.io/helm-charts' + vcLibs = 'https://aka.ms/Microsoft.VCLibs.x64.14.00.Desktop.appx' + windowsTerminal = 'https://api.github.com/repos/microsoft/terminal/releases/latest' + aksEEReleases = 'https://api.github.com/repos/Azure/AKS-Edge/releases' + mqttExplorerReleases = 'https://api.github.com/repos/thomasnordquist/MQTT-Explorer/releases/latest' + } + + # Azure required registered resource providers + AzureProviders = @( + "Microsoft.Kubernetes", + "Microsoft.KubernetesConfiguration", + "Microsoft.ExtendedLocation", + "Microsoft.HybridCompute", + "Microsoft.GuestConfiguration", + "Microsoft.HybridConnectivity", + "Microsoft.DeviceRegistry", + "Microsoft.EventGrid" + ) + + # Az CLI required extensions + AzCLIExtensions = @( + @{name="k8s-extension"; version="latest"}, + @{name="k8s-configuration"; version="latest"}, + @{name="eventgrid"; version="latest"}, + @{name="customlocation"; version="latest"}, + @{name="kusto"; version="latest"}, + @{name="storage-preview"; version="latest"}, + @{name="azure-iot-ops"; version="latest"} + ) + + # PowerShell modules + PowerShellModules = @( + 'Az.ConnectedKubernetes', + 'Az.KubernetesConfiguration', + 'Az.Kusto', + 'Az.EventGrid', + 'Az.Storage', + 'Az.EventHub' + ) + + # Chocolatey packages list + ChocolateyPackagesList = @( + 'az.powershell', + 'powershell-core', + 'bicep', + 'kubernetes-cli', + 'vcredist140', + 'microsoft-edge', + 'azcopy10', + 'vscode', + 'git', + '7zip', + 'kubectx', + 'putty.install', + 'kubernetes-helm', + 'dotnet-sdk', + 'zoomit', + 'openssl.light', + 'mqtt-explorer', + 'gh', + 'python' + ) + + # Pip packages list + PipPackagesList = @( + 'paho-mqtt' + ) + + # VSCode extensions + VSCodeExtensions = @( + 'ms-vscode-remote.remote-containers', + 'ms-vscode-remote.remote-wsl', + 'ms-vscode.powershell', + 'redhat.vscode-yaml', + 'ZainChen.json', + 'esbenp.prettier-vscode', + 'ms-kubernetes-tools.vscode-kubernetes-tools', + 'mindaro.mindaro', + 'github.vscode-pull-request-github' + ) + + # Git branches + GitBranches = @( + 'production', + 'staging', + 'canary' , + 'main' + ) + + # VHDX blob url + ProdVHDBlobURL = 'https://jumpstartprodsg.blob.core.windows.net/agora/base/prod-w11iot/AGBase.vhdx' + PreProdVHDBlobURL = 'https://jumpstartprodsg.blob.core.windows.net/agora/base/preprod-w11iot/AGBase.vhdx' + + # L1 virtual machine configuration + HostVMDrive = "V" # This value controls the drive letter where the nested virtual + L1VMMemory = 32GB # This value controls the amount of RAM for each AKS Edge Essentials host virtual machine + L1VMNumVCPU = 8 # This value controls the number of vCPUs to assign to each AKS Edge Essentials host virtual machine. + InternalSwitch = "InternalSwitch" # This value controls the Hyper-V internal switch name used by L0 Azure virtual machine. + L1Username = "Administrator" # This value controls the Admin credential username for the L1 Hyper-V virtual machines that run on the Agora-Client. + L1Password = 'Agora123!!' # This value controls the Admin credential password for the L1 Hyper-V virtual machines that run on the Agora-Client. + L1DefaultGateway = "172.20.1.1" # This value controls the default gateway IP address used by each L1 Hyper-V virtual machines that run on the Agora-Client. + L1SwitchName = "AKS-Int" # This value controls the Hyper-V internal switch name used by each L1 Hyper-V virtual machines that run on the Agora-Client. + L1NatSubnetPrefix = "172.20.1.0/24" # This value controls the network subnet used by each L1 Hyper-V virtual machines that run on the Agora-Client. + + # NAT Configuration + natHostSubnet = "192.168.128.0/24" + natHostVMSwitchName = "InternalNAT" + natConfigure = $true + natSubnet = "192.168.46.0/24" # This value is the subnet is the NAT router will use to route to AzSMGMT to access the Internet. It can be any /24 subnet and is only used for routing. + natDNS = "%staging-natDNS%" # Do not change - can be configured by passing the optional natDNS parameter to the ARM deployment. + + # AKS Edge Essentials variables + SiteConfig = @{ + Detroit = @{ + ArcClusterName = "Ag-ArcK8s-Detroit" + NetIPAddress = "172.20.1.2" + DefaultGateway = "172.20.1.1" + PrefixLength = "24" + DNSClientServerAddress = "168.63.129.16" + ServiceIPRangeStart = "172.20.1.31" + ServiceIPRangeSize = "10" + ControlPlaneEndpointIp = "172.20.1.21" + LinuxNodeIp4Address = "172.20.1.11" + Subnet = "172.20.1.0/24" + FriendlyName = "Detroit" + IsProduction = $true + Type = "AKSEE" + Branch = "main" + HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" + HelmService = "service/prometheus-kube-prometheus-prometheus" + GrafanaDataSource = "detroit" + HelmValuesFile = "prometheus-additional-scrape-config.yaml" + clusterLogSize = "1024" + AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used + } + Monterrey = @{ + ArcClusterName = "Ag-ArcK8s-Monterrey" + NetIPAddress = "172.20.1.3" + DefaultGateway = "172.20.1.1" + PrefixLength = "24" + DNSClientServerAddress = "168.63.129.16" + ServiceIPRangeStart = "172.20.1.71" + ServiceIPRangeSize = "10" + ControlPlaneEndpointIp = "172.20.1.61" + LinuxNodeIp4Address = "172.20.1.51" + Subnet = "172.20.1.0/24" + FriendlyName = "Monterrey" + IsProduction = $true + Type = "AKSEE" + Branch = "main" + HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" + HelmService = "service/prometheus-kube-prometheus-prometheus" + GrafanaDataSource = "monterrey" + HelmValuesFile = "prometheus-additional-scrape-config.yaml" + clusterLogSize = "1024" + AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used + } + } + + # Universal resource tag and resource types + TagName = 'Project' + TagValue = 'Jumpstart_Agora' + ArcServerResourceType = 'Microsoft.HybridCompute/machines' + ArcK8sResourceType = 'Microsoft.Kubernetes/connectedClusters' + AksResourceType = 'Microsoft.ContainerService/managedClusters' + + + # Observability variables + Monitoring = @{ + AdminUser = "admin" + User = "Contoso Operator" + Email = "operator@contoso.com" + Namespace = "observability" + ProdURL = "http://localhost:3000" + Dashboards = @{ + "grafana.com" = @() # Dashboards from https://grafana.com/grafana/dashboards + "custom" = @('node-exporter-full','cluster-global') # Dashboards from https://github.com/microsoft/azure_arc/tree/main/azure_jumpstart_ag/artifacts/monitoring + } + } + + Namespaces = @( + "observability" + "images-cache" + ) + + AppConfig = @{ + inferencing_deployment = @{ + GitOpsConfigName = "contoso-motors" + KustomizationName = "contoso-motors" + KustomizationPath="./contoso_manufacturing/operations" + Namespace = "contoso-motors" + Order = 1 + } + } + + # Microsoft Edge startup settings variables + EdgeSettingRegistryPath = 'HKLM:\SOFTWARE\Policies\Microsoft\Edge' + EdgeSettingValueTrue = '00000001' + EdgeSettingValueFalse = '00000000' + +} \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 new file mode 100644 index 0000000000..9e900f5c42 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 @@ -0,0 +1,319 @@ +@{ + # This is the PowerShell datafile used to provide configuration information for the Agora environment. Product keys and password are not encrypted and will be available on host during installation. + + # Directory paths + AgDirectories = @{ + AgDir = "C:\Ag" + AgPowerShellDir = "C:\Ag\PowerShell" + AgLogsDir = "C:\Ag\Logs" + AgVMDir = "C:\Ag\Virtual Machines" + AgIconDir = "C:\Ag\Icons" + AgToolsDir = "C:\Tools" + AgTempDir = "C:\Temp" + AgVHDXDir = "V:\VMs" + AgConfigMapDir = "C:\Ag\ConfigMaps" + AgL1Files = "C:\Ag\L1Files" + AgAppsRepo = "C:\Ag\AppsRepo" + AgAdxDashboards = "C:\Ag\AdxDashboards" + AgDataEmulator = "C:\Ag\DataEmulator" + AgMonitoringDir = "C:\Ag\Monitoring" + } + + # Required URLs + URLs = @{ + chocoInstallScript = 'https://chocolatey.org/install.ps1' + wslUbuntu = 'https://aka.ms/wslubuntu' + wslStoreStorage = 'https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi' + docker = 'https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe' + githubAPI = 'https://api.github.com' + grafana = 'https://api.github.com/repos/grafana/grafana/releases/latest' + azurePortal = 'https://portal.azure.com' + aksEEk3s = 'https://aka.ms/aks-edge/k3s-msi' + nginx = 'https://kubernetes.github.io/ingress-nginx' + prometheus = 'https://prometheus-community.github.io/helm-charts' + vcLibs = 'https://aka.ms/Microsoft.VCLibs.x64.14.00.Desktop.appx' + windowsTerminal = 'https://api.github.com/repos/microsoft/terminal/releases/latest' + aksEEReleases = 'https://api.github.com/repos/Azure/AKS-Edge/releases' + } + + # Azure required registered resource providers + AzureProviders = @( + "Microsoft.Kubernetes", + "Microsoft.KubernetesConfiguration", + "Microsoft.ExtendedLocation" + ) + + # Az CLI required extensions + AzCLIExtensions = @( + @{name = "k8s-extension"; version = "latest" }, + @{name = "k8s-configuration"; version = "latest" }, + @{name = "azure-iot"; version = "latest" } + ) + + # PowerShell modules + PowerShellModules = @( + 'Az.ConnectedKubernetes' + 'Az.KubernetesConfiguration' + 'Az.Kusto' + ) + + # Chocolatey packages list + ChocolateyPackagesList = @( + 'az.powershell', + 'powershell-core', + 'kubernetes-cli', + 'vcredist140', + 'microsoft-edge', + 'azcopy10', + 'vscode', + 'git', + '7zip', + 'kubectx', + 'putty.install', + 'kubernetes-helm', + 'dotnet-sdk', + 'zoomit', + 'openssl.light', + 'mqtt-explorer', + 'gh', + 'python', + 'bicep' + ) + + # VSCode extensions + VSCodeExtensions = @( + 'ms-vscode-remote.remote-containers', + 'ms-vscode-remote.remote-wsl', + 'ms-vscode.powershell', + 'redhat.vscode-yaml', + 'ZainChen.json', + 'esbenp.prettier-vscode', + 'ms-kubernetes-tools.vscode-kubernetes-tools', + 'mindaro.mindaro', + 'github.vscode-pull-request-github' + ) + + # Git branches + GitBranches = @( + 'production', + 'staging', + 'canary' , + 'main' + ) + + # VHDX blob url + ProdVHDBlobURL = 'https://jumpstartprodsg.blob.core.windows.net/agora/base/prod-w11iot/AGBase.vhdx' + PreProdVHDBlobURL = 'https://jumpstartprodsg.blob.core.windows.net/agora/base/preprod-w11iot/AGBase.vhdx' + + # L1 virtual machine configuration + HostVMDrive = "V" # This value controls the drive letter where the nested virtual + L1VMMemory = 32GB # This value controls the amount of RAM for each AKS Edge Essentials host virtual machine + L1VMNumVCPU = 8 # This value controls the number of vCPUs to assign to each AKS Edge Essentials host virtual machine. + InternalSwitch = "InternalSwitch" # This value controls the Hyper-V internal switch name used by L0 Azure virtual machine. + L1Username = "Administrator" # This value controls the Admin credential username for the L1 Hyper-V virtual machines that run on the Agora-Client. + L1Password = 'Agora123!!' # This value controls the Admin credential password for the L1 Hyper-V virtual machines that run on the Agora-Client. + L1DefaultGateway = "172.20.1.1" # This value controls the default gateway IP address used by each L1 Hyper-V virtual machines that run on the Agora-Client. + L1SwitchName = "AKS-Int" # This value controls the Hyper-V internal switch name used by each L1 Hyper-V virtual machines that run on the Agora-Client. + L1NatSubnetPrefix = "172.20.1.0/24" # This value controls the network subnet used by each L1 Hyper-V virtual machines that run on the Agora-Client. + + # NAT Configuration + natHostSubnet = "192.168.128.0/24" + natHostVMSwitchName = "InternalNAT" + natConfigure = $true + natSubnet = "192.168.46.0/24" # This value is the subnet is the NAT router will use to route to AzSMGMT to access the Internet. It can be any /24 subnet and is only used for routing. + natDNS = "%staging-natDNS%" # Do not change - can be configured by passing the optional natDNS parameter to the ARM deployment. + + # AKS Edge Essentials variables + SiteConfig = @{ + Seattle = @{ + ArcClusterName = "Ag-ArcK8s-Seattle" + NetIPAddress = "172.20.1.2" + DefaultGateway = "172.20.1.1" + PrefixLength = "24" + DNSClientServerAddress = "168.63.129.16" + ServiceIPRangeStart = "172.20.1.31" + ServiceIPRangeSize = "10" + ControlPlaneEndpointIp = "172.20.1.21" + LinuxNodeIp4Address = "172.20.1.11" + Subnet = "172.20.1.0/24" + FriendlyName = "Seattle" + IsProduction = $true + Type = "AKSEE" + posNamespace = "contoso-supermarket" + Branch = "production" + HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" + HelmService = "service/prometheus-kube-prometheus-prometheus" + GrafanaDataSource = "seattle" + HelmValuesFile = "prometheus-additional-scrape-config.yaml" + IoTDevices = @("Freezer-1", "Freezer-2") + AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used + } + Chicago = @{ + ArcClusterName = "Ag-ArcK8s-Chicago" + NetIPAddress = "172.20.1.3" + DefaultGateway = "172.20.1.1" + PrefixLength = "24" + DNSClientServerAddress = "168.63.129.16" + ServiceIPRangeStart = "172.20.1.71" + ServiceIPRangeSize = "10" + ControlPlaneEndpointIp = "172.20.1.61" + LinuxNodeIp4Address = "172.20.1.51" + Subnet = "172.20.1.0/24" + FriendlyName = "Chicago" + IsProduction = $true + Type = "AKSEE" + posNamespace = "contoso-supermarket" + Branch = "canary" + HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" + HelmService = "service/prometheus-kube-prometheus-prometheus" + GrafanaDataSource = "chicago" + HelmValuesFile = "prometheus-additional-scrape-config.yaml" + IoTDevices = @("Freezer-1", "Freezer-2") + AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used + } + Dev = @{ + ArcClusterName = "Ag-ArcK8s-Dev" + NetIPAddress = "172.20.1.4" + DefaultGateway = "172.20.1.1" + PrefixLength = "24" + DNSClientServerAddress = "168.63.129.16" + ServiceIPRangeStart = "172.20.1.101" + ServiceIPRangeSize = "10" + ControlPlaneEndpointIp = "172.20.1.91" + LinuxNodeIp4Address = "172.20.1.81" + Subnet = "172.20.1.0/24" + FriendlyName = "Dev" + IsProduction = $false + Type = "AKSEE" + posNamespace = "contoso-supermarket" + Branch = "main" + HelmSetValue = "alertmanager.enabled=false,grafana.ingress.enabled=true,grafana.service.type=LoadBalancer,prometheus.service.type=LoadBalancer,grafana.adminPassword=adminPasswordPlaceholder" + HelmService = "service/prometheus-grafana" + GrafanaDataSource = "prometheus" + HelmValuesFile = "prometheus-additional-scrape-config.yaml" + IoTDevices = @("Freezer-1", "Freezer-2") + AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used + } + Staging = @{ + ArcClusterName = "Ag-AKS-Staging" + FriendlyName = "Staging" + IsProduction = $false + Type = "AKS" + posNamespace = "contoso-supermarket" + Branch = "staging" + HelmSetValue = "alertmanager.enabled=false,grafana.ingress.enabled=true,grafana.service.type=LoadBalancer,prometheus.service.type=LoadBalancer,grafana.adminPassword=adminPasswordPlaceholder" + HelmService = "service/prometheus-grafana" + GrafanaDataSource = "prometheus" + HelmValuesFile = "prometheus-additional-scrape-config.yaml" + IoTDevices = @("Freezer-1", "Freezer-2") + } + } + + # Universal resource tag and resource types + TagName = 'Project' + TagValue = 'Jumpstart_Agora' + ArcServerResourceType = 'Microsoft.HybridCompute/machines' + ArcK8sResourceType = 'Microsoft.Kubernetes/connectedClusters' + AksResourceType = 'Microsoft.ContainerService/managedClusters' + + # nginx variables + nginx = @{ + RepoName = "ingress-nginx" + RepoURL = "https://kubernetes.github.io/ingress-nginx" + ReleaseName = "ingress-nginx" + ChartName = "ingress-nginx/ingress-nginx" + Namespace = "ingress-nginx" + } + + # Observability variables + Monitoring = @{ + AdminUser = "admin" + User = "Contoso Operator" + Email = "operator@contoso.com" + Namespace = "observability" + ProdURL = "http://localhost:3000" + Dashboards = @{ + "grafana.com" = @() # Dashboards from https://grafana.com/grafana/dashboards + "custom" = @('freezer-monitoring','node-exporter-full','cluster-global') # Dashboards from https://github.com/microsoft/azure_arc/tree/main/azure_jumpstart_ag/contoso_supermarket/artifacts/monitoring + } + } + + # Microsoft Edge startup settings variables + EdgeSettingRegistryPath = 'HKLM:\SOFTWARE\Policies\Microsoft\Edge' + EdgeSettingValueTrue = '00000001' + EdgeSettingValueFalse = '00000000' + + Namespaces = @( + "contoso-supermarket" + "observability" + "sensor-monitor" + "images-cache" + ) + + AppConfig = @{ + ContosoSupermarket_contosodb = @{ + GitOpsConfigName = "config-supermarket-db" + KustomizationName = "contosodb" + KustomizationPath="./contoso_supermarket/operations/contoso_supermarket/releases/contosodb" + Namespace = "contoso-supermarket" + Order = 1 + } + ContosoSupermarket_cloudsync = @{ + GitOpsConfigName = "config-supermarket-cloudsync" + KustomizationName = "cloudsync" + KustomizationPath="./contoso_supermarket/operations/contoso_supermarket/releases/cloudsync" + Namespace = "contoso-supermarket" + Order = 2 + } + ContosoSupermarket_contosopos = @{ + GitOpsConfigName = "config-supermarket-pos" + KustomizationName = "contosopos" + KustomizationPath="./contoso_supermarket/operations/contoso_supermarket/releases/contosopos" + Namespace = "contoso-supermarket" + Order = 3 + } + ContosoSupermarket_queue_monitoring_backend = @{ + GitOpsConfigName = "config-supermarket-queue-backend" + KustomizationName = "queuebackend" + KustomizationPath="./contoso_supermarket/operations/contoso_supermarket/releases/queue-monitoring-backend" + Namespace = "contoso-supermarket" + Order = 4 + } + ContosoSupermarket_contosoai = @{ + GitOpsConfigName = "config-supermarket-ai" + KustomizationName = "contosoai" + KustomizationPath="./contoso_supermarket/operations/contoso_supermarket/releases/contosoai" + Namespace = "contoso-supermarket" + Order = 5 + } + ContosoSupermarket_queue_monitoring_frontend = @{ + GitOpsConfigName = "config-supermarket-queue-frontend" + KustomizationName = "queuefrontend" + KustomizationPath="./contoso_supermarket/operations/contoso_supermarket/releases/queue-monitoring-frontend" + Namespace = "contoso-supermarket" + Order = 6 + } + SensorMonitor = @{ + GitOpsConfigName = "config-sensormonitor" + KustomizationName = "sensor-monitor" + KustomizationPath = "./contoso_supermarket/operations/freezer_monitoring/release" + Namespace = "sensor-monitor" + AppPath = "freezer_monitoring" + ConfigMaps = @{ + "mqtt-broker-config" = @{ + ContainerName = "mqtt-broker" + RepoPath = "contents/contoso_supermarket/developer/freezer_monitoring/src/mqtt-broker/mosquitto.conf" + } + "mqtt-simulator-config" = @{ + ContainerName = "mqtt-simulator" + RepoPath = "contents/contoso_supermarket/developer/freezer_monitoring/src/mqtt-simulator/config/settings.json" + } + "mqtt2prom-config" = @{ + ContainerName = "mqtt2prom" + RepoPath = "contents/contoso_supermarket/developer/freezer_monitoring/src/mqtt2prom/config.yaml" + } + } + Order = 7 + } + } +} diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 4f87cecb3c..f6549ad75e 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -13,7 +13,8 @@ $global:AgAppsRepo = $AgConfig.AgDirectories["AgAppsRepo"] $global:configMapDir = $agConfig.AgDirectories["AgConfigMapDir"] $global:AgDeploymentFolder = $AgConfig.AgDirectories["AgL1Files"] $global:AgPowerShellDir = $AgConfig.AgDirectories["AgPowerShellDir"] -$global:industry = $Env:industry +$global:AgLogsDir = $AgConfig.AgDirectories["AgLogsDir"] +$global:scenario = $Env:scenario $global:websiteUrls = $AgConfig.URLs $global:githubAccount = $Env:githubAccount $global:githubBranch = $Env:githubBranch @@ -31,8 +32,7 @@ $global:adminPassword = $Env:adminPassword $global:customLocationRPOID = $Env:customLocationRPOID $global:appUpstreamRepo = "https://github.com/microsoft/jumpstart-agora-apps" $global:appsRepo = "jumpstart-agora-apps" -$global:AKSEEPinnedSchemaVersion = $Env:AKSEEPinnedSchemaVersion -if ($industry -eq "retail") { +if ($scenario -eq "contoso_supermarket") { $global:githubUser = $Env:githubUser $global:githubPat = $Env:GITHUB_TOKEN $global:acrName = $Env:acrName.ToLower() @@ -41,7 +41,7 @@ if ($industry -eq "retail") { $global:gitHubAPIBaseUri = $websiteUrls["githubAPI"] $global:workflowStatus = "" $global:appClonedRepo = "https://github.com/$githubUser/jumpstart-agora-apps" -}elseif ($industry -eq "manufacturing") { +}elseif ($scenario -eq "contoso_motors") { $global:aioNamespace = "azure-iot-operations" $global:mqListenerService = "aio-mq-dmqtt-frontend" $global:mqttExplorerReleasesUrl = $websiteUrls["mqttExplorerReleases"] @@ -49,17 +49,28 @@ if ($industry -eq "retail") { $global:aioStorageAccountName = $Env:aioStorageAccountName $global:spnObjectId = $Env:spnObjectId $global:stcontainerName = $Env:stcontainerName +}elseif ($scenario -eq "contoso_hypermarket"){ + $global:aioNamespace = "azure-iot-operations" + $global:mqListenerService = "aio-mq-dmqtt-frontend" + $global:mqttExplorerReleasesUrl = $websiteUrls["mqttExplorerReleases"] + $global:stagingStorageAccountName = $Env:stagingStorageAccountName + $global:aioStorageAccountName = $Env:aioStorageAccountName + $global:k3sArcDataClusterName = $Env:k3sArcDataClusterName + $global:k3sArcClusterName = $Env:k3sArcClusterName + $global:spnObjectId = $Env:spnObjectId + $global:stcontainerName = $Env:stcontainerName } ##################################################################### # Importing fuctions ##################################################################### Import-Module "$AgPowerShellDir\common.psm1" -Force -DisableNameChecking -Import-Module "$AgPowerShellDir\retail.psm1" -Force -DisableNameChecking -Import-Module "$AgPowerShellDir\manufacturing.psm1" -Force -DisableNameChecking +Import-Module "$AgPowerShellDir\contoso_supermarket.psm1" -Force -DisableNameChecking +Import-Module "$AgPowerShellDir\contoso_motors.psm1" -Force -DisableNameChecking +Import-Module "$AgPowerShellDir\contoso_hypermarket.psm1" -Force -DisableNameChecking -Start-Transcript -Path ($AgConfig.AgDirectories["AgLogsDir"] + "\AgLogonScript.log") -Write-Header "Executing Jumpstart Agora automation scripts" +Start-Transcript -Path ($AgLogsDir + "\AgLogonScript.log") +Write-Host "Executing Jumpstart Agora automation scripts" $startTime = Get-Date # Disable Windows firewall @@ -96,16 +107,16 @@ Deploy-WindowsTools ##################################################################### # Configure Jumpstart Agora Apps repository ##################################################################### -if ($industry -eq "retail") { +if ($scenario -eq "contoso_supermarket") { Write-Host "INFO: Forking and preparing Apps repository locally (Step 4/17)" -ForegroundColor DarkGreen - SetupRetailRepo + SetupSupermarketRepo } ##################################################################### # Azure IoT Hub resources preparation ##################################################################### -if ($industry -eq "retail") { +if ($scenario -eq "contoso_supermarket") { Write-Host "[$(Get-Date -Format t)] INFO: Creating Azure IoT resources (Step 5/17)" -ForegroundColor DarkGreen Deploy-AzureIoTHub } @@ -113,16 +124,26 @@ if ($industry -eq "retail") { ##################################################################### # Configure L1 virtualization infrastructure ##################################################################### -Write-Host "[$(Get-Date -Format t)] INFO: Configuring L1 virtualization infrastructure (Step 6/17)" -ForegroundColor DarkGreen -Deploy-VirtualizationInfrastructure +if ($scenario -eq "contoso_supermarket" -or $scenario -eq "contoso_motors") { + Write-Host "[$(Get-Date -Format t)] INFO: Configuring L1 virtualization infrastructure (Step 6/17)" -ForegroundColor DarkGreen + Deploy-VirtualizationInfrastructure +} ##################################################################### # Setup Azure Container registry on cloud AKS staging environment ##################################################################### -if ($industry -eq "retail") { +if ($scenario -eq "contoso_supermarket") { Deploy-AzContainerRegistry } +##################################################################### +# Get clusters config files +##################################################################### +if($scenario -eq "contoso_hypermarket"){ + Get-K3sConfigFile + Configure-K3sClusters +} + ##################################################################### # Creating Kubernetes namespaces on clusters ##################################################################### @@ -138,13 +159,17 @@ Deploy-ClusterSecrets ##################################################################### # Cache contoso-supermarket images on all clusters ##################################################################### -Deploy-K8sImagesCache +if ($scenario -eq "contoso_supermarket") { + Deploy-K8sImagesCache +} ##################################################################### # Connect the AKS Edge Essentials clusters and hosts to Azure Arc ##################################################################### Write-Host "[$(Get-Date -Format t)] INFO: Connecting AKS Edge clusters to Azure with Azure Arc (Step 10/17)" -ForegroundColor DarkGreen -Deploy-AzArcK8s +if($scenario -eq "contoso_supermarket" -or $scenario -eq "contoso_motors"){ + Deploy-AzArcK8sAKSEE +} ##################################################################### # Installing flux extension on clusters @@ -155,7 +180,7 @@ Deploy-ClusterFluxExtension ##################################################################### # Deploying nginx on AKS cluster ##################################################################### -if ($industry -eq "retail") { +if ($scenario -eq "contoso_supermarket") { Write-Host "[$(Get-Date -Format t)] INFO: Deploying nginx on AKS cluster (Step 12/17)" -ForegroundColor DarkGreen kubectx $AgConfig.SiteConfig.Staging.FriendlyName.ToLower() | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Nginx.log") helm repo add $AgConfig.nginx.RepoName $AgConfig.nginx.RepoURL | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Nginx.log") @@ -169,16 +194,17 @@ if ($industry -eq "retail") { ##################################################################### # Configuring applications on the clusters using GitOps ##################################################################### -if ($industry -eq "retail") { +if ($scenario -eq "contoso_supermarket") { Write-Host "[$(Get-Date -Format t)] INFO: Configuring GitOps (Step 13/17)" -ForegroundColor DarkGreen - Deploy-RetailConfigs + Deploy-SupermarketConfigs } -if ($industry -eq "manufacturing") { +if ($scenario -eq "contoso_motors" -or $scenario -eq "contoso_hypermarket") { Deploy-AIO - Deploy-ManufacturingConfigs + if($scenario -eq "contoso_motors"){ + Deploy-MotorsConfigs + } $mqttIpArray=Set-MQTTIpAddress - #Deploy-MQTTSimulator -mqttIpArray $mqttIpArray # this is now being done via helm Deploy-MQTTExplorer -mqttIpArray $mqttIpArray } @@ -199,7 +225,7 @@ Deploy-Workbook "arc-osperformance-workbook.bicep" ##################################################################### # Deploy Azure Data Explorer Dashboard Reports ##################################################################### -if($industry -eq "manufacturing"){ +if($scenario -eq "contoso_motors"){ Deploy-ADXDashboardReports } @@ -207,10 +233,12 @@ if($industry -eq "manufacturing"){ # Creating bookmarks ############################################################## Write-Host "[$(Get-Date -Format t)] INFO: Creating Microsoft Edge Bookmarks in Favorites Bar (Step 15/17)" -ForegroundColor DarkGreen -if($industry -eq "retail"){ - Deploy-RetailBookmarks -}else{ - Deploy-ManufacturingBookmarks +if($scenario -eq "contoso_supermarket"){ + Deploy-SupermarketBookmarks +}elseif($scenario -eq "contoso_motors"){ + Deploy-MotorsBookmarks +}elseif($scenario -eq "contoso_hypermarket"){ + #Deploy-HypermarketBookmarks } ############################################################## @@ -221,7 +249,7 @@ Write-Host "[$(Get-Date -Format t)] INFO: Cleaning up scripts and uploading logs Write-Host "[$(Get-Date -Format t)] INFO: Creating Hyper-V desktop shortcut." -ForegroundColor Gray Copy-Item -Path "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\Hyper-V Manager.lnk" -Destination "C:\Users\All Users\Desktop" -Force -if($industry -eq "retail"){ +if($scenario -eq "contoso_supermarket"){ Write-Host "[$(Get-Date -Format t)] INFO: Cleaning up images-cache job" -ForegroundColor Gray while ($(Get-Job -Name images-cache-cleanup).State -eq 'Running') { Write-Host "[$(Get-Date -Format t)] INFO: Waiting for images-cache job to complete on all clusters...waiting 60 seconds" -ForegroundColor Gray @@ -268,7 +296,7 @@ Add-Type $code [Win32.Wallpaper]::SetWallpaper($imgPath) # Kill the open PowerShell monitoring kubectl get pods -# if ($industry -eq "manufacturing") { +# if ($scenario -eq "contoso_motors") { # foreach ($shell in $kubectlMonShells) { # Stop-Process -Id $shell.Id # } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 7f10b42be4..0600d97385 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -24,11 +24,12 @@ param ( [string]$githubUser, [string]$adxClusterName, [string]$namingGuid, - [string]$industry, + [string]$scenario, [string]$customLocationRPOID, [string]$aioStorageAccountName, [string]$stcontainerName, - [string]$AKSEEPinnedSchemaVersion + [string]$k3sArcClusterName, + [string]$k3sArcDataClusterName ) ############################################################## @@ -63,11 +64,12 @@ param ( [System.Environment]::SetEnvironmentVariable('AgDir', "C:\Ag", [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('adxClusterName', $adxClusterName, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('namingGuid', $namingGuid, [System.EnvironmentVariableTarget]::Machine) -[System.Environment]::SetEnvironmentVariable('industry', $industry, [System.EnvironmentVariableTarget]::Machine) +[System.Environment]::SetEnvironmentVariable('scenario', $scenario, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('customLocationRPOID', $customLocationRPOID, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('aioStorageAccountName', $aioStorageAccountName, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('stcontainerName', $stcontainerName, [System.EnvironmentVariableTarget]::Machine) -[System.Environment]::SetEnvironmentVariable('AKSEEPinnedSchemaVersion', $AKSEEPinnedSchemaVersion, [System.EnvironmentVariableTarget]::Machine) +[System.Environment]::SetEnvironmentVariable('k3sArcClusterName', $k3sArcClusterName, [System.EnvironmentVariableTarget]::Machine) +[System.Environment]::SetEnvironmentVariable('k3sArcDataClusterName', $k3sArcDataClusterName, [System.EnvironmentVariableTarget]::Machine) $ErrorActionPreference = 'Continue' @@ -108,9 +110,10 @@ if (($rdpPort -ne $null) -and ($rdpPort -ne "") -and ($rdpPort -ne "3389")) { ############################################################## $ConfigurationDataFile = "C:\Temp\AgConfig.psd1" -switch ($industry) { - "retail" { Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/AgConfig-retail.psd1") -OutFile $ConfigurationDataFile } - "manufacturing" {Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/AgConfig-manufacturing.psd1") -OutFile $ConfigurationDataFile} +switch ($scenario) { + "contoso_supermarket" { Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/AgConfig-contoso-supermarket.psd1") -OutFile $ConfigurationDataFile } + "contoso_motors" {Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/AgConfig-contoso-motors.psd1") -OutFile $ConfigurationDataFile} + "contoso_hypermarket" {Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1") -OutFile $ConfigurationDataFile} } $AgConfig = Import-PowerShellDataFile -Path $ConfigurationDataFile @@ -219,6 +222,7 @@ foreach ($url in $websiteUrls.Values) { # Copy PowerShell Profile and Reload ############################################################## Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/PSProfile.ps1") -OutFile $PsHome\Profile.ps1 +Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/PSProfile.ps1") -OutFile "$AgPowerShellDir\Profile.ps1" .$PsHome\Profile.ps1 ############################################################## @@ -234,8 +238,9 @@ Copy-Item $ConfigurationDataFile "$AgPowerShellDir\AgConfig.psd1" -Force Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/AgLogonScript.ps1") -OutFile "$AgPowerShellDir\AgLogonScript.ps1" Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/Modules/common.psm1") -OutFile "$AgPowerShellDir\common.psm1" -Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/Modules/retail.psm1") -OutFile "$AgPowerShellDir\retail.psm1" -Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/Modules/manufacturing.psm1") -OutFile "$AgPowerShellDir\manufacturing.psm1" +Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/Modules/contoso_supermarket.psm1") -OutFile "$AgPowerShellDir\contoso_supermarket.psm1" +Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/Modules/contoso_motors.psm1") -OutFile "$AgPowerShellDir\contoso_motors.psm1" +Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/Modules/contoso_hypermarket.psm1") -OutFile "$AgPowerShellDir\contoso_hypermarket.psm1" Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/DockerDesktopSettings.json") -OutFile "$AgToolsDir\settings.json" Invoke-WebRequest "https://raw.githubusercontent.com/Azure/arc_jumpstart_docs/main/img/wallpaper/agora_wallpaper_dark.png" -OutFile $AgDirectory\wallpaper.png Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-node-exporter-full.json") -OutFile "$AgMonitoringDir\grafana-node-exporter-full.json" @@ -250,15 +255,23 @@ Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso-motors.png") -Out Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso-motors.svg") -OutFile $AgIconsDir\contoso-motors.svg Invoke-WebRequest ($templateBaseUrl + "artifacts/L1Files/config.json") -OutFile $AgDeploymentFolder\config.json -if($industry -eq "retail"){ - Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/Bookmarks-retail") -OutFile "$AgToolsDir\Bookmarks" +if($scenario -eq "contoso_supermarket"){ + Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/Bookmarks-contoso-supermarket") -OutFile "$AgToolsDir\Bookmarks" Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-freezer-monitoring.json") -OutFile "$AgMonitoringDir\grafana-freezer-monitoring.json" } -elseif ($industry -eq "manufacturing") { - Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/Bookmarks-manufacturing") -OutFile "$AgToolsDir\Bookmarks" +elseif ($scenario -eq "contoso_motors") { + Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/Bookmarks-contoso-motors") -OutFile "$AgToolsDir\Bookmarks" Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/mq_cloudConnector.yml") -OutFile "$AgToolsDir\mq_cloudConnector.yml" Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/mqtt_explorer_settings.json") -OutFile "$AgToolsDir\mqtt_explorer_settings.json" } +elseif ($scenario -eq "contoso_hypermarket") { + Invoke-WebRequest ($templateBaseUrl + "artifacts/kubernetes/K3s/longhorn.yaml") -OutFile "$AgToolsDir\longhorn.yaml" + Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/Bookmarks-contoso-hypermarket") -OutFile "$AgToolsDir\Bookmarks" + Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/mq_cloudConnector.yml") -OutFile "$AgToolsDir\mq_cloudConnector.yml" + Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/mqtt_explorer_settings.json") -OutFile "$AgToolsDir\mqtt_explorer_settings.json" + + +} BITSRequest -Params @{'Uri' = 'https://aka.ms/wslubuntu'; 'Filename' = "$AgToolsDir\Ubuntu.appx" } BITSRequest -Params @{'Uri' = $websiteUrls["wslStoreStorage"]; 'Filename' = "$AgToolsDir\wsl_update_x64.msi" } @@ -377,7 +390,7 @@ Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force Install-Module -Name Posh-SSH -Force $Trigger = New-ScheduledTaskTrigger -AtLogOn -$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "$AgPowerShellDir\AgLogonScript.ps1" +$Action = New-ScheduledTaskAction -Execute "C:\Program Files\PowerShell\7\pwsh.exe" -Argument "$AgPowerShellDir\AgLogonScript.ps1" Register-ScheduledTask -TaskName "AgLogonScript" -Trigger $Trigger -User $adminUsername -Action $Action -RunLevel "Highest" -Force ############################################################## @@ -388,11 +401,13 @@ Get-ScheduledTask -TaskName ServerManager | Disable-ScheduledTask ############################################################## # Install Hyper-V, WSL and reboot ############################################################## -Write-Header "Installing Hyper-V" -Enable-WindowsOptionalFeature -Online -FeatureName Containers -All -NoRestart -Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -NoRestart -Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux -NoRestart -Install-WindowsFeature -Name Hyper-V -IncludeAllSubFeature -IncludeManagementTools -Restart +if($scenario -eq "contoso_supermarket" -or $scenario -eq "contoso_motors"){ + Write-Header "Installing Hyper-V" + Enable-WindowsOptionalFeature -Online -FeatureName Containers -All -NoRestart + Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -NoRestart + Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux -NoRestart + Install-WindowsFeature -Name Hyper-V -IncludeAllSubFeature -IncludeManagementTools -Restart +} Stop-Transcript diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index 7b4d8bb928..4a1c6c009f 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -28,7 +28,6 @@ function Deploy-AzCLI { } } - Write-Host "[$(Get-Date -Format t)] INFO: Az CLI configuration complete!" -ForegroundColor Green Write-Host } @@ -246,7 +245,7 @@ function Deploy-VirtualizationInfrastructure { # Create an array with VM names $VMnames = (Get-VM).Name - $sourcePath = "$PsHome\Profile.ps1" + $sourcePath = "$AgPowerShellDir\Profile.ps1" $destinationPath = "C:\Deployment\Profile.ps1" $maxRetries = 3 @@ -299,26 +298,24 @@ function Deploy-VirtualizationInfrastructure { } Write-Host "[$(Get-Date -Format t)] INFO: Fetching the latest two AKS Edge Essentials releases." -ForegroundColor Gray + $latestReleaseTag = (Invoke-WebRequest $websiteUrls["aksEEReleases"] | ConvertFrom-Json)[0].tag_name + $beforeLatestReleaseTag = (Invoke-WebRequest $websiteUrls["aksEEReleases"] | ConvertFrom-Json)[1].tag_name + $AKSEEReleasesTags = ($latestReleaseTag, $beforeLatestReleaseTag) $AKSEESchemaVersions = @() - if($AKSEEPinnedSchemaVersion -eq "useLatest"){ - $latestReleaseTag = (Invoke-WebRequest $websiteUrls["aksEEReleases"] | ConvertFrom-Json)[0].tag_name - $beforeLatestReleaseTag = (Invoke-WebRequest $websiteUrls["aksEEReleases"] | ConvertFrom-Json)[1].tag_name - $AKSEEReleasesTags = ($latestReleaseTag, $beforeLatestReleaseTag) - - for ($i = 0; $i -lt $AKSEEReleasesTags.Count; $i++) { - $releaseTag = (Invoke-WebRequest $websiteUrls["aksEEReleases"] | ConvertFrom-Json)[$i].tag_name - $AKSEEReleaseDownloadUrl = "https://github.com/Azure/AKS-Edge/archive/refs/tags/$releaseTag.zip" - $output = Join-Path $AgToolsDir "$releaseTag.zip" - Invoke-WebRequest $AKSEEReleaseDownloadUrl -OutFile $output - Expand-Archive $output -DestinationPath $AgToolsDir -Force - $AKSEEReleaseConfigFilePath = "$AgToolsDir\AKS-Edge-$releaseTag\tools\aksedge-config.json" - $jsonContent = Get-Content -Raw -Path $AKSEEReleaseConfigFilePath | ConvertFrom-Json - $schemaVersion = $jsonContent.SchemaVersion - $AKSEESchemaVersions += $schemaVersion - # Clean up the downloaded release files - Remove-Item -Path $output -Force - Remove-Item -Path "$AgToolsDir\AKS-Edge-$releaseTag" -Force -Recurse - } + + for ($i = 0; $i -lt $AKSEEReleasesTags.Count; $i++) { + $releaseTag = (Invoke-WebRequest $websiteUrls["aksEEReleases"] | ConvertFrom-Json)[$i].tag_name + $AKSEEReleaseDownloadUrl = "https://github.com/Azure/AKS-Edge/archive/refs/tags/$releaseTag.zip" + $output = Join-Path $AgToolsDir "$releaseTag.zip" + Invoke-WebRequest $AKSEEReleaseDownloadUrl -OutFile $output + Expand-Archive $output -DestinationPath $AgToolsDir -Force + $AKSEEReleaseConfigFilePath = "$AgToolsDir\AKS-Edge-$releaseTag\tools\aksedge-config.json" + $jsonContent = Get-Content -Raw -Path $AKSEEReleaseConfigFilePath | ConvertFrom-Json + $schemaVersion = $jsonContent.SchemaVersion + $AKSEESchemaVersions += $schemaVersion + # Clean up the downloaded release files + Remove-Item -Path $output -Force + Remove-Item -Path "$AgToolsDir\AKS-Edge-$releaseTag" -Force -Recurse } Invoke-Command -VMName $VMnames -Credential $Credentials -ScriptBlock { @@ -351,7 +348,6 @@ function Deploy-VirtualizationInfrastructure { $AgConfig = $using:AgConfig $AgToolsDir = $using:AgToolsDir $websiteUrls = $using:websiteUrls - $AKSEEPinnedSchemaVersion = $using:AKSEEPinnedSchemaVersion ########################################## # Deploying AKS Edge Essentials clusters @@ -405,15 +401,12 @@ function Deploy-VirtualizationInfrastructure { # Fetch schemaVersion release from the AgConfig file $AKSEESchemaVersionUseLatest = $AgConfig.SiteConfig[$Env:COMPUTERNAME].AKSEEReleaseUseLatest - if ($AKSEESchemaVersionUseLatest -and $AKSEEPinnedSchemaVersion -eq "useLatest") { + if ($AKSEESchemaVersionUseLatest) { $SchemaVersion = $using:AKSEESchemaVersions[0] } - elseif (!$AKSEESchemaVersionUseLatest -and $AKSEEPinnedSchemaVersion -eq "useLatest") { + else { $SchemaVersion = $using:AKSEESchemaVersions[1] } - elseif ($AKSEEPinnedSchemaVersion -ne "useLatest") { - $SchemaVersion = $AKSEEPinnedSchemaVersion - } $replacementParams = @{ "SchemaVersion-null" = $SchemaVersion @@ -533,7 +526,12 @@ function Deploy-AzContainerRegistry { function Deploy-ClusterNamespaces { foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { $clusterName = $cluster.Name.ToLower() - kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\ClusterSecrets.log") + if($cluster.Value.Type -eq "K3s"){ + $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" + kubectx + }else{ + kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\ClusterSecrets.log") + } foreach ($namespace in $AgConfig.Namespaces) { Write-Host "[$(Get-Date -Format t)] INFO: Creating namespace $namespace on $clusterName" -ForegroundColor Gray kubectl create namespace $namespace | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\ClusterSecrets.log") @@ -547,7 +545,12 @@ function Deploy-ClusterSecrets { foreach ($namespace in $AgConfig.Namespaces) { if ($namespace -eq "contoso-supermarket" -or $namespace -eq "images-cache") { Write-Host "[$(Get-Date -Format t)] INFO: Configuring Azure Container registry on $clusterName" - kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\ClusterSecrets.log") + if($cluster.Value.Type -eq "K3s"){ + $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" + kubectx + }else{ + kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\ClusterSecrets.log") + } kubectl create secret docker-registry acr-secret ` --namespace $namespace ` --docker-server="$acrName.azurecr.io" ` @@ -560,7 +563,7 @@ function Deploy-ClusterSecrets { ##################################################################### # Create secrets for GitHub actions ##################################################################### - if ($Env:industry -eq "retail") { + if ($Env:scenario -eq "contoso_supermarket") { Write-Host "[$(Get-Date -Format t)] INFO: Creating Kubernetes secrets" -ForegroundColor Gray $cosmosDBKey = $(az cosmosdb keys list --name $cosmosDBName --resource-group $resourceGroup --query primaryMasterKey --output tsv) foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { @@ -580,7 +583,7 @@ function Deploy-ClusterSecrets { } } -function Deploy-AzArcK8s { +function Deploy-AzArcK8sAKSEE { # Running pre-checks to ensure that the aksedge ConfigMap is present on all clusters $maxRetries = 5 $retryInterval = 30 # seconds @@ -687,7 +690,7 @@ function Deploy-AzArcK8s { function Deploy-ClusterFluxExtension { $resourceTypes = @($AgConfig.ArcK8sResourceType, $AgConfig.AksResourceType) - $resources = Get-AzResource -ResourceGroupName $Env:resourceGroup | Where-Object { $_.ResourceType -in $resourceTypes } + $resources = Get-AzResource -ResourceGroupName $resourceGroup | Where-Object { $_.ResourceType -in $resourceTypes } $jobs = @() foreach ($resource in $resources) { @@ -736,6 +739,7 @@ function Deploy-ClusterFluxExtension { } az login --service-principal --username $Env:spnClientID --password=$Env:spnClientSecret --tenant $Env:spnTenantId + az account set -s $Env:subscriptionId $extension = az k8s-extension list --cluster-name $resourceName --resource-group $Env:resourceGroup --cluster-type $ClusterType --output json | ConvertFrom-Json $extension = $extension | Where-Object extensionType -eq 'microsoft.flux' @@ -830,7 +834,7 @@ function Deploy-Prometheus { helm repo add prometheus-community $websiteUrls["prometheus"] | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Observability.log") helm repo update | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Observability.log") - if ($Env:industry -eq "retail") { + if ($Env:scenario -eq "contoso_supermarket") { # Update Grafana Icons Copy-Item -Path $AgIconsDir\contoso.png -Destination "C:\Program Files\GrafanaLabs\grafana\public\img" Copy-Item -Path $AgIconsDir\contoso.svg -Destination "C:\Program Files\GrafanaLabs\grafana\public\img\grafana_icon.svg" @@ -844,7 +848,7 @@ function Deploy-Prometheus { (Get-Content $_.FullName) -replace 'Welcome to Grafana', 'Welcome to Grafana for Contoso Supermarket Production' | Set-Content $_.FullName } } - elseif ($Env:industry -eq "manufacturing") { + elseif ($Env:scenario -eq "contoso_motors") { # Update Grafana Icons Copy-Item -Path $AgIconsDir\contoso-motors.png -Destination "C:\Program Files\GrafanaLabs\grafana\public\img" Copy-Item -Path $AgIconsDir\contoso-motors.svg -Destination "C:\Program Files\GrafanaLabs\grafana\public\img\grafana_icon.svg" @@ -858,6 +862,20 @@ function Deploy-Prometheus { (Get-Content $_.FullName) -replace 'Welcome to Grafana', 'Welcome to Grafana for Contoso Motors' | Set-Content $_.FullName } } + elseif ($Env:scenario -eq "contoso_hypermarket") { + # Update Grafana Icons + Copy-Item -Path $AgIconsDir\contoso-motors.png -Destination "C:\Program Files\GrafanaLabs\grafana\public\img" + Copy-Item -Path $AgIconsDir\contoso-motors.svg -Destination "C:\Program Files\GrafanaLabs\grafana\public\img\grafana_icon.svg" + + Get-ChildItem -Path 'C:\Program Files\GrafanaLabs\grafana\public\build\*.js' -Recurse -File | ForEach-Object { + (Get-Content $_.FullName) -replace 'className:u,src:"public/img/grafana_icon.svg"', 'className:u,src:"public/img/contoso-motors.png"' | Set-Content $_.FullName + } + + # Reset Grafana UI + Get-ChildItem -Path 'C:\Program Files\GrafanaLabs\grafana\public\build\*.js' -Recurse -File | ForEach-Object { + (Get-Content $_.FullName) -replace 'Welcome to Grafana', 'Welcome to Grafana for Contoso Hypermarket' | Set-Content $_.FullName + } + } # Reset Grafana Password $Env:Path += ';C:\Program Files\GrafanaLabs\grafana\bin' @@ -1061,3 +1079,298 @@ function Deploy-Prometheus { } Write-Host } + +# Deploys Azure IoT Operations on all k8s clusters in the config file +function Deploy-AIO { + $sites = $AgConfig.SiteConfig.GetEnumerator() + foreach ($site in $sites) { + if ($site.Value.Type -eq "AKSEE") { + ############################################################## + # Preparing clusters for aio + ############################################################## + $VMnames = $AgConfig.SiteConfig.GetEnumerator().Name.ToLower() + + Invoke-Command -VMName $VMnames -Credential $Credentials -ScriptBlock { + $ProgressPreference = "SilentlyContinue" + ########################################### + # Preparing environment folders structure + ########################################### + Write-Host "[$(Get-Date -Format t)] INFO: Preparing AKSEE clusters for AIO" -ForegroundColor DarkGray + Write-Host "`n" + try { + $localPathProvisionerYaml = "https://raw.githubusercontent.com/Azure/AKS-Edge/main/samples/storage/local-path-provisioner/local-path-storage.yaml" + & kubectl apply -f $localPathProvisionerYaml + $pvcYaml = @" + apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: local-path-pvc + namespace: default + spec: + accessModes: + - ReadWriteOnce + storageClassName: local-path + resources: + requests: + storage: 15Gi +"@ + + $pvcYaml | kubectl apply -f - + + Write-Host "Successfully deployment the local path provisioner" + } + catch { + Write-Host "Error: local path provisioner deployment failed" -ForegroundColor Red + } + + Write-Host "Configuring firewall specific to AIO" + Write-Host "Add firewall rule for AIO MQTT Broker" + New-NetFirewallRule -DisplayName "AIO MQTT Broker" -Direction Inbound -Action Allow | Out-Null + try { + $deploymentInfo = Get-AksEdgeDeploymentInfo + # Get the service ip address start to determine the connect address + $connectAddress = $deploymentInfo.LinuxNodeConfig.ServiceIpRange.split("-")[0] + $portProxyRulExists = netsh interface portproxy show v4tov4 | findstr /C:"1883" | findstr /C:"$connectAddress" + if ( $null -eq $portProxyRulExists ) { + Write-Host "Configure port proxy for AIO" + netsh interface portproxy add v4tov4 listenport=1883 listenaddress=0.0.0.0 connectport=1883 connectaddress=$connectAddress | Out-Null + netsh interface portproxy add v4tov4 listenport=1883 listenaddress=0.0.0.0 connectport=18883 connectaddress=$connectAddress | Out-Null + netsh interface portproxy add v4tov4 listenport=1883 listenaddress=0.0.0.0 connectport=8883 connectaddress=$connectAddress | Out-Null + } + else { + Write-Host "Port proxy rule for AIO exists, skip configuring port proxy..." + } + } + catch { + Write-Host "Error: port proxy update for aio failed" -ForegroundColor Red + } + Write-Host "Update the iptables rules" + try { + $iptableRulesExist = Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "sudo iptables-save | grep -- '-m tcp --dport 9110 -j ACCEPT'" -ignoreError + if ( $null -eq $iptableRulesExist ) { + Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 9110 -j ACCEPT" + Write-Host "Updated runtime iptable rules for node exporter" + Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "sudo sed -i '/-A OUTPUT -j ACCEPT/i-A INPUT -p tcp -m tcp --dport 9110 -j ACCEPT' /etc/systemd/scripts/ip4save" + Write-Host "Persisted iptable rules for node exporter" + # increase the maximum number of files + Invoke-AksEdgeNodeCommand -NodeType "Linux" -Command "echo 'fs.inotify.max_user_instances = 1024' | sudo tee -a /etc/sysctl.conf && sudo sysctl -p" + } + else { + Write-Host "iptable rule exists, skip configuring iptable rules..." + } + } + catch { + Write-Host "Error: iptable rule update failed" -ForegroundColor Red + } + } | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\L1Infra.log") + } + } + + ############################################################# + # Deploying AIO on the clusters + ############################################################# + + Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the clusters" -ForegroundColor DarkGray + Write-Host "`n" + $kvIndex = 0 + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + $clusterName = $cluster.Name.ToLower() + Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the $clusterName cluster" -ForegroundColor Gray + Write-Host "`n" + if($cluster.Value.type -eq "K3s"){ + $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" + kubectx + }else{ + kubectx $clusterName + } + $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" + $keyVaultId = (az keyvault list -g $resourceGroup --resource-type vault --query "[$kvIndex].id" -o tsv) + $retryCount = 0 + $maxRetries = 5 + $aioStatus = "notDeployed" + + # Enable custom locations on the Arc-enabled cluster + Write-Host "[$(Get-Date -Format t)] INFO: Enabling custom locations on the Arc-enabled cluster" -ForegroundColor DarkGray + Write-Host "`n" + az config set extension.use_dynamic_install=yes_without_prompt + if($cluster.Value.Type -eq "K3s"){ + az connectedk8s enable-features --name $arcClusterName ` + --resource-group $resourceGroup ` + --features cluster-connect custom-locations ` + --custom-locations-oid $customLocationRPOID ` + --kube-config "C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" ` + --kube-context "ag-k3s-$clusterName" ` + --only-show-errors + }else{ + az connectedk8s enable-features --name $arcClusterName ` + --resource-group $resourceGroup ` + --features cluster-connect custom-locations ` + --custom-locations-oid $customLocationRPOID ` + --only-show-errors + } + + Start-Sleep -Seconds 10 + + do { + az iot ops init --cluster $arcClusterName.toLower() -g $resourceGroup --kv-id $keyVaultId --sp-app-id $spnClientId --sp-secret $spnClientSecret --sp-object-id $spnObjectId --broker-service-type loadBalancer --add-insecure-listener true --simulate-plc false --no-block --only-show-errors + if ($? -eq $false) { + $aioStatus = "notDeployed" + Write-Host "`n" + Write-Host "[$(Get-Date -Format t)] Error: An error occured while deploying AIO on the cluster...Retrying" -ForegroundColor DarkRed + Write-Host "`n" + az iot ops init --cluster $arcClusterName.toLower() -g $resourceGroup --kv-id $keyVaultId --sp-app-id $spnClientId --sp-secret $spnClientSecret --sp-object-id $spnObjectId --broker-service-type loadBalancer --add-insecure-listener true --simulate-plc false --no-block --only-show-errors + $retryCount++ + } + else { + $aioStatus = "deployed" + } + } until ($aioStatus -eq "deployed" -or $retryCount -eq $maxRetries) + $kvIndex++ + } + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + $clusterName = $cluster.Name.ToLower() + $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" + $retryCount = 0 + $maxRetries = 25 + if($cluster.Value.type -eq "K3s"){ + $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" + kubectx + }else{ + kubectx $clusterName + } + do { + $output = az iot ops check --as-object --only-show-errors + $output = $output | ConvertFrom-Json + $mqServiceStatus = ($output.postDeployment | Where-Object { $_.name -eq "evalBrokerListeners" }).status + if ($mqServiceStatus -ne "Success") { + if($retryCount -eq 20 -and $mqServiceStatus -eq "warning"){ + break; + } + Write-Host "Waiting for AIO to be deployed successfully on $clusterName...waiting for 60 seconds" -ForegroundColor DarkGray + Start-Sleep -Seconds 60 + $retryCount++ + } + } until ($mqServiceStatus -eq "Success" -or $retryCount -eq $maxRetries) + + if ($retryCount -eq $maxRetries) { + Write-Host "[$(Get-Date -Format t)] ERROR: AIO deployment failed. Exiting..." -ForegroundColor White -BackgroundColor Red + exit 1 # Exit the script + } + + Write-Host "AIO deployed successfully on the $clusterName cluster" -ForegroundColor Green + Write-Host "`n" + Write-Host "[$(Get-Date -Format t)] INFO: Started Event Grid role assignment process" -ForegroundColor DarkGray + #$extensionPrincipalId = (az k8s-extension list --cluster-name $arcClusterName --resource-group $resourceGroup --cluster-type "connectedClusters" --query "[?extensionType=='microsoft.iotoperations']" --output json | ConvertFrom-Json).identity.principalId + $extensionPrincipalId = (az k8s-extension list --cluster-name $arcClusterName --resource-group $resourceGroup --cluster-type "connectedClusters" --query "[?extensionType=='microsoft.iotoperations.mq']" --output json | ConvertFrom-Json).identity.principalId + $eventGridTopicId = (az eventgrid topic list --resource-group $resourceGroup --query "[0].id" -o tsv --only-show-errors) + $eventGridNamespaceName = (az eventgrid namespace list --resource-group $resourceGroup --query "[0].name" -o tsv --only-show-errors) + $eventGridNamespaceId = (az eventgrid namespace list --resource-group $resourceGroup --query "[0].id" -o tsv --only-show-errors) + $eventGridNamespacePrincipalId = (az eventgrid namespace list --resource-group $resourceGroup -o json --only-show-errors | ConvertFrom-Json)[0].identity.principalId + + az role assignment create --assignee-object-id $extensionPrincipalId --role "EventGrid Data Sender" --scope $eventGridTopicId --assignee-principal-type ServicePrincipal --only-show-errors + az role assignment create --assignee-object-id $eventGridNamespacePrincipalId --role "EventGrid Data Sender" --scope $eventGridTopicId --assignee-principal-type ServicePrincipal --only-show-errors + az role assignment create --assignee-object-id $extensionPrincipalId --role "EventGrid TopicSpaces Subscriber" --scope $eventGridNamespaceId --assignee-principal-type ServicePrincipal --only-show-errors + az role assignment create --assignee-object-id $extensionPrincipalId --role 'EventGrid TopicSpaces Publisher' --scope $eventGridNamespaceId --assignee-principal-type ServicePrincipal --only-show-errors + az role assignment create --assignee-object-id $extensionPrincipalId --role "EventGrid TopicSpaces Subscriber" --scope $eventGridTopicId --assignee-principal-type ServicePrincipal --only-show-errors + az role assignment create --assignee-object-id $extensionPrincipalId --role 'EventGrid TopicSpaces Publisher' --scope $eventGridTopicId --assignee-principal-type ServicePrincipal --only-show-errors + + Start-Sleep -Seconds 60 + + Write-Host "[$(Get-Date -Format t)] INFO: Configuring routing to use system-managed identity" -ForegroundColor DarkGray + $eventGridConfig = "{routing-identity-info:{type:'SystemAssigned'}}" + az eventgrid namespace update -g $resourceGroup -n $eventGridNamespaceName --topic-spaces-configuration $eventGridConfig --only-show-errors + + Start-Sleep -Seconds 60 + + ## Adding MQTT bridge to Event Grid MQTT + $mqconfigfile = "$AgToolsDir\mq_cloudConnector.yml" + Copy-Item $mqconfigfile "$AgToolsDir\mq_cloudConnector_$clusterName.yml" -Force + $bridgeConfig = "$AgToolsDir\mq_cloudConnector_$clusterName.yml" + (Get-Content $bridgeConfig) -replace 'clusterName', $clusterName | Set-Content $bridgeConfig + Write-Host "[$(Get-Date -Format t)] INFO: Configuring the MQ Event Grid bridge" -ForegroundColor DarkGray + $eventGridHostName = (az eventgrid namespace list --resource-group $resourceGroup --query "[0].topicSpacesConfiguration.hostname" -o tsv --only-show-errors) + (Get-Content -Path $bridgeConfig) -replace 'eventGridPlaceholder', $eventGridHostName | Set-Content -Path $bridgeConfig + kubectl apply -f $bridgeConfig -n $aioNamespace + + ## Patching MQTT listener + } +} + +function Set-MQTTIpAddress { + $mqttIpArray = @() + $clusters = $AgConfig.SiteConfig.GetEnumerator() + foreach ($cluster in $clusters) { + $clusterName = $cluster.Name.ToLower() + if($cluster.Value.type -eq "K3s"){ + $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" + kubectx + }else{ + kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\ClusterSecrets.log") + } + Write-Host "[$(Get-Date -Format t)] INFO: Getting MQ IP address" -ForegroundColor DarkGray + + do { + $mqttIp = kubectl get service $mqListenerService -n $aioNamespace -o jsonpath="{.status.loadBalancer.ingress[0].ip}" + $services = kubectl get pods -n $aioNamespace -o json | ConvertFrom-Json + $matchingServices = $services.items | Where-Object { + $_.metadata.name -match "aio-mq-dmqtt" -and + $_.status.phase -notmatch "running" + } + Write-Host "[$(Get-Date -Format t)] INFO: Waiting for MQTT services to initialize and the service Ip address to be assigned...Waiting for 20 seconds" -ForegroundColor DarkGray + Start-Sleep -Seconds 20 + } while ( + $null -eq $mqttIp -and $matchingServices.Count -ne 0 + ) + if (-not [string]::IsNullOrEmpty($mqttIp)) { + $newObject = [PSCustomObject]@{ + cluster = $clusterName + ip = $mqttIp + } + $mqttIpArray += $newObject + } + if($cluster.Value.type -eq "AKSEE"){ + Invoke-Command -VMName $clusterName -Credential $Credentials -ScriptBlock { + netsh interface portproxy add v4tov4 listenport=1883 listenaddress=0.0.0.0 connectport=1883 connectaddress=$using:mqttIp + } + } + } + + $mqttIpArray = $mqttIpArray | Where-Object { $_ -ne "" } + + return $mqttIpArray +} + +############################################################## +# Install MQTT Explorer +############################################################## +function Deploy-MQTTExplorer { + param ( + [array]$mqttIpArray + ) + Write-Host "`n" + Write-Host "[$(Get-Date -Format t)] INFO: Installing MQTT Explorer." -ForegroundColor DarkGreen + Write-Host "`n" + $aioToolsDir = $AgConfig.AgDirectories["AgToolsDir"] + $mqttExplorerSettings = "$env:USERPROFILE\AppData\Roaming\MQTT-Explorer\settings.json" + $latestReleaseTag = (Invoke-WebRequest $mqttExplorerReleasesUrl | ConvertFrom-Json)[0].tag_name + $versionToDownload = $latestReleaseTag.Split("v")[1] + $mqttExplorerReleaseDownloadUrl = ((Invoke-WebRequest $mqttExplorerReleasesUrl | ConvertFrom-Json)[0].assets | Where-object { $_.name -like "MQTT-Explorer-Setup-${versionToDownload}.exe" }).browser_download_url + $output = Join-Path $aioToolsDir "mqtt-explorer-$latestReleaseTag.exe" + $clusters = $AgConfig.SiteConfig.GetEnumerator() + + $ProgressPreference = "SilentlyContinue" + Invoke-WebRequest $mqttExplorerReleaseDownloadUrl -OutFile $output + Start-Process -FilePath $output -ArgumentList "/S" -Wait + + Write-Host "[$(Get-Date -Format t)] INFO: Configuring MQTT explorer" -ForegroundColor DarkGray + Start-Process "$env:USERPROFILE\AppData\Local\Programs\MQTT-Explorer\MQTT Explorer.exe" + Start-Sleep -Seconds 5 + Stop-Process -Name "MQTT Explorer" + Copy-Item "$aioToolsDir\mqtt_explorer_settings.json" -Destination $mqttExplorerSettings -Force + foreach ($cluster in $clusters) { + $clusterName = $cluster.Name.ToLower() + $mqttIp = $mqttIpArray | Where-Object { $_.cluster -eq $clusterName } | Select-Object -ExpandProperty ip + (Get-Content $mqttExplorerSettings ) -replace "${clusterName}IpPlaceholder", $mqttIp | Set-Content $mqttExplorerSettings + } + $ProgressPreference = "Continue" +} \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 new file mode 100644 index 0000000000..ddb909c784 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -0,0 +1,185 @@ +function Get-K3sConfigFile{ + # Downloading k3s Kubernetes cluster kubeconfig file + Write-Host "Downloading k3s Kubeconfigs" + $Env:AZCOPY_AUTO_LOGIN_TYPE="PSCRED" + $Env:KUBECONFIG="" + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + $clusterName = $cluster.Name.ToLower() + $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" + $containerName = $arcClusterName.toLower() + $sourceFile = "https://$stagingStorageAccountName.blob.core.windows.net/$containerName/config" + azcopy copy $sourceFile "C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" --check-length=false + $sourceFile = "https://$stagingStorageAccountName.blob.core.windows.net/$containerName/*" + azcopy cp --check-md5 FailIfDifferentOrMissing $sourceFile "$AgLogsDir\" --include-pattern "*.log" + } +} + +function Configure-K3sClusters { + Write-Host "Configuring kube-vip on K3s clusterS" + $clusters = $AgConfig.SiteConfig.GetEnumerator() + foreach ($cluster in $clusters) { + if ($cluster.Value.Type -eq "k3s") { + $clusterName = $cluster.Name.ToLower() + $vmName = $cluster.Value.ArcClusterName+"-$namingGuid" + $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" + kubectx + $k3sVIP = az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``true``].privateIPAddress" -otsv + Write-Host "Assigning kube-vip-role on k3s cluster" +$kubeVipRBAC = @" +apiVersion: v1 +kind: ServiceAccount +metadata: + name: kube-vip + namespace: kube-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + annotations: + rbac.authorization.kubernetes.io/autoupdate: "true" + name: system:kube-vip-role +rules: + - apiGroups: [""] + resources: ["services/status"] + verbs: ["update"] + - apiGroups: [""] + resources: ["services", "endpoints"] + verbs: ["list","get","watch", "update"] + - apiGroups: [""] + resources: ["nodes"] + verbs: ["list","get","watch", "update", "patch"] + - apiGroups: ["coordination.k8s.io"] + resources: ["leases"] + verbs: ["list", "get", "watch", "update", "create"] + - apiGroups: ["discovery.k8s.io"] + resources: ["endpointslices"] + verbs: ["list","get","watch", "update"] +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: system:kube-vip-binding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: system:kube-vip-role +subjects: +- kind: ServiceAccount + name: kube-vip + namespace: kube-system +"@ + +$kubeVipRBAC | kubectl apply -f - + +$kubeVipDaemonset = @" +apiVersion: apps/v1 +kind: DaemonSet +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/name: kube-vip-ds + app.kubernetes.io/version: v0.7.0 + name: kube-vip-ds + namespace: kube-system +spec: + selector: + matchLabels: + app.kubernetes.io/name: kube-vip-ds + template: + metadata: + creationTimestamp: null + labels: + app.kubernetes.io/name: kube-vip-ds + app.kubernetes.io/version: v0.7.0 + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: node-role.kubernetes.io/master + operator: Exists + - matchExpressions: + - key: node-role.kubernetes.io/control-plane + operator: Exists + containers: + - args: + - manager + env: + - name: vip_arp + value: "true" + - name: port + value: "6443" + - name: vip_interface + value: eth0 + - name: vip_cidr + value: "32" + - name: dns_mode + value: first + - name: cp_enable + value: "true" + - name: cp_namespace + value: kube-system + - name: svc_enable + value: "true" + - name: svc_leasename + value: plndr-svcs-lock + - name: vip_leaderelection + value: "true" + - name: vip_leasename + value: plndr-cp-lock + - name: vip_leaseduration + value: "5" + - name: vip_renewdeadline + value: "3" + - name: vip_retryperiod + value: "1" + - name: address + value: "$k3sVIP" + - name: prometheus_server + value: :2112 + image: ghcr.io/kube-vip/kube-vip:v0.7.0 + imagePullPolicy: Always + name: kube-vip + resources: {} + securityContext: + capabilities: + add: + - NET_ADMIN + - NET_RAW + hostNetwork: true + serviceAccountName: kube-vip + tolerations: + - effect: NoSchedule + operator: Exists + - effect: NoExecute + operator: Exists + updateStrategy: {} +status: + currentNumberScheduled: 0 + desiredNumberScheduled: 0 + numberMisscheduled: 0 + numberReady: 0 +"@ + + $kubeVipDaemonset | kubectl apply -f - + + Write-Host "Deploying Kube vip cloud controller on k3s cluster" + kubectl apply -f https://raw.githubusercontent.com/kube-vip/kube-vip-cloud-provider/main/manifest/kube-vip-cloud-controller.yaml + + $serviceIpRange = az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``false``].privateIPAddress" -otsv + $sortedIps = $serviceIpRange | Sort-Object {[System.Version]$_} + $lowestServiceIp = $sortedIps[0] + $highestServiceIp = $sortedIps[-1] + + kubectl create configmap -n kube-system kubevip --from-literal range-global=$lowestServiceIp-$highestServiceIp + Start-Sleep -Seconds 30 + + Write-Host "Creating longhorn storage on K3scluster" + kubectl apply -f "$AgToolsDir\longhorn.yaml" + Start-Sleep -Seconds 30 + Write-Host "`n" + } + } + +} \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_motors.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_motors.psm1 new file mode 100644 index 0000000000..ed4fee4ed1 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_motors.psm1 @@ -0,0 +1,309 @@ +function Deploy-MotorsConfigs { + Write-Host "[$(Get-Date -Format t)] INFO: Configuring OVMS prerequisites on Kubernetes nodes." -ForegroundColor Gray + $VMs = (Get-VM).Name + foreach ($VM in $VMs) { + Invoke-Command -VMName $VM -Credential $Credentials -ScriptBlock { + Invoke-AksEdgeNodeCommand -NodeType Linux -command "curl -sL https://github.com/operator-framework/operator-lifecycle-manager/releases/download/v0.27.0/install.sh | bash -s v0.27.0" + } + kubectx $VM.ToLower() + kubectl create -f https://operatorhub.io/install/ovms-operator.yaml + } + + # Loop through the clusters and deploy the configs in AppConfig hashtable in AgConfig-contoso-motors.psd + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + Start-Job -Name gitops -ScriptBlock { + $AgConfig = $using:AgConfig + $cluster = $using:cluster + $namingGuid = $using:namingGuid + $resourceGroup = $using:resourceGroup + $appClonedRepo = $using:appUpstreamRepo + $appsRepo = $using:appsRepo + + $AgConfig.AppConfig.GetEnumerator() | sort-object -Property @{Expression = { $_.value.Order }; Ascending = $true } | ForEach-Object { + $app = $_ + $clusterName = $cluster.value.ArcClusterName + "-$namingGuid" + $branch = $cluster.value.Branch.ToLower() + $configName = $app.value.GitOpsConfigName.ToLower() + $namespace = $app.value.Namespace + $appName = $app.Value.KustomizationName + $appPath = $app.Value.KustomizationPath + $retryCount = 0 + $maxRetries = 2 + + Write-Host "[$(Get-Date -Format t)] INFO: Creating GitOps config for $configName on $($cluster.Value.ArcClusterName+"-$namingGuid")" -ForegroundColor Gray + $type = "connectedClusters" + + # Wait for Kubernetes API server to become available + $apiServer = kubectl config view --context $cluster.Name.ToLower() --minify -o jsonpath='{.clusters[0].cluster.server}' + $apiServerAddress = $apiServer -replace '.*https://| .*$' + $apiServerFqdn = ($apiServerAddress -split ":")[0] + $apiServerPort = ($apiServerAddress -split ":")[1] + + do { + $result = Test-NetConnection -ComputerName $apiServerFqdn -Port $apiServerPort -WarningAction SilentlyContinue + if ($result.TcpTestSucceeded) { + break + } + else { + Start-Sleep -Seconds 5 + } + } while ($true) + + + az k8s-configuration flux create ` + --cluster-name $clusterName ` + --resource-group $resourceGroup ` + --name $configName ` + --cluster-type $type ` + --scope cluster ` + --url $appClonedRepo ` + --branch $branch ` + --sync-interval 3s ` + --kustomization name=$appName path=$appPath prune=true retry_interval=1m ` + --timeout 10m ` + --namespace $namespace ` + --only-show-errors ` + 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + + do { + $configStatus = $(az k8s-configuration flux show --name $configName --cluster-name $clusterName --cluster-type $type --resource-group $resourceGroup -o json 2>$null) | convertFrom-JSON + if ($configStatus.ComplianceState -eq "Compliant") { + Write-Host "[$(Get-Date -Format t)] INFO: GitOps configuration $configName is ready on $clusterName" -ForegroundColor DarkGreen | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + } + else { + if ($configStatus.ComplianceState -ne "Non-compliant") { + Start-Sleep -Seconds 20 + } + elseif ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -lt $maxRetries) { + Start-Sleep -Seconds 20 + $configStatus = $(az k8s-configuration flux show --name $configName --cluster-name $clusterName --cluster-type $type --resource-group $resourceGroup -o json 2>$null) | convertFrom-JSON + if ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -lt $maxRetries) { + $retryCount++ + Write-Host "[$(Get-Date -Format t)] INFO: Attempting to re-install $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + Write-Host "[$(Get-Date -Format t)] INFO: Deleting $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + az k8s-configuration flux delete ` + --resource-group $resourceGroup ` + --cluster-name $clusterName ` + --cluster-type $type ` + --name $configName ` + --force ` + --yes ` + --only-show-errors ` + 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + + Start-Sleep -Seconds 10 + Write-Host "[$(Get-Date -Format t)] INFO: Re-creating $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + + az k8s-configuration flux create ` + --cluster-name $clusterName ` + --resource-group $resourceGroup ` + --name $configName ` + --cluster-type $type ` + --scope cluster ` + --url $appClonedRepo ` + --branch $branch ` + --sync-interval 3s ` + --kustomization name=$appName path=$appPath prune=true ` + --timeout 30m ` + --namespace $namespace ` + --only-show-errors ` + 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + } + } + elseif ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -eq $maxRetries) { + Write-Host "[$(Get-Date -Format t)] ERROR: GitOps configuration $configName has failed on $clusterName. Exiting..." -ForegroundColor White -BackgroundColor Red | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + break + } + } + } until ($configStatus.ComplianceState -eq "Compliant") + } + } + } + + while ($(Get-Job -Name gitops).State -eq 'Running') { + #Write-Host "[$(Get-Date -Format t)] INFO: Waiting for GitOps configuration to complete on all clusters...waiting 60 seconds" -ForegroundColor Gray + Receive-Job -Name gitops -WarningAction SilentlyContinue + Start-Sleep -Seconds 60 + } + + Get-Job -name gitops | Remove-Job + Write-Host "[$(Get-Date -Format t)] INFO: GitOps configuration complete." -ForegroundColor Green + Write-Host +} + +function Deploy-MQTTSimulator { + param ( + [array]$mqttIpArray + ) + + $mqsimulatorfile = "$AgToolsDir\mqtt_simulator.yml" + + $clusters = $AgConfig.SiteConfig.GetEnumerator() + + foreach ($cluster in $clusters) { + $clusterName = $cluster.Name.ToLower() + Copy-Item $mqsimulatorfile "$AgToolsDir\mqtt_simulator_$clusterName.yml" -Force + $simualtorConfig = "$AgToolsDir\mqtt_simulator_$clusterName.yml" + $mqttIp = $mqttIpArray | Where-Object { $_.cluster -eq $clusterName } | Select-Object -ExpandProperty ip + Write-Host "[$(Get-Date -Format t)] INFO: Deploying MQTT Simulator to the $clusterName cluster" -ForegroundColor Gray + Write-Host "`n" + kubectx $clusterName + (Get-Content $simualtorConfig ) -replace 'MQTTIpPlaceholder', $mqttIp | Set-Content $simualtorConfig + netsh interface portproxy add v4tov4 listenport=1883 listenaddress=0.0.0.0 connectport=1883 connectaddress=$mqttIp + kubectl apply -f $simualtorConfig -n $aioNamespace + } +} + +# Function to deploy Azure Data Explorer dashboard reports +function Deploy-ADXDashboardReports { + ### BELOW IS AN ALTERNATIVE APPROACH TO IMPORT DASHBOARD USING README INSTRUCTIONS + $adxDashBoardsDir = $AgConfig.AgDirectories["AgAdxDashboards"] + + # Create directory if do not exist + if (-not (Test-Path -LiteralPath $adxDashBoardsDir)) { + New-Item -Path $adxDashBoardsDir -ItemType Directory -ErrorAction Stop | Out-Null #-Force + } + + #$dataEmulatorDir = $AgConfig.AgDirectories["AgDataEmulator"] + $kustoCluster = Get-AzKustoCluster -ResourceGroupName $resourceGroup -Name $adxClusterName + if ($null -ne $kustoCluster) { + $adxEndPoint = $kustoCluster.Uri + if ($null -ne $adxEndPoint -and $adxEndPoint -ne "") { + $ordersDashboardBody = (Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/artifacts/adx_dashboards/adx-dashboard-contoso-motors-auto-parts.json").Content -replace '{{ADX_CLUSTER_URI}}', $adxEndPoint -replace '{{ADX_CLUSTER_NAME}}', $adxClusterName -replace '{{GITHUB_BRANCH}}', $env:githubBranch -replace '{{GITHUB_ACCOUNT}}', $env:githubAccount + Set-Content -Path "$adxDashBoardsDir\adx-dashboard-contoso-motors-auto-parts.json" -Value $ordersDashboardBody -Force -ErrorAction Ignore + } + else { + Write-Host "[$(Get-Date -Format t)] ERROR: Unable to find Azure Data Explorer endpoint from the cluster resource in the resource group." + } + } + + # Create EventHub environment variables + $eventHubNamespace = (az eventhubs namespace list --resource-group $env:resourceGroup --query [0].name --output tsv) + if ($null -ne $eventHubNamespace) { + # Find EventHub and create connection string + $eventHub = (az eventhubs eventhub list --namespace-name $eventHubNamespace --resource-group $env:resourceGroup --query [0].name --output tsv) + + # Create authorization rule + $authRuleName = "data-emulator" + az eventhubs eventhub authorization-rule create --authorization-rule-name $authRuleName --eventhub-name $eventHub --namespace-name $eventHubNamespace --resource-group $env:resourceGroup --rights Send Listen + + # Get connection string + $connectionString = (az eventhubs eventhub authorization-rule keys list --resource-group $env:resourceGroup --namespace-name $eventHubNamespace --eventhub-name $eventHub --name $authRuleName --query primaryConnectionString --output tsv) + + # Set environment variables + [System.Environment]::SetEnvironmentVariable('EVENTHUB_CONNECTION_STRING', $connectionString, [System.EnvironmentVariableTarget]::Machine) + [System.Environment]::SetEnvironmentVariable('EVENTHUB_NAME', $eventHub, [System.EnvironmentVariableTarget]::Machine) + } + + # Create desktop icons + $AgDataEmulatorDir = $AgConfig.AgDirectories["AgDataEmulator"] + $dataEmulatorFile = "$AgDataEmulatorDir\data-emulator.py" + Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/artifacts/data_emulator/data-emulator.py" -OutFile $dataEmulatorFile + if (!(Test-Path -Path $dataEmulatorFile)) { + Write-Host "Unabled to download data-emulator.py file. Please download manually from GitHub into the DataEmulator folder." + } + + $emulationScriptContent = "@echo off `r`ncmd /k `"cd /d $AgDataEmulatorDir & python data-emulator.py`"" + $emulatorLocation = "$AgDataEmulatorDir\dataemulator.cmd" + Set-Content -Path $emulatorLocation -Value $emulationScriptContent + + # Download icon file + $AgIconsDir = $AgConfig.AgDirectories["AgIconDir"] + + $iconPath = "$AgIconsDir\emulator.ico" + Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/artifacts/icons/emulator.ico" -OutFile $iconPath + if (!(Test-Path -Path $iconPath)) { + Write-Host "Unabled to download emulator.ico file. Please download manually from GitHub into the icons folder." + } + + # Create desktop shortcut + $shortcutLocation = "$Env:Public\Desktop\Data Emulator.lnk" + $wScriptShell = New-Object -ComObject WScript.Shell + $shortcut = $wScriptShell.CreateShortcut($shortcutLocation) + $shortcut.TargetPath = $emulatorLocation + $shortcut.IconLocation = "$iconPath, 0" + $shortcut.WindowStyle = 8 + $shortcut.Save() + + # Install azure.eventhub python module to run data emulator + pip install azure.eventhub +} + +function Deploy-MotorsBookmarks { + $bookmarksFileName = "$AgToolsDir\Bookmarks" + $edgeBookmarksPath = "$Env:LOCALAPPDATA\Microsoft\Edge\User Data\Default" + + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + kubectx $cluster.Name.ToLower() | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + $services = kubectl get services --all-namespaces -o json | ConvertFrom-Json + + # Matching url: flask app + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'flask-app-service' -and + $_.spec.ports.port -contains 8888 + } + $flaskIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($flaskIp in $flaskIps) { + $output = "http://${flaskIp}:8888" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("Flask-" + $cluster.Name + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + + Start-Sleep -Seconds 2 + } + + # Matching url: Influxdb + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'Influxdb' -and + $_.spec.ports.port -contains 8086 + } + $influxdbIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($influxdbIp in $influxdbIps) { + $output = "http://${influxdbIp}:8086" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("Influxdb-" + $cluster.Name + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + + Start-Sleep -Seconds 2 + } + + # Matching url: prometheus + $matchingServices = $services.items | Where-Object { + $_.spec.ports.port -contains 9090 -and + $_.spec.type -eq "LoadBalancer" + } + $prometheusIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($prometheusIp in $prometheusIps) { + $output = "http://${prometheusIp}:9090" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("Prometheus-" + $cluster.Name + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + + Start-Sleep -Seconds 2 + } + } + + Start-Sleep -Seconds 2 + + Copy-Item -Path $bookmarksFileName -Destination $edgeBookmarksPath -Force + + ############################################################## + # Pinning important directories to Quick access + ############################################################## + Write-Host "[$(Get-Date -Format t)] INFO: Pinning important directories to Quick access (Step 16/17)" -ForegroundColor DarkGreen + $quickAccess = new-object -com shell.application + $quickAccess.Namespace($AgConfig.AgDirectories.AgDir).Self.InvokeVerb("pintohome") + $quickAccess.Namespace($AgConfig.AgDirectories.AgLogsDir).Self.InvokeVerb("pintohome") +} diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_supermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_supermarket.psm1 new file mode 100644 index 0000000000..3df267b869 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_supermarket.psm1 @@ -0,0 +1,772 @@ +function SetupSupermarketRepo { + Set-Location $AgAppsRepo + Write-Host "INFO: Checking if the $appsRepo repository is forked" -ForegroundColor Gray + $retryCount = 0 + $maxRetries = 5 + do { + $forkExists = $false + try { + $response = Invoke-RestMethod -Uri "$gitHubAPIBaseUri/repos/$githubUser/$appsRepo" + if ($response) { + write-host "INFO: Fork exists....Proceeding" -ForegroundColor Gray + $forkExists = $true + } + } + catch { + if ($retryCount -lt $maxRetries) { + Write-Host "ERROR: $githubUser/$appsRepo Fork doesn't exist, please fork https://github.com/microsoft/jumpstart-agora-apps to proceed (attempt $retryCount/$maxRetries) . . . waiting 60 seconds" -ForegroundColor Red + $retryCount++ + $forkExists = $false + start-sleep -Seconds 60 + } + else { + Write-Host "[$(Get-Date -Format t)] ERROR: Retry limit reached, $githubUser/$appsRepo Fork doesn't exist. Exiting." -ForegroundColor Red + exit + } + } + } until ($forkExists -eq $true) + + Write-Host "INFO: Checking if the GitHub access token is valid." -ForegroundColor Gray + do { + $response = gh auth status 2>&1 + if ($response -match "authentication failed") { + write-host "ERROR: The GitHub Personal access token is not valid" -ForegroundColor Red + Write-Host "INFO: Please try to re-generate the personal access token and provide it here (https://aka.ms/AgoraPreReqs): " + do { + $githubPAT = Read-Host "GitHub personal access token" + } while ($githubPAT -eq "") + } + } until ( + $response -notmatch "authentication failed" + ) + + Write-Host "INFO: The GitHub Personal access token is valid. Proceeding." -ForegroundColor DarkGreen + $Env:GITHUB_TOKEN = $githubPAT.Trim() + [System.Environment]::SetEnvironmentVariable('GITHUB_TOKEN', $githubPAT.Trim(), [System.EnvironmentVariableTarget]::Machine) + + Write-Host "INFO: Checking if the personal access token is assigned on the $githubUser/$appsRepo Fork" -ForegroundColor Gray + $headers = @{ + Authorization = "token $githubPat" + "Content-Type" = "application/json" + } + $retryCount = 0 + $maxRetries = 5 + $uri = "$gitHubAPIBaseUri/repos/$githubUser/$appsRepo/actions/secrets" + do { + try { + $response = Invoke-RestMethod -Uri $uri -Method Get -Headers $headers + Write-Host "INFO: Personal access token is assigned on $githubUser/$appsRepo fork" -ForegroundColor DarkGreen + $PatAssigned = $true + } + catch { + if ($retryCount -lt $maxRetries) { + Write-Host "ERROR: Personal access token is not assigned on $githubUser/$appsRepo fork. Please assign the personal access token to your fork (https://aka.ms/AgoraPreReqs) (attempt $retryCount/$maxRetries).....waiting 60 seconds" -ForegroundColor Red + $PatAssigned = $false + $retryCount++ + start-sleep -Seconds 60 + } + else { + Write-Host "[$(Get-Date -Format t)] ERROR: Retry limit reached, the personal access token is not assigned to $githubUser/$appsRepo. Exiting." -ForegroundColor Red + exit + } + } + } until ($PatAssigned -eq $true) + + + Write-Host "INFO: Cloning the GitHub repository locally" -ForegroundColor Gray + git clone "https://$githubPat@github.com/$githubUser/$appsRepo.git" "$AgAppsRepo\$appsRepo" + Set-Location "$AgAppsRepo\$appsRepo" + + Write-Host "INFO: Verifying 'Administration' permissions" -ForegroundColor Gray + $retryCount = 0 + $maxRetries = 5 + + $body = @{ + required_status_checks = $null + enforce_admins = $false + required_pull_request_reviews = @{ + required_approving_review_count = 0 + } + dismiss_stale_reviews = $true + restrictions = $null + } | ConvertTo-Json + + do { + try { + $response = Invoke-WebRequest -Uri "$gitHubAPIBaseUri/repos/$githubUser/$appsRepo/branches/main/protection" -Method Put -Headers $headers -Body $body -ContentType "application/json" + } + catch { + if ($retryCount -lt $maxRetries) { + Write-Host "ERROR: The GitHub Personal access token doesn't seem to have 'Administration' write permissions, please assign the right permissions (https://aka.ms/AgoraPreReqs) (attempt $retryCount/$maxRetries)...waiting 60 seconds" -ForegroundColor Red + $retryCount++ + start-sleep -Seconds 60 + } + else { + Write-Host "[$(Get-Date -Format t)] ERROR: Retry limit reached, the personal access token doesn't have 'Administration' write permissions assigned. Exiting." -ForegroundColor Red + exit + } + } + } until ($response) + Write-Host "INFO: 'Administration' write permissions verified" -ForegroundColor DarkGreen + + + Write-Host "INFO: Checking if there are existing branch protection policies" -ForegroundColor Gray + $protectedBranches = Invoke-RestMethod -Uri "$gitHubAPIBaseUri/repos/$githubUser/$appsRepo/branches?protected=true" -Method GET -Headers $headers + foreach ($branch in $protectedBranches) { + $branchName = $branch.name + $deleteProtectionUrl = "$gitHubAPIBaseUri/repos/$githubUser/$appsRepo/branches/$branchName/protection" + Invoke-RestMethod -Uri $deleteProtectionUrl -Headers $headers -Method Delete + Write-Host "INFO: Deleted protection policy for branch: $branchName" -ForegroundColor Gray + } + + Write-Host "INFO: Pulling latests changes to GitHub repository" -ForegroundColor Gray + git config --global user.email "dev@agora.com" + git config --global user.name "Agora Dev" + git remote add upstream "$appUpstreamRepo.git" + git fetch upstream + git checkout main + git reset --hard upstream/main + git push origin main -f + git pull + git remote remove upstream + git remote add upstream "$appClonedRepo.git" + + Write-Host "INFO: Creating GitHub workflows" -ForegroundColor Gray + New-Item -ItemType Directory ".github/workflows" -Force + $githubApiUrl = "$gitHubAPIBaseUri/repos/$githubAccount/azure_arc/contents/azure_jumpstart_ag/artifacts/workflows?ref=$githubBranch" + $response = Invoke-RestMethod -Uri $githubApiUrl + $fileUrls = $response | Where-Object { $_.type -eq "file" } | Select-Object -ExpandProperty download_url + $fileUrls | ForEach-Object { + $fileName = $_.Substring($_.LastIndexOf("/") + 1) + $outputFile = Join-Path "$AgAppsRepo\$appsRepo\.github\workflows" $fileName + Invoke-RestMethod -Uri $_ -OutFile $outputFile + } + git add . + git commit -m "Pushing GitHub Actions to apps fork" + git push + Start-Sleep -Seconds 20 + + Write-Host "INFO: Verifying 'Secrets' permissions" -ForegroundColor Gray + $retryCount = 0 + $maxRetries = 5 + do { + $response = gh secret set "test" -b "test" 2>&1 + if ($response -match "error") { + if ($retryCount -eq $maxRetries) { + Write-Host "[$(Get-Date -Format t)] ERROR: Retry limit reached, the personal access token doesn't have 'Secrets' write permissions assigned. Exiting." -ForegroundColor Red + exit + } + else { + $retryCount++ + write-host "ERROR: The GitHub Personal access token doesn't seem to have 'Secrets' write permissions, please assign the right permissions (https://aka.ms/AgoraPreReqs) (attempt $retryCount/$maxRetries)...waiting 60 seconds" -ForegroundColor Red + Start-Sleep -Seconds 60 + } + } + } while ($response -match "error" -or $retryCount -ge $maxRetries) + gh secret delete test + Write-Host "INFO: 'Secrets' write permissions verified" -ForegroundColor DarkGreen + + Write-Host "INFO: Verifying 'Actions' permissions" -ForegroundColor Gray + $retryCount = 0 + $maxRetries = 5 + do { + $response = gh workflow enable update-files.yml 2>&1 + if ($response -match "failed") { + if ($retryCount -eq $maxRetries) { + Write-Host "[$(Get-Date -Format t)] ERROR: Retry limit reached, the personal access token doesn't have 'Actions' write permissions assigned. Exiting." -ForegroundColor Red + exit + } + else { + $retryCount++ + write-host "ERROR: The GitHub Personal access token doesn't seem to have 'Actions' write permissions, please assign the right permissions (https://aka.ms/AgoraPreReqs) (attempt $retryCount/$maxRetries)...waiting 60 seconds" -ForegroundColor Red + Start-Sleep -Seconds 60 + } + } + } while ($response -match "failed" -or $retryCount -ge $maxRetries) + Write-Host "INFO: 'Actions' write permissions verified" -ForegroundColor DarkGreen + + write-host "INFO: Creating GitHub secrets" -ForegroundColor Gray + Write-Host "INFO: Getting Cosmos DB access key" -ForegroundColor Gray + Write-Host "INFO: Adding GitHub secrets to apps fork" -ForegroundColor Gray + gh api -X PUT "/repos/$githubUser/$appsRepo/actions/permissions/workflow" -F can_approve_pull_request_reviews=true + gh repo set-default "$githubUser/$appsRepo" + gh secret set "SPN_CLIENT_ID" -b $spnClientID + gh secret set "SPN_CLIENT_SECRET" -b $spnClientSecret + gh secret set "ACR_NAME" -b $acrName + gh secret set "PAT_GITHUB" -b $githubPat + gh secret set "COSMOS_DB_ENDPOINT" -b $cosmosDBEndpoint + gh secret set "SPN_TENANT_ID" -b $spnTenantId + + Write-Host "INFO: Updating ACR name and Cosmos DB endpoint in all branches" -ForegroundColor Gray + gh workflow run update-files.yml + while ($workflowStatus.status -ne "completed") { + Write-Host "INFO: Waiting for update-files workflow to complete" -ForegroundColor Gray + Start-Sleep -Seconds 10 + $workflowStatus = (gh run list --workflow=update-files.yml --json status) | ConvertFrom-Json + } + Write-Host "INFO: Starting Contoso supermarket pos application v1.0 image build" -ForegroundColor Gray + gh workflow run pos-app-initial-images-build.yml + + Write-Host "INFO: Creating GitHub branches to $appsRepo fork" -ForegroundColor Gray + $branches = $AgConfig.GitBranches + foreach ($branch in $branches) { + try { + $response = Invoke-RestMethod -Uri "$gitHubAPIBaseUri/repos/$githubUser/$appsRepo/branches/$branch" + if ($response) { + if ($branch -ne "main") { + Write-Host "INFO: branch $branch already exists! Deleting and recreating the branch" -ForegroundColor Gray + git push origin --delete $branch + git branch -d $branch + git fetch origin + git checkout main + git pull origin main + git checkout -b $branch main + git pull origin main + git push --set-upstream origin $branch + } + } + } + catch { + Write-Host "INFO: Creating $branch branch" -ForegroundColor Gray + git fetch origin + git checkout main + git pull origin main + git checkout -b $branch main + git pull origin main + git push --set-upstream origin $branch + } + } + Write-Host "INFO: Cleaning up any other branches" -ForegroundColor Gray + $existingBranches = gh api "repos/$githubUser/$appsRepo/branches" | ConvertFrom-Json + $branches = $AgConfig.GitBranches + foreach ($branch in $existingBranches) { + if ($branches -notcontains $branch.name) { + $branchToDelete = $branch.name + git push origin --delete $branchToDelete + } + } + + Write-Host "INFO: Switching to main branch" -ForegroundColor Gray + git checkout main + + Write-Host "INFO: Adding branch protection policies for all branches" -ForegroundColor Gray + foreach ($branch in $branches) { + Write-Host "INFO: Adding branch protection policies for $branch branch" -ForegroundColor Gray + $headers = @{ + "Authorization" = "Bearer $githubPat" + "Accept" = "application/vnd.github+json" + } + $body = @{ + required_status_checks = $null + enforce_admins = $false + required_pull_request_reviews = @{ + required_approving_review_count = 0 + } + dismiss_stale_reviews = $true + restrictions = $null + } | ConvertTo-Json + + Invoke-WebRequest -Uri "$gitHubAPIBaseUri/repos/$githubUser/$appsRepo/branches/$branch/protection" -Method Put -Headers $headers -Body $body -ContentType "application/json" + } + Write-Host "INFO: GitHub repo configuration complete!" -ForegroundColor Green + Write-Host +} + +function Deploy-AzureIOTHub { + if ($githubUser -ne "microsoft") { + $iotHubHostName = $Env:iotHubHostName + $iotHubName = $iotHubHostName.replace(".azure-devices.net", "") + $sites = $AgConfig.SiteConfig.Values + Write-Host "[$(Get-Date -Format t)] INFO: Create an Azure IoT device for each site" -ForegroundColor Gray + foreach ($site in $sites) { + foreach ($device in $site.IoTDevices) { + $deviceId = "$device-$($site.FriendlyName)" + Add-AzIotHubDevice -ResourceGroupName $resourceGroup -IotHubName $iotHubName -DeviceId $deviceId -EdgeEnabled | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\IoT.log") + } + } + Write-Host "[$(Get-Date -Format t)] INFO: Azure IoT Hub configuration complete!" -ForegroundColor Green + Write-Host + } + else { + Write-Host "[$(Get-Date -Format t)] ERROR: You have to fork the jumpstart-agora-apps repository!" -ForegroundColor Red + } + + ### BELOW IS AN ALTERNATIVE APPROACH TO IMPORT DASHBOARD USING README INSTRUCTIONS + $adxDashBoardsDir = $AgConfig.AgDirectories["AgAdxDashboards"] + $dataEmulatorDir = $AgConfig.AgDirectories["AgDataEmulator"] + $kustoCluster = Get-AzKustoCluster -ResourceGroupName $resourceGroup -Name $adxClusterName + if ($null -ne $kustoCluster) { + $adxEndPoint = $kustoCluster.Uri + if ($null -ne $adxEndPoint -and $adxEndPoint -ne "") { + $ordersDashboardBody = (Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/artifacts/adx_dashboards/adx-dashboard-orders-payload.json").Content -replace '{{ADX_CLUSTER_URI}}', $adxEndPoint -replace '{{ADX_CLUSTER_NAME}}', $adxClusterName + Set-Content -Path "$adxDashBoardsDir\adx-dashboard-orders-payload.json" -Value $ordersDashboardBody -Force -ErrorAction Ignore + $iotSensorsDashboardBody = (Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/artifacts/adx_dashboards/adx-dashboard-iotsensor-payload.json") -replace '{{ADX_CLUSTER_URI}}', $adxEndPoint -replace '{{ADX_CLUSTER_NAME}}', $adxClusterName + Set-Content -Path "$adxDashBoardsDir\adx-dashboard-iotsensor-payload.json" -Value $iotSensorsDashboardBody -Force -ErrorAction Ignore + } + else { + Write-Host "[$(Get-Date -Format t)] ERROR: Unable to find Azure Data Explorer endpoint from the cluster resource in the resource group." + } + } + + # Download DataEmulator.zip into Agora folder and unzip + $emulatorPath = "$dataEmulatorDir\DataEmulator.zip" + Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/artifacts/data_emulator/DataEmulator.zip" -OutFile $emulatorPath + + # Unzip DataEmulator.zip to copy DataEmulator exe and config file to generate sample data for dashboards + if (Test-Path -Path $emulatorPath) { + Expand-Archive -Path "$emulatorPath" -DestinationPath "$dataEmulatorDir" -ErrorAction SilentlyContinue -Force + } + + # Download products.json and stores.json file to use in Data Emulator + $productsJsonPath = "$dataEmulatorDir\products.json" + Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/artifacts/data_emulator/products.json" -OutFile $productsJsonPath + if (!(Test-Path -Path $productsJsonPath)) { + Write-Host "Unabled to download products.json file. Please download manually from GitHub into the data_emulator folder." + } + + $storesJsonPath = "$dataEmulatorDir\stores.json" + Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/artifacts/data_emulator/stores.json" -OutFile $storesJsonPath + if (!(Test-Path -Path $storesJsonPath)) { + Write-Host "Unabled to download stores.json file. Please download manually from GitHub into the data_emulator folder." + } + + # Download icon file + $iconPath = "$AgIconsDir\emulator.ico" + Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/artifacts/icons/emulator.ico" -OutFile $iconPath + if (!(Test-Path -Path $iconPath)) { + Write-Host "Unabled to download emulator.ico file. Please download manually from GitHub into the icons folder." + } + + # Create desktop shortcut + $shortcutLocation = "$Env:Public\Desktop\Data Emulator.lnk" + $wScriptShell = New-Object -ComObject WScript.Shell + $shortcut = $wScriptShell.CreateShortcut($shortcutLocation) + $shortcut.TargetPath = "$dataEmulatorDir\DataEmulator.exe" + $shortcut.IconLocation = "$iconPath, 0" + $shortcut.WindowStyle = 7 + $shortcut.Save() +} + +function Deploy-K8sImagesCache { + if ($Env:scenario -eq "contoso_supermarket") { + Write-Host "[$(Get-Date -Format t)] INFO: Caching contoso-supermarket images on all clusters" -ForegroundColor Gray + while ($workflowStatus.status -ne "completed") { + Write-Host "INFO: Waiting for pos-app-initial-images-build workflow to complete" -ForegroundColor Gray + Start-Sleep -Seconds 10 + $workflowStatus = (gh run list --workflow=pos-app-initial-images-build.yml --json status) | ConvertFrom-Json + } + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + $branch = $cluster.Name.ToLower() + $context = $cluster.Name.ToLower() + $applicationName = "contoso-supermarket" + $imageTag = "v1.0" + $imagePullSecret = "acr-secret" + $namespace = "images-cache" + if ($branch -eq "chicago") { + $branch = "canary" + } + if ($branch -eq "seattle") { + $branch = "production" + } + Save-K8sImage -applicationName $applicationName -imageName "contosoai" -imageTag $imageTag -namespace $namespace -imagePullSecret $imagePullSecret -branch $branch -acrName $acrName -context $context + Save-K8sImage -applicationName $applicationName -imageName "pos" -imageTag $imageTag -namespace $namespace -imagePullSecret $imagePullSecret -branch $branch -acrName $acrName -context $context + Save-K8sImage -applicationName $applicationName -imageName "pos-cloudsync" -imageTag $imageTag -namespace $namespace -imagePullSecret $imagePullSecret -branch $branch -acrName $acrName -context $context + Save-K8sImage -applicationName $applicationName -imageName "queue-monitoring-backend" -imageTag $imageTag -namespace $namespace -imagePullSecret $imagePullSecret -branch $branch -acrName $acrName -context $context + Save-K8sImage -applicationName $applicationName -imageName "queue-monitoring-frontend" -imageTag $imageTag -namespace $namespace -imagePullSecret $imagePullSecret -branch $branch -acrName $acrName -context $context + } + } +} + +function Save-K8sImage { + param ( + [Parameter(Mandatory = $True, + ValueFromPipeline = $True, + ValueFromPipelineByPropertyName = $True)] + [string]$applicationName, + [Parameter(Mandatory = $True, + ValueFromPipeline = $True, + ValueFromPipelineByPropertyName = $True)] + [string]$imageName, + [Parameter(Mandatory = $True)] + [string]$imageTag, + [Parameter(Mandatory = $True)] + [string]$namespace, + [Parameter(Mandatory = $True)] + [string]$imagePullSecret, + [Parameter(Mandatory = $True, + ValueFromPipeline = $True, + ValueFromPipelineByPropertyName = $True)] + [string]$branch, + [Parameter(Mandatory = $True)] + [string]$acrName, + [Parameter(Mandatory = $True, + ValueFromPipeline = $True, + ValueFromPipelineByPropertyName = $True)] + [string]$context + ) + $imageToPull = "${acrName}.azurecr.io/${branch}/${applicationName}/${imageName}:${imageTag}" +$yaml = @" +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: images-cache-$imageName +spec: + selector: + matchLabels: + app: images-cache-$imageName + template: + metadata: + labels: + app: images-cache-$imageName + spec: + containers: + - image: $imageToPull + imagePullPolicy: IfNotPresent + name: images-cache-$imageName + imagePullSecrets: + - name: $imagePullSecret +"@ + $yaml | kubectl apply -f - --context $context -n $namespace + +} +function Get-GitHubFiles ($githubApiUrl, $folderPath, [Switch]$excludeFolders) { + # Force TLS 1.2 for connections to prevent TLS/SSL errors + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + + $response = Invoke-RestMethod -Uri $githubApiUrl + $fileUrls = $response | Where-Object { $_.type -eq "file" } | Select-Object -ExpandProperty download_url + $fileUrls | ForEach-Object { + $fileName = $_.Substring($_.LastIndexOf("/") + 1) + $outputFile = Join-Path $folderPath $fileName + Invoke-RestMethod -Uri $_ -OutFile $outputFile + } + + If (-not $excludeFolders) { + $response | Where-Object { $_.type -eq "dir" } | ForEach-Object { + $folderName = $_.name + $path = Join-Path $folderPath $folderName + New-Item $path -ItemType Directory -Force -ErrorAction Continue + Get-GitHubFiles -githubApiUrl $_.url -folderPath $path + } + } +} +function Deploy-supermarketConfigs { + Write-Host "[$(Get-Date -Format t)] INFO: Cleaning up images-cache namespace on all clusters" -ForegroundColor Gray + # Cleaning up images-cache namespace on all clusters + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + Start-Job -Name images-cache-cleanup -ScriptBlock { + $cluster = $using:cluster + $clusterName = $cluster.Name.ToLower() + Write-Host "[$(Get-Date -Format t)] INFO: Deleting images-cache namespace on cluster $clusterName" -ForegroundColor Gray + kubectl delete namespace "images-cache" --context $clusterName + } + } + + # TODO - this looks app-specific so should perhaps be moved to the app loop + while ($workflowStatus.status -ne "completed") { + Write-Host "INFO: Waiting for pos-app-initial-images-build workflow to complete" -ForegroundColor Gray + Start-Sleep -Seconds 10 + $workflowStatus = (gh run list --workflow=pos-app-initial-images-build.yml --json status) | ConvertFrom-Json + } + + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + Start-Job -Name gitops -ScriptBlock { + + Function Get-GitHubFiles ($githubApiUrl, $folderPath, [Switch]$excludeFolders) { + # Force TLS 1.2 for connections to prevent TLS/SSL errors + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + + $response = Invoke-RestMethod -Uri $githubApiUrl + $fileUrls = $response | Where-Object { $_.type -eq "file" } | Select-Object -ExpandProperty download_url + $fileUrls | ForEach-Object { + $fileName = $_.Substring($_.LastIndexOf("/") + 1) + $outputFile = Join-Path $folderPath $fileName + Invoke-RestMethod -Uri $_ -OutFile $outputFile + } + + If (-not $excludeFolders) { + $response | Where-Object { $_.type -eq "dir" } | ForEach-Object { + $folderName = $_.name + $path = Join-Path $folderPath $folderName + New-Item $path -ItemType Directory -Force -ErrorAction Continue + Get-GitHubFiles -githubApiUrl $_.url -folderPath $path + } + } + } + + $AgConfig = $using:AgConfig + $cluster = $using:cluster + $site = $cluster.Value + $siteName = $site.FriendlyName.ToLower() + $namingGuid = $using:namingGuid + $resourceGroup = $using:resourceGroup + $appClonedRepo = $using:appClonedRepo + $appsRepo = $using:appsRepo + + $AgConfig.AppConfig.GetEnumerator() | sort-object -Property @{Expression = { $_.value.Order }; Ascending = $true } | ForEach-Object { + $app = $_ + $store = $cluster.value.Branch.ToLower() + $clusterName = $cluster.value.ArcClusterName + "-$namingGuid" + $branch = $cluster.value.Branch.ToLower() + $configName = $app.value.GitOpsConfigName.ToLower() + $clusterType = $cluster.value.Type + $namespace = $app.value.Namespace + $appName = $app.Value.KustomizationName + $appPath = $app.Value.KustomizationPath + $retryCount = 0 + $maxRetries = 2 + + Write-Host "[$(Get-Date -Format t)] INFO: Creating GitOps config for $configName on $($cluster.Value.ArcClusterName+"-$namingGuid")" -ForegroundColor Gray + if ($clusterType -eq "AKS") { + $type = "managedClusters" + $clusterName = $cluster.value.ArcClusterName + } + else { + $type = "connectedClusters" + } + if ($branch -eq "main") { + $store = "dev" + } + + # Wait for Kubernetes API server to become available + $apiServer = kubectl config view --context $cluster.Name.ToLower() --minify -o jsonpath='{.clusters[0].cluster.server}' + $apiServerAddress = $apiServer -replace '.*https://| .*$' + $apiServerFqdn = ($apiServerAddress -split ":")[0] + $apiServerPort = ($apiServerAddress -split ":")[1] + + do { + $result = Test-NetConnection -ComputerName $apiServerFqdn -Port $apiServerPort -WarningAction SilentlyContinue + if ($result.TcpTestSucceeded) { + break + } + else { + Start-Sleep -Seconds 5 + } + } while ($true) + If ($app.Value.ConfigMaps) { + # download the config files + foreach ($configMap in $app.value.ConfigMaps.GetEnumerator()) { + $repoPath = $configMap.value.RepoPath + $configPath = "$configMapDir\$appPath\config\$($configMap.Name)\$branch" + $iotHubName = $Env:iotHubHostName.replace(".azure-devices.net", "") + $gitHubUser = $Env:gitHubUser + $githubBranch = $Env:githubBranch + + New-Item -Path $configPath -ItemType Directory -Force | Out-Null + + $githubApiUrl = "https://api.github.com/repos/$gitHubUser/$appsRepo/$($repoPath)?ref=$branch" + Get-GitHubFiles -githubApiUrl $githubApiUrl -folderPath $configPath + + # replace the IoT Hub name and the SAS Tokens with the deployment specific values + # this is a one-off for the broker, but needs to be generalized if/when another app needs it + If ($configMap.Name -eq "mqtt-broker-config") { + $configFile = "$configPath\mosquitto.conf" + $update = (Get-Content $configFile -Raw) + $update = $update -replace "Ag-IotHub-\w*", $iotHubName + + foreach ($device in $site.IoTDevices) { + $deviceId = "$device-$($site.FriendlyName)" + $deviceSASToken = $(az iot hub generate-sas-token --device-id $deviceId --hub-name $iotHubName --resource-group $resourceGroup --duration (60 * 60 * 24 * 30) --query sas -o tsv --only-show-errors) + $update = $update -replace "Chicago", $site.FriendlyName + $update = $update -replace "SharedAccessSignature.*$($device).*", $deviceSASToken + } + + $update | Set-Content $configFile + } + + # create the namespace if needed + If (-not (kubectl get namespace $namespace --context $siteName)) { + kubectl create namespace $namespace --context $siteName + } + # create the configmap + kubectl create configmap $configMap.name --from-file=$configPath --namespace $namespace --context $siteName + } + } + + az k8s-configuration flux create ` + --cluster-name $clusterName ` + --resource-group $resourceGroup ` + --name $configName ` + --cluster-type $type ` + --url $appClonedRepo ` + --branch $branch ` + --sync-interval 5s ` + --kustomization name=$appName path=$appPath/$store prune=true retry_interval=1m ` + --timeout 10m ` + --namespace $namespace ` + --only-show-errors ` + 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + + do { + $configStatus = $(az k8s-configuration flux show --name $configName --cluster-name $clusterName --cluster-type $type --resource-group $resourceGroup -o json 2>$null) | convertFrom-JSON + if ($configStatus.ComplianceState -eq "Compliant") { + Write-Host "[$(Get-Date -Format t)] INFO: GitOps configuration $configName is ready on $clusterName" -ForegroundColor DarkGreen | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + } + else { + if ($configStatus.ComplianceState -ne "Non-compliant") { + Start-Sleep -Seconds 20 + } + elseif ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -lt $maxRetries) { + Start-Sleep -Seconds 20 + $configStatus = $(az k8s-configuration flux show --name $configName --cluster-name $clusterName --cluster-type $type --resource-group $resourceGroup -o json 2>$null) | convertFrom-JSON + if ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -lt $maxRetries) { + $retryCount++ + Write-Host "[$(Get-Date -Format t)] INFO: Attempting to re-install $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + Write-Host "[$(Get-Date -Format t)] INFO: Deleting $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + az k8s-configuration flux delete ` + --resource-group $resourceGroup ` + --cluster-name $clusterName ` + --cluster-type $type ` + --name $configName ` + --force ` + --yes ` + --only-show-errors ` + 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + + Start-Sleep -Seconds 10 + Write-Host "[$(Get-Date -Format t)] INFO: Re-creating $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + + az k8s-configuration flux create ` + --cluster-name $clusterName ` + --resource-group $resourceGroup ` + --name $configName ` + --cluster-type $type ` + --url $appClonedRepo ` + --branch $branch ` + --sync-interval 5s ` + --kustomization name=$appName path=$appPath/$store prune=true ` + --timeout 30m ` + --namespace $namespace ` + --only-show-errors ` + 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + } + } + elseif ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -eq $maxRetries) { + Write-Host "[$(Get-Date -Format t)] ERROR: GitOps configuration $configName has failed on $clusterName. Exiting..." -ForegroundColor White -BackgroundColor Red | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + break + } + } + } until ($configStatus.ComplianceState -eq "Compliant") + } + } + } + + while ($(Get-Job -Name gitops).State -eq 'Running') { + #Write-Host "[$(Get-Date -Format t)] INFO: Waiting for GitOps configuration to complete on all clusters...waiting 60 seconds" -ForegroundColor Gray + Receive-Job -Name gitops -WarningAction SilentlyContinue + Start-Sleep -Seconds 60 + } + + Get-Job -name gitops | Remove-Job + Write-Host "[$(Get-Date -Format t)] INFO: GitOps configuration complete." -ForegroundColor Green + Write-Host +} + +function Deploy-supermarketBookmarks { + $bookmarksFileName = "$AgToolsDir\Bookmarks" + $edgeBookmarksPath = "$Env:LOCALAPPDATA\Microsoft\Edge\User Data\Default" + + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + kubectx $cluster.Name.ToLower() | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + $services = kubectl get services --all-namespaces -o json | ConvertFrom-Json + + # Matching url: pos - customer + $matchingServices = $services.items | Where-Object { + $_.spec.ports.port -contains 5000 -and + $_.spec.type -eq "LoadBalancer" + } + $posIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($posIp in $posIps) { + $output = "http://$posIp" + ':5000' + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("POS-" + $cluster.Name + "-URL-Customer"), $output + $newContent | Set-Content -Path $bookmarksFileName + + Start-Sleep -Seconds 2 + } + + # Matching url: pos - manager + $matchingServices = $services.items | Where-Object { + $_.spec.ports.port -contains 81 -and + $_.spec.type -eq "LoadBalancer" + } + $posIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($posIp in $posIps) { + $output = "http://$posIp" + ':81' + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("POS-" + $cluster.Name + "-URL-Manager"), $output + $newContent | Set-Content -Path $bookmarksFileName + + Start-Sleep -Seconds 2 + } + + # Matching url: prometheus-grafana + if ($cluster.Name -eq "Staging" -or $cluster.Name -eq "Dev") { + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'prometheus-grafana' + } + $grafanaIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($grafanaIp in $grafanaIps) { + $output = "http://$grafanaIp" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("Grafana-" + $cluster.Name + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + + Start-Sleep -Seconds 2 + } + } + + # Matching url: prometheus + $matchingServices = $services.items | Where-Object { + $_.spec.ports.port -contains 9090 -and + $_.spec.type -eq "LoadBalancer" + } + $prometheusIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($prometheusIp in $prometheusIps) { + $output = "http://$prometheusIp" + ':9090' + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("Prometheus-" + $cluster.Name + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + + Start-Sleep -Seconds 2 + } + } + + # Matching url: Agora apps forked repo + $output = $appClonedRepo + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace "Agora-Apps-Repo-Clone-URL", $output + $newContent = $newContent -replace "Agora-Apps-Repo-Your-Fork", "Agora Apps Repo - $githubUser" + $newContent | Set-Content -Path $bookmarksFileName + + Start-Sleep -Seconds 2 + + Copy-Item -Path $bookmarksFileName -Destination $edgeBookmarksPath -Force + + ############################################################## + # Pinning important directories to Quick access + ############################################################## + Write-Host "[$(Get-Date -Format t)] INFO: Pinning important directories to Quick access (Step 16/17)" -ForegroundColor DarkGreen + $quickAccess = new-object -com shell.application + $quickAccess.Namespace($AgConfig.AgDirectories.AgDir).Self.InvokeVerb("pintohome") + $quickAccess.Namespace($AgConfig.AgDirectories.AgLogsDir).Self.InvokeVerb("pintohome") +} diff --git a/azure_jumpstart_ag/artifacts/PowerShell/PSProfile.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/PSProfile.ps1 index 40ae832111..e09d98a935 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/PSProfile.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/PSProfile.ps1 @@ -131,7 +131,6 @@ Function Invoke-CommandLineTool { } } - function Save-K8sImage { param ( [Parameter(Mandatory = $True, diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh new file mode 100644 index 0000000000..5564d7c98a --- /dev/null +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -0,0 +1,253 @@ +#!/bin/bash +sudo apt-get update + +sudo sed -i "s/PasswordAuthentication no/PasswordAuthentication yes/" /etc/ssh/sshd_config +sudo adduser staginguser --gecos "First Last,RoomNumber,WorkPhone,HomePhone" --disabled-password +sudo echo "staginguser:ArcPassw0rd" | sudo chpasswd + +# Injecting environment variables +echo '#!/bin/bash' >> vars.sh +echo $adminUsername:$1 | awk '{print substr($1,2); }' >> vars.sh +echo $subscriptionId:$2 | awk '{print substr($1,2); }' >> vars.sh +echo $vmName:$3 | awk '{print substr($1,2); }' >> vars.sh +echo $location:$4 | awk '{print substr($1,2); }' >> vars.sh +echo $stagingStorageAccountName:$5 | awk '{print substr($1,2); }' >> vars.sh +echo $logAnalyticsWorkspace:$6 | awk '{print substr($1,2); }' >> vars.sh +echo $templateBaseUrl:$7 | awk '{print substr($1,2); }' >> vars.sh +echo $storageContainerName:$8 | awk '{print substr($1,2); }' >> vars.sh +echo $k3sControlPlane:$9 | awk '{print substr($1,2); }' >> vars.sh + +sed -i '2s/^/export adminUsername=/' vars.sh +sed -i '3s/^/export subscriptionId=/' vars.sh +sed -i '4s/^/export vmName=/' vars.sh +sed -i '5s/^/export location=/' vars.sh +sed -i '6s/^/export stagingStorageAccountName=/' vars.sh +sed -i '7s/^/export logAnalyticsWorkspace=/' vars.sh +sed -i '8s/^/export templateBaseUrl=/' vars.sh +sed -i '9s/^/export storageContainerName=/' vars.sh +sed -i '10s/^/export k3sControlPlane=/' vars.sh + +export vmName=$3 + +# Save the original stdout and stderr +exec 3>&1 4>&2 + +exec >installK3s-${vmName}.log +exec 2>&1 + +# Set k3 deployment variables +export K3S_VERSION="1.29.6+k3s2" # Do not change! + +chmod +x vars.sh +. ./vars.sh + +# Creating login message of the day (motd) +sudo curl -v -o /etc/profile.d/welcomeK3s.sh ${templateBaseUrl}artifacts/welcomeK3s.sh + +# Syncing this script log to 'jumpstart_logs' directory for ease of troubleshooting +sudo -u $adminUsername mkdir -p /home/${adminUsername}/jumpstart_logs +while sleep 1; do sudo -s rsync -a /var/lib/waagent/custom-script/download/0/installK3s-$vmName.log /home/${adminUsername}/jumpstart_logs/installK3s-$vmName.log; done & + +# Downloading azcopy +echo "" +echo "Downloading azcopy" +echo "" +wget -O azcopy.tar.gz https://aka.ms/downloadazcopy-v10-linux +if [[ $? -ne 0 ]]; then + echo "ERROR: Failed to download azcopy" + exit 1 +fi + +tar -xf azcopy.tar.gz +sudo mv azcopy_linux_amd64_*/azcopy /usr/local/bin/azcopy +sudo chmod +x /usr/local/bin/azcopy +# Authorize azcopy by using a system-wide managed identity +export AZCOPY_AUTO_LOGIN_TYPE=MSI + +# Function to check if dpkg lock is in place +check_dpkg_lock() { + while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1; do + echo "Waiting for other package management processes to complete..." + sleep 5 + done +} + +# Run the lock check before attempting the installation +check_dpkg_lock + +# Installing Azure CLI & Azure Arc extensions +curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash + +echo "" +echo "Log in to Azure" +echo "" +for i in {1..5}; do + sudo -u $adminUsername az login --identity + if [[ $? -eq 0 ]]; then + break + fi + sleep 15 + if [[ $i -eq 5 ]]; then + echo "Error: Failed to login to Azure after 5 retries" + exit 1 + fi +done + +sudo -u $adminUsername az account set --subscription $subscriptionId +az -v + +if [[ "$k3sControlPlane" == "true" ]]; then + + # Installing Azure Arc extensions + echo "" + echo "Installing Azure Arc extensions" + echo "" + sudo -u $adminUsername az extension add --name connectedk8s + sudo -u $adminUsername az extension add --name k8s-configuration + sudo -u $adminUsername az extension add --name k8s-extension + + # Installing Rancher K3s cluster (single control plane) + echo "" + echo "Installing Rancher K3s cluster" + echo "" + publicIp=$(hostname -i) + sudo mkdir ~/.kube + sudo -u $adminUsername mkdir /home/${adminUsername}/.kube + curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server --disable traefik --disable servicelb --node-ip ${publicIp} --node-external-ip ${publicIp} --bind-address ${publicIp} --tls-san ${publicIp}" INSTALL_K3S_VERSION=v${K3S_VERSION} K3S_KUBECONFIG_MODE="644" sh - + if [[ $? -ne 0 ]]; then + echo "ERROR: K3s installation failed" + exit 1 + fi + # Renaming default context to k3s cluster name + context=$(echo $storageContainerName | sed 's/-[^-]*$//') + sudo kubectl config rename-context default $context --kubeconfig /etc/rancher/k3s/k3s.yaml + sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config + sudo cp /etc/rancher/k3s/k3s.yaml /home/${adminUsername}/.kube/config + sudo cp /etc/rancher/k3s/k3s.yaml /home/${adminUsername}/.kube/config.staging + sudo chown -R $adminUsername /home/${adminUsername}/.kube/ + sudo chown -R staginguser /home/${adminUsername}/.kube/config.staging + + # Installing Helm 3 + echo "" + echo "Installing Helm" + echo "" + sudo snap install helm --classic + if [[ $? -ne 0 ]]; then + echo "ERROR: Helm installation failed" + exit 1 + fi + + echo "" + echo "Making sure Rancher K3s cluster is ready..." + echo "" + sudo kubectl wait --for=condition=Available --timeout=60s --all deployments -A >/dev/null + sudo kubectl get nodes -o wide | expand | awk 'length($0) > length(longest) { longest = $0 } { lines[NR] = $0 } END { gsub(/./, "=", longest); print "/=" longest "=\\"; n = length(longest); for(i = 1; i <= NR; ++i) { printf("| %s %*s\n", lines[i], n - length(lines[i]) + 1, "|"); } print "\\=" longest "=/" }' + + # Copying Rancher K3s kubeconfig file to staging storage account + echo "" + echo "Copying Rancher K3s kubeconfig file to staging storage account" + echo "" + localPath="/home/$adminUsername/.kube/config" + k3sClusterNodeConfig="/home/$adminUsername/k3sClusterNodeConfig.yaml" + echo "k3sNodeToken: $(sudo cat /var/lib/rancher/k3s/server/node-token)" >> $k3sClusterNodeConfig + echo "k3sClusterIp: $publicIp" >> $k3sClusterNodeConfig + # Copying kubeconfig file to staging storage account + azcopy make "https://$stagingStorageAccountName.blob.core.windows.net/$storageContainerName" + azcopy cp $localPath "https://$stagingStorageAccountName.blob.core.windows.net/$storageContainerName/config" + azcopy cp $k3sClusterNodeConfig "https://$stagingStorageAccountName.blob.core.windows.net/$storageContainerName/k3sClusterNodeConfig.yaml" + + # Onboard the cluster to Azure Arc + echo "" + echo "Onboarding the cluster to Azure Arc" + echo "" + resourceGroup=$(sudo -u $adminUsername az resource list --query "[?name=='$stagingStorageAccountName']".[resourceGroup] --resource-type "Microsoft.Storage/storageAccounts" -o tsv) + workspaceResourceId=$(sudo -u $adminUsername az resource show --resource-group $resourceGroup --name $logAnalyticsWorkspace --resource-type "Microsoft.OperationalInsights/workspaces" --query id -o tsv) + echo "Log Analytics workspace id $workspaceResourceId" + + sudo -u $adminUsername az connectedk8s connect --name $vmName --resource-group $resourceGroup --location $location + echo "Onboarding the k3s cluster to Azure Arc completed" + + # Verify if cluster is connected to Azure Arc successfully + connectedClusterInfo=$(sudo -u $adminUsername az connectedk8s show --name $vmName --resource-group $resourceGroup) + echo "Connected cluster info: $connectedClusterInfo" + + # Wait +# Function to check if an extension is already installed +is_extension_installed() { + extension_name=$1 + extension_count=$(sudo -u $adminUsername az k8s-extension list --cluster-name $vmName --resource-group $resourceGroup --cluster-type connectedClusters --query "[?name=='$extension_name'] | length(@)") + + if [ "$extension_count" -gt 0 ]; then + return 0 # Extension is installed + else + return 1 # Extension is not installed + fi +} + +# Enabling Container Insights and Microsoft Defender for Containers cluster extensions +echo "" +echo "Enabling Container Insights and Microsoft Defender for Containers cluster extensions" +echo "" + +# Check and install azuremonitor-containers extension +if is_extension_installed "azuremonitor-containers"; then + echo "Extension 'azuremonitor-containers' is already installed." +else + echo "Extension 'azuremonitor-containers' is not installed - triggering installation" + sudo -u $adminUsername az k8s-extension create -n "azuremonitor-containers" --cluster-name $vmName --resource-group $resourceGroup --cluster-type connectedClusters --extension-type Microsoft.AzureMonitor.Containers --configuration-settings logAnalyticsWorkspaceResourceID=$workspaceResourceId --only-show-errors +fi + +# Check and install microsoft.azuredefender.kubernetes extension +if is_extension_installed "microsoft.azuredefender.kubernetes"; then + echo "Extension 'microsoft.azuredefender.kubernetes' is already installed." +else + echo "Extension 'microsoft.azuredefender.kubernetes' is not installed - triggering installation" + sudo -u $adminUsername az k8s-extension create -n "microsoft.azuredefender.kubernetes" --cluster-name $vmName --resource-group $resourceGroup --cluster-type connectedClusters --extension-type Microsoft.AzureDefender.Kubernetes --configuration-settings logAnalyticsWorkspaceResourceID=$workspaceResourceId --only-show-errors +fi + +# Enabling Azure Policy for Kubernetes on the cluster +echo "" +echo "Enabling Azure Policy for Kubernetes on the cluster" +echo "" + +# Check and install arc-azurepolicy extension +if is_extension_installed "azurepolicy"; then + echo "Extension 'azurepolicy' is already installed." +else + echo "Extension 'azurepolicy' is not installed - triggering installation" + sudo -u $adminUsername az k8s-extension create --name "azurepolicy" --cluster-name $vmName --resource-group $resourceGroup --cluster-type connectedClusters --extension-type Microsoft.PolicyInsights --only-show-errors +fi + +else + # Downloading k3s control plane details + echo "" + echo "Downloading k3s control plane details" + echo "" + k3sClusterNodeConfigYaml="k3sClusterNodeConfig.yaml" + azcopy cp --check-md5 FailIfDifferentOrMissing "https://$stagingStorageAccountName.blob.core.windows.net/$storageContainerName/$k3sClusterNodeConfigYaml" "/home/$adminUsername/$k3sClusterNodeConfigYaml" + + # Installing Rancher K3s cluster (single worker node) + echo "" + echo "Installing Rancher K3s cluster node" + echo "" + k3sNodeToken=$(grep 'k3sNodeToken' "/home/$adminUsername/$k3sClusterNodeConfigYaml" | awk '{print $2}') + k3sClusterIp=$(grep 'k3sClusterIp' "/home/$adminUsername/$k3sClusterNodeConfigYaml" | awk '{print $2}') + curl -sfL https://get.k3s.io | K3S_URL=https://${k3sClusterIp}:6443 INSTALL_K3S_VERSION=v${K3S_VERSION} K3S_TOKEN=${k3sNodeToken} sh - + if [[ $? -ne 0 ]]; then + echo "ERROR: Failed to add k3s worker nodes" + exit 1 + fi + + sudo service sshd restart +fi + +# Uploading this script log to staging storage for ease of troubleshooting +echo "" +echo "Uploading the script logs to staging storage" +echo "" +exec 1>&3 2>&4 # Further commands will now output to the original stdout and stderr and not the log file +log="/home/$adminUsername/jumpstart_logs/installK3s-$vmName.log" +storageContainerNameLower=$(echo $storageContainerName | tr '[:upper:]' '[:lower:]') +azcopy cp $log "https://$stagingStorageAccountName.blob.core.windows.net/$storageContainerNameLower/installK3s-$vmName.log" --check-length=false >/dev/null 2>&1 + +exit 0 \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/longhorn.yaml b/azure_jumpstart_ag/artifacts/kubernetes/K3s/longhorn.yaml new file mode 100644 index 0000000000..b03ab89440 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/longhorn.yaml @@ -0,0 +1,4571 @@ +--- +# Builtin: "helm template" does not respect --create-namespace +apiVersion: v1 +kind: Namespace +metadata: + name: longhorn-system +--- +# Source: longhorn/templates/priorityclass.yaml +apiVersion: scheduling.k8s.io/v1 +kind: PriorityClass +metadata: + name: "longhorn-critical" + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 +description: "Ensure Longhorn pods have the highest priority to prevent any unexpected eviction by the Kubernetes scheduler under node pressure" +globalDefault: false +preemptionPolicy: PreemptLowerPriority +value: 1000000000 +--- +# Source: longhorn/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: longhorn-service-account + namespace: longhorn-system + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 +--- +# Source: longhorn/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: longhorn-ui-service-account + namespace: longhorn-system + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 +--- +# Source: longhorn/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: longhorn-support-bundle + namespace: longhorn-system + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 +--- +# Source: longhorn/templates/default-setting.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: longhorn-default-setting + namespace: longhorn-system + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 +data: + default-setting.yaml: |- + priority-class: longhorn-critical +--- +# Source: longhorn/templates/storageclass.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: longhorn-storageclass + namespace: longhorn-system + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 +data: + storageclass.yaml: | + kind: StorageClass + apiVersion: storage.k8s.io/v1 + metadata: + name: longhorn + annotations: + storageclass.kubernetes.io/is-default-class: "true" + provisioner: driver.longhorn.io + allowVolumeExpansion: true + reclaimPolicy: "Delete" + volumeBindingMode: Immediate + parameters: + numberOfReplicas: "1" + staleReplicaTimeout: "30" + fromBackup: "" + fsType: "ext4" + dataLocality: "disabled" +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + longhorn-manager: "" + name: backingimagedatasources.longhorn.io +spec: + group: longhorn.io + names: + kind: BackingImageDataSource + listKind: BackingImageDataSourceList + plural: backingimagedatasources + shortNames: + - lhbids + singular: backingimagedatasource + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The current state of the pod used to provision the backing image file from source + jsonPath: .status.currentState + name: State + type: string + - description: The data source type + jsonPath: .spec.sourceType + name: SourceType + type: string + - description: The node the backing image file will be prepared on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk the backing image file will be prepared on + jsonPath: .spec.diskUUID + name: DiskUUID + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: BackingImageDataSource is where Longhorn stores backing image data source object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The system generated UUID of the provisioned backing image file + jsonPath: .spec.uuid + name: UUID + type: string + - description: The current state of the pod used to provision the backing image file from source + jsonPath: .status.currentState + name: State + type: string + - description: The data source type + jsonPath: .spec.sourceType + name: SourceType + type: string + - description: The backing image file size + jsonPath: .status.size + name: Size + type: string + - description: The node the backing image file will be prepared on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk the backing image file will be prepared on + jsonPath: .spec.diskUUID + name: DiskUUID + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: BackingImageDataSource is where Longhorn stores backing image data source object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: BackingImageDataSourceSpec defines the desired state of the Longhorn backing image data source + properties: + checksum: + type: string + diskPath: + type: string + diskUUID: + type: string + fileTransferred: + type: boolean + nodeID: + type: string + parameters: + additionalProperties: + type: string + type: object + sourceType: + enum: + - download + - upload + - export-from-volume + - restore + type: string + uuid: + type: string + type: object + status: + description: BackingImageDataSourceStatus defines the observed state of the Longhorn backing image data source + properties: + checksum: + type: string + currentState: + type: string + ip: + type: string + message: + type: string + ownerID: + type: string + progress: + type: integer + runningParameters: + additionalProperties: + type: string + nullable: true + type: object + size: + format: int64 + type: integer + storageIP: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + longhorn-manager: "" + name: backingimagemanagers.longhorn.io +spec: + group: longhorn.io + names: + kind: BackingImageManager + listKind: BackingImageManagerList + plural: backingimagemanagers + shortNames: + - lhbim + singular: backingimagemanager + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The current state of the manager + jsonPath: .status.currentState + name: State + type: string + - description: The image the manager pod will use + jsonPath: .spec.image + name: Image + type: string + - description: The node the manager is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk the manager is responsible for + jsonPath: .spec.diskUUID + name: DiskUUID + type: string + - description: The disk path the manager is using + jsonPath: .spec.diskPath + name: DiskPath + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: BackingImageManager is where Longhorn stores backing image manager object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The current state of the manager + jsonPath: .status.currentState + name: State + type: string + - description: The image the manager pod will use + jsonPath: .spec.image + name: Image + type: string + - description: The node the manager is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk the manager is responsible for + jsonPath: .spec.diskUUID + name: DiskUUID + type: string + - description: The disk path the manager is using + jsonPath: .spec.diskPath + name: DiskPath + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: BackingImageManager is where Longhorn stores backing image manager object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: BackingImageManagerSpec defines the desired state of the Longhorn backing image manager + properties: + backingImages: + additionalProperties: + type: string + type: object + diskPath: + type: string + diskUUID: + type: string + image: + type: string + nodeID: + type: string + type: object + status: + description: BackingImageManagerStatus defines the observed state of the Longhorn backing image manager + properties: + apiMinVersion: + type: integer + apiVersion: + type: integer + backingImageFileMap: + additionalProperties: + properties: + currentChecksum: + type: string + message: + type: string + name: + type: string + progress: + type: integer + senderManagerAddress: + type: string + sendingReference: + type: integer + size: + format: int64 + type: integer + state: + type: string + uuid: + type: string + type: object + nullable: true + type: object + currentState: + type: string + ip: + type: string + ownerID: + type: string + storageIP: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + longhorn-manager: "" + name: backingimages.longhorn.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: longhorn-conversion-webhook + namespace: longhorn-system + path: /v1/webhook/conversion + port: 9501 + conversionReviewVersions: + - v1beta2 + - v1beta1 + group: longhorn.io + names: + kind: BackingImage + listKind: BackingImageList + plural: backingimages + shortNames: + - lhbi + singular: backingimage + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The backing image name + jsonPath: .spec.image + name: Image + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: BackingImage is where Longhorn stores backing image object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The system generated UUID + jsonPath: .status.uuid + name: UUID + type: string + - description: The source of the backing image file data + jsonPath: .spec.sourceType + name: SourceType + type: string + - description: The backing image file size in each disk + jsonPath: .status.size + name: Size + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: BackingImage is where Longhorn stores backing image object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: BackingImageSpec defines the desired state of the Longhorn backing image + properties: + checksum: + type: string + disks: + additionalProperties: + type: string + type: object + sourceParameters: + additionalProperties: + type: string + type: object + sourceType: + enum: + - download + - upload + - export-from-volume + - restore + type: string + type: object + status: + description: BackingImageStatus defines the observed state of the Longhorn backing image status + properties: + checksum: + type: string + diskFileStatusMap: + additionalProperties: + properties: + lastStateTransitionTime: + type: string + message: + type: string + progress: + type: integer + state: + type: string + type: object + nullable: true + type: object + diskLastRefAtMap: + additionalProperties: + type: string + nullable: true + type: object + ownerID: + type: string + size: + format: int64 + type: integer + uuid: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + labels: + longhorn-manager: "" + name: backupbackingimages.longhorn.io +spec: + group: longhorn.io + names: + kind: BackupBackingImage + listKind: BackupBackingImageList + plural: backupbackingimages + shortNames: + - lhbbi + singular: backupbackingimage + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The backing image name + jsonPath: .status.backingImage + name: BackingImage + type: string + - description: The backing image size + jsonPath: .status.size + name: Size + type: string + - description: The backing image backup upload finished time + jsonPath: .status.backupCreatedAt + name: BackupCreatedAt + type: string + - description: The backing image backup state + jsonPath: .status.state + name: State + type: string + - description: The last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: BackupBackingImage is where Longhorn stores backing image backup object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: BackupBackingImageSpec defines the desired state of the Longhorn backing image backup + properties: + labels: + additionalProperties: + type: string + description: The labels of backing image backup. + type: object + syncRequestedAt: + description: The time to request run sync the remote backing image backup. + format: date-time + nullable: true + type: string + userCreated: + description: Is this CR created by user through API or UI. Required + type: boolean + required: + - userCreated + type: object + status: + description: BackupBackingImageStatus defines the observed state of the Longhorn backing image backup + properties: + backingImage: + description: The backing image name. + type: string + backupCreatedAt: + description: The backing image backup upload finished time. + type: string + checksum: + description: The checksum of the backing image. + type: string + compressionMethod: + description: Compression method + type: string + error: + description: The error message when taking the backing image backup. + type: string + labels: + additionalProperties: + type: string + description: The labels of backing image backup. + nullable: true + type: object + lastSyncedAt: + description: The last time that the backing image backup was synced with the remote backup target. + format: date-time + nullable: true + type: string + managerAddress: + description: The address of the backing image manager that runs backing image backup. + type: string + messages: + additionalProperties: + type: string + description: The error messages when listing or inspecting backing image backup. + nullable: true + type: object + ownerID: + description: The node ID on which the controller is responsible to reconcile this CR. + type: string + progress: + description: The backing image backup progress. + type: integer + size: + description: The backing image size. + format: int64 + type: integer + state: + description: The backing image backup creation state. Can be "", "InProgress", "Completed", "Error", "Unknown". + type: string + url: + description: The backing image backup URL. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + longhorn-manager: "" + name: backups.longhorn.io +spec: + group: longhorn.io + names: + kind: Backup + listKind: BackupList + plural: backups + shortNames: + - lhb + singular: backup + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The snapshot name + jsonPath: .status.snapshotName + name: SnapshotName + type: string + - description: The snapshot size + jsonPath: .status.size + name: SnapshotSize + type: string + - description: The snapshot creation time + jsonPath: .status.snapshotCreatedAt + name: SnapshotCreatedAt + type: string + - description: The backup state + jsonPath: .status.state + name: State + type: string + - description: The backup last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta1 + schema: + openAPIV3Schema: + description: Backup is where Longhorn stores backup object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The snapshot name + jsonPath: .status.snapshotName + name: SnapshotName + type: string + - description: The snapshot size + jsonPath: .status.size + name: SnapshotSize + type: string + - description: The snapshot creation time + jsonPath: .status.snapshotCreatedAt + name: SnapshotCreatedAt + type: string + - description: The backup state + jsonPath: .status.state + name: State + type: string + - description: The backup last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: Backup is where Longhorn stores backup object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: BackupSpec defines the desired state of the Longhorn backup + properties: + labels: + additionalProperties: + type: string + description: The labels of snapshot backup. + type: object + snapshotName: + description: The snapshot name. + type: string + syncRequestedAt: + description: The time to request run sync the remote backup. + format: date-time + nullable: true + type: string + type: object + status: + description: BackupStatus defines the observed state of the Longhorn backup + properties: + backupCreatedAt: + description: The snapshot backup upload finished time. + type: string + compressionMethod: + description: Compression method + type: string + error: + description: The error message when taking the snapshot backup. + type: string + labels: + additionalProperties: + type: string + description: The labels of snapshot backup. + nullable: true + type: object + lastSyncedAt: + description: The last time that the backup was synced with the remote backup target. + format: date-time + nullable: true + type: string + messages: + additionalProperties: + type: string + description: The error messages when calling longhorn engine on listing or inspecting backups. + nullable: true + type: object + ownerID: + description: The node ID on which the controller is responsible to reconcile this backup CR. + type: string + progress: + description: The snapshot backup progress. + type: integer + replicaAddress: + description: The address of the replica that runs snapshot backup. + type: string + size: + description: The snapshot size. + type: string + snapshotCreatedAt: + description: The snapshot creation time. + type: string + snapshotName: + description: The snapshot name. + type: string + state: + description: The backup creation state. Can be "", "InProgress", "Completed", "Error", "Unknown". + type: string + url: + description: The snapshot backup URL. + type: string + volumeBackingImageName: + description: The volume's backing image name. + type: string + volumeCreated: + description: The volume creation time. + type: string + volumeName: + description: The volume name. + type: string + volumeSize: + description: The volume size. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + longhorn-manager: "" + name: backuptargets.longhorn.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: longhorn-conversion-webhook + namespace: longhorn-system + path: /v1/webhook/conversion + port: 9501 + conversionReviewVersions: + - v1beta2 + - v1beta1 + group: longhorn.io + names: + kind: BackupTarget + listKind: BackupTargetList + plural: backuptargets + shortNames: + - lhbt + singular: backuptarget + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The backup target URL + jsonPath: .spec.backupTargetURL + name: URL + type: string + - description: The backup target credential secret + jsonPath: .spec.credentialSecret + name: Credential + type: string + - description: The backup target poll interval + jsonPath: .spec.pollInterval + name: LastBackupAt + type: string + - description: Indicate whether the backup target is available or not + jsonPath: .status.available + name: Available + type: boolean + - description: The backup target last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta1 + schema: + openAPIV3Schema: + description: BackupTarget is where Longhorn stores backup target object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The backup target URL + jsonPath: .spec.backupTargetURL + name: URL + type: string + - description: The backup target credential secret + jsonPath: .spec.credentialSecret + name: Credential + type: string + - description: The backup target poll interval + jsonPath: .spec.pollInterval + name: LastBackupAt + type: string + - description: Indicate whether the backup target is available or not + jsonPath: .status.available + name: Available + type: boolean + - description: The backup target last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: BackupTarget is where Longhorn stores backup target object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: BackupTargetSpec defines the desired state of the Longhorn backup target + properties: + backupTargetURL: + description: The backup target URL. + type: string + credentialSecret: + description: The backup target credential secret. + type: string + pollInterval: + description: The interval that the cluster needs to run sync with the backup target. + type: string + syncRequestedAt: + description: The time to request run sync the remote backup target. + format: date-time + nullable: true + type: string + type: object + status: + description: BackupTargetStatus defines the observed state of the Longhorn backup target + properties: + available: + description: Available indicates if the remote backup target is available or not. + type: boolean + conditions: + description: Records the reason on why the backup target is unavailable. + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + message: + description: Human-readable message indicating details about last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's last transition. + type: string + status: + description: Status is the status of the condition. Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + lastSyncedAt: + description: The last time that the controller synced with the remote backup target. + format: date-time + nullable: true + type: string + ownerID: + description: The node ID on which the controller is responsible to reconcile this backup target CR. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + longhorn-manager: "" + name: backupvolumes.longhorn.io +spec: + group: longhorn.io + names: + kind: BackupVolume + listKind: BackupVolumeList + plural: backupvolumes + shortNames: + - lhbv + singular: backupvolume + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The backup volume creation time + jsonPath: .status.createdAt + name: CreatedAt + type: string + - description: The backup volume last backup name + jsonPath: .status.lastBackupName + name: LastBackupName + type: string + - description: The backup volume last backup time + jsonPath: .status.lastBackupAt + name: LastBackupAt + type: string + - description: The backup volume last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta1 + schema: + openAPIV3Schema: + description: BackupVolume is where Longhorn stores backup volume object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The backup volume creation time + jsonPath: .status.createdAt + name: CreatedAt + type: string + - description: The backup volume last backup name + jsonPath: .status.lastBackupName + name: LastBackupName + type: string + - description: The backup volume last backup time + jsonPath: .status.lastBackupAt + name: LastBackupAt + type: string + - description: The backup volume last synced time + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: BackupVolume is where Longhorn stores backup volume object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: BackupVolumeSpec defines the desired state of the Longhorn backup volume + properties: + syncRequestedAt: + description: The time to request run sync the remote backup volume. + format: date-time + nullable: true + type: string + type: object + status: + description: BackupVolumeStatus defines the observed state of the Longhorn backup volume + properties: + backingImageChecksum: + description: the backing image checksum. + type: string + backingImageName: + description: The backing image name. + type: string + createdAt: + description: The backup volume creation time. + type: string + dataStored: + description: The backup volume block count. + type: string + labels: + additionalProperties: + type: string + description: The backup volume labels. + nullable: true + type: object + lastBackupAt: + description: The latest volume backup time. + type: string + lastBackupName: + description: The latest volume backup name. + type: string + lastModificationTime: + description: The backup volume config last modification time. + format: date-time + nullable: true + type: string + lastSyncedAt: + description: The last time that the backup volume was synced into the cluster. + format: date-time + nullable: true + type: string + messages: + additionalProperties: + type: string + description: The error messages when call longhorn engine on list or inspect backup volumes. + nullable: true + type: object + ownerID: + description: The node ID on which the controller is responsible to reconcile this backup volume CR. + type: string + size: + description: The backup volume size. + type: string + storageClassName: + description: the storage class name of pv/pvc binding with the volume. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + longhorn-manager: "" + name: engineimages.longhorn.io +spec: + preserveUnknownFields: false + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: longhorn-conversion-webhook + namespace: longhorn-system + path: /v1/webhook/conversion + port: 9501 + conversionReviewVersions: + - v1beta2 + - v1beta1 + group: longhorn.io + names: + kind: EngineImage + listKind: EngineImageList + plural: engineimages + shortNames: + - lhei + singular: engineimage + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: State of the engine image + jsonPath: .status.state + name: State + type: string + - description: The Longhorn engine image + jsonPath: .spec.image + name: Image + type: string + - description: Number of resources using the engine image + jsonPath: .status.refCount + name: RefCount + type: integer + - description: The build date of the engine image + jsonPath: .status.buildDate + name: BuildDate + type: date + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: EngineImage is where Longhorn stores engine image object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: Compatibility of the engine image + jsonPath: .status.incompatible + name: Incompatible + type: boolean + - description: State of the engine image + jsonPath: .status.state + name: State + type: string + - description: The Longhorn engine image + jsonPath: .spec.image + name: Image + type: string + - description: Number of resources using the engine image + jsonPath: .status.refCount + name: RefCount + type: integer + - description: The build date of the engine image + jsonPath: .status.buildDate + name: BuildDate + type: date + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: EngineImage is where Longhorn stores engine image object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: EngineImageSpec defines the desired state of the Longhorn engine image + properties: + image: + minLength: 1 + type: string + required: + - image + type: object + status: + description: EngineImageStatus defines the observed state of the Longhorn engine image + properties: + buildDate: + type: string + cliAPIMinVersion: + type: integer + cliAPIVersion: + type: integer + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + message: + description: Human-readable message indicating details about last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's last transition. + type: string + status: + description: Status is the status of the condition. Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + controllerAPIMinVersion: + type: integer + controllerAPIVersion: + type: integer + dataFormatMinVersion: + type: integer + dataFormatVersion: + type: integer + gitCommit: + type: string + incompatible: + type: boolean + noRefSince: + type: string + nodeDeploymentMap: + additionalProperties: + type: boolean + nullable: true + type: object + ownerID: + type: string + refCount: + type: integer + state: + type: string + version: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + longhorn-manager: "" + name: engines.longhorn.io +spec: + group: longhorn.io + names: + kind: Engine + listKind: EngineList + plural: engines + shortNames: + - lhe + singular: engine + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The current state of the engine + jsonPath: .status.currentState + name: State + type: string + - description: The node that the engine is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The instance manager of the engine + jsonPath: .status.instanceManagerName + name: InstanceManager + type: string + - description: The current image of the engine + jsonPath: .status.currentImage + name: Image + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: Engine is where Longhorn stores engine object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The data engine of the engine + jsonPath: .spec.dataEngine + name: Data Engine + type: string + - description: The current state of the engine + jsonPath: .status.currentState + name: State + type: string + - description: The node that the engine is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The instance manager of the engine + jsonPath: .status.instanceManagerName + name: InstanceManager + type: string + - description: The current image of the engine + jsonPath: .status.currentImage + name: Image + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Engine is where Longhorn stores engine object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: EngineSpec defines the desired state of the Longhorn engine + properties: + active: + type: boolean + backendStoreDriver: + description: 'Deprecated: Replaced by field `dataEngine`.' + type: string + backupVolume: + type: string + dataEngine: + enum: + - v1 + - v2 + type: string + desireState: + type: string + disableFrontend: + type: boolean + engineImage: + description: 'Deprecated: Replaced by field `image`.' + type: string + frontend: + enum: + - blockdev + - iscsi + - nvmf + - "" + type: string + image: + type: string + logRequested: + type: boolean + nodeID: + type: string + replicaAddressMap: + additionalProperties: + type: string + type: object + requestedBackupRestore: + type: string + requestedDataSource: + type: string + revisionCounterDisabled: + type: boolean + salvageRequested: + type: boolean + snapshotMaxCount: + type: integer + snapshotMaxSize: + format: int64 + type: string + unmapMarkSnapChainRemovedEnabled: + type: boolean + upgradedReplicaAddressMap: + additionalProperties: + type: string + type: object + volumeName: + type: string + volumeSize: + format: int64 + type: string + type: object + status: + description: EngineStatus defines the observed state of the Longhorn engine + properties: + backupStatus: + additionalProperties: + properties: + backupURL: + type: string + error: + type: string + progress: + type: integer + replicaAddress: + type: string + snapshotName: + type: string + state: + type: string + type: object + nullable: true + type: object + cloneStatus: + additionalProperties: + properties: + error: + type: string + fromReplicaAddress: + type: string + isCloning: + type: boolean + progress: + type: integer + snapshotName: + type: string + state: + type: string + type: object + nullable: true + type: object + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + message: + description: Human-readable message indicating details about last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's last transition. + type: string + status: + description: Status is the status of the condition. Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + currentImage: + type: string + currentReplicaAddressMap: + additionalProperties: + type: string + nullable: true + type: object + currentSize: + format: int64 + type: string + currentState: + type: string + endpoint: + type: string + instanceManagerName: + type: string + ip: + type: string + isExpanding: + type: boolean + lastExpansionError: + type: string + lastExpansionFailedAt: + type: string + lastRestoredBackup: + type: string + logFetched: + type: boolean + ownerID: + type: string + port: + type: integer + purgeStatus: + additionalProperties: + properties: + error: + type: string + isPurging: + type: boolean + progress: + type: integer + state: + type: string + type: object + nullable: true + type: object + rebuildStatus: + additionalProperties: + properties: + error: + type: string + fromReplicaAddress: + type: string + isRebuilding: + type: boolean + progress: + type: integer + state: + type: string + type: object + nullable: true + type: object + replicaModeMap: + additionalProperties: + type: string + nullable: true + type: object + restoreStatus: + additionalProperties: + properties: + backupURL: + type: string + currentRestoringBackup: + type: string + error: + type: string + filename: + type: string + isRestoring: + type: boolean + lastRestored: + type: string + progress: + type: integer + state: + type: string + type: object + nullable: true + type: object + salvageExecuted: + type: boolean + snapshotMaxCount: + type: integer + snapshotMaxSize: + format: int64 + type: string + snapshots: + additionalProperties: + properties: + children: + additionalProperties: + type: boolean + nullable: true + type: object + created: + type: string + labels: + additionalProperties: + type: string + nullable: true + type: object + name: + type: string + parent: + type: string + removed: + type: boolean + size: + type: string + usercreated: + type: boolean + type: object + nullable: true + type: object + snapshotsError: + type: string + started: + type: boolean + storageIP: + type: string + unmapMarkSnapChainRemovedEnabled: + type: boolean + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + longhorn-manager: "" + name: instancemanagers.longhorn.io +spec: + group: longhorn.io + names: + kind: InstanceManager + listKind: InstanceManagerList + plural: instancemanagers + shortNames: + - lhim + singular: instancemanager + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The state of the instance manager + jsonPath: .status.currentState + name: State + type: string + - description: The type of the instance manager (engine or replica) + jsonPath: .spec.type + name: Type + type: string + - description: The node that the instance manager is running on + jsonPath: .spec.nodeID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: InstanceManager is where Longhorn stores instance manager object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The data engine of the instance manager + jsonPath: .spec.dataEngine + name: Data Engine + type: string + - description: The state of the instance manager + jsonPath: .status.currentState + name: State + type: string + - description: The type of the instance manager (engine or replica) + jsonPath: .spec.type + name: Type + type: string + - description: The node that the instance manager is running on + jsonPath: .spec.nodeID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: InstanceManager is where Longhorn stores instance manager object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: InstanceManagerSpec defines the desired state of the Longhorn instance manager + properties: + dataEngine: + type: string + image: + type: string + nodeID: + type: string + type: + enum: + - aio + - engine + - replica + type: string + type: object + status: + description: InstanceManagerStatus defines the observed state of the Longhorn instance manager + properties: + apiMinVersion: + type: integer + apiVersion: + type: integer + proxyApiMinVersion: + type: integer + proxyApiVersion: + type: integer + currentState: + type: string + instanceEngines: + additionalProperties: + properties: + spec: + properties: + backendStoreDriver: + description: 'Deprecated: Replaced by field `dataEngine`.' + type: string + dataEngine: + type: string + name: + type: string + type: object + status: + properties: + conditions: + additionalProperties: + type: boolean + type: object + endpoint: + type: string + errorMsg: + type: string + listen: + type: string + portEnd: + format: int32 + type: integer + portStart: + format: int32 + type: integer + resourceVersion: + format: int64 + type: integer + state: + type: string + type: + type: string + type: object + type: object + nullable: true + type: object + instanceReplicas: + additionalProperties: + properties: + spec: + properties: + backendStoreDriver: + description: 'Deprecated: Replaced by field `dataEngine`.' + type: string + dataEngine: + type: string + name: + type: string + type: object + status: + properties: + conditions: + additionalProperties: + type: boolean + type: object + endpoint: + type: string + errorMsg: + type: string + listen: + type: string + portEnd: + format: int32 + type: integer + portStart: + format: int32 + type: integer + resourceVersion: + format: int64 + type: integer + state: + type: string + type: + type: string + type: object + type: object + nullable: true + type: object + instances: + additionalProperties: + properties: + spec: + properties: + backendStoreDriver: + description: 'Deprecated: Replaced by field `dataEngine`.' + type: string + dataEngine: + type: string + name: + type: string + type: object + status: + properties: + conditions: + additionalProperties: + type: boolean + type: object + endpoint: + type: string + errorMsg: + type: string + listen: + type: string + portEnd: + format: int32 + type: integer + portStart: + format: int32 + type: integer + resourceVersion: + format: int64 + type: integer + state: + type: string + type: + type: string + type: object + type: object + nullable: true + description: 'Deprecated: Replaced by InstanceEngines and InstanceReplicas' + type: object + ip: + type: string + ownerID: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + longhorn-manager: "" + name: nodes.longhorn.io +spec: + preserveUnknownFields: false + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: longhorn-conversion-webhook + namespace: longhorn-system + path: /v1/webhook/conversion + port: 9501 + conversionReviewVersions: + - v1beta2 + - v1beta1 + group: longhorn.io + names: + kind: Node + listKind: NodeList + plural: nodes + shortNames: + - lhn + singular: node + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: Indicate whether the node is ready + jsonPath: .status.conditions['Ready']['status'] + name: Ready + type: string + - description: Indicate whether the user disabled/enabled replica scheduling for the node + jsonPath: .spec.allowScheduling + name: AllowScheduling + type: boolean + - description: Indicate whether Longhorn can schedule replicas on the node + jsonPath: .status.conditions['Schedulable']['status'] + name: Schedulable + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: Node is where Longhorn stores Longhorn node object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: Indicate whether the node is ready + jsonPath: .status.conditions[?(@.type=='Ready')].status + name: Ready + type: string + - description: Indicate whether the user disabled/enabled replica scheduling for the node + jsonPath: .spec.allowScheduling + name: AllowScheduling + type: boolean + - description: Indicate whether Longhorn can schedule replicas on the node + jsonPath: .status.conditions[?(@.type=='Schedulable')].status + name: Schedulable + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Node is where Longhorn stores Longhorn node object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: NodeSpec defines the desired state of the Longhorn node + properties: + allowScheduling: + description: Allow scheduling replicas on the node. + type: boolean + disks: + additionalProperties: + properties: + allowScheduling: + type: boolean + diskType: + enum: + - filesystem + - block + type: string + evictionRequested: + type: boolean + path: + type: string + storageReserved: + format: int64 + type: integer + tags: + items: + type: string + type: array + type: object + type: object + evictionRequested: + type: boolean + instanceManagerCPURequest: + type: integer + name: + type: string + tags: + items: + type: string + type: array + type: object + status: + description: NodeStatus defines the observed state of the Longhorn node + properties: + autoEvicting: + type: boolean + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + message: + description: Human-readable message indicating details about last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's last transition. + type: string + status: + description: Status is the status of the condition. Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + diskStatus: + additionalProperties: + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + message: + description: Human-readable message indicating details about last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's last transition. + type: string + status: + description: Status is the status of the condition. Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + diskType: + type: string + diskUUID: + type: string + filesystemType: + type: string + scheduledReplica: + additionalProperties: + format: int64 + type: integer + nullable: true + type: object + storageAvailable: + format: int64 + type: integer + storageMaximum: + format: int64 + type: integer + storageScheduled: + format: int64 + type: integer + type: object + description: The status of the disks on the node. + nullable: true + type: object + region: + description: The Region of the node. + type: string + snapshotCheckStatus: + description: The status of the snapshot integrity check. + properties: + lastPeriodicCheckedAt: + format: date-time + type: string + type: object + zone: + description: The Zone of the node. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + longhorn-manager: "" + name: orphans.longhorn.io +spec: + group: longhorn.io + names: + kind: Orphan + listKind: OrphanList + plural: orphans + shortNames: + - lho + singular: orphan + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The type of the orphan + jsonPath: .spec.orphanType + name: Type + type: string + - description: The node that the orphan is on + jsonPath: .spec.nodeID + name: Node + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: Orphan is where Longhorn stores orphan object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: OrphanSpec defines the desired state of the Longhorn orphaned data + properties: + nodeID: + description: The node ID on which the controller is responsible to reconcile this orphan CR. + type: string + orphanType: + description: The type of the orphaned data. Can be "replica". + type: string + parameters: + additionalProperties: + type: string + description: The parameters of the orphaned data + type: object + type: object + status: + description: OrphanStatus defines the observed state of the Longhorn orphaned data + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + message: + description: Human-readable message indicating details about last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's last transition. + type: string + status: + description: Status is the status of the condition. Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + ownerID: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + labels: + longhorn-manager: "" + name: recurringjobs.longhorn.io +spec: + group: longhorn.io + names: + kind: RecurringJob + listKind: RecurringJobList + plural: recurringjobs + shortNames: + - lhrj + singular: recurringjob + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: Sets groupings to the jobs. When set to "default" group will be added to the volume label when no other job label exist in volume + jsonPath: .spec.groups + name: Groups + type: string + - description: Should be one of "backup" or "snapshot" + jsonPath: .spec.task + name: Task + type: string + - description: The cron expression represents recurring job scheduling + jsonPath: .spec.cron + name: Cron + type: string + - description: The number of snapshots/backups to keep for the volume + jsonPath: .spec.retain + name: Retain + type: integer + - description: The concurrent job to run by each cron job + jsonPath: .spec.concurrency + name: Concurrency + type: integer + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + - description: Specify the labels + jsonPath: .spec.labels + name: Labels + type: string + name: v1beta1 + schema: + openAPIV3Schema: + description: RecurringJob is where Longhorn stores recurring job object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: Sets groupings to the jobs. When set to "default" group will be added to the volume label when no other job label exist in volume + jsonPath: .spec.groups + name: Groups + type: string + - description: Should be one of "snapshot", "snapshot-force-create", "snapshot-cleanup", "snapshot-delete", "backup", "backup-force-create" or "filesystem-trim" + jsonPath: .spec.task + name: Task + type: string + - description: The cron expression represents recurring job scheduling + jsonPath: .spec.cron + name: Cron + type: string + - description: The number of snapshots/backups to keep for the volume + jsonPath: .spec.retain + name: Retain + type: integer + - description: The concurrent job to run by each cron job + jsonPath: .spec.concurrency + name: Concurrency + type: integer + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + - description: Specify the labels + jsonPath: .spec.labels + name: Labels + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: RecurringJob is where Longhorn stores recurring job object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: RecurringJobSpec defines the desired state of the Longhorn recurring job + properties: + concurrency: + description: The concurrency of taking the snapshot/backup. + type: integer + cron: + description: The cron setting. + type: string + groups: + description: The recurring job group. + items: + type: string + type: array + labels: + additionalProperties: + type: string + description: The label of the snapshot/backup. + type: object + name: + description: The recurring job name. + type: string + retain: + description: The retain count of the snapshot/backup. + type: integer + task: + description: The recurring job task. Can be "snapshot", "snapshot-force-create", "snapshot-cleanup", "snapshot-delete", "backup", "backup-force-create" or "filesystem-trim" + enum: + - snapshot + - snapshot-force-create + - snapshot-cleanup + - snapshot-delete + - backup + - backup-force-create + - filesystem-trim + type: string + type: object + status: + description: RecurringJobStatus defines the observed state of the Longhorn recurring job + properties: + ownerID: + description: The owner ID which is responsible to reconcile this recurring job CR. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + longhorn-manager: "" + name: replicas.longhorn.io +spec: + group: longhorn.io + names: + kind: Replica + listKind: ReplicaList + plural: replicas + shortNames: + - lhr + singular: replica + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The current state of the replica + jsonPath: .status.currentState + name: State + type: string + - description: The node that the replica is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk that the replica is on + jsonPath: .spec.diskID + name: Disk + type: string + - description: The instance manager of the replica + jsonPath: .status.instanceManagerName + name: InstanceManager + type: string + - description: The current image of the replica + jsonPath: .status.currentImage + name: Image + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: Replica is where Longhorn stores replica object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The data engine of the replica + jsonPath: .spec.dataEngine + name: Data Engine + type: string + - description: The current state of the replica + jsonPath: .status.currentState + name: State + type: string + - description: The node that the replica is on + jsonPath: .spec.nodeID + name: Node + type: string + - description: The disk that the replica is on + jsonPath: .spec.diskID + name: Disk + type: string + - description: The instance manager of the replica + jsonPath: .status.instanceManagerName + name: InstanceManager + type: string + - description: The current image of the replica + jsonPath: .status.currentImage + name: Image + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Replica is where Longhorn stores replica object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: ReplicaSpec defines the desired state of the Longhorn replica + properties: + active: + type: boolean + backendStoreDriver: + description: 'Deprecated: Replaced by field `dataEngine`.' + type: string + backingImage: + type: string + dataDirectoryName: + type: string + dataEngine: + enum: + - v1 + - v2 + type: string + desireState: + type: string + diskID: + type: string + diskPath: + type: string + engineImage: + description: 'Deprecated: Replaced by field `image`.' + type: string + engineName: + type: string + evictionRequested: + type: boolean + failedAt: + type: string + hardNodeAffinity: + type: string + healthyAt: + type: string + image: + type: string + logRequested: + type: boolean + nodeID: + type: string + rebuildRetryCount: + type: integer + revisionCounterDisabled: + type: boolean + salvageRequested: + type: boolean + snapshotMaxCount: + type: integer + snapshotMaxSize: + format: int64 + type: string + unmapMarkDiskChainRemovedEnabled: + type: boolean + volumeName: + type: string + volumeSize: + format: int64 + type: string + type: object + status: + description: ReplicaStatus defines the observed state of the Longhorn replica + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + message: + description: Human-readable message indicating details about last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's last transition. + type: string + status: + description: Status is the status of the condition. Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + currentImage: + type: string + currentState: + type: string + evictionRequested: + description: 'Deprecated: Replaced by field `spec.evictionRequested`.' + type: boolean + instanceManagerName: + type: string + ip: + type: string + logFetched: + type: boolean + ownerID: + type: string + port: + type: integer + salvageExecuted: + type: boolean + started: + type: boolean + storageIP: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + longhorn-manager: "" + name: settings.longhorn.io +spec: + group: longhorn.io + names: + kind: Setting + listKind: SettingList + plural: settings + shortNames: + - lhs + singular: setting + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The value of the setting + jsonPath: .value + name: Value + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: Setting is where Longhorn stores setting object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + value: + type: string + required: + - value + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The value of the setting + jsonPath: .value + name: Value + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Setting is where Longhorn stores setting object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + value: + description: The value of the setting. + type: string + required: + - value + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + longhorn-manager: "" + name: sharemanagers.longhorn.io +spec: + group: longhorn.io + names: + kind: ShareManager + listKind: ShareManagerList + plural: sharemanagers + shortNames: + - lhsm + singular: sharemanager + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The state of the share manager + jsonPath: .status.state + name: State + type: string + - description: The node that the share manager is owned by + jsonPath: .status.ownerID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: ShareManager is where Longhorn stores share manager object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The state of the share manager + jsonPath: .status.state + name: State + type: string + - description: The node that the share manager is owned by + jsonPath: .status.ownerID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: ShareManager is where Longhorn stores share manager object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: ShareManagerSpec defines the desired state of the Longhorn share manager + properties: + image: + description: Share manager image used for creating a share manager pod + type: string + type: object + status: + description: ShareManagerStatus defines the observed state of the Longhorn share manager + properties: + endpoint: + description: NFS endpoint that can access the mounted filesystem of the volume + type: string + ownerID: + description: The node ID on which the controller is responsible to reconcile this share manager resource + type: string + state: + description: The state of the share manager resource + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + longhorn-manager: "" + name: snapshots.longhorn.io +spec: + group: longhorn.io + names: + kind: Snapshot + listKind: SnapshotList + plural: snapshots + shortNames: + - lhsnap + singular: snapshot + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The volume that this snapshot belongs to + jsonPath: .spec.volume + name: Volume + type: string + - description: Timestamp when the point-in-time snapshot was taken + jsonPath: .status.creationTime + name: CreationTime + type: string + - description: Indicates if the snapshot is ready to be used to restore/backup a volume + jsonPath: .status.readyToUse + name: ReadyToUse + type: boolean + - description: Represents the minimum size of volume required to rehydrate from this snapshot + jsonPath: .status.restoreSize + name: RestoreSize + type: string + - description: The actual size of the snapshot + jsonPath: .status.size + name: Size + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Snapshot is the Schema for the snapshots API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: SnapshotSpec defines the desired state of Longhorn Snapshot + properties: + createSnapshot: + description: require creating a new snapshot + type: boolean + labels: + additionalProperties: + type: string + description: The labels of snapshot + nullable: true + type: object + volume: + description: the volume that this snapshot belongs to. This field is immutable after creation. Required + type: string + required: + - volume + type: object + status: + description: SnapshotStatus defines the observed state of Longhorn Snapshot + properties: + checksum: + type: string + children: + additionalProperties: + type: boolean + nullable: true + type: object + creationTime: + type: string + error: + type: string + labels: + additionalProperties: + type: string + nullable: true + type: object + markRemoved: + type: boolean + ownerID: + type: string + parent: + type: string + readyToUse: + type: boolean + restoreSize: + format: int64 + type: integer + size: + format: int64 + type: integer + userCreated: + type: boolean + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + longhorn-manager: "" + name: supportbundles.longhorn.io +spec: + group: longhorn.io + names: + kind: SupportBundle + listKind: SupportBundleList + plural: supportbundles + shortNames: + - lhbundle + singular: supportbundle + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The state of the support bundle + jsonPath: .status.state + name: State + type: string + - description: The issue URL + jsonPath: .spec.issueURL + name: Issue + type: string + - description: A brief description of the issue + jsonPath: .spec.description + name: Description + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: SupportBundle is where Longhorn stores support bundle object + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: SupportBundleSpec defines the desired state of the Longhorn SupportBundle + properties: + description: + description: A brief description of the issue + type: string + issueURL: + description: The issue URL + nullable: true + type: string + nodeID: + description: The preferred responsible controller node ID. + type: string + required: + - description + type: object + status: + description: SupportBundleStatus defines the observed state of the Longhorn SupportBundle + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + message: + description: Human-readable message indicating details about last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's last transition. + type: string + status: + description: Status is the status of the condition. Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + type: array + filename: + type: string + filesize: + format: int64 + type: integer + image: + description: The support bundle manager image + type: string + managerIP: + description: The support bundle manager IP + type: string + ownerID: + description: The current responsible controller node ID + type: string + progress: + type: integer + state: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + longhorn-manager: "" + name: systembackups.longhorn.io +spec: + group: longhorn.io + names: + kind: SystemBackup + listKind: SystemBackupList + plural: systembackups + shortNames: + - lhsb + singular: systembackup + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The system backup Longhorn version + jsonPath: .status.version + name: Version + type: string + - description: The system backup state + jsonPath: .status.state + name: State + type: string + - description: The system backup creation time + jsonPath: .status.createdAt + name: Created + type: string + - description: The last time that the system backup was synced into the cluster + jsonPath: .status.lastSyncedAt + name: LastSyncedAt + type: string + name: v1beta2 + schema: + openAPIV3Schema: + description: SystemBackup is where Longhorn stores system backup object + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: SystemBackupSpec defines the desired state of the Longhorn SystemBackup + properties: + volumeBackupPolicy: + description: The create volume backup policy Can be "if-not-present", "always" or "disabled" + nullable: true + type: string + type: object + status: + description: SystemBackupStatus defines the observed state of the Longhorn SystemBackup + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + message: + description: Human-readable message indicating details about last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's last transition. + type: string + status: + description: Status is the status of the condition. Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + createdAt: + description: The system backup creation time. + format: date-time + type: string + gitCommit: + description: The saved Longhorn manager git commit. + nullable: true + type: string + lastSyncedAt: + description: The last time that the system backup was synced into the cluster. + format: date-time + nullable: true + type: string + managerImage: + description: The saved manager image. + type: string + ownerID: + description: The node ID of the responsible controller to reconcile this SystemBackup. + type: string + state: + description: The system backup state. + type: string + version: + description: The saved Longhorn version. + nullable: true + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + longhorn-manager: "" + name: systemrestores.longhorn.io +spec: + group: longhorn.io + names: + kind: SystemRestore + listKind: SystemRestoreList + plural: systemrestores + shortNames: + - lhsr + singular: systemrestore + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The system restore state + jsonPath: .status.state + name: State + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: SystemRestore is where Longhorn stores system restore object + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: SystemRestoreSpec defines the desired state of the Longhorn SystemRestore + properties: + systemBackup: + description: The system backup name in the object store. + type: string + required: + - systemBackup + type: object + status: + description: SystemRestoreStatus defines the observed state of the Longhorn SystemRestore + properties: + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + message: + description: Human-readable message indicating details about last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's last transition. + type: string + status: + description: Status is the status of the condition. Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + ownerID: + description: The node ID of the responsible controller to reconcile this SystemRestore. + type: string + sourceURL: + description: The source system backup URL. + type: string + state: + description: The system restore state. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + longhorn-manager: "" + name: volumes.longhorn.io +spec: + preserveUnknownFields: false + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: longhorn-conversion-webhook + namespace: longhorn-system + path: /v1/webhook/conversion + port: 9501 + conversionReviewVersions: + - v1beta2 + - v1beta1 + group: longhorn.io + names: + kind: Volume + listKind: VolumeList + plural: volumes + shortNames: + - lhv + singular: volume + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The state of the volume + jsonPath: .status.state + name: State + type: string + - description: The robustness of the volume + jsonPath: .status.robustness + name: Robustness + type: string + - description: The scheduled condition of the volume + jsonPath: .status.conditions['scheduled']['status'] + name: Scheduled + type: string + - description: The size of the volume + jsonPath: .spec.size + name: Size + type: string + - description: The node that the volume is currently attaching to + jsonPath: .status.currentNodeID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: Volume is where Longhorn stores volume object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + x-kubernetes-preserve-unknown-fields: true + status: + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: The data engine of the volume + jsonPath: .spec.dataEngine + name: Data Engine + type: string + - description: The state of the volume + jsonPath: .status.state + name: State + type: string + - description: The robustness of the volume + jsonPath: .status.robustness + name: Robustness + type: string + - description: The scheduled condition of the volume + jsonPath: .status.conditions[?(@.type=='Schedulable')].status + name: Scheduled + type: string + - description: The size of the volume + jsonPath: .spec.size + name: Size + type: string + - description: The node that the volume is currently attaching to + jsonPath: .status.currentNodeID + name: Node + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: Volume is where Longhorn stores volume object. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: VolumeSpec defines the desired state of the Longhorn volume + properties: + Standby: + type: boolean + accessMode: + enum: + - rwo + - rwx + type: string + backendStoreDriver: + description: 'Deprecated: Replaced by field `dataEngine`.' + type: string + backingImage: + type: string + backupCompressionMethod: + enum: + - none + - lz4 + - gzip + type: string + dataEngine: + enum: + - v1 + - v2 + type: string + dataLocality: + enum: + - disabled + - best-effort + - strict-local + type: string + dataSource: + type: string + disableFrontend: + type: boolean + diskSelector: + items: + type: string + type: array + encrypted: + type: boolean + engineImage: + description: 'Deprecated: Replaced by field `image`.' + type: string + fromBackup: + type: string + frontend: + enum: + - blockdev + - iscsi + - nvmf + - "" + type: string + image: + type: string + lastAttachedBy: + type: string + migratable: + type: boolean + migrationNodeID: + type: string + nodeID: + type: string + nodeSelector: + items: + type: string + type: array + numberOfReplicas: + type: integer + offlineReplicaRebuilding: + description: OfflineReplicaRebuilding is used to determine if the offline replica rebuilding feature is enabled or not + enum: + - ignored + - disabled + - enabled + type: string + replicaAutoBalance: + enum: + - ignored + - disabled + - least-effort + - best-effort + type: string + replicaDiskSoftAntiAffinity: + description: Replica disk soft anti affinity of the volume. Set enabled to allow replicas to be scheduled in the same disk. + enum: + - ignored + - enabled + - disabled + type: string + replicaSoftAntiAffinity: + description: Replica soft anti affinity of the volume. Set enabled to allow replicas to be scheduled on the same node. + enum: + - ignored + - enabled + - disabled + type: string + replicaZoneSoftAntiAffinity: + description: Replica zone soft anti affinity of the volume. Set enabled to allow replicas to be scheduled in the same zone. + enum: + - ignored + - enabled + - disabled + type: string + restoreVolumeRecurringJob: + enum: + - ignored + - enabled + - disabled + type: string + revisionCounterDisabled: + type: boolean + size: + format: int64 + type: string + snapshotDataIntegrity: + enum: + - ignored + - disabled + - enabled + - fast-check + type: string + snapshotMaxCount: + type: integer + snapshotMaxSize: + format: int64 + type: string + staleReplicaTimeout: + type: integer + unmapMarkSnapChainRemoved: + enum: + - ignored + - disabled + - enabled + type: string + type: object + status: + description: VolumeStatus defines the observed state of the Longhorn volume + properties: + actualSize: + format: int64 + type: integer + cloneStatus: + properties: + snapshot: + type: string + sourceVolume: + type: string + state: + type: string + type: object + conditions: + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + message: + description: Human-readable message indicating details about last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's last transition. + type: string + status: + description: Status is the status of the condition. Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + currentImage: + type: string + currentMigrationNodeID: + description: the node that this volume is currently migrating to + type: string + currentNodeID: + type: string + expansionRequired: + type: boolean + frontendDisabled: + type: boolean + isStandby: + type: boolean + kubernetesStatus: + properties: + lastPVCRefAt: + type: string + lastPodRefAt: + type: string + namespace: + description: determine if PVC/Namespace is history or not + type: string + pvName: + type: string + pvStatus: + type: string + pvcName: + type: string + workloadsStatus: + description: determine if Pod/Workload is history or not + items: + properties: + podName: + type: string + podStatus: + type: string + workloadName: + type: string + workloadType: + type: string + type: object + nullable: true + type: array + type: object + lastBackup: + type: string + lastBackupAt: + type: string + lastDegradedAt: + type: string + offlineReplicaRebuildingRequired: + type: boolean + ownerID: + type: string + pendingNodeID: + description: Deprecated. + type: string + remountRequestedAt: + type: string + restoreInitiated: + type: boolean + restoreRequired: + type: boolean + robustness: + type: string + shareEndpoint: + type: string + shareState: + type: string + state: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/crds.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + longhorn-manager: "" + name: volumeattachments.longhorn.io +spec: + group: longhorn.io + names: + kind: VolumeAttachment + listKind: VolumeAttachmentList + plural: volumeattachments + shortNames: + - lhva + singular: volumeattachment + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta2 + schema: + openAPIV3Schema: + description: VolumeAttachment stores attachment information of a Longhorn volume + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: VolumeAttachmentSpec defines the desired state of Longhorn VolumeAttachment + properties: + attachmentTickets: + additionalProperties: + properties: + generation: + description: A sequence number representing a specific generation of the desired state. Populated by the system. Read-only. + format: int64 + type: integer + id: + description: The unique ID of this attachment. Used to differentiate different attachments of the same volume. + type: string + nodeID: + description: The node that this attachment is requesting + type: string + parameters: + additionalProperties: + type: string + description: Optional additional parameter for this attachment + type: object + type: + type: string + type: object + type: object + volume: + description: The name of Longhorn volume of this VolumeAttachment + type: string + required: + - volume + type: object + status: + description: VolumeAttachmentStatus defines the observed state of Longhorn VolumeAttachment + properties: + attachmentTicketStatuses: + additionalProperties: + properties: + conditions: + description: Record any error when trying to fulfill this attachment + items: + properties: + lastProbeTime: + description: Last time we probed the condition. + type: string + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + message: + description: Human-readable message indicating details about last transition. + type: string + reason: + description: Unique, one-word, CamelCase reason for the condition's last transition. + type: string + status: + description: Status is the status of the condition. Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. + type: string + type: object + nullable: true + type: array + generation: + description: A sequence number representing a specific generation of the desired state. Populated by the system. Read-only. + format: int64 + type: integer + id: + description: The unique ID of this attachment. Used to differentiate different attachments of the same volume. + type: string + satisfied: + description: Indicate whether this attachment ticket has been satisfied + type: boolean + required: + - conditions + - satisfied + type: object + type: object + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +# Source: longhorn/templates/clusterrole.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: longhorn-role + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 +rules: +- apiGroups: + - apiextensions.k8s.io + resources: + - customresourcedefinitions + verbs: + - "*" +- apiGroups: [""] + resources: ["pods", "events", "persistentvolumes", "persistentvolumeclaims","persistentvolumeclaims/status", "nodes", "proxy/nodes", "pods/log", "secrets", "services", "endpoints", "configmaps", "serviceaccounts"] + verbs: ["*"] +- apiGroups: [""] + resources: ["namespaces"] + verbs: ["get", "list"] +- apiGroups: ["apps"] + resources: ["daemonsets", "statefulsets", "deployments"] + verbs: ["*"] +- apiGroups: ["batch"] + resources: ["jobs", "cronjobs"] + verbs: ["*"] +- apiGroups: ["policy"] + resources: ["poddisruptionbudgets", "podsecuritypolicies"] + verbs: ["*"] +- apiGroups: ["scheduling.k8s.io"] + resources: ["priorityclasses"] + verbs: ["watch", "list"] +- apiGroups: ["storage.k8s.io"] + resources: ["storageclasses", "volumeattachments", "volumeattachments/status", "csinodes", "csidrivers"] + verbs: ["*"] +- apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotclasses", "volumesnapshots", "volumesnapshotcontents", "volumesnapshotcontents/status"] + verbs: ["*"] +- apiGroups: ["longhorn.io"] + resources: ["volumes", "volumes/status", "engines", "engines/status", "replicas", "replicas/status", "settings", + "engineimages", "engineimages/status", "nodes", "nodes/status", "instancemanagers", "instancemanagers/status", + "sharemanagers", "sharemanagers/status", "backingimages", "backingimages/status", + "backingimagemanagers", "backingimagemanagers/status", "backingimagedatasources", "backingimagedatasources/status", + "backuptargets", "backuptargets/status", "backupvolumes", "backupvolumes/status", "backups", "backups/status", + "recurringjobs", "recurringjobs/status", "orphans", "orphans/status", "snapshots", "snapshots/status", + "supportbundles", "supportbundles/status", "systembackups", "systembackups/status", "systemrestores", "systemrestores/status", + "volumeattachments", "volumeattachments/status", "backupbackingimages", "backupbackingimages/status"] + verbs: ["*"] +- apiGroups: ["coordination.k8s.io"] + resources: ["leases"] + verbs: ["*"] +- apiGroups: ["metrics.k8s.io"] + resources: ["pods", "nodes"] + verbs: ["get", "list"] +- apiGroups: ["apiregistration.k8s.io"] + resources: ["apiservices"] + verbs: ["list", "watch"] +- apiGroups: ["admissionregistration.k8s.io"] + resources: ["mutatingwebhookconfigurations", "validatingwebhookconfigurations"] + verbs: ["get", "list", "create", "patch", "delete"] +- apiGroups: ["rbac.authorization.k8s.io"] + resources: ["roles", "rolebindings", "clusterrolebindings", "clusterroles"] + verbs: ["*"] +--- +# Source: longhorn/templates/clusterrolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: longhorn-bind + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: longhorn-role +subjects: +- kind: ServiceAccount + name: longhorn-service-account + namespace: longhorn-system +--- +# Source: longhorn/templates/clusterrolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: longhorn-support-bundle + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin +subjects: +- kind: ServiceAccount + name: longhorn-support-bundle + namespace: longhorn-system +--- +# Source: longhorn/templates/daemonset-sa.yaml +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + app: longhorn-manager + name: longhorn-backend + namespace: longhorn-system +spec: + type: ClusterIP + selector: + app: longhorn-manager + ports: + - name: manager + port: 9500 + targetPort: manager +--- +# Source: longhorn/templates/deployment-ui.yaml +kind: Service +apiVersion: v1 +metadata: + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + app: longhorn-ui + name: longhorn-frontend + namespace: longhorn-system +spec: + type: LoadBalancer + selector: + app: longhorn-ui + ports: + - name: http + port: 8888 + targetPort: http + nodePort: null +--- +# Source: longhorn/templates/services.yaml +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + app: longhorn-conversion-webhook + name: longhorn-conversion-webhook + namespace: longhorn-system +spec: + type: ClusterIP + selector: + app: longhorn-manager + ports: + - name: conversion-webhook + port: 9501 + targetPort: conversion-wh +--- +# Source: longhorn/templates/services.yaml +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + app: longhorn-admission-webhook + name: longhorn-admission-webhook + namespace: longhorn-system +spec: + type: ClusterIP + selector: + app: longhorn-manager + ports: + - name: admission-webhook + port: 9502 + targetPort: admission-wh +--- +# Source: longhorn/templates/services.yaml +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + app: longhorn-recovery-backend + name: longhorn-recovery-backend + namespace: longhorn-system +spec: + type: ClusterIP + selector: + app: longhorn-manager + ports: + - name: recovery-backend + port: 9503 + targetPort: recov-backend +--- +# Source: longhorn/templates/services.yaml +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + name: longhorn-engine-manager + namespace: longhorn-system +spec: + clusterIP: None + selector: + longhorn.io/component: instance-manager + longhorn.io/instance-manager-type: engine +--- +# Source: longhorn/templates/services.yaml +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + name: longhorn-replica-manager + namespace: longhorn-system +spec: + clusterIP: None + selector: + longhorn.io/component: instance-manager + longhorn.io/instance-manager-type: replica +--- +# Source: longhorn/templates/daemonset-sa.yaml +apiVersion: apps/v1 +kind: DaemonSet +metadata: + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + app: longhorn-manager + name: longhorn-manager + namespace: longhorn-system +spec: + selector: + matchLabels: + app: longhorn-manager + template: + metadata: + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + app: longhorn-manager + spec: + containers: + - name: longhorn-manager + image: longhornio/longhorn-manager:v1.6.0 + imagePullPolicy: IfNotPresent + securityContext: + privileged: true + command: + - longhorn-manager + - -d + - daemon + - --engine-image + - "longhornio/longhorn-engine:v1.6.0" + - --instance-manager-image + - "longhornio/longhorn-instance-manager:v1.6.0" + - --share-manager-image + - "longhornio/longhorn-share-manager:v1.6.0" + - --backing-image-manager-image + - "longhornio/backing-image-manager:v1.6.0" + - --support-bundle-manager-image + - "longhornio/support-bundle-kit:v0.0.33" + - --manager-image + - "longhornio/longhorn-manager:v1.6.0" + - --service-account + - longhorn-service-account + - --upgrade-version-check + ports: + - containerPort: 9500 + name: manager + - containerPort: 9501 + name: conversion-wh + - containerPort: 9502 + name: admission-wh + - containerPort: 9503 + name: recov-backend + readinessProbe: + httpGet: + path: /v1/healthz + port: 9501 + scheme: HTTPS + volumeMounts: + - name: dev + mountPath: /host/dev/ + - name: proc + mountPath: /host/proc/ + - name: longhorn + mountPath: /var/lib/longhorn/ + mountPropagation: Bidirectional + - name: longhorn-grpc-tls + mountPath: /tls-files/ + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + volumes: + - name: dev + hostPath: + path: /dev/ + - name: proc + hostPath: + path: /proc/ + - name: longhorn + hostPath: + path: /var/lib/longhorn/ + - name: longhorn-grpc-tls + secret: + secretName: longhorn-grpc-tls + optional: true + priorityClassName: "longhorn-critical" + serviceAccountName: longhorn-service-account + updateStrategy: + rollingUpdate: + maxUnavailable: "100%" +--- +# Source: longhorn/templates/deployment-driver.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: longhorn-driver-deployer + namespace: longhorn-system + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 +spec: + replicas: 1 + selector: + matchLabels: + app: longhorn-driver-deployer + template: + metadata: + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + app: longhorn-driver-deployer + spec: + initContainers: + - name: wait-longhorn-manager + image: longhornio/longhorn-manager:v1.6.0 + command: ['sh', '-c', 'while [ $(curl -m 1 -s -o /dev/null -w "%{http_code}" http://longhorn-backend:9500/v1) != "200" ]; do echo waiting; sleep 2; done'] + containers: + - name: longhorn-driver-deployer + image: longhornio/longhorn-manager:v1.6.0 + imagePullPolicy: IfNotPresent + command: + - longhorn-manager + - -d + - deploy-driver + - --manager-image + - "longhornio/longhorn-manager:v1.6.0" + - --manager-url + - http://longhorn-backend:9500/v1 + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + - name: SERVICE_ACCOUNT + valueFrom: + fieldRef: + fieldPath: spec.serviceAccountName + - name: CSI_ATTACHER_IMAGE + value: "longhornio/csi-attacher:v4.4.2" + - name: CSI_PROVISIONER_IMAGE + value: "longhornio/csi-provisioner:v3.6.2" + - name: CSI_NODE_DRIVER_REGISTRAR_IMAGE + value: "longhornio/csi-node-driver-registrar:v2.9.2" + - name: CSI_RESIZER_IMAGE + value: "longhornio/csi-resizer:v1.9.2" + - name: CSI_SNAPSHOTTER_IMAGE + value: "longhornio/csi-snapshotter:v6.3.2" + - name: CSI_LIVENESS_PROBE_IMAGE + value: "longhornio/livenessprobe:v2.11.0" + priorityClassName: "longhorn-critical" + serviceAccountName: longhorn-service-account + securityContext: + runAsUser: 0 +--- +# Source: longhorn/templates/deployment-ui.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + app: longhorn-ui + name: longhorn-ui + namespace: longhorn-system +spec: + replicas: 2 + selector: + matchLabels: + app: longhorn-ui + template: + metadata: + labels: + app.kubernetes.io/name: longhorn + app.kubernetes.io/instance: longhorn + app.kubernetes.io/version: v1.6.0 + app: longhorn-ui + spec: + serviceAccountName: longhorn-ui-service-account + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 1 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: app + operator: In + values: + - longhorn-ui + topologyKey: kubernetes.io/hostname + containers: + - name: longhorn-ui + image: longhornio/longhorn-ui:v1.6.0 + imagePullPolicy: IfNotPresent + volumeMounts: + - name : nginx-cache + mountPath: /var/cache/nginx/ + - name : nginx-config + mountPath: /var/config/nginx/ + - name: var-run + mountPath: /var/run/ + ports: + - containerPort: 8000 + name: http + env: + - name: LONGHORN_MANAGER_IP + value: "http://longhorn-backend:9500" + - name: LONGHORN_UI_PORT + value: "8000" + volumes: + - emptyDir: {} + name: nginx-cache + - emptyDir: {} + name: nginx-config + - emptyDir: {} + name: var-run + priorityClassName: "longhorn-critical" +--- +# Source: longhorn/templates/validate-psp-install.yaml +# \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/welcomeK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/welcomeK3s.sh new file mode 100644 index 0000000000..6e440b507b --- /dev/null +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/welcomeK3s.sh @@ -0,0 +1,9 @@ +tput setaf 1;echo "-----------------------------------------------------------------------------------------------------------------------------" +echo "" +tput setaf 6;echo "Welcome to Jumpstart ArcBox Rancher K3s Kubernetes cluster management virtual machine!" +echo "" +tput setaf 6;echo "* To check the Rancher K3s deployment log, use the 'cat jumpstart_logs/installK3s.log' command." +echo "" +tput setaf 6;echo "* To work with Rancher K3s workload Kubernetes cluster, use the 'kubectl '. For example: kubectl get nodes" +echo "" +tput setaf 1;echo "-----------------------------------------------------------------------------------------------------------------------------" \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-hypermarket b/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-hypermarket new file mode 100644 index 0000000000..3445f225f2 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-hypermarket @@ -0,0 +1,215 @@ +{ + "checksum": "d77f9db622cff666aa1ae0f899c3b4ec", + "roots": { + "bookmark_bar": { + "children": [ { + "children": [ { + "children": [ { + "id": "4", + "name": "POS Chicago - Customer", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "POS-Chicago-URL-Customer" + }, { + "id": "5", + "name": "POS Chicago - Manager", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "POS-Chicago-URL-Manager" + } ], + "id": "3", + "name": "Chicago", + "source": "unknown", + "type": "folder" + }, { + "children": [ { + "id": "7", + "name": "POS Seattle - Customer", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "POS-Seattle-URL-Customer" + }, { + "id": "8", + "name": "POS Seattle - Manager", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "POS-Seattle-URL-Manager" + } ], + "id": "6", + "name": "Seattle", + "source": "unknown", + "type": "folder" + }, { + "children": [ { + "id": "10", + "name": "POS Dev - Customer", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "POS-Dev-URL-Customer" + }, { + "id": "11", + "name": "POS Dev - Manager", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "POS-Dev-URL-Manager" + } ], + "id": "9", + "name": "Dev", + "source": "unknown", + "type": "folder" + }, { + "children": [ { + "id": "13", + "name": "POS Staging - Customer", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "POS-Staging-URL-Customer" + }, { + "id": "14", + "name": "POS Staging - Manager", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "POS-Staging-URL-Manager" + } ], + "id": "12", + "name": "Staging", + "source": "unknown", + "type": "folder" + } ], + "id": "2", + "name": "POS", + "source": "unknown", + "type": "folder" + }, { + "children": [ { + "id": "16", + "name": "Grafana Dev", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "Grafana-Dev-URL" + }, { + "id": "17", + "name": "Grafana Staging", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "Grafana-Staging-URL" + }, { + "id": "18", + "name": "Grafana Prod", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "http://localhost:3000/" + } ], + "id": "15", + "name": "Grafana", + "source": "unknown", + "type": "folder" + }, { + "children": [ { + "id": "30", + "name": "Prometheus Dev", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "Prometheus-Dev-URL" + }, { + "id": "31", + "name": "Prometheus Staging", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "Prometheus-Staging-URL" + }, { + "id": "32", + "name": "Prometheus Canary - Chicago", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "Prometheus-Chicago-URL" + }, { + "id": "33", + "name": "Prometheus Prod - Seattle", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "Prometheus-Seattle-URL" + } ], + "id": "29", + "name": "Prometheus", + "source": "unknown", + "type": "folder" + }, { + "children": [ { + "id": "20", + "name": "Agora Apps Repo - Microsoft", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "https://github.com/microsoft/jumpstart-agora-apps" + }, { + "id": "21", + "name": "Agora-Apps-Repo-Your-Fork", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "Agora-Apps-Repo-Clone-URL" + } ], + "id": "19", + "name": "GitHub", + "source": "unknown", + "type": "folder" + }, { + "id": "22", + "name": "ADX Dashboards", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "https://dataexplorer.azure.com/dashboards/" + }, { + "id": "23", + "name": "Arc Jumpstart", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "https://aka.ms/ArcJumpstart/" + }, { + "id": "24", + "name": "Azure Portal", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "https://portal.azure.com/" + } ], + "id": "1", + "name": "Favorites bar", + "source": "unknown", + "type": "folder" + }, + "other": { + "children": [ ], + "id": "25", + "name": "Other favorites", + "source": "unknown", + "type": "folder" + }, + "synced": { + "children": [ ], + "id": "26", + "name": "Mobile favorites", + "source": "unknown", + "type": "folder" + } + }, + "version": 1 +} diff --git a/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-motors b/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-motors new file mode 100644 index 0000000000..9ba8dea075 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-motors @@ -0,0 +1,125 @@ +{ + "checksum": "d77f9db622cff666aa1ae0f899c3b4ec", + "roots": { + "bookmark_bar": { + "children": [ + { + "children": [ { + "id": "18", + "name": "Control center Detroit", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "Flask-Detroit-URL" + }, { + "id": "19", + "name": "Control center Monterrey", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "Flask-Monterrey-URL" + }], + "id": "16", + "name": "Control centers", + "source": "unknown", + "type": "folder" + }, + { + "children": [ { + "id": "16", + "name": "Influxdb Detroit", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "Influxdb-Detroit-URL" + }, { + "id": "17", + "name": "Influxdb Monterrey", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "Influxdb-Monterrey-URL" + }], + "id": "15", + "name": "Influxdb", + "source": "unknown", + "type": "folder" + }, + { + "children": [ { + "id": "20", + "name": "Grafana", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "http://localhost:3000" + }], + "id": "17", + "name": "Grafana", + "source": "unknown", + "type": "folder" + }, + { + "children": [ { + "id": "30", + "name": "Prometheus Detroit", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "Prometheus-Detroit-URL" + }, { + "id": "31", + "name": "Prometheus Monterrey", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "Prometheus-Monterrey-URL" + }], + "id": "29", + "name": "Prometheus", + "source": "unknown", + "type": "folder" + }, { + "id": "22", + "name": "ADX Dashboards", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "https://dataexplorer.azure.com/dashboards/" + }, { + "id": "23", + "name": "Arc Jumpstart", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "https://aka.ms/ArcJumpstart/" + }, { + "id": "24", + "name": "Azure Portal", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "https://portal.azure.com/" + } ], + "id": "1", + "name": "Favorites bar", + "source": "unknown", + "type": "folder" + }, + "other": { + "children": [ ], + "id": "25", + "name": "Other favorites", + "source": "unknown", + "type": "folder" + }, + "synced": { + "children": [ ], + "id": "26", + "name": "Mobile favorites", + "source": "unknown", + "type": "folder" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-supermarket b/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-supermarket new file mode 100644 index 0000000000..3445f225f2 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-supermarket @@ -0,0 +1,215 @@ +{ + "checksum": "d77f9db622cff666aa1ae0f899c3b4ec", + "roots": { + "bookmark_bar": { + "children": [ { + "children": [ { + "children": [ { + "id": "4", + "name": "POS Chicago - Customer", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "POS-Chicago-URL-Customer" + }, { + "id": "5", + "name": "POS Chicago - Manager", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "POS-Chicago-URL-Manager" + } ], + "id": "3", + "name": "Chicago", + "source": "unknown", + "type": "folder" + }, { + "children": [ { + "id": "7", + "name": "POS Seattle - Customer", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "POS-Seattle-URL-Customer" + }, { + "id": "8", + "name": "POS Seattle - Manager", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "POS-Seattle-URL-Manager" + } ], + "id": "6", + "name": "Seattle", + "source": "unknown", + "type": "folder" + }, { + "children": [ { + "id": "10", + "name": "POS Dev - Customer", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "POS-Dev-URL-Customer" + }, { + "id": "11", + "name": "POS Dev - Manager", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "POS-Dev-URL-Manager" + } ], + "id": "9", + "name": "Dev", + "source": "unknown", + "type": "folder" + }, { + "children": [ { + "id": "13", + "name": "POS Staging - Customer", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "POS-Staging-URL-Customer" + }, { + "id": "14", + "name": "POS Staging - Manager", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "POS-Staging-URL-Manager" + } ], + "id": "12", + "name": "Staging", + "source": "unknown", + "type": "folder" + } ], + "id": "2", + "name": "POS", + "source": "unknown", + "type": "folder" + }, { + "children": [ { + "id": "16", + "name": "Grafana Dev", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "Grafana-Dev-URL" + }, { + "id": "17", + "name": "Grafana Staging", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "Grafana-Staging-URL" + }, { + "id": "18", + "name": "Grafana Prod", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "http://localhost:3000/" + } ], + "id": "15", + "name": "Grafana", + "source": "unknown", + "type": "folder" + }, { + "children": [ { + "id": "30", + "name": "Prometheus Dev", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "Prometheus-Dev-URL" + }, { + "id": "31", + "name": "Prometheus Staging", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "Prometheus-Staging-URL" + }, { + "id": "32", + "name": "Prometheus Canary - Chicago", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "Prometheus-Chicago-URL" + }, { + "id": "33", + "name": "Prometheus Prod - Seattle", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "Prometheus-Seattle-URL" + } ], + "id": "29", + "name": "Prometheus", + "source": "unknown", + "type": "folder" + }, { + "children": [ { + "id": "20", + "name": "Agora Apps Repo - Microsoft", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "https://github.com/microsoft/jumpstart-agora-apps" + }, { + "id": "21", + "name": "Agora-Apps-Repo-Your-Fork", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "Agora-Apps-Repo-Clone-URL" + } ], + "id": "19", + "name": "GitHub", + "source": "unknown", + "type": "folder" + }, { + "id": "22", + "name": "ADX Dashboards", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "https://dataexplorer.azure.com/dashboards/" + }, { + "id": "23", + "name": "Arc Jumpstart", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "https://aka.ms/ArcJumpstart/" + }, { + "id": "24", + "name": "Azure Portal", + "show_icon": false, + "source": "unknown", + "type": "url", + "url": "https://portal.azure.com/" + } ], + "id": "1", + "name": "Favorites bar", + "source": "unknown", + "type": "folder" + }, + "other": { + "children": [ ], + "id": "25", + "name": "Other favorites", + "source": "unknown", + "type": "folder" + }, + "synced": { + "children": [ ], + "id": "26", + "name": "Mobile favorites", + "source": "unknown", + "type": "folder" + } + }, + "version": 1 +} diff --git a/azure_jumpstart_ag/artifacts/settings/mq_cloudConnector.yml b/azure_jumpstart_ag/artifacts/settings/mq_cloudConnector.yml index 933a109596..f435db3cb6 100644 --- a/azure_jumpstart_ag/artifacts/settings/mq_cloudConnector.yml +++ b/azure_jumpstart_ag/artifacts/settings/mq_cloudConnector.yml @@ -1,34 +1,55 @@ -apiVersion: mq.iotoperations.azure.com/v1beta1 -kind: MqttBridgeTopicMap +apiVersion: connectivity.iotoperations.azure.com/v1beta1 +kind: DataflowEndpoint metadata: - name: my-topic-map - namespace: azure-iot-operations + name: mq spec: - mqttBridgeConnectorRef: my-mqtt-bridge - routes: - - direction: local-to-remote - name: route-to-eventgrid - qos: 1 - source: "topic/#" + endpointType: mqtt + authentication: + method: serviceAccountToken + serviceAccountTokenSettings: + audience: aio-mqtt + mqttSettings: + {} --- -apiVersion: mq.iotoperations.azure.com/v1beta1 -kind: MqttBridgeConnector +apiVersion: connectivity.iotoperations.azure.com/v1beta1 +kind: DataflowEndpoint metadata: - name: my-mqtt-bridge - namespace: azure-iot-operations + name: eventgrid spec: - image: - repository: mcr.microsoft.com/azureiotoperations/mqttbridge - tag: 0.1.0-preview - pullPolicy: IfNotPresent - protocol: v5 - bridgeInstances: 1 - clientIdPrefix: factory-gateway- - logLevel: debug - remoteBrokerConnection: - endpoint: eventGridPlaceholder:8883 + endpointType: mqtt + authentication: + method: systemAssignedManagedIdentity + systemAssignedManagedIdentitySettings: + audience: https://eventgrid.azure.net + mqttSettings: + host: eventGridPlaceholder:8883 tls: - tlsEnabled: true - authentication: - systemAssignedManagedIdentity: - audience: https://eventgrid.azure.net \ No newline at end of file + mode: Enabled +--- +apiVersion: connectivity.iotoperations.azure.com/v1beta1 +kind: Dataflow +metadata: + name: my-dataflow +spec: + profileRef: my-dataflow-profile + mode: enabled + operations: + - operationType: source + name: source1 + sourceSettings: + endpointRef: mq + dataSources: + - "topic/#" + - azure-iot-operations/data/# + - operationType: destination + name: destination1 + destinationSettings: + endpointRef: eventgrid + dataDestination: factory +--- +apiVersion: connectivity.iotoperations.azure.com/v1beta1 +kind: DataflowProfile +metadata: + name: my-dataflow-profile +spec: + instanceCount: 2 \ No newline at end of file diff --git a/azure_jumpstart_ag/manufacturing/.gitignore b/azure_jumpstart_ag/contoso_hypermarket/.gitignore similarity index 100% rename from azure_jumpstart_ag/manufacturing/.gitignore rename to azure_jumpstart_ag/contoso_hypermarket/.gitignore diff --git a/azure_jumpstart_ag/manufacturing/azure.yaml b/azure_jumpstart_ag/contoso_hypermarket/azure.yaml similarity index 100% rename from azure_jumpstart_ag/manufacturing/azure.yaml rename to azure_jumpstart_ag/contoso_hypermarket/azure.yaml diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep new file mode 100644 index 0000000000..5f9ea6e5bf --- /dev/null +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep @@ -0,0 +1,210 @@ +@description('The name of your Virtual Machine') +param vmName string = 'Ag-VM-Client' + +@description('Username for the Virtual Machine') +param windowsAdminUsername string = 'agora' + +@description('Password for Windows account. Password must have 3 of the following: 1 lower case character, 1 upper case character, 1 number, and 1 special character. The value must be between 12 and 123 characters long') +@minLength(12) +@maxLength(123) +@secure() +param windowsAdminPassword string + +@description('The Windows version for the VM. This will pick a fully patched image of this given Windows version') +param windowsOSVersion string = '2022-datacenter-g2' + +@description('Location for all resources') +param location string = resourceGroup().location + + +@description('Name of the storage account') +param aioStorageAccountName string = 'aiostg${namingGuid}' + +@description('Resource tag for Jumpstart Agora') +param resourceTags object = { + Project: 'Jumpstart_Agora' +} + +@description('Resource Id of the subnet in the virtual network') +param subnetId string + +@description('Client id of the service principal') +param spnClientId string + +@description('Azure service principal object id') +param spnObjectId string + +@description('Client secret of the service principal') +@secure() +param spnClientSecret string +param spnAuthority string = environment().authentication.loginEndpoint + +@description('Tenant id of the service principal') +param spnTenantId string + +@description('Name for the environment Azure Log Analytics workspace') +param workspaceName string + +@description('The base URL used for accessing artifacts and automation artifacts.') +param templateBaseUrl string + +@description('Choice to deploy Bastion to connect to the client VM') +param deployBastion bool = false + +@description('Storage account used for staging file artifacts') +param storageAccountName string + +@description('The name of ESA container in Storage Account') +param stcontainerName string + +@description('The login server name of the Azure Container Registry') +param acrName string + +@description('The name of the Azure Data Explorer cluster') +param adxClusterName string + +@description('Override default RDP port using this parameter. Default is 3389. No changes will be made to the client VM.') +param rdpPort string = '3389' + +@description('Target GitHub account') +param githubAccount string = 'microsoft' + +@description('Target GitHub branch') +param githubBranch string = 'main' + +@description('Random GUID') +param namingGuid string + +@description('The custom location RPO ID') +param customLocationRPOID string + +@description('The agora scenario to be deployed') +param scenario string = 'contoso_supermarket' + +@description('The name of the Azure Arc K3s cluster') +param k3sArcDataClusterName string = 'Ag-K3s-Seattle-${namingGuid}' + +@description('The name of the Azure Arc K3s data cluster') +param k3sArcClusterName string = 'Ag-K3s-Chicago-${namingGuid}' + +var encodedPassword = base64(windowsAdminPassword) +var bastionName = 'Ag-Bastion' +var publicIpAddressName = deployBastion == false ? '${vmName}-PIP' : '${bastionName}-PIP' +var networkInterfaceName = '${vmName}-NIC' +var osDiskType = 'Premium_LRS' +var PublicIPNoBastion = { + id: publicIpAddress.id +} + +resource networkInterface 'Microsoft.Network/networkInterfaces@2023-02-01' = { + name: networkInterfaceName + location: location + tags: resourceTags + properties: { + ipConfigurations: [ + { + name: 'ipconfig1' + properties: { + subnet: { + id: subnetId + } + privateIPAllocationMethod: 'Dynamic' + publicIPAddress: deployBastion == false ? PublicIPNoBastion : null + } + } + ] + } +} + +resource publicIpAddress 'Microsoft.Network/publicIpAddresses@2023-02-01' = if (deployBastion == false) { + name: publicIpAddressName + location: location + tags: resourceTags + properties: { + publicIPAllocationMethod: 'Static' + publicIPAddressVersion: 'IPv4' + idleTimeoutInMinutes: 4 + } + sku: { + name: 'Basic' + } +} + +resource vm 'Microsoft.Compute/virtualMachines@2022-11-01' = { + name: vmName + location: location + tags: resourceTags + properties: { + hardwareProfile: { + vmSize: 'Standard_D32s_v5' + } + storageProfile: { + osDisk: { + name: '${vmName}-OSDisk' + caching: 'ReadWrite' + createOption: 'FromImage' + managedDisk: { + storageAccountType: osDiskType + } + diskSizeGB: 256 + } + imageReference: { + publisher: 'MicrosoftWindowsServer' + offer: 'WindowsServer' + sku: windowsOSVersion + version: 'latest' + } + dataDisks: [ + { + diskSizeGB: 1024 + lun: 0 + createOption: 'Empty' + caching: 'ReadWrite' + managedDisk: { + storageAccountType: 'Premium_LRS' + } + } + ] + } + networkProfile: { + networkInterfaces: [ + { + id: networkInterface.id + } + ] + } + osProfile: { + computerName: vmName + adminUsername: windowsAdminUsername + adminPassword: windowsAdminPassword + windowsConfiguration: { + provisionVMAgent: true + enableAutomaticUpdates: false + } + } + } +} + +resource vmBootstrap 'Microsoft.Compute/virtualMachines/extensions@2022-11-01' = { + parent: vm + name: 'Bootstrap' + location: location + tags: { + displayName: 'config-choco' + } + properties: { + publisher: 'Microsoft.Compute' + type: 'CustomScriptExtension' + typeHandlerVersion: '1.10' + autoUpgradeMinorVersion: true + protectedSettings: { + fileUris: [ + uri(templateBaseUrl, 'artifacts/PowerShell/Bootstrap.ps1') + ] + commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnObjectId ${spnObjectId} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -acrName ${acrName} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -adxClusterName ${adxClusterName} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName} -stcontainerName ${stcontainerName} -k3sArcClusterName ${k3sArcClusterName} -k3sArcDataClusterName ${k3sArcDataClusterName}' + } + } +} + +output adminUsername string = windowsAdminUsername +output publicIP string = deployBastion == false ? concat(publicIpAddress.properties.ipAddress) : '' diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataExplorer.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataExplorer.bicep new file mode 100644 index 0000000000..8701a4e517 --- /dev/null +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataExplorer.bicep @@ -0,0 +1,75 @@ +@description('The name of the Azure Data Explorer cluster') +param adxClusterName string + +@description('The location of the Azure Data Explorer cluster') +param location string = resourceGroup().location + +@description('Resource tag for Jumpstart Agora') +param resourceTags object = { + Project: 'Jumpstart_azure_aio' +} + +@description('The name of the Azure Data Explorer cluster Sku') +param skuName string = 'Dev(No SLA)_Standard_E2a_v4' + +@description('The name of the Azure Data Explorer cluster Sku tier') +param skuTier string = 'Basic' + +@description('The name of the Event Hub') +param eventHubName string + +@description('The name of the Event Hub Namespace') +param eventHubNamespaceName string + +@description('The resource id of the Event Hub') +param eventHubResourceId string + +@description('The name of the Azure Data Explorer database') +param adxDBName string = 'manufacturing' + +@description('# of nodes') +@minValue(1) +@maxValue(2) +param skuCapacity int = 1 + + +resource adxCluster 'Microsoft.Kusto/clusters@2023-05-02' = { + name: adxClusterName + location: location + tags: resourceTags + sku: { + name: skuName + tier: skuTier + capacity: skuCapacity + } + identity: { + type: 'SystemAssigned' + } +} + +resource manufacturingAdxDB 'Microsoft.Kusto/clusters/databases@2023-05-02' = { + parent: adxCluster + name: adxDBName + location: location + kind: 'ReadWrite' +} + +resource azureEventHubsDataReceiverRole 'Microsoft.Authorization/roleDefinitions@2022-04-01' existing = { + name: 'a638d3c7-ab3a-418d-83e6-5f17a39d4fde' + scope: tenant() +} + +resource eventHub 'Microsoft.EventHub/namespaces/eventhubs@2023-01-01-preview' existing = { + name: '${eventHubNamespaceName}/${eventHubName}' +} + +resource eventHubRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid('AzureEventHubsDataReceiverRole', adxCluster.id, eventHubResourceId) + scope: eventHub + properties: { + roleDefinitionId: azureEventHubsDataReceiverRole.id + principalId: adxCluster.identity.principalId + } +} + +output adxEndpoint string = adxCluster.properties.uri diff --git a/azure_jumpstart_ag/manufacturing/bicep/data/eventGrid.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/eventGrid.bicep similarity index 100% rename from azure_jumpstart_ag/manufacturing/bicep/data/eventGrid.bicep rename to azure_jumpstart_ag/contoso_hypermarket/bicep/data/eventGrid.bicep diff --git a/azure_jumpstart_ag/manufacturing/bicep/data/eventHub.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/eventHub.bicep similarity index 100% rename from azure_jumpstart_ag/manufacturing/bicep/data/eventHub.bicep rename to azure_jumpstart_ag/contoso_hypermarket/bicep/data/eventHub.bicep diff --git a/azure_jumpstart_ag/manufacturing/bicep/data/keyVault.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep similarity index 100% rename from azure_jumpstart_ag/manufacturing/bicep/data/keyVault.bicep rename to azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep diff --git a/azure_jumpstart_ag/manufacturing/bicep/kubernetes/acr.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/acr.bicep similarity index 100% rename from azure_jumpstart_ag/manufacturing/bicep/kubernetes/acr.bicep rename to azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/acr.bicep diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep new file mode 100644 index 0000000000..8bb0444f74 --- /dev/null +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep @@ -0,0 +1,179 @@ +@description('The name of you Virtual Machine') +param vmName string = 'Ag-K3s-${namingGuid}' + +@description('Username for the Virtual Machine') +param adminUsername string = 'arcdemo' + +@description('RSA public key used for securing SSH access to ArcBox resources. This parameter is only needed when deploying the DataOps or DevOps flavors.') +@secure() +param sshRSAPublicKey string = '' + +@description('The Ubuntu version for the VM. This will pick a fully patched image of this given Ubuntu version') +@allowed([ + '22_04-lts-gen2' +]) +param ubuntuOSVersion string = '22_04-lts-gen2' + +@description('Location for all resources.') +param azureLocation string = resourceGroup().location + +@description('The size of the VM') +param vmSize string = 'Standard_B4ms' + +@description('Resource Id of the subnet in the virtual network') +param subnetId string + +@description('Name for the staging storage account using to hold kubeconfig. This value is passed into the template as an output from mgmtStagingStorage.json') +param stagingStorageAccountName string + +@description('Name of the Log Analytics workspace used with cluster extensions') +param logAnalyticsWorkspace string + +@description('The base URL used for accessing artifacts and automation artifacts') +param templateBaseUrl string + +@description('Storage account container name for artifacts') +param storageContainerName string + +@maxLength(5) +@description('Random GUID') +param namingGuid string + +var publicIpAddressName = '${vmName}-PIP' +var networkInterfaceName = '${vmName}-NIC' +var osDiskType = 'Premium_LRS' +var k3sControlPlane = 'true' // deploy single-node k3s control plane +var diskSize = 512 +var numberOfIPAddresses = 8 // The number of IP addresses to create + +// Create multiple public IP addresses if deployBastion is false +resource publicIpAddresses 'Microsoft.Network/publicIpAddresses@2022-01-01' = [for i in range(1, numberOfIPAddresses): { + name: '${publicIpAddressName}${i}' + location: azureLocation + properties: { + publicIPAllocationMethod: 'Static' + publicIPAddressVersion: 'IPv4' + idleTimeoutInMinutes: 4 + } + sku: { + name: 'Basic' + } +}] + +// Create multiple NIC IP configurations and assign the public IP to the IP configuration if deployBastion is false +resource networkInterface 'Microsoft.Network/networkInterfaces@2022-01-01' = { + name: networkInterfaceName + location: azureLocation + properties: { + ipConfigurations: [for i in range(1, numberOfIPAddresses): { + name: 'ipconfig${i}' + properties: { + subnet: { + id: subnetId + } + privateIPAllocationMethod: 'Dynamic' + publicIPAddress: { + id: publicIpAddresses[i-1].id + } + primary: i == 1 ? true : false + } + }] + } +} + +resource vm 'Microsoft.Compute/virtualMachines@2022-03-01' = { + name: vmName + location: azureLocation + identity: { + type: 'SystemAssigned' + } + properties: { + hardwareProfile: { + vmSize: vmSize + } + storageProfile: { + osDisk: { + name: '${vmName}-OSDisk' + caching: 'ReadWrite' + createOption: 'FromImage' + managedDisk: { + storageAccountType: osDiskType + } + diskSizeGB: diskSize + } + imageReference: { + publisher: 'canonical' + offer: '0001-com-ubuntu-server-jammy' + sku: ubuntuOSVersion + version: 'latest' + } + } + networkProfile: { + networkInterfaces: [ + { + id: networkInterface.id + } + ] + } + osProfile: { + computerName: vmName + adminUsername: adminUsername + linuxConfiguration: { + disablePasswordAuthentication: true + ssh: { + publicKeys: [ + { + path: '/home/${adminUsername}/.ssh/authorized_keys' + keyData: sshRSAPublicKey + } + ] + } + } + } + } +} + +// Add role assignment for the VM: Owner role +resource vmRoleAssignment_Owner 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid(vm.id, 'Microsoft.Authorization/roleAssignments', 'Owner') + scope: resourceGroup() + properties: { + principalId: vm.identity.principalId + roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', '8e3af657-a8ff-443c-a75c-2fe8c4bcb635') + principalType: 'ServicePrincipal' + } +} + +// Add role assignment for the VM: Storage Blob Data Contributor +resource vmRoleAssignment_Storage 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid(vm.id, 'Microsoft.Authorization/roleAssignments', 'Storage Blob Data Contributor') + scope: resourceGroup() + properties: { + principalId: vm.identity.principalId + roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe') + principalType: 'ServicePrincipal' + } +} + +resource vmInstallscriptK3s 'Microsoft.Compute/virtualMachines/extensions@2022-03-01' = { + parent: vm + name: 'installscript_k3s' + location: azureLocation + properties: { + publisher: 'Microsoft.Azure.Extensions' + type: 'CustomScript' + typeHandlerVersion: '2.1' + autoUpgradeMinorVersion: true + settings: {} + protectedSettings: { + commandToExecute: 'bash installK3s.sh ${adminUsername} ${subscription().subscriptionId} ${vmName} ${azureLocation} ${stagingStorageAccountName} ${logAnalyticsWorkspace} ${templateBaseUrl} ${storageContainerName} ${k3sControlPlane}' + fileUris: [ + '${templateBaseUrl}artifacts/kubernetes/K3s/installK3s.sh' + ] + } + } + dependsOn: [ + vmRoleAssignment_Owner + vmRoleAssignment_Storage + ] +} \ No newline at end of file diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep new file mode 100644 index 0000000000..47c84430e0 --- /dev/null +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep @@ -0,0 +1,158 @@ + +@description('The name of you Virtual Machine') +param vmName string = 'Ag-K3s-Node-${namingGuid}' + +@description('Username for the Virtual Machine') +param adminUsername string = 'arcdemo' + +@description('RSA public key used for securing SSH access to ArcBox resources. This parameter is only needed when deploying the DataOps or DevOps flavors.') +@secure() +param sshRSAPublicKey string = '' + +@description('The Ubuntu version for the VM. This will pick a fully patched image of this given Ubuntu version') +@allowed([ + '22_04-lts-gen2' +]) +param ubuntuOSVersion string = '22_04-lts-gen2' + +@description('Location for all resources.') +param azureLocation string = resourceGroup().location + +@description('Resource Id of the subnet in the virtual network') +param subnetId string + +@description('Name for the staging storage account using to hold kubeconfig. This value is passed into the template as an output from mgmtStagingStorage.json') +param stagingStorageAccountName string + +@description('Name of the Log Analytics workspace used with cluster extensions') +param logAnalyticsWorkspace string + +@description('The base URL used for accessing artifacts and automation artifacts') +param templateBaseUrl string + +@description('Storage account container name for artifacts') +param storageContainerName string + +@maxLength(5) +@description('Random GUID') +param namingGuid string + +var networkInterfaceName = '${vmName}-NIC' +var osDiskType = 'Premium_LRS' +var vmSize = 'Standard_D8s_v5' +var diskSize = 512 + +resource networkInterface 'Microsoft.Network/networkInterfaces@2022-01-01' = { + name: networkInterfaceName + location: azureLocation + properties: { + ipConfigurations: [ + { + name: 'ipconfig1' + properties: { + subnet: { + id: subnetId + } + privateIPAllocationMethod: 'Dynamic' + } + } + ] + } +} + +resource vm 'Microsoft.Compute/virtualMachines@2022-03-01' = { + name: vmName + location: azureLocation + identity: { + type: 'SystemAssigned' + } + properties: { + hardwareProfile: { + vmSize: vmSize + } + storageProfile: { + osDisk: { + name: '${vmName}-OSDisk' + caching: 'ReadWrite' + createOption: 'FromImage' + managedDisk: { + storageAccountType: osDiskType + } + diskSizeGB: diskSize + } + imageReference: { + publisher: 'canonical' + offer: '0001-com-ubuntu-server-jammy' + sku: ubuntuOSVersion + version: 'latest' + } + } + networkProfile: { + networkInterfaces: [ + { + id: networkInterface.id + } + ] + } + osProfile: { + computerName: vmName + adminUsername: adminUsername + linuxConfiguration: { + disablePasswordAuthentication: true + ssh: { + publicKeys: [ + { + path: '/home/${adminUsername}/.ssh/authorized_keys' + keyData: sshRSAPublicKey + } + ] + } + } + } + } +} + +// Add role assignment for the VM: Owner role +resource vmRoleAssignment_Owner 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid(vm.id, 'Microsoft.Authorization/roleAssignments', 'Owner') + scope: resourceGroup() + properties: { + principalId: vm.identity.principalId + roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', '8e3af657-a8ff-443c-a75c-2fe8c4bcb635') + principalType: 'ServicePrincipal' + } +} + +// Add role assignment for the VM: Storage Blob Data Contributor +resource vmRoleAssignment_Storage 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid(vm.id, 'Microsoft.Authorization/roleAssignments', 'Storage Blob Data Contributor') + scope: resourceGroup() + properties: { + principalId: vm.identity.principalId + roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe') + principalType: 'ServicePrincipal' + } +} + +resource vmInstallscriptK3s 'Microsoft.Compute/virtualMachines/extensions@2022-03-01' = { + parent: vm + name: 'installscript_k3s' + location: azureLocation + properties: { + publisher: 'Microsoft.Azure.Extensions' + type: 'CustomScript' + typeHandlerVersion: '2.1' + autoUpgradeMinorVersion: true + settings: {} + protectedSettings: { + commandToExecute: 'bash installK3s.sh ${adminUsername} ${subscription().subscriptionId} ${vmName} ${azureLocation} ${stagingStorageAccountName} ${logAnalyticsWorkspace} ${templateBaseUrl} ${storageContainerName}' + fileUris: [ + '${templateBaseUrl}artifacts/kubernetes/K3s/installK3s.sh' + ] + } + } + dependsOn: [ + vmRoleAssignment_Owner + vmRoleAssignment_Storage + ] +} \ No newline at end of file diff --git a/azure_jumpstart_ag/retail/bicep/main.azd.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.azd.bicep similarity index 98% rename from azure_jumpstart_ag/retail/bicep/main.azd.bicep rename to azure_jumpstart_ag/contoso_hypermarket/bicep/main.azd.bicep index cb6680b118..6c8e6ee20b 100644 --- a/azure_jumpstart_ag/retail/bicep/main.azd.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.azd.bicep @@ -87,8 +87,8 @@ param acrName string = 'agacr${namingGuid}' @description('Override default RDP port using this parameter. Default is 3389. No changes will be made to the client VM.') param rdpPort string = '3389' -@description('The agora industry to be deployed') -param industry string = 'retail' +@description('The agora scenario to be deployed') +param scenario string = 'contoso_supermarket' var templateBaseUrl = 'https://raw.githubusercontent.com/${githubAccount}/azure_arc/${githubBranch}/azure_jumpstart_ag/' @@ -170,7 +170,7 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { rdpPort: rdpPort adxClusterName: adxClusterName namingGuid: namingGuid - industry: industry + scenario: scenario } } diff --git a/azure_jumpstart_ag/retail/bicep/main.azd.parameters.json b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.azd.parameters.json similarity index 100% rename from azure_jumpstart_ag/retail/bicep/main.azd.parameters.json rename to azure_jumpstart_ag/contoso_hypermarket/bicep/main.azd.parameters.json diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep new file mode 100644 index 0000000000..20b1470c65 --- /dev/null +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -0,0 +1,287 @@ +@description('Azure service principal client id') +param spnClientId string + +@description('Azure service principal client secret') +@secure() +param spnClientSecret string + +@description('Azure AD tenant id for your service principal') +param spnTenantId string + +@description('Azure service principal object id') +param spnObjectId string + +@description('Location for all resources') +param location string = resourceGroup().location + +@maxLength(5) +@description('Random GUID') +param namingGuid string = toLower(substring(newGuid(), 0, 5)) + +@description('Username for Windows account') +param windowsAdminUsername string + +@description('Password for Windows account. Password must have 3 of the following: 1 lower case character, 1 upper case character, 1 number, and 1 special character. The value must be between 12 and 123 characters long') +@minLength(12) +@maxLength(123) +@secure() +param windowsAdminPassword string + +@description('Configure all linux machines with the SSH RSA public key string. Your key should include three parts, for example \'ssh-rsa AAAAB...snip...UcyupgH azureuser@linuxvm\'') +param sshRSAPublicKey string + +@description('Name for your log analytics workspace') +param logAnalyticsWorkspaceName string = 'Ag-Workspace-${namingGuid}' + +@description('Target GitHub account') +param githubAccount string = 'microsoft' + +@description('Target GitHub branch') +param githubBranch string = 'agora_2.0' + +@description('Choice to deploy Bastion to connect to the client VM') +param deployBastion bool = false + +@description('Name of the Cloud VNet') +param virtualNetworkNameCloud string = 'Ag-Vnet-Prod' + +@description('Name of the Staging AKS subnet in the cloud virtual network') +param subnetNameCloudK3s string = 'Ag-Subnet-K3s' + +@description('Name of the inner-loop AKS subnet in the cloud virtual network') +param subnetNameCloud string = 'Ag-Subnet-Cloud' + +@description('The name of the Azure Data Explorer cluster') +param adxClusterName string = 'agadx${namingGuid}' + +@description('Name of the storage queue') +param storageQueueName string = 'aioqueue' + +@description('Name of the event hub') +param eventHubName string = 'aiohub${namingGuid}' + +@description('Name of the event hub namespace') +param eventHubNamespaceName string = 'aiohubns${namingGuid}' + +@description('Name of the event grid namespace') +param eventGridNamespaceName string = 'aioeventgridns${namingGuid}' + +@description('Name of the storage account') +param aioStorageAccountName string = 'aiostg${namingGuid}' + +@description('The name of the Azure Data Explorer Event Hub consumer group for assemblybatteries') +param stagingDataCGName string = 'mqttdataemulator' + +@description('The name of ESA container in Storage Account') +param stcontainerName string = 'esacontainer' + +@description('The custom location RPO ID') +param customLocationRPOID string + +@minLength(5) +@maxLength(50) +@description('Name of the Azure Container Registry') +param acrName string = 'agacr${namingGuid}' + +@description('Override default RDP port using this parameter. Default is 3389. No changes will be made to the client VM.') +param rdpPort string = '3389' + +@description('The agora scenario to be deployed') +param scenario string = 'contoso_hypermarket' + +@description('The name of the Azure Arc K3s cluster') +param k3sArcDataClusterName string = 'Ag-K3s-Seattle-${namingGuid}' + +@description('The name of the Azure Arc K3s data cluster') +param k3sArcClusterName string = 'Ag-K3s-Chicago-${namingGuid}' + +@description('The name of the Key Vault for site 1') +param akvNameSite1 string = 'agakv1${namingGuid}' + +@description('The name of the Key Vault for site 2') +param akvNameSite2 string = 'agakv2${namingGuid}' + +var templateBaseUrl = 'https://raw.githubusercontent.com/${githubAccount}/azure_arc/${githubBranch}/azure_jumpstart_ag/' +var k3sClusterNodesCount = 2 // Number of nodes to deploy in the K3s cluster + +module mgmtArtifactsAndPolicyDeployment 'mgmt/mgmtArtifacts.bicep' = { + name: 'mgmtArtifactsAndPolicyDeployment' + params: { + workspaceName: logAnalyticsWorkspaceName + location: location + } +} + +module networkDeployment 'mgmt/network.bicep' = { + name: 'networkDeployment' + params: { + virtualNetworkNameCloud: virtualNetworkNameCloud + subnetNameCloudK3s: subnetNameCloudK3s + subnetNameCloud: subnetNameCloud + deployBastion: deployBastion + location: location + } +} + +module storageAccountDeployment 'mgmt/storageAccount.bicep' = { + name: 'storageAccountDeployment' + params: { + location: location + spnObjectId: spnObjectId + } +} + +module ubuntuRancherK3sDataSvcDeployment 'kubernetes/ubuntuRancher.bicep' = { + name: 'ubuntuRancherK3sDataSvcDeployment' + params: { + sshRSAPublicKey: sshRSAPublicKey + stagingStorageAccountName: toLower(storageAccountDeployment.outputs.storageAccountName) + logAnalyticsWorkspace: logAnalyticsWorkspaceName + templateBaseUrl: templateBaseUrl + subnetId: networkDeployment.outputs.k3sSubnetId + azureLocation: location + vmName : k3sArcDataClusterName + storageContainerName: toLower(k3sArcDataClusterName) + namingGuid: namingGuid + } +} + +module ubuntuRancherK3sDeployment 'kubernetes/ubuntuRancher.bicep' = { + name: 'ubuntuRancherK3sDeployment' + params: { + sshRSAPublicKey: sshRSAPublicKey + stagingStorageAccountName: toLower(storageAccountDeployment.outputs.storageAccountName) + logAnalyticsWorkspace: logAnalyticsWorkspaceName + templateBaseUrl: templateBaseUrl + subnetId: networkDeployment.outputs.k3sSubnetId + azureLocation: location + vmName : k3sArcClusterName + storageContainerName: toLower(k3sArcClusterName) + namingGuid: namingGuid + } +} + +module ubuntuRancherK3sDataSvcNodesDeployment 'kubernetes/ubuntuRancherNodes.bicep' = [for i in range(0, k3sClusterNodesCount): { + name: 'ubuntuRancherK3sDataSvcNodesDeployment-${i}' + params: { + sshRSAPublicKey: sshRSAPublicKey + stagingStorageAccountName: toLower(storageAccountDeployment.outputs.storageAccountName) + logAnalyticsWorkspace: logAnalyticsWorkspaceName + templateBaseUrl: templateBaseUrl + subnetId: networkDeployment.outputs.k3sSubnetId + azureLocation: location + vmName : '${k3sArcDataClusterName}-Node-0${i}' + storageContainerName: toLower(k3sArcDataClusterName) + namingGuid: namingGuid + } + dependsOn: [ + ubuntuRancherK3sDataSvcDeployment + ] +}] + +module ubuntuRancherK3sNodesDeployment 'kubernetes/ubuntuRancherNodes.bicep' = [for i in range(0, k3sClusterNodesCount): { + name: 'ubuntuRancherK3sNodesDeployment-${i}' + params: { + sshRSAPublicKey: sshRSAPublicKey + stagingStorageAccountName: toLower(storageAccountDeployment.outputs.storageAccountName) + logAnalyticsWorkspace: logAnalyticsWorkspaceName + templateBaseUrl: templateBaseUrl + subnetId: networkDeployment.outputs.k3sSubnetId + azureLocation: location + vmName : '${k3sArcClusterName}-Node-0${i}' + storageContainerName: toLower(k3sArcClusterName) + namingGuid: namingGuid + } + dependsOn: [ + ubuntuRancherK3sDeployment + ] +}] + +module clientVmDeployment 'clientVm/clientVm.bicep' = { + name: 'clientVmDeployment' + params: { + windowsAdminUsername: windowsAdminUsername + windowsAdminPassword: windowsAdminPassword + spnClientId: spnClientId + spnClientSecret: spnClientSecret + spnTenantId: spnTenantId + workspaceName: logAnalyticsWorkspaceName + storageAccountName: storageAccountDeployment.outputs.storageAccountName + templateBaseUrl: templateBaseUrl + deployBastion: deployBastion + githubAccount: githubAccount + githubBranch: githubBranch + location: location + subnetId: networkDeployment.outputs.cloudSubnetId + acrName: acrName + rdpPort: rdpPort + adxClusterName: adxClusterName + namingGuid: namingGuid + scenario: scenario + customLocationRPOID: customLocationRPOID + spnObjectId: spnObjectId + stcontainerName: stcontainerName + k3sArcClusterName: k3sArcClusterName + k3sArcDataClusterName: k3sArcDataClusterName + } +} +module adx 'data/dataExplorer.bicep' = { + name: 'adxDeployment' + params: { + adxClusterName: adxClusterName + location: location + eventHubResourceId: eventHub.outputs.eventHubResourceId + eventHubName: eventHubName + eventHubNamespaceName: eventHubNamespaceName + } +} + +module acr 'kubernetes/acr.bicep' = { + name: 'acrDeployment' + params: { + acrName: acrName + location: location + } +} + +module keyVault 'data/keyVault.bicep' = { + name: 'keyVaultDeployment' + params: { + tenantId: spnTenantId + akvNameSite1: akvNameSite1 + akvNameSite2: akvNameSite2 + location: location + } +} + +module eventGrid 'data/eventGrid.bicep' = { + name: 'eventGridDeployment' + params: { + eventGridNamespaceName: eventGridNamespaceName + eventHubResourceId: eventHub.outputs.eventHubResourceId + queueName: storageQueueName + storageAccountResourceId: storageAccount.outputs.storageAccountResourceId + namingGuid: namingGuid + location: location + } +} + +module storageAccount 'storage/storageAccount.bicep' = { + name: 'aioStorageAccountDeployment' + params: { + storageAccountName: aioStorageAccountName + location: location + storageQueueName: storageQueueName + stcontainerName: stcontainerName + } +} + +module eventHub 'data/eventHub.bicep' = { + name: 'eventHubDeployment' + params: { + eventHubName: eventHubName + eventHubNamespaceName: eventHubNamespaceName + location: location + stagingDataCGName: stagingDataCGName + } +} diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.parameters.json b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.parameters.json new file mode 100644 index 0000000000..14c9728505 --- /dev/null +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.parameters.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "spnClientId": { + "value": "" + }, + "spnClientSecret": { + "value": "" + }, + "spnTenantId": { + "value": "" + }, + "spnObjectId": { + "value": "" + }, + "windowsAdminUsername": { + "value": "" + }, + "windowsAdminPassword": { + "value": "" + }, + "deployBastion": { + "value": false + }, + "customLocationRPOID": { + "value": "" + }, + "sshRSAPublicKey": { + "value": "" + } + } +} diff --git a/azure_jumpstart_ag/retail/bicep/mgmt/mgmtArtifacts.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/mgmtArtifacts.bicep similarity index 100% rename from azure_jumpstart_ag/retail/bicep/mgmt/mgmtArtifacts.bicep rename to azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/mgmtArtifacts.bicep diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep new file mode 100644 index 0000000000..09fa4ae2e0 --- /dev/null +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep @@ -0,0 +1,368 @@ +@description('Name of the Cloud VNet') +param virtualNetworkNameCloud string + +@description('Name of the K3s subnet in the cloud virtual network') +param subnetNameCloudK3s string + +@description('Name of the inner-loop subnet in the cloud virtual network') +param subnetNameCloud string + +@description('Azure Region to deploy the Log Analytics Workspace') +param location string = resourceGroup().location + +@description('Resource tag for Jumpstart Agora') +param resourceTags object = { + Project: 'Jumpstart_Agora' +} + +@description('Choice to deploy Bastion to connect to the client VM') +param deployBastion bool = false + +@description('Name of the prod Network Security Group') +param networkSecurityGroupNameCloud string = 'Ag-NSG-Prod' + +@description('Name of the Bastion Network Security Group') +param bastionNetworkSecurityGroupName string = 'Ag-NSG-Bastion' + +var addressPrefixCloud = '10.16.0.0/16' +var subnetAddressPrefixK3s = '10.16.80.0/21' +var subnetAddressPrefixCloud = '10.16.64.0/21' +var bastionSubnetIpPrefix = '10.16.3.64/26' +var bastionSubnetName = 'AzureBastionSubnet' +var bastionSubnetRef = '${cloudVirtualNetwork.id}/subnets/${bastionSubnetName}' +var bastionName = 'Ag-Bastion' +var bastionPublicIpAddressName = '${bastionName}-PIP' + + +var bastionSubnet = [ + { + name: 'AzureBastionSubnet' + properties: { + addressPrefix: bastionSubnetIpPrefix + networkSecurityGroup: { + id: bastionNetworkSecurityGroup.id + } + } + } +] +var cloudK3sSubnet = [ + { + name: subnetNameCloudK3s + properties: { + addressPrefix: subnetAddressPrefixK3s + privateEndpointNetworkPolicies: 'Enabled' + privateLinkServiceNetworkPolicies: 'Enabled' + networkSecurityGroup: { + id: networkSecurityGroupCloud.id + } + } + } +] + +var cloudSubnet = [ + { + name: subnetNameCloud + properties: { + addressPrefix: subnetAddressPrefixCloud + privateEndpointNetworkPolicies: 'Enabled' + privateLinkServiceNetworkPolicies: 'Enabled' + networkSecurityGroup: { + id: networkSecurityGroupCloud.id + } + } + } +] + +resource cloudVirtualNetwork 'Microsoft.Network/virtualNetworks@2022-07-01' = { + name: virtualNetworkNameCloud + location: location + tags: resourceTags + properties: { + addressSpace: { + addressPrefixes: [ + addressPrefixCloud + ] + } + subnets: (deployBastion == false) ? union (cloudK3sSubnet,cloudSubnet) : union(cloudK3sSubnet,cloudSubnet,bastionSubnet) + } +} + +resource publicIpAddress 'Microsoft.Network/publicIPAddresses@2023-02-01' = if (deployBastion == true) { + name: bastionPublicIpAddressName + location: location + tags: resourceTags + properties: { + publicIPAllocationMethod: 'Static' + publicIPAddressVersion: 'IPv4' + idleTimeoutInMinutes: 4 + } + sku: { + name: 'Standard' + } +} + +resource networkSecurityGroupCloud 'Microsoft.Network/networkSecurityGroups@2023-02-01' = { + name: networkSecurityGroupNameCloud + location: location + tags: resourceTags + properties: { + securityRules: [ + { + name: 'allow_k8s_80' + properties: { + priority: 1000 + protocol: 'TCP' + access: 'Allow' + direction: 'Inbound' + sourceAddressPrefix: '*' + sourcePortRange: '*' + destinationAddressPrefix: '*' + destinationPortRange: '80' + } + } + { + name: 'allow_k8s_8080' + properties: { + priority: 1010 + protocol: 'TCP' + access: 'Allow' + direction: 'Inbound' + sourceAddressPrefix: '*' + sourcePortRange: '*' + destinationAddressPrefix: '*' + destinationPortRange: '8080' + } + } + { + name: 'allow_k8s_443' + properties: { + priority: 1020 + protocol: 'TCP' + access: 'Allow' + direction: 'Inbound' + sourceAddressPrefix: '*' + sourcePortRange: '*' + destinationAddressPrefix: '*' + destinationPortRange: '443' + } + } + { + name: 'allow_prometheus_9090' + properties: { + priority: 1030 + protocol: 'TCP' + access: 'Allow' + direction: 'Inbound' + sourceAddressPrefix: '*' + sourcePortRange: '*' + destinationAddressPrefix: '*' + destinationPortRange: '9090' + } + } + { + name: 'allow_MQ_8883' + properties: { + priority: 1040 + protocol: 'TCP' + access: 'Allow' + direction: 'Inbound' + sourceAddressPrefix: '*' + sourcePortRange: '*' + destinationAddressPrefix: '*' + destinationPortRange: '8883' + } + } + { + name: 'allow_MQ_1883' + properties: { + priority: 1050 + protocol: 'TCP' + access: 'Allow' + direction: 'Inbound' + sourceAddressPrefix: '*' + sourcePortRange: '*' + destinationAddressPrefix: '*' + destinationPortRange: '1883' + } + } + { + name: 'allow_k8s_kubelet' + properties: { + priority: 1060 + protocol: 'Tcp' + access: 'Allow' + direction: 'Inbound' + sourceAddressPrefix: '*' + sourcePortRange: '*' + destinationAddressPrefix: '*' + destinationPortRange: '10250' + } + } + { + name: 'allow_traefik_lb_external' + properties: { + priority: 1070 + protocol: 'Tcp' + access: 'Allow' + direction: 'Inbound' + sourceAddressPrefix: '*' + sourcePortRange: '*' + destinationAddressPrefix: '*' + destinationPortRange: '32323' + } + } + ] + } +} + +resource bastionNetworkSecurityGroup 'Microsoft.Network/networkSecurityGroups@2023-02-01' = if (deployBastion == true) { + name: bastionNetworkSecurityGroupName + location: location + tags: resourceTags + properties: { + securityRules: [ + { + name: 'bastion_allow_https_inbound' + properties: { + priority: 1010 + protocol: 'TCP' + access: 'Allow' + direction: 'Inbound' + sourceAddressPrefix: 'Internet' + sourcePortRange: '*' + destinationAddressPrefix: '*' + destinationPortRange: '443' + } + } + { + name: 'bastion_allow_gateway_manager_inbound' + properties: { + priority: 1011 + protocol: 'TCP' + access: 'Allow' + direction: 'Inbound' + sourceAddressPrefix: 'GatewayManager' + sourcePortRange: '*' + destinationAddressPrefix: '*' + destinationPortRange: '443' + } + } + { + name: 'bastion_allow_load_balancer_inbound' + properties: { + priority: 1012 + protocol: 'TCP' + access: 'Allow' + direction: 'Inbound' + sourceAddressPrefix: 'AzureLoadBalancer' + sourcePortRange: '*' + destinationAddressPrefix: '*' + destinationPortRange: '443' + } + } + { + name: 'bastion_allow_host_comms' + properties: { + priority: 1013 + protocol: '*' + access: 'Allow' + direction: 'Inbound' + sourceAddressPrefix: 'VirtualNetwork' + sourcePortRange: '*' + destinationAddressPrefix: 'VirtualNetwork' + destinationPortRanges: [ + '8080' + '5701' + ] + } + } + { + name: 'bastion_allow_ssh_rdp_outbound' + properties: { + priority: 1014 + protocol: '*' + access: 'Allow' + direction: 'Outbound' + sourceAddressPrefix: '*' + sourcePortRange: '*' + destinationAddressPrefix: 'VirtualNetwork' + destinationPortRanges: [ + '22' + '3389' + ] + } + } + { + name: 'bastion_allow_azure_cloud_outbound' + properties: { + priority: 1015 + protocol: 'TCP' + access: 'Allow' + direction: 'Outbound' + sourceAddressPrefix: '*' + sourcePortRange: '*' + destinationAddressPrefix: 'AzureCloud' + destinationPortRange: '443' + } + } + { + name: 'bastion_allow_bastion_comms' + properties: { + priority: 1016 + protocol: '*' + access: 'Allow' + direction: 'Outbound' + sourceAddressPrefix: 'VirtualNetwork' + sourcePortRange: '*' + destinationAddressPrefix: 'VirtualNetwork' + destinationPortRanges: [ + '8080' + '5701' + ] + } + } + { + name: 'bastion_allow_get_session_info' + properties: { + priority: 1017 + protocol: '*' + access: 'Allow' + direction: 'Outbound' + sourceAddressPrefix: '*' + sourcePortRange: '*' + destinationAddressPrefix: 'Internet' + destinationPortRanges: [ + '80' + '443' + ] + } + } + ] + } +} + +resource bastionHost 'Microsoft.Network/bastionHosts@2023-02-01' = if (deployBastion == true) { + name: bastionName + location: location + tags: resourceTags + properties: { + ipConfigurations: [ + { + name: 'IpConf' + properties: { + publicIPAddress: { + id: publicIpAddress.id + } + subnet: { + id: bastionSubnetRef + } + } + } + ] + } +} + +output vnetId string = cloudVirtualNetwork.id +output k3sSubnetId string = cloudVirtualNetwork.properties.subnets[0].id +output cloudSubnetId string = cloudVirtualNetwork.properties.subnets[1].id +output virtualNetworkNameCloud string = cloudVirtualNetwork.name diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/policyAzureArcRGScope.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/policyAzureArcRGScope.bicep new file mode 100644 index 0000000000..150db6250c --- /dev/null +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/policyAzureArcRGScope.bicep @@ -0,0 +1,125 @@ +@description('Location of your Azure resources') +param azureLocation string + +@description('Name of your log analytics workspace') +param logAnalyticsWorkspaceId string + +var policies = [ + { + name: '(Ag) Enable Azure Monitor for Hybrid VMs with AMA' + definitionId: '/providers/Microsoft.Authorization/policySetDefinitions/59e9c3eb-d8df-473b-8059-23fd38ddd0f0' + roleDefinition: [ + '/subscriptions/${subscription().subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/92aaf0da-9dab-42b6-94a3-d43ce8d16293' + '/subscriptions/${subscription().subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/cd570a14-e51a-42ad-bac8-bafd67325302' + '/subscriptions/${subscription().subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/749f88d5-cbae-40b8-bcfc-e573ddc772fa' + ] + scope: resourceGroup().id + parameters: { + logAnalyticsWorkspace: { + value: logAnalyticsWorkspaceId + } + enableProcessesAndDependencies: { + value: true + } + } + } + { + name: '(Ag) Deploy Azure Security agent on Windows Arc machines' + definitionId: '/providers/Microsoft.Authorization/policyDefinitions/d01f3018-de9f-4d75-8dae-d12c1875da9f' + roleDefinition: '/subscriptions/${subscription().subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/92aaf0da-9dab-42b6-94a3-d43ce8d16293' + parameters: {} + } + { + name: '(Ag) Deploy Azure Security agent on Linux Arc machines' + definitionId: '/providers/Microsoft.Authorization/policyDefinitions/2f47ec78-4301-4655-b78e-b29377030cdc' + roleDefinition: '/subscriptions/${subscription().subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/92aaf0da-9dab-42b6-94a3-d43ce8d16293' + parameters: {} + } + { + name: '(Ag) Deploy MDE agent on Windows Arc machines' + definitionId: '/providers/Microsoft.Authorization/policyDefinitions/37c043a6-6d64-656d-6465-b362dfeb354a' + roleDefinition: '/subscriptions/${subscription().subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c' + parameters: {} + } + { + name: '(Ag) Deploy MDE agent on Linux Arc machines' + definitionId: '/providers/Microsoft.Authorization/policyDefinitions/4eb909e7-6d64-656d-6465-2eeb297a1625' + roleDefinition: '/subscriptions/${subscription().subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c' + parameters: {} + } +] + +resource policies_name 'Microsoft.Authorization/policyAssignments@2022-06-01' = [for item in policies: { + name: item.name + location: azureLocation + identity: { + type: 'SystemAssigned' + } + properties: { + policyDefinitionId: any(item.definitionId) + parameters: item.parameters + } +}] + +resource policy_AMA_role_0 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid( policies[0].name, policies[0].roleDefinition[0],resourceGroup().id) + properties: { + roleDefinitionId: any(policies[0].roleDefinition[0]) + principalId: policies_name[0].identity.principalId + principalType: 'ServicePrincipal' + } +} + +resource policy_AMA_role_1 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid( policies[0].name, policies[0].roleDefinition[1],resourceGroup().id) + properties: { + roleDefinitionId: any(policies[0].roleDefinition[1]) + principalId: policies_name[0].identity.principalId + principalType: 'ServicePrincipal' + } +} + +resource policy_AMA_role_2 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid( policies[0].name, policies[0].roleDefinition[2],resourceGroup().id) + properties: { + roleDefinitionId: any(policies[0].roleDefinition[2]) + principalId: policies_name[0].identity.principalId + principalType: 'ServicePrincipal' + } +} + +resource policy_arc_windows_azure_security_agent 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid( policies[1].name, policies[1].roleDefinition,resourceGroup().id) + properties: { + roleDefinitionId: any(policies[1].roleDefinition) + principalId: policies_name[1].identity.principalId + principalType: 'ServicePrincipal' + } +} + +resource policy_arc_linux_azure_security_agent 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid( policies[2].name, policies[2].roleDefinition,resourceGroup().id) + properties: { + roleDefinitionId: any(policies[2].roleDefinition) + principalId: policies_name[2].identity.principalId + principalType: 'ServicePrincipal' + } +} + +resource policy_arc_windows_mde 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid( policies[3].name, policies[3].roleDefinition,resourceGroup().id) + properties: { + roleDefinitionId: any(policies[3].roleDefinition) + principalId: policies_name[3].identity.principalId + principalType: 'ServicePrincipal' + } +} + +resource policy_arc_linux_mde 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid( policies[4].name, policies[4].roleDefinition,resourceGroup().id) + properties: { + roleDefinitionId: any(policies[4].roleDefinition) + principalId: policies_name[4].identity.principalId + principalType: 'ServicePrincipal' + } +} diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/storageAccount.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/storageAccount.bicep new file mode 100644 index 0000000000..6e4afde511 --- /dev/null +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/storageAccount.bicep @@ -0,0 +1,51 @@ +@description('Storage Account type') +@allowed([ + 'Standard_LRS' + 'Standard_GRS' + 'Standard_ZRS' + 'Premium_LRS' +]) +param storageAccountType string = 'Standard_LRS' + +@description('Location for all resources.') +param location string = resourceGroup().location + +@description('Resource tag for Jumpstart Agora') +param resourceTags object = { + Project: 'Jumpstart_Agora' +} + +@description('Azure service principal object id') +param spnObjectId string + +var storageAccountName = 'agora${uniqueString(resourceGroup().id)}' + +resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = { + name: storageAccountName + location: location + tags: resourceTags + sku: { + name: storageAccountType + } + kind: 'StorageV2' + properties: { + supportsHttpsTrafficOnly: true + allowBlobPublicAccess: true + } +} + +// Add role assignment for the SPN: Storage Blob Data Contributo +resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid(spnObjectId, resourceGroup().id, 'ba92f5b4-2d11-453d-a403-e96b0029c9fe') + scope: resourceGroup() + properties: { + principalId: spnObjectId + roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe') + principalType: 'ServicePrincipal' + + } +} + + +output storageAccountName string = storageAccountName +output storageAccountResourceId string = storageAccount.id diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep new file mode 100644 index 0000000000..0f767fe74f --- /dev/null +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep @@ -0,0 +1,48 @@ +@description('Storage account name') +param storageAccountName string + +@description('Storage account location') +param location string = resourceGroup().location + +@description('Storage account kind') +param kind string = 'StorageV2' + +@description('Storage account sku') +param skuName string = 'Standard_LRS' + +param storageQueueName string = 'aioQueue' + +@description('The name of ESA container in Storage Account') +param stcontainerName string + +resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = { + name: storageAccountName + location: location + kind: kind + sku: { + name: skuName + } + properties: { + supportsHttpsTrafficOnly: true + } +} + +resource storageQueueServices 'Microsoft.Storage/storageAccounts/queueServices@2023-01-01' = { + parent: storageAccount + name: 'default' +} + +resource storageQueue 'Microsoft.Storage/storageAccounts/queueServices/queues@2023-01-01' = { + parent: storageQueueServices + name: storageQueueName +} + +resource storageAccountName_default_container 'Microsoft.Storage/storageAccounts/blobServices/containers@2021-04-01' = { + name: '${storageAccountName}/default/${stcontainerName}' + dependsOn: [ + storageAccount + ] +} + +output queueName string = storageQueueName +output storageAccountResourceId string = storageAccount.id diff --git a/azure_jumpstart_ag/retail/scripts/postprovision.ps1 b/azure_jumpstart_ag/contoso_hypermarket/scripts/postprovision.ps1 similarity index 96% rename from azure_jumpstart_ag/retail/scripts/postprovision.ps1 rename to azure_jumpstart_ag/contoso_hypermarket/scripts/postprovision.ps1 index 08698e13d0..752d7b163f 100644 --- a/azure_jumpstart_ag/retail/scripts/postprovision.ps1 +++ b/azure_jumpstart_ag/contoso_hypermarket/scripts/postprovision.ps1 @@ -7,7 +7,7 @@ if ($null -ne $env:AZURE_RESOURCE_GROUP){ # This section is for testing only $resourceGroup = "charris-js-ag-43-rg" $adxClusterName = "agadx2827a" - Get-AzSubscription -SubscriptionName "Arc Jumpstart Subscription" | Select-AzSubscription + Get-AzSubscription -SubscriptionName "Azure Arc Jumpstart Subscription" | Select-AzSubscription } ######################################################################## @@ -21,7 +21,7 @@ $kustoCluster = Get-AzKustoCluster -ResourceGroupName $resourceGroup -Name $adxC $adxEndPoint = $kustoCluster.Uri # Update the dashboards files with the new ADX cluster name and URI -$templateBaseUrl = "https://raw.githubusercontent.com/microsoft/azure_arc/main/azure_jumpstart_ag/retail/" +$templateBaseUrl = "https://raw.githubusercontent.com/microsoft/azure_arc/main/azure_jumpstart_ag/contoso_hypermarket/" $ordersDashboardBody = (Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/artifacts/adx_dashboards/adx-dashboard-orders-payload.json").Content -replace '{{ADX_CLUSTER_URI}}', $adxEndPoint -replace '{{ADX_CLUSTER_NAME}}', $adxClusterName $iotSensorsDashboardBody = (Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/artifacts/adx_dashboards/adx-dashboard-iotsensor-payload.json") -replace '{{ADX_CLUSTER_URI}}', $adxEndPoint -replace '{{ADX_CLUSTER_NAME}}', $adxClusterName diff --git a/azure_jumpstart_ag/retail/scripts/preprovision.ps1 b/azure_jumpstart_ag/contoso_hypermarket/scripts/preprovision.ps1 similarity index 100% rename from azure_jumpstart_ag/retail/scripts/preprovision.ps1 rename to azure_jumpstart_ag/contoso_hypermarket/scripts/preprovision.ps1 diff --git a/azure_jumpstart_ag/retail/.gitignore b/azure_jumpstart_ag/contoso_motors/.gitignore similarity index 100% rename from azure_jumpstart_ag/retail/.gitignore rename to azure_jumpstart_ag/contoso_motors/.gitignore diff --git a/azure_jumpstart_ag/retail/azure.yaml b/azure_jumpstart_ag/contoso_motors/azure.yaml similarity index 100% rename from azure_jumpstart_ag/retail/azure.yaml rename to azure_jumpstart_ag/contoso_motors/azure.yaml diff --git a/azure_jumpstart_ag/manufacturing/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_motors/bicep/clientVm/clientVm.bicep similarity index 93% rename from azure_jumpstart_ag/manufacturing/bicep/clientVm/clientVm.bicep rename to azure_jumpstart_ag/contoso_motors/bicep/clientVm/clientVm.bicep index fb4816bd52..3e9be93c56 100644 --- a/azure_jumpstart_ag/manufacturing/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_motors/bicep/clientVm/clientVm.bicep @@ -82,11 +82,8 @@ param namingGuid string @description('The custom location RPO ID') param customLocationRPOID string -@description('The agora industry to be deployed') -param industry string = 'retail' - -@description('The AKS Edge Essentials schema version to be used. This is only used to pin the AKS Edge Essentials schema version for testing.') -param AKSEEPinnedSchemaVersion string = 'useLatest' +@description('The agora scenario to be deployed') +param scenario string = 'contoso_motors' var encodedPassword = base64(windowsAdminPassword) var bastionName = 'Ag-Bastion' @@ -202,7 +199,7 @@ resource vmBootstrap 'Microsoft.Compute/virtualMachines/extensions@2022-11-01' = fileUris: [ uri(templateBaseUrl, 'artifacts/PowerShell/Bootstrap.ps1') ] - commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnObjectId ${spnObjectId} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -acrName ${acrName} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -adxClusterName ${adxClusterName} -customLocationRPOID ${customLocationRPOID} -industry ${industry} -aioStorageAccountName ${aioStorageAccountName} -stcontainerName ${stcontainerName} -AKSEEPinnedSchemaVersion ${AKSEEPinnedSchemaVersion}' + commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnObjectId ${spnObjectId} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -acrName ${acrName} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -adxClusterName ${adxClusterName} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName} -stcontainerName ${stcontainerName}' } } } diff --git a/azure_jumpstart_ag/manufacturing/bicep/data/dataExplorer.bicep b/azure_jumpstart_ag/contoso_motors/bicep/data/dataExplorer.bicep similarity index 100% rename from azure_jumpstart_ag/manufacturing/bicep/data/dataExplorer.bicep rename to azure_jumpstart_ag/contoso_motors/bicep/data/dataExplorer.bicep diff --git a/azure_jumpstart_ag/contoso_motors/bicep/data/eventGrid.bicep b/azure_jumpstart_ag/contoso_motors/bicep/data/eventGrid.bicep new file mode 100644 index 0000000000..d5d7e8b994 --- /dev/null +++ b/azure_jumpstart_ag/contoso_motors/bicep/data/eventGrid.bicep @@ -0,0 +1,184 @@ +@description('The name of the EventGrid namespace') +param eventGridNamespaceName string = 'aioNamespace' + +@description('The location of the Azure Data Explorer cluster') +param location string = resourceGroup().location + +@maxLength(5) +@description('Random GUID') +param namingGuid string + +@description('EventGrid Sku') +param eventGridSku string = 'Standard' + +@description('EventGrid capacity') +param eventGridCapacity int = 1 + +@description('The name of the EventGrid client group') +param eventGridClientGroupName string = '$all' + +@description('The name of the EventGrid namespace') +param eventGridTopicSpaceName string = 'aiotopicSpace${namingGuid}' + +@description('The name of the EventGrid topic templates') +param eventGridTopicTemplates array = [ + '#' +] + +@description('Resource tag for Jumpstart Agora') +param resourceTags object = { + Project: 'Jumpstart_azure_aio' +} + +@description('The name of the EventGrid publisher binding name') +param publisherBindingName string = 'publisherBinding' + +@description('The name of the EventGrid subscription binding name') +param subscriberBindingName string = 'subscriberBindingName' + +@description('The name of the EventHub topic subscription') +param eventGridTopicSubscriptionName string = 'aioEventHubSubscription' + +@description('The name of the storage topic subscription') +param storageTopicSubscriptionName string = 'aioStorageSubscription' + +@description('The name of the EventGrid topic') +param eventGridTopicName string = 'aiotopic${namingGuid}' + +@description('The name of the EventGrid topic sku') +param eventGridTopicSku string = 'Basic' + +@description('The resource Id of the event hub') +param eventHubResourceId string + +@description('The resource Id of the storage account queue') +param storageAccountResourceId string + +@description('The name of the storage account queue') +param queueName string + +@description('The time to live of the storage account queue') +param queueTTL int = 604800 + +@description('The maximum number of client sessions per authentication name') +param maximumClientSessionsPerAuthenticationName int = 100 + +resource eventGrid 'Microsoft.EventGrid/namespaces@2023-12-15-preview' = { + name: eventGridNamespaceName + tags: resourceTags + location: location + sku: { + name: eventGridSku + capacity: eventGridCapacity + } + identity: { + type: 'SystemAssigned' + } + properties: { + topicSpacesConfiguration: { + state: 'Enabled' + maximumClientSessionsPerAuthenticationName: maximumClientSessionsPerAuthenticationName + clientAuthentication: { + alternativeAuthenticationNameSources: [ + 'ClientCertificateSubject' + ] + } + routeTopicResourceId: eventGridTopic.id + } + } +} + +resource eventGridTopicSpace 'Microsoft.EventGrid/namespaces/topicSpaces@2023-06-01-preview' = { + name: eventGridTopicSpaceName + parent: eventGrid + properties: { + topicTemplates: eventGridTopicTemplates + } +} + +resource eventGridPubisherBinding 'Microsoft.EventGrid/namespaces/permissionBindings@2023-06-01-preview' = { + name: publisherBindingName + parent: eventGrid + properties: { + clientGroupName: eventGridClientGroupName + permission: 'Publisher' + topicSpaceName: eventGridTopicSpace.name + } +} + +resource eventGridsubscriberBindingName 'Microsoft.EventGrid/namespaces/permissionBindings@2023-06-01-preview' = { + name: subscriberBindingName + parent: eventGrid + properties: { + clientGroupName: eventGridClientGroupName + permission: 'Subscriber' + topicSpaceName: eventGridTopicSpace.name + } +} + +resource eventGridTopic 'Microsoft.EventGrid/topics@2023-06-01-preview' = { + name: eventGridTopicName + location: location + tags: resourceTags + sku: { + name: eventGridTopicSku + } + identity: { + type: 'SystemAssigned' + } + properties: { + inputSchema: 'CloudEventSchemaV1_0' + } +} + + +resource eventHubTopicSubscription 'Microsoft.EventGrid/topics/eventSubscriptions@2023-06-01-preview' = { + name: eventGridTopicSubscriptionName + parent:eventGridTopic + properties: { + destination: { + endpointType: 'EventHub' + properties: { + resourceId: eventHubResourceId + } + } + filter: { + enableAdvancedFilteringOnArrays: true + } + eventDeliverySchema: 'CloudEventSchemaV1_0' + } +} + +resource storageTopicSubscription 'Microsoft.EventGrid/topics/eventSubscriptions@2023-06-01-preview' = { + name: storageTopicSubscriptionName + parent:eventGridTopic + properties: { + destination: { + endpointType: 'StorageQueue' + properties: { + resourceId: storageAccountResourceId + queueName: queueName + queueMessageTimeToLiveInSeconds: queueTTL + } + } + filter: { + enableAdvancedFilteringOnArrays: true + } + eventDeliverySchema: 'CloudEventSchemaV1_0' + } +} + +resource azureEventGridDataSenderRole 'Microsoft.Authorization/roleDefinitions@2022-04-01' existing = { + name: 'd5a91429-5739-47e2-a06b-3470a27159e7' + scope: tenant() +} + +resource eventGridTopicRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid('azureEventGridDataSenderRole', eventGrid.id, eventGridTopic.id) + scope: eventGridTopic + properties: { + roleDefinitionId: azureEventGridDataSenderRole.id + principalId: eventGrid.identity.principalId + } +} + diff --git a/azure_jumpstart_ag/contoso_motors/bicep/data/eventHub.bicep b/azure_jumpstart_ag/contoso_motors/bicep/data/eventHub.bicep new file mode 100644 index 0000000000..9492b09cc4 --- /dev/null +++ b/azure_jumpstart_ag/contoso_motors/bicep/data/eventHub.bicep @@ -0,0 +1,61 @@ +@description('The name of the EventHub namespace') +param eventHubNamespaceName string = 'aiohubns${uniqueString(resourceGroup().id)}' + +@description('The name of the EventHub') +param eventHubName string = 'aioEventHub' + +@description('EventHub Sku') +param eventHubSku string = 'Standard' + +@description('EventHub Tier') +param eventHubTier string = 'Standard' + +@description('EventHub capacity') +param eventHubCapacity int = 1 + +@description('Resource tag for Jumpstart Agora') +param resourceTags object = { + Project: 'Jumpstart_azure_aio' +} + +@description('The location of the Azure Data Explorer cluster') +param location string = resourceGroup().location + +@description('The name of the Azure Data Explorer Event Hub consumer group for mqttdataemulator') +param stagingDataCGName string = 'mqttdataemulator' + +resource eventHubNamespace 'Microsoft.EventHub/namespaces@2023-01-01-preview' = { + name: eventHubNamespaceName + tags: resourceTags + location: location + sku: { + name: eventHubSku + capacity: eventHubCapacity + tier: eventHubTier + } +} + +resource eventHub 'Microsoft.EventHub/namespaces/eventhubs@2023-01-01-preview' = { + name: eventHubName + parent: eventHubNamespace + properties: { + messageRetentionInDays: 1 + } +} + +resource eventHubAuthRule 'Microsoft.EventHub/namespaces/authorizationRules@2023-01-01-preview' = { + name: 'eventHubAuthRule' + parent: eventHubNamespace + properties: { + rights: [ + 'Listen' + ] + } +} + +resource weldingrobotCG 'Microsoft.EventHub/namespaces/eventhubs/consumergroups@2023-01-01-preview' = { + name: stagingDataCGName + parent: eventHub +} + +output eventHubResourceId string = eventHub.id diff --git a/azure_jumpstart_ag/contoso_motors/bicep/data/keyVault.bicep b/azure_jumpstart_ag/contoso_motors/bicep/data/keyVault.bicep new file mode 100644 index 0000000000..c0b7ad3428 --- /dev/null +++ b/azure_jumpstart_ag/contoso_motors/bicep/data/keyVault.bicep @@ -0,0 +1,71 @@ +@description('Azure Key Vault name') +param akvNameSite1 string = 'aio-akv-01' + +@description('Azure Key Vault name') +param akvNameSite2 string = 'aio-akv-02' + +@description('Azure Key Vault location') +param location string = resourceGroup().location + +@description('Azure Key Vault SKU') +param akvSku string = 'standard' + +@description('Azure Key Vault tenant ID') +param tenantId string = subscription().tenantId + +@description('Secret name') +param aioPlaceHolder string = 'azure-iot-operations' + +@description('Secret value') +param aioPlaceHolderValue string = 'aioSecretValue' + +@description('Resource tag for Jumpstart Agora') +param resourceTags object = { + Project: 'Jumpstart_azure_aio' +} + +resource akv 'Microsoft.KeyVault/vaults@2023-02-01' = { + name: akvNameSite1 + location: location + tags: resourceTags + properties: { + sku: { + name: akvSku + family: 'A' + } + accessPolicies: [] + enableSoftDelete: false + tenantId: tenantId + } +} + +resource aioSecretPlaceholder 'Microsoft.KeyVault/vaults/secrets@2023-02-01' = { + name: aioPlaceHolder + parent: akv + properties: { + value: aioPlaceHolderValue + } +} + +resource akv2 'Microsoft.KeyVault/vaults@2023-02-01' = { + name: akvNameSite2 + location: location + tags: resourceTags + properties: { + sku: { + name: akvSku + family: 'A' + } + accessPolicies: [] + enableSoftDelete: false + tenantId: tenantId + } +} + +resource aioSecretPlaceholder2 'Microsoft.KeyVault/vaults/secrets@2023-02-01' = { + name: aioPlaceHolder + parent: akv2 + properties: { + value: aioPlaceHolderValue + } +} diff --git a/azure_jumpstart_ag/manufacturing/bicep/data/script.kql b/azure_jumpstart_ag/contoso_motors/bicep/data/script.kql similarity index 100% rename from azure_jumpstart_ag/manufacturing/bicep/data/script.kql rename to azure_jumpstart_ag/contoso_motors/bicep/data/script.kql diff --git a/azure_jumpstart_ag/contoso_motors/bicep/kubernetes/acr.bicep b/azure_jumpstart_ag/contoso_motors/bicep/kubernetes/acr.bicep new file mode 100644 index 0000000000..c864f1db59 --- /dev/null +++ b/azure_jumpstart_ag/contoso_motors/bicep/kubernetes/acr.bicep @@ -0,0 +1,25 @@ +@description('The location of the Managed Cluster resource') +param location string = resourceGroup().location + +@description('Resource tag for Jumpstart Agora') +param resourceTags object = { + Project: 'Jumpstart_Agora' +} + +@description('Name of the Azure Container Registry') +param acrName string + +@description('Provide a tier of your Azure Container Registry.') +param acrSku string = 'Basic' + +resource acr 'Microsoft.ContainerRegistry/registries@2023-01-01-preview' ={ + name: acrName + location: location + tags: resourceTags + sku: { + name: acrSku + } + properties: { + adminUserEnabled: true + } +} diff --git a/azure_jumpstart_ag/manufacturing/bicep/main.azd.bicep b/azure_jumpstart_ag/contoso_motors/bicep/main.azd.bicep similarity index 98% rename from azure_jumpstart_ag/manufacturing/bicep/main.azd.bicep rename to azure_jumpstart_ag/contoso_motors/bicep/main.azd.bicep index f751cc8409..4b62046e9b 100644 --- a/azure_jumpstart_ag/manufacturing/bicep/main.azd.bicep +++ b/azure_jumpstart_ag/contoso_motors/bicep/main.azd.bicep @@ -98,8 +98,8 @@ param acrName string = 'agacr${namingGuid}' @description('Override default RDP port using this parameter. Default is 3389. No changes will be made to the client VM.') param rdpPort string = '3389' -@description('The agora industry to be deployed') -param industry string = 'manufacturing' +@description('The agora scenario to be deployed') +param scenario string = 'contoso_motors' var templateBaseUrl = 'https://raw.githubusercontent.com/${githubAccount}/azure_arc/${githubBranch}/azure_jumpstart_ag/' @@ -156,7 +156,7 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { namingGuid: namingGuid adxClusterName: adxClusterName customLocationRPOID: customLocationRPOID - industry: industry + scenario: scenario stcontainerName: stcontainerName } } diff --git a/azure_jumpstart_ag/manufacturing/bicep/main.azd.parameters.json b/azure_jumpstart_ag/contoso_motors/bicep/main.azd.parameters.json similarity index 100% rename from azure_jumpstart_ag/manufacturing/bicep/main.azd.parameters.json rename to azure_jumpstart_ag/contoso_motors/bicep/main.azd.parameters.json diff --git a/azure_jumpstart_ag/manufacturing/bicep/main.bicep b/azure_jumpstart_ag/contoso_motors/bicep/main.bicep similarity index 93% rename from azure_jumpstart_ag/manufacturing/bicep/main.bicep rename to azure_jumpstart_ag/contoso_motors/bicep/main.bicep index 15dbbc0d8e..dc593e32dc 100644 --- a/azure_jumpstart_ag/manufacturing/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_motors/bicep/main.bicep @@ -89,13 +89,8 @@ param acrName string = 'agacr${namingGuid}' @description('Override default RDP port using this parameter. Default is 3389. No changes will be made to the client VM.') param rdpPort string = '3389' -@description('The agora industry to be deployed') -param industry string = 'manufacturing' - -@description('''The AKS Edge Essentials schema version to be used. This is only used to pin the AKS Edge Essentials schema version for testing. -To pin a specific version, use the format '1.14'. To use the latest schema version, use 'useLatest'. -''') -param AKSEEPinnedSchemaVersion string = '1.14' +@description('The agora scenario to be deployed') +param scenario string = 'contoso_motors' var templateBaseUrl = 'https://raw.githubusercontent.com/${githubAccount}/azure_arc/${githubBranch}/azure_jumpstart_ag/' @@ -148,10 +143,9 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { namingGuid: namingGuid adxClusterName: adxClusterName customLocationRPOID: customLocationRPOID - industry: industry + scenario: scenario aioStorageAccountName: aioStorageAccountName stcontainerName: stcontainerName - AKSEEPinnedSchemaVersion: AKSEEPinnedSchemaVersion } } diff --git a/azure_jumpstart_ag/manufacturing/bicep/main.parameters.json b/azure_jumpstart_ag/contoso_motors/bicep/main.parameters.json similarity index 100% rename from azure_jumpstart_ag/manufacturing/bicep/main.parameters.json rename to azure_jumpstart_ag/contoso_motors/bicep/main.parameters.json diff --git a/azure_jumpstart_ag/manufacturing/bicep/mgmt/VMInsightsDCR.bicep b/azure_jumpstart_ag/contoso_motors/bicep/mgmt/VMInsightsDCR.bicep similarity index 97% rename from azure_jumpstart_ag/manufacturing/bicep/mgmt/VMInsightsDCR.bicep rename to azure_jumpstart_ag/contoso_motors/bicep/mgmt/VMInsightsDCR.bicep index 6e904cec50..0711c46551 100644 --- a/azure_jumpstart_ag/manufacturing/bicep/mgmt/VMInsightsDCR.bicep +++ b/azure_jumpstart_ag/contoso_motors/bicep/mgmt/VMInsightsDCR.bicep @@ -18,7 +18,6 @@ resource MSVMI_PerfandDa_Dcr 'Microsoft.Insights/dataCollectionRules@2021-04-01' { name: 'VMInsightsPerfCounters' streams: ['Microsoft-InsightsMetrics'] - scheduledTransferPeriod: 'PT1M' samplingFrequencyInSeconds: 60 counterSpecifiers: ['\\VmInsights\\DetailedMetrics'] } diff --git a/azure_jumpstart_ag/manufacturing/bicep/mgmt/mgmtArtifacts.bicep b/azure_jumpstart_ag/contoso_motors/bicep/mgmt/mgmtArtifacts.bicep similarity index 100% rename from azure_jumpstart_ag/manufacturing/bicep/mgmt/mgmtArtifacts.bicep rename to azure_jumpstart_ag/contoso_motors/bicep/mgmt/mgmtArtifacts.bicep diff --git a/azure_jumpstart_ag/manufacturing/bicep/mgmt/network.bicep b/azure_jumpstart_ag/contoso_motors/bicep/mgmt/network.bicep similarity index 100% rename from azure_jumpstart_ag/manufacturing/bicep/mgmt/network.bicep rename to azure_jumpstart_ag/contoso_motors/bicep/mgmt/network.bicep diff --git a/azure_jumpstart_ag/manufacturing/bicep/mgmt/policyAzureArcRGScope.bicep b/azure_jumpstart_ag/contoso_motors/bicep/mgmt/policyAzureArcRGScope.bicep similarity index 91% rename from azure_jumpstart_ag/manufacturing/bicep/mgmt/policyAzureArcRGScope.bicep rename to azure_jumpstart_ag/contoso_motors/bicep/mgmt/policyAzureArcRGScope.bicep index 7f550c7418..3efbd87c55 100644 --- a/azure_jumpstart_ag/manufacturing/bicep/mgmt/policyAzureArcRGScope.bicep +++ b/azure_jumpstart_ag/contoso_motors/bicep/mgmt/policyAzureArcRGScope.bicep @@ -56,7 +56,7 @@ resource policies_name 'Microsoft.Authorization/policyAssignments@2022-06-01' = type: 'SystemAssigned' } properties: { - policyDefinitionId: item.definitionId + policyDefinitionId: any(item.definitionId) parameters: item.parameters } }] @@ -64,7 +64,7 @@ resource policies_name 'Microsoft.Authorization/policyAssignments@2022-06-01' = resource policy_AMA_role_0 'Microsoft.Authorization/roleAssignments@2022-04-01' = { name: guid( policies[0].name, policies[0].roleDefinition[0],resourceGroup().id) properties: { - roleDefinitionId: policies[0].roleDefinition[0] + roleDefinitionId: any(policies[0].roleDefinition[0]) principalId: policies_name[0].identity.principalId principalType: 'ServicePrincipal' } @@ -73,7 +73,7 @@ resource policy_AMA_role_0 'Microsoft.Authorization/roleAssignments@2022-04-01' resource policy_AMA_role_1 'Microsoft.Authorization/roleAssignments@2022-04-01' = { name: guid( policies[0].name, policies[0].roleDefinition[1],resourceGroup().id) properties: { - roleDefinitionId: policies[0].roleDefinition[1] + roleDefinitionId: any(policies[0].roleDefinition[1]) principalId: policies_name[0].identity.principalId principalType: 'ServicePrincipal' } @@ -82,7 +82,7 @@ resource policy_AMA_role_1 'Microsoft.Authorization/roleAssignments@2022-04-01' resource policy_AMA_role_2 'Microsoft.Authorization/roleAssignments@2022-04-01' = { name: guid( policies[0].name, policies[0].roleDefinition[2],resourceGroup().id) properties: { - roleDefinitionId: policies[0].roleDefinition[2] + roleDefinitionId: any(policies[0].roleDefinition[2]) principalId: policies_name[0].identity.principalId principalType: 'ServicePrincipal' } @@ -91,7 +91,7 @@ resource policy_AMA_role_2 'Microsoft.Authorization/roleAssignments@2022-04-01' resource policy_arc_windows_azure_security_agent 'Microsoft.Authorization/roleAssignments@2022-04-01' = { name: guid( policies[1].name, policies[1].roleDefinition,resourceGroup().id) properties: { - roleDefinitionId: policies[1].roleDefinition + roleDefinitionId: any(policies[1].roleDefinition) principalId: policies_name[1].identity.principalId principalType: 'ServicePrincipal' } @@ -100,7 +100,7 @@ resource policy_arc_windows_azure_security_agent 'Microsoft.Authorization/roleAs resource policy_arc_linux_azure_security_agent 'Microsoft.Authorization/roleAssignments@2022-04-01' = { name: guid( policies[2].name, policies[2].roleDefinition,resourceGroup().id) properties: { - roleDefinitionId: policies[2].roleDefinition + roleDefinitionId: any(policies[2].roleDefinition) principalId: policies_name[2].identity.principalId principalType: 'ServicePrincipal' } @@ -109,7 +109,7 @@ resource policy_arc_linux_azure_security_agent 'Microsoft.Authorization/roleAssi resource policy_arc_windows_mde 'Microsoft.Authorization/roleAssignments@2022-04-01' = { name: guid( policies[3].name, policies[3].roleDefinition,resourceGroup().id) properties: { - roleDefinitionId: policies[3].roleDefinition + roleDefinitionId: any(policies[3].roleDefinition) principalId: policies_name[3].identity.principalId principalType: 'ServicePrincipal' } @@ -118,7 +118,7 @@ resource policy_arc_windows_mde 'Microsoft.Authorization/roleAssignments@2022-04 resource policy_arc_linux_mde 'Microsoft.Authorization/roleAssignments@2022-04-01' = { name: guid( policies[4].name, policies[4].roleDefinition,resourceGroup().id) properties: { - roleDefinitionId: policies[4].roleDefinition + roleDefinitionId: any(policies[4].roleDefinition) principalId: policies_name[4].identity.principalId principalType: 'ServicePrincipal' } diff --git a/azure_jumpstart_ag/manufacturing/bicep/mgmt/storageAccount.bicep b/azure_jumpstart_ag/contoso_motors/bicep/mgmt/storageAccount.bicep similarity index 100% rename from azure_jumpstart_ag/manufacturing/bicep/mgmt/storageAccount.bicep rename to azure_jumpstart_ag/contoso_motors/bicep/mgmt/storageAccount.bicep diff --git a/azure_jumpstart_ag/manufacturing/bicep/storage/storageAccount.bicep b/azure_jumpstart_ag/contoso_motors/bicep/storage/storageAccount.bicep similarity index 100% rename from azure_jumpstart_ag/manufacturing/bicep/storage/storageAccount.bicep rename to azure_jumpstart_ag/contoso_motors/bicep/storage/storageAccount.bicep diff --git a/azure_jumpstart_ag/manufacturing/scripts/postprovision.ps1 b/azure_jumpstart_ag/contoso_motors/scripts/postprovision.ps1 similarity index 100% rename from azure_jumpstart_ag/manufacturing/scripts/postprovision.ps1 rename to azure_jumpstart_ag/contoso_motors/scripts/postprovision.ps1 diff --git a/azure_jumpstart_ag/manufacturing/scripts/predown.ps1 b/azure_jumpstart_ag/contoso_motors/scripts/predown.ps1 similarity index 100% rename from azure_jumpstart_ag/manufacturing/scripts/predown.ps1 rename to azure_jumpstart_ag/contoso_motors/scripts/predown.ps1 diff --git a/azure_jumpstart_ag/manufacturing/scripts/preprovision.ps1 b/azure_jumpstart_ag/contoso_motors/scripts/preprovision.ps1 similarity index 100% rename from azure_jumpstart_ag/manufacturing/scripts/preprovision.ps1 rename to azure_jumpstart_ag/contoso_motors/scripts/preprovision.ps1 diff --git a/azure_jumpstart_ag/contoso_supermarket/.gitignore b/azure_jumpstart_ag/contoso_supermarket/.gitignore new file mode 100644 index 0000000000..6297a3b672 --- /dev/null +++ b/azure_jumpstart_ag/contoso_supermarket/.gitignore @@ -0,0 +1,2 @@ +.azure +js_rsa* \ No newline at end of file diff --git a/azure_jumpstart_ag/contoso_supermarket/azure.yaml b/azure_jumpstart_ag/contoso_supermarket/azure.yaml new file mode 100644 index 0000000000..200ea17596 --- /dev/null +++ b/azure_jumpstart_ag/contoso_supermarket/azure.yaml @@ -0,0 +1,20 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json + +name: azure_jumpstart_ag +metadata: + template: azure_jumpstart_agora@0.0.1-beta +infra: + provider: "bicep" + path: "bicep" + module: "main.azd" +hooks: + preprovision: + shell: pwsh + run: ./scripts/preprovision.ps1 + continueOnError: false + interactive: true + postprovision: + shell: pwsh + run: ./scripts/postprovision.ps1 + continueOnError: false + interactive: true \ No newline at end of file diff --git a/azure_jumpstart_ag/retail/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_supermarket/bicep/clientVm/clientVm.bicep similarity index 94% rename from azure_jumpstart_ag/retail/bicep/clientVm/clientVm.bicep rename to azure_jumpstart_ag/contoso_supermarket/bicep/clientVm/clientVm.bicep index a7bf32626b..e3e3b55568 100644 --- a/azure_jumpstart_ag/retail/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_supermarket/bicep/clientVm/clientVm.bicep @@ -84,11 +84,8 @@ param adxClusterName string @description('Random GUID') param namingGuid string -@description('The agora industry to be deployed') -param industry string = 'retail' - -@description('The AKS Edge Essentials schema version to be used. This is only used to pin the AKS Edge Essentials schema version for testing.') -param AKSEEPinnedSchemaVersion string = 'useLatest' +@description('The agora scenario to be deployed') +param scenario string = 'conotos_supermarket' var encodedPassword = base64(windowsAdminPassword) var bastionName = 'Ag-Bastion' @@ -204,7 +201,7 @@ resource vmBootstrap 'Microsoft.Compute/virtualMachines/extensions@2022-11-01' = fileUris: [ uri(templateBaseUrl, 'artifacts/PowerShell/Bootstrap.ps1') ] - commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -githubUser ${githubUser} -aksStagingClusterName ${aksStagingClusterName} -iotHubHostName ${iotHubHostName} -acrName ${acrName} -cosmosDBName ${cosmosDBName} -cosmosDBEndpoint ${cosmosDBEndpoint} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -githubPAT ${githubPAT} -adxClusterName ${adxClusterName} -namingGuid ${namingGuid} -industry ${industry} -AKSEEPinnedSchemaVersion ${AKSEEPinnedSchemaVersion}' + commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -githubUser ${githubUser} -aksStagingClusterName ${aksStagingClusterName} -iotHubHostName ${iotHubHostName} -acrName ${acrName} -cosmosDBName ${cosmosDBName} -cosmosDBEndpoint ${cosmosDBEndpoint} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -githubPAT ${githubPAT} -adxClusterName ${adxClusterName} -namingGuid ${namingGuid} -scenario ${scenario}' } } } diff --git a/azure_jumpstart_ag/retail/bicep/data/cosmosDB.bicep b/azure_jumpstart_ag/contoso_supermarket/bicep/data/cosmosDB.bicep similarity index 100% rename from azure_jumpstart_ag/retail/bicep/data/cosmosDB.bicep rename to azure_jumpstart_ag/contoso_supermarket/bicep/data/cosmosDB.bicep diff --git a/azure_jumpstart_ag/retail/bicep/data/dataExplorer.bicep b/azure_jumpstart_ag/contoso_supermarket/bicep/data/dataExplorer.bicep similarity index 100% rename from azure_jumpstart_ag/retail/bicep/data/dataExplorer.bicep rename to azure_jumpstart_ag/contoso_supermarket/bicep/data/dataExplorer.bicep diff --git a/azure_jumpstart_ag/retail/bicep/data/iotHub.bicep b/azure_jumpstart_ag/contoso_supermarket/bicep/data/iotHub.bicep similarity index 100% rename from azure_jumpstart_ag/retail/bicep/data/iotHub.bicep rename to azure_jumpstart_ag/contoso_supermarket/bicep/data/iotHub.bicep diff --git a/azure_jumpstart_ag/retail/bicep/data/script.kql b/azure_jumpstart_ag/contoso_supermarket/bicep/data/script.kql similarity index 100% rename from azure_jumpstart_ag/retail/bicep/data/script.kql rename to azure_jumpstart_ag/contoso_supermarket/bicep/data/script.kql diff --git a/azure_jumpstart_ag/retail/bicep/kubernetes/aks.bicep b/azure_jumpstart_ag/contoso_supermarket/bicep/kubernetes/aks.bicep similarity index 96% rename from azure_jumpstart_ag/retail/bicep/kubernetes/aks.bicep rename to azure_jumpstart_ag/contoso_supermarket/bicep/kubernetes/aks.bicep index 024b0e4599..e54098af6c 100644 --- a/azure_jumpstart_ag/retail/bicep/kubernetes/aks.bicep +++ b/azure_jumpstart_ag/contoso_supermarket/bicep/kubernetes/aks.bicep @@ -67,7 +67,7 @@ param kubernetesVersion string = '1.28.5' var serviceCidr_staging = '10.21.64.0/19' var dnsServiceIP_staging = '10.21.64.10' -resource aksStaging 'Microsoft.ContainerService/managedClusters@2024-04-02-preview' = { +resource aksStaging 'Microsoft.ContainerService/managedClusters@2023-05-02-preview' = { location: location name: aksStagingClusterName tags: resourceTags @@ -102,10 +102,6 @@ resource aksStaging 'Microsoft.ContainerService/managedClusters@2024-04-02-previ enabled: true } } - autoUpgradeProfile: { - upgradeChannel: 'stable' - nodeOSUpgradeChannel: 'NodeImage' - } networkProfile: { networkPlugin: 'azure' serviceCidr: serviceCidr_staging diff --git a/azure_jumpstart_ag/contoso_supermarket/bicep/main.azd.bicep b/azure_jumpstart_ag/contoso_supermarket/bicep/main.azd.bicep new file mode 100644 index 0000000000..6c8e6ee20b --- /dev/null +++ b/azure_jumpstart_ag/contoso_supermarket/bicep/main.azd.bicep @@ -0,0 +1,218 @@ +@description('Azure service principal client id') +param spnClientId string = '' + +@description('Azure service principal client secret') +@minLength(12) +@maxLength(123) +@secure() +param spnClientSecret string = newGuid() + +@description('Azure AD tenant id for your service principal') +param spnTenantId string = '' + +@minLength(1) +@maxLength(77) +@description('Prefix for resource group, i.e. {name}-rg') +param envName string = toLower(substring(newGuid(), 0, 5)) + +@description('Location for all resources') +param location string = '' + +@maxLength(5) +@description('Random GUID') +param namingGuid string = toLower(substring(newGuid(), 0, 5)) + +@description('Username for Windows account') +param windowsAdminUsername string = 'Agora' + +@description('Password for Windows account. Password must have 3 of the following: 1 lower case character, 1 upper case character, 1 number, and 1 special character. The value must be between 12 and 123 characters long') +@minLength(12) +@maxLength(123) +@secure() +param windowsAdminPassword string = newGuid() + +@description('Configure all linux machines with the SSH RSA public key string. Your key should include three parts, for example \'ssh-rsa AAAAB...snip...UcyupgH azureuser@linuxvm\'') +param sshRSAPublicKey string = '' + +@description('Name for your log analytics workspace') +param logAnalyticsWorkspaceName string = 'Ag-Workspace-${namingGuid}' + +@description('Target GitHub account') +param githubAccount string = 'microsoft' + +@description('Target GitHub branch') +param githubBranch string = 'main' + +@description('Choice to deploy Bastion to connect to the client VM') +param deployBastion bool = false + +@description('User github account where they have forked the repo https://github.com/microsoft/jumpstart-agora-apps') +@minLength(1) +param githubUser string = 'sampleUser' + +@description('GitHub Personal access token for the user account') +@minLength(1) +@secure() +param githubPAT string = newGuid() + +@description('Name of the Cloud VNet') +param virtualNetworkNameCloud string = 'Ag-Vnet-Prod' + +@description('Name of the Staging AKS subnet in the cloud virtual network') +param subnetNameCloudAksStaging string = 'Ag-Subnet-Staging' + +@description('Name of the inner-loop AKS subnet in the cloud virtual network') +param subnetNameCloudAksInnerLoop string = 'Ag-Subnet-InnerLoop' + +@description('The name of the Staging Kubernetes cluster resource') +param aksStagingClusterName string = 'Ag-AKS-Staging' + +@description('The name of the IotHub') +param iotHubName string = 'Ag-IotHub-${namingGuid}' + +@description('The name of the Cosmos DB account') +param accountName string = 'agcosmos${namingGuid}' + +@description('The name of the Azure Data Explorer cluster') +param adxClusterName string = 'agadx${namingGuid}' + +@description('The name of the Azure Data Explorer POS database') +param posOrdersDBName string = 'Orders' + +@minLength(5) +@maxLength(50) +@description('Name of the Azure Container Registry') +param acrName string = 'agacr${namingGuid}' + +@description('Override default RDP port using this parameter. Default is 3389. No changes will be made to the client VM.') +param rdpPort string = '3389' + +@description('The agora scenario to be deployed') +param scenario string = 'contoso_supermarket' + +var templateBaseUrl = 'https://raw.githubusercontent.com/${githubAccount}/azure_arc/${githubBranch}/azure_jumpstart_ag/' + +targetScope = 'subscription' + +resource rg 'Microsoft.Resources/resourceGroups@2020-06-01' = { + name: '${envName}-rg' + location: location +} + +module mgmtArtifactsAndPolicyDeployment 'mgmt/mgmtArtifacts.bicep' = { + name: 'mgmtArtifactsAndPolicyDeployment' + scope: rg + params: { + workspaceName: logAnalyticsWorkspaceName + location: location + } +} + +module networkDeployment 'mgmt/network.bicep' = { + name: 'networkDeployment' + scope: rg + params: { + virtualNetworkNameCloud: virtualNetworkNameCloud + subnetNameCloudAksStaging: subnetNameCloudAksStaging + subnetNameCloudAksInnerLoop: subnetNameCloudAksInnerLoop + deployBastion: deployBastion + location: location + } +} + +module storageAccountDeployment 'mgmt/storageAccount.bicep' = { + name: 'storageAccountDeployment' + scope: rg + params: { + location: location + } +} + +module kubernetesDeployment 'kubernetes/aks.bicep' = { + name: 'kubernetesDeployment' + scope: rg + params: { + aksStagingClusterName: aksStagingClusterName + virtualNetworkNameCloud: networkDeployment.outputs.virtualNetworkNameCloud + aksSubnetNameStaging: subnetNameCloudAksStaging + spnClientId: spnClientId + spnClientSecret: spnClientSecret + location: location + sshRSAPublicKey: sshRSAPublicKey + acrName: acrName + } +} + +module clientVmDeployment 'clientVm/clientVm.bicep' = { + name: 'clientVmDeployment' + scope: rg + params: { + windowsAdminUsername: windowsAdminUsername + windowsAdminPassword: windowsAdminPassword + spnClientId: spnClientId + spnClientSecret: spnClientSecret + spnTenantId: spnTenantId + workspaceName: logAnalyticsWorkspaceName + storageAccountName: storageAccountDeployment.outputs.storageAccountName + templateBaseUrl: templateBaseUrl + deployBastion: deployBastion + githubAccount: githubAccount + githubBranch: githubBranch + githubUser: githubUser + githubPAT: githubPAT + location: location + subnetId: networkDeployment.outputs.innerLoopSubnetId + aksStagingClusterName: aksStagingClusterName + iotHubHostName: iotHubDeployment.outputs.iotHubHostName + cosmosDBName: accountName + cosmosDBEndpoint: cosmosDBDeployment.outputs.cosmosDBEndpoint + acrName: acrName + rdpPort: rdpPort + adxClusterName: adxClusterName + namingGuid: namingGuid + scenario: scenario + } +} + +module iotHubDeployment 'data/iotHub.bicep' = { + name: 'iotHubDeployment' + scope: rg + params: { + location: location + iotHubName: iotHubName + } +} + +module adxDeployment 'data/dataExplorer.bicep' = { + name: 'adxDeployment' + scope: rg + params: { + location: location + adxClusterName: adxClusterName + iotHubId: iotHubDeployment.outputs.iotHubId + iotHubConsumerGroup: iotHubDeployment.outputs.iotHubConsumerGroup + cosmosDBAccountName: accountName + posOrdersDBName: posOrdersDBName + } +} + +module cosmosDBDeployment 'data/cosmosDB.bicep' = { + name: 'cosmosDBDeployment' + scope: rg + params: { + location: location + accountName: accountName + posOrdersDBName: posOrdersDBName + } +} + +output AZURE_TENANT_ID string = tenant().tenantId +output AZURE_RESOURCE_GROUP string = rg.name + +output NAMING_GUID string = namingGuid +output RDP_PORT string = rdpPort + +output ADX_CLUSTER_NAME string = adxClusterName +output IOT_HUB_NAME string = iotHubName +output COSMOS_DB_NAME string = accountName +output ACR_NAME string = acrName diff --git a/azure_jumpstart_ag/contoso_supermarket/bicep/main.azd.parameters.json b/azure_jumpstart_ag/contoso_supermarket/bicep/main.azd.parameters.json new file mode 100644 index 0000000000..ed06adf631 --- /dev/null +++ b/azure_jumpstart_ag/contoso_supermarket/bicep/main.azd.parameters.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "envName": { + "value": "${AZURE_ENV_NAME}" + }, + "location": { + "value": "${AZURE_LOCATION}" + }, + "spnClientId": { + "value": "${SPN_CLIENT_ID}" + }, + "spnClientSecret": { + "value": "${SPN_CLIENT_SECRET}" + }, + "spnTenantId": { + "value": "${SPN_TENANT_ID}" + }, + "windowsAdminUsername": { + "value": "${JS_WINDOWS_ADMIN_USERNAME}" + }, + "sshRSAPublicKey": { + "value": "${JS_SSH_RSA_PUBLIC_KEY}" + }, + "deployBastion": { + "value": false + }, + "rdpPort": { + "value": "${JS_RDP_PORT}" + }, + "githubUser": { + "value": "${JS_GITHUB_USER}" + }, + "githubPAT": { + "value": "${JS_GITHUB_PAT}" + } + } +} \ No newline at end of file diff --git a/azure_jumpstart_ag/retail/bicep/main.bicep b/azure_jumpstart_ag/contoso_supermarket/bicep/main.bicep similarity index 92% rename from azure_jumpstart_ag/retail/bicep/main.bicep rename to azure_jumpstart_ag/contoso_supermarket/bicep/main.bicep index 221afa3b74..50def3206e 100644 --- a/azure_jumpstart_ag/retail/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_supermarket/bicep/main.bicep @@ -80,13 +80,8 @@ param acrName string = 'agacr${namingGuid}' @description('Override default RDP port using this parameter. Default is 3389. No changes will be made to the client VM.') param rdpPort string = '3389' -@description('The agora industry to be deployed') -param industry string = 'retail' - -@description('''The AKS Edge Essentials schema version to be used. This is only used to pin the AKS Edge Essentials schema version for testing. -To pin a specific version, use the format '1.14'. To use the latest schema version, use 'useLatest'. -''') -param AKSEEPinnedSchemaVersion string = '1.14' +@description('The agora scenario to be deployed') +param scenario string = 'contoso_supermarket' var templateBaseUrl = 'https://raw.githubusercontent.com/${githubAccount}/azure_arc/${githubBranch}/azure_jumpstart_ag/' @@ -156,8 +151,7 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { rdpPort: rdpPort adxClusterName: adxClusterName namingGuid: namingGuid - industry: industry - AKSEEPinnedSchemaVersion: AKSEEPinnedSchemaVersion + scenario: scenario } } diff --git a/azure_jumpstart_ag/retail/bicep/main.parameters.json b/azure_jumpstart_ag/contoso_supermarket/bicep/main.parameters.json similarity index 100% rename from azure_jumpstart_ag/retail/bicep/main.parameters.json rename to azure_jumpstart_ag/contoso_supermarket/bicep/main.parameters.json diff --git a/azure_jumpstart_ag/contoso_supermarket/bicep/mgmt/mgmtArtifacts.bicep b/azure_jumpstart_ag/contoso_supermarket/bicep/mgmt/mgmtArtifacts.bicep new file mode 100644 index 0000000000..ec7b5ea53b --- /dev/null +++ b/azure_jumpstart_ag/contoso_supermarket/bicep/mgmt/mgmtArtifacts.bicep @@ -0,0 +1,52 @@ +@description('Name for your log analytics workspace') +param workspaceName string + +@description('Azure Region to deploy the Log Analytics Workspace') +param location string = resourceGroup().location + +@description('Resource tag for Jumpstart Agora') +param resourceTags object = { + Project: 'Jumpstart_Agora' +} + +@description('SKU, leave default pergb2018') +param sku string = 'pergb2018' + +var security = { + name: 'Security(${workspaceName})' + galleryName: 'Security' +} + +resource workspace 'Microsoft.OperationalInsights/workspaces@2022-10-01' = { + name: workspaceName + location: location + tags: resourceTags + properties: { + sku: { + name: sku + } + } +} + +resource securityGallery 'Microsoft.OperationsManagement/solutions@2015-11-01-preview' = { + name: security.name + location: location + tags: resourceTags + properties: { + workspaceResourceId: workspace.id + } + plan: { + name: security.name + promotionCode: '' + product: 'OMSGallery/${security.galleryName}' + publisher: 'Microsoft' + } +} + +module policyDeploymentRGScope './policyAzureArcRGScope.bicep' = { + name: 'policyDeployment' + params: { + azureLocation: location + logAnalyticsWorkspaceId: workspace.id + } +} diff --git a/azure_jumpstart_ag/retail/bicep/mgmt/network.bicep b/azure_jumpstart_ag/contoso_supermarket/bicep/mgmt/network.bicep similarity index 100% rename from azure_jumpstart_ag/retail/bicep/mgmt/network.bicep rename to azure_jumpstart_ag/contoso_supermarket/bicep/mgmt/network.bicep diff --git a/azure_jumpstart_ag/retail/bicep/mgmt/policyAzureArcRGScope.bicep b/azure_jumpstart_ag/contoso_supermarket/bicep/mgmt/policyAzureArcRGScope.bicep similarity index 100% rename from azure_jumpstart_ag/retail/bicep/mgmt/policyAzureArcRGScope.bicep rename to azure_jumpstart_ag/contoso_supermarket/bicep/mgmt/policyAzureArcRGScope.bicep diff --git a/azure_jumpstart_ag/retail/bicep/mgmt/storageAccount.bicep b/azure_jumpstart_ag/contoso_supermarket/bicep/mgmt/storageAccount.bicep similarity index 100% rename from azure_jumpstart_ag/retail/bicep/mgmt/storageAccount.bicep rename to azure_jumpstart_ag/contoso_supermarket/bicep/mgmt/storageAccount.bicep diff --git a/azure_jumpstart_ag/contoso_supermarket/scripts/postprovision.ps1 b/azure_jumpstart_ag/contoso_supermarket/scripts/postprovision.ps1 new file mode 100644 index 0000000000..1105069670 --- /dev/null +++ b/azure_jumpstart_ag/contoso_supermarket/scripts/postprovision.ps1 @@ -0,0 +1,84 @@ +if ($null -ne $env:AZURE_RESOURCE_GROUP){ + $resourceGroup = $env:AZURE_RESOURCE_GROUP + $adxClusterName = $env:ADX_CLUSTER_NAME + Select-AzSubscription -SubscriptionId $env:AZURE_SUBSCRIPTION_ID | out-null + $rdpPort = $env:JS_RDP_PORT +} else { + # This section is for testing only + $resourceGroup = "charris-js-ag-43-rg" + $adxClusterName = "agadx2827a" + Get-AzSubscription -SubscriptionName "Azure Arc Jumpstart Subscription" | Select-AzSubscription +} + +######################################################################## +# ADX Dashboards +######################################################################## + +Write-Host "Importing Azure Data Explorer dashboards..." + +# Get the ADX/Kusto cluster info +$kustoCluster = Get-AzKustoCluster -ResourceGroupName $resourceGroup -Name $adxClusterName +$adxEndPoint = $kustoCluster.Uri + +# Update the dashboards files with the new ADX cluster name and URI +$templateBaseUrl = "https://raw.githubusercontent.com/microsoft/azure_arc/main/azure_jumpstart_ag/contoso_supermarket/" +$ordersDashboardBody = (Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/artifacts/adx_dashboards/adx-dashboard-orders-payload.json").Content -replace '{{ADX_CLUSTER_URI}}', $adxEndPoint -replace '{{ADX_CLUSTER_NAME}}', $adxClusterName +$iotSensorsDashboardBody = (Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/artifacts/adx_dashboards/adx-dashboard-iotsensor-payload.json") -replace '{{ADX_CLUSTER_URI}}', $adxEndPoint -replace '{{ADX_CLUSTER_NAME}}', $adxClusterName + +# Get access token to make REST API call to Azure Data Explorer Dashabord API. Replace double quotes surrounding access token +$token = (az account get-access-token --scope "https://rtd-metadata.azurewebsites.net/user_impersonation openid profile offline_access" --query "accessToken") -replace "`"", "" + +# Prepare authorization header with access token +$httpHeaders = @{"Authorization" = "Bearer $token"; "Content-Type" = "application/json" } + +# Make REST API call to the dashboard endpoint. +$dashboardApi = "https://dashboards.kusto.windows.net/dashboards" + +# Import orders dashboard report +$httpResponse = Invoke-WebRequest -Method Post -Uri $dashboardApi -Body $ordersDashboardBody -Headers $httpHeaders +if ($httpResponse.StatusCode -ne 200){ + Write-Host "ERROR: Failed import orders dashboard report into Azure Data Explorer" -ForegroundColor Red +} + +# Import IoT Sensor dashboard report +$httpResponse = Invoke-WebRequest -Method Post -Uri $dashboardApi -Body $iotSensorsDashboardBody -Headers $httpHeaders +if ($httpResponse.StatusCode -ne 200){ + Write-Host "ERROR: Failed import IoT Sensor dashboard report into Azure Data Explorer" -ForegroundColor Red +} + + +######################################################################## +# RDP Port +######################################################################## + +# Configure NSG Rule for RDP (if needed) +If ($rdpPort -ne "3389") { + + Write-Host "Configuring NSG Rule for RDP..." + $nsg = Get-AzNetworkSecurityGroup -ResourceGroupName $resourceGroup -Name Ag-NSG-Prod + + Add-AzNetworkSecurityRuleConfig ` + -NetworkSecurityGroup $nsg ` + -Name "RDP-$rdpPort" ` + -Description "Allow RDP" ` + -Access Allow ` + -Protocol Tcp ` + -Direction Inbound ` + -Priority 100 ` + -SourceAddressPrefix * ` + -SourcePortRange * ` + -DestinationAddressPrefix * ` + -DestinationPortRange $rdpPort ` + | Out-Null + + Set-AzNetworkSecurityGroup -NetworkSecurityGroup $nsg | Out-Null + # az network nsg rule create -g $resourceGroup --nsg-name Ag-NSG-Prod --name "RDC-$rdpPort" --priority 100 --source-address-prefixes * --destination-port-ranges $rdpPort --access Allow --protocol Tcp +} + + +# Client VM IP address +$ip = (Get-AzPublicIpAddress -ResourceGroupName $resourceGroup -Name "Ag-VM-Client-PIP").IpAddress + +Write-Host "You can now connect to the client VM using the following command: " -NoNewline +WRite-Host "mstsc /v:$($ip):$($rdpPort)" -ForegroundColor Green -BackgroundColor Black +Write-Host "Remember to use the Windows admin user name [$env:JS_WINDOWS_ADMIN_USERNAME] and the password you specified." diff --git a/azure_jumpstart_ag/contoso_supermarket/scripts/preprovision.ps1 b/azure_jumpstart_ag/contoso_supermarket/scripts/preprovision.ps1 new file mode 100644 index 0000000000..7d1be08c4b --- /dev/null +++ b/azure_jumpstart_ag/contoso_supermarket/scripts/preprovision.ps1 @@ -0,0 +1,248 @@ +######################################################################## +# Connect to Azure +######################################################################## + +Write-Host "Connecting to Azure..." + +# Install Azure module if not already installed +if (-not (Get-Command -Name Get-AzContext)) { + Write-Host "Installing Azure module..." + Install-Module -Name Az -AllowClobber -Scope CurrentUser -ErrorAction Stop +} + +# If not signed in, run the Connect-AzAccount cmdlet +if (-not (Get-AzContext)) { + Write-Host "Logging in to Azure..." + If (-not (Connect-AzAccount -SubscriptionId $env:AZURE_SUBSCRIPTION_ID -ErrorAction Stop)){ + Throw "Unable to login to Azure. Please check your credentials and try again." + } +} + +# Write-Host "Getting Azure Tenant Id..." +$tenantId = (Get-AzSubscription -SubscriptionId $env:AZURE_SUBSCRIPTION_ID).TenantId + +# Write-Host "Setting Azure context..." +$context = Set-AzContext -SubscriptionId $env:AZURE_SUBSCRIPTION_ID -Tenant $tenantId -ErrorAction Stop + +# Write-Host "Setting az subscription..." +$azLogin = az account set --subscription $env:AZURE_SUBSCRIPTION_ID + + +######################################################################## +# Check for available capacity in region +######################################################################## +#region Functions +Function Get-AzAvailableCores ($location, $skuFriendlyNames, $minCores = 0) { + # using az command because there is currently a bug in various versions of PowerShell that affects Get-AzVMUsage + $usage = (az vm list-usage --location $location --output json --only-show-errors) | ConvertFrom-Json + + $usage = $usage | + Where-Object {$_.localname -match $skuFriendlyNames} + + $enhanced = $usage | + ForEach-Object { + $_ | Add-Member -MemberType NoteProperty -Name available -Value 0 -Force -PassThru + $_.available = $_.limit - $_.currentValue + } + + $enhanced = $enhanced | + ForEach-Object { + $_ | Add-Member -MemberType NoteProperty -Name usableLocation -Value $false -Force -PassThru + If ($_.available -ge $minCores) { + $_.usableLocation = $true + } + else { + $_.usableLocation = $false + } + } + + $enhanced + +} + +Function Get-AzAvailableLocations ($location, $skuFriendlyNames, $minCores = 0) { + $allLocations = get-AzLocation + $geographyGroup = ($allLocations | Where-Object {$_.location -eq $location}).GeographyGroup + $locations = $allLocations | Where-Object { ` + $_.GeographyGroup -eq $geographyGroup ` + -and $_.Location -ne $location ` + -and $_.RegionCategory -eq "Recommended" ` + -and $_.PhysicalLocation -ne "" + } + + $usableLocations = $locations | + ForEach-Object { + $available = Get-AzAvailableCores -location $_.location -skuFriendlyNames $skuFriendlyNames -minCores $minCores | + Where-Object {$_.localName -ne "Total Regional vCPUs"} + If ($available.usableLocation) { + $_ | Add-Member -MemberType NoteProperty -Name TotalCores -Value $available.limit -Force + $_ | Add-Member -MemberType NoteProperty -Name AvailableCores -Value $available.available -Force + $_ | Add-Member -MemberType NoteProperty -Name usableLocation -Value $available.usableLocation -Force -PassThru + } + } + + $usableLocations +} + +Function Get-AzAvailablePublicIpAddress ($location, $subscriptionId, $minPublicIP = 0) { + + $accessToken = az account get-access-token --query accessToken -o tsv + $headers = @{ + "Authorization" = "Bearer $accessToken" + } + + $uri = "https://management.azure.com/subscriptions/$subscriptionId/providers/Microsoft.Network/locations/$location/usages?api-version=2023-02-01" + + $publicIpCount = (Get-AzPublicIpAddress | where-object {$_.location -eq $location} | measure-object).count + $response = Invoke-RestMethod -Uri $uri -Headers $headers -Method Get + + $limit = ($response.value | where-object { $_.name.value -eq "PublicIPAddresses"}).limit + + $availableIP = $limit - $publicIpCount + + $availableIP + +} + +#endregion Functions + +$location = $env:AZURE_LOCATION +$subscriptionId = $env:AZURE_SUBSCRIPTION_ID +$minCores = 32 +$minPublicIP = 10 +$skuFriendlyNames = "Standard DSv5 Family vCPUs|Total Regional vCPUs" + +Write-Host "`nChecking for available capacity in $location region..." + +$available = Get-AzAvailableCores -location $location -skuFriendlyNames $skuFriendlyNames -minCores $minCores + +If ($available.usableLocation -contains $false) { + Write-Host "`n`u{274C} There is not enough VM capacity in the $location region to deploy the Jumpstart environment." -ForegroundColor Red + + Write-Host "`nChecking other regions in the same geography with enough capacity ($minCores cores)...`n" + + $locations = Get-AzAvailableLocations -location $location -skuFriendlyNames $skuFriendlyNames -minCores $minCores | + Format-Table Location, DisplayName, TotalCores, AvailableCores, UsableLocation -AutoSize | Out-String + + Write-Host $locations + + Write-Host "Please run ``azd env --new`` to create a new environment and select the new location.`n" + + $message = "Not enough capacity in $location region." + Throw $message + +} else { + $availableIP = Get-AzAvailablePublicIpAddress -location $location -subscriptionId $subscriptionId -minPublicIP $minPublicIP + + If ($availableIP -le $minPublicIP) { + $requiredIp = $minPublicIP - $availableIP + Write-Host "`n`u{274C} There is not enough Public IP in the $location region to deploy the Jumpstart environment. Need addtional $requiredIp Public IP." -ForegroundColor Red + + $message = "Not enough capacity in $location region." + Throw $message + } else { + Write-Host "`n`u{2705} There is enough VM and Public IP capacity in the $location region to deploy the Jumpstart environment.`n" + } +} + +######################################################################## +# Get Windows Admin Username and Password +######################################################################## +$JS_WINDOWS_ADMIN_USERNAME = 'agora' +if ($promptOutput = Read-Host "Enter the Windows Admin Username [$JS_WINDOWS_ADMIN_USERNAME]") { $JS_WINDOWS_ADMIN_USERNAME = $promptOutput } + +# set the env variable +azd env set JS_WINDOWS_ADMIN_USERNAME -- $JS_WINDOWS_ADMIN_USERNAME + + +######################################################################## +# RDP Port +######################################################################## +$JS_RDP_PORT = '3389' +If ($env:JS_RDP_PORT) { + $JS_RDP_PORT = $env:JS_RDP_PORT +} +if ($promptOutput = Read-Host "Enter the RDP Port for remote desktop connection [$JS_RDP_PORT]") { $JS_RDP_PORT = $promptOutput } + +# set the env variable +azd env set JS_RDP_PORT $JS_RDP_PORT + + +######################################################################## +# GitHub User +######################################################################## +$JS_GITHUB_USER = $env:JS_GITHUB_USER + +$defaultGhUser = "" +If ($JS_GITHUB_USER) { $defaultGhUser = " [$JS_GITHUB_USER]"} + +if ($promptOutput = Read-Host "Enter your GitHub user name$defaultGhUser") { $JS_GITHUB_USER = $promptOutput } + +# set the env variable +azd env set JS_GITHUB_USER -- $JS_GITHUB_USER + + +######################################################################## +# GitHub Personal Access Token +######################################################################## +$JS_GITHUB_PAT = $env:JS_GITHUB_PAT + +$defaultPAT = "" +If ($JS_GITHUB_PAT) { $defaultPAT = " [$JS_GITHUB_PAT]"} + +if ($promptOutput = Read-Host "Enter your GitHub Personal Access Token (PAT)$defaultPAT") { $JS_GITHUB_PAT = $promptOutput } + +# set the env variable +azd env set JS_GITHUB_PAT -- $JS_GITHUB_PAT + + +######################################################################## +# Create SSH RSA Public Key +######################################################################## +Write-Host "Creating SSH RSA Public Key..." +$file = "js_rsa" +remove-item $file, "$file.pub" -Force -ea 0 + +# Generate the SSH key pair +ssh-keygen -q -t rsa -b 4096 -f $file -N '""' + +# Get the public key +$JS_SSH_RSA_PUBLIC_KEY = get-content "$file.pub" + +# Escape the backslashes +$JS_SSH_RSA_PUBLIC_KEY = $JS_SSH_RSA_PUBLIC_KEY.Replace("\", "\\") + +# set the env variable +azd env set JS_SSH_RSA_PUBLIC_KEY -- $JS_SSH_RSA_PUBLIC_KEY + + +######################################################################## +# Create Azure Service Principal +######################################################################## +Write-Host "Creating Azure Service Principal..." + +$user = $context.Account.Id.split("@")[0] +$uniqueSpnName = "$user-jumpstart-spn-$(Get-Random -Minimum 1000 -Maximum 9999)" +try { + $spn = New-AzADServicePrincipal -DisplayName $uniqueSpnName -Role "Owner" -Scope "/subscriptions/$($env:AZURE_SUBSCRIPTION_ID)" -ErrorAction Stop +} +catch { + If ($error[0].ToString() -match "Forbidden"){ + Throw "You do not have permission to create a service principal. Please contact your Azure subscription administrator to grant you the Owner role on the subscription." + } + elseif ($error[0].ToString() -match "credentials") { + Throw "Please run Connect-AzAccount to sign and run 'azd up' again." + } + else { + Throw "An error occurred creating the service principal. Please try again." + } +} + +$SPN_CLIENT_ID = $spn.AppId +$SPN_CLIENT_SECRET = $spn.PasswordCredentials.SecretText +$SPN_TENANT_ID = (Get-AzContext).Tenant.Id + +# Set environment variables +azd env set SPN_CLIENT_ID -- $SPN_CLIENT_ID +azd env set SPN_CLIENT_SECRET -- $SPN_CLIENT_SECRET +azd env set SPN_TENANT_ID -- $SPN_TENANT_ID From 709ec2cc7a3b22b658234f5548a5a1097326b9d4 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 26 Sep 2024 19:55:17 +0300 Subject: [PATCH 002/409] Update azure-iot-ops version to 0.5.1b1 in AgConfig-contoso-hypermarket.psd1 and AgConfig-contoso-motors.psd1 --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 2 +- .../artifacts/PowerShell/AgConfig-contoso-motors.psd1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index a53fdd7cf3..34576050c3 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -59,7 +59,7 @@ @{name="customlocation"; version="latest"}, @{name="kusto"; version="latest"}, @{name="storage-preview"; version="latest"}, - @{name="azure-iot-ops"; version="latest"} + @{name="azure-iot-ops"; version="0.5.1b1"} ) # PowerShell modules diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 index d2cd9b1016..09715be664 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 @@ -57,7 +57,7 @@ @{name="customlocation"; version="latest"}, @{name="kusto"; version="latest"}, @{name="storage-preview"; version="latest"}, - @{name="azure-iot-ops"; version="latest"} + @{name="azure-iot-ops"; version="0.5.1b1"} ) # PowerShell modules From bdd2e04846693718cc767274a9659266bd8ee03d Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 26 Sep 2024 19:57:03 +0300 Subject: [PATCH 003/409] Update azure-iot-ops version to latest in AgConfig-contoso-hypermarket.psd1 and AgConfig-contoso-motors.psd1 --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 2 +- .../artifacts/PowerShell/AgConfig-contoso-motors.psd1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 34576050c3..a53fdd7cf3 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -59,7 +59,7 @@ @{name="customlocation"; version="latest"}, @{name="kusto"; version="latest"}, @{name="storage-preview"; version="latest"}, - @{name="azure-iot-ops"; version="0.5.1b1"} + @{name="azure-iot-ops"; version="latest"} ) # PowerShell modules diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 index 09715be664..d2cd9b1016 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 @@ -57,7 +57,7 @@ @{name="customlocation"; version="latest"}, @{name="kusto"; version="latest"}, @{name="storage-preview"; version="latest"}, - @{name="azure-iot-ops"; version="0.5.1b1"} + @{name="azure-iot-ops"; version="latest"} ) # PowerShell modules From 38164701bd2765ee4cd7382fbb805620f08b6d89 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 26 Sep 2024 20:05:30 +0300 Subject: [PATCH 004/409] Update container image references in mqtt_listener.yml and mqtt_simulator.yml --- .../settings/Bookmarks-manufacturing | 125 ---------- .../artifacts/settings/Bookmarks-retail | 215 ------------------ .../artifacts/settings/mq_cloudConnector.yml | 77 +++---- .../artifacts/settings/mqtt_listener.yml | 2 +- .../artifacts/settings/mqtt_simulator.yml | 2 +- 5 files changed, 30 insertions(+), 391 deletions(-) delete mode 100644 azure_jumpstart_ag/artifacts/settings/Bookmarks-manufacturing delete mode 100644 azure_jumpstart_ag/artifacts/settings/Bookmarks-retail diff --git a/azure_jumpstart_ag/artifacts/settings/Bookmarks-manufacturing b/azure_jumpstart_ag/artifacts/settings/Bookmarks-manufacturing deleted file mode 100644 index 9ba8dea075..0000000000 --- a/azure_jumpstart_ag/artifacts/settings/Bookmarks-manufacturing +++ /dev/null @@ -1,125 +0,0 @@ -{ - "checksum": "d77f9db622cff666aa1ae0f899c3b4ec", - "roots": { - "bookmark_bar": { - "children": [ - { - "children": [ { - "id": "18", - "name": "Control center Detroit", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "Flask-Detroit-URL" - }, { - "id": "19", - "name": "Control center Monterrey", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "Flask-Monterrey-URL" - }], - "id": "16", - "name": "Control centers", - "source": "unknown", - "type": "folder" - }, - { - "children": [ { - "id": "16", - "name": "Influxdb Detroit", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "Influxdb-Detroit-URL" - }, { - "id": "17", - "name": "Influxdb Monterrey", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "Influxdb-Monterrey-URL" - }], - "id": "15", - "name": "Influxdb", - "source": "unknown", - "type": "folder" - }, - { - "children": [ { - "id": "20", - "name": "Grafana", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "http://localhost:3000" - }], - "id": "17", - "name": "Grafana", - "source": "unknown", - "type": "folder" - }, - { - "children": [ { - "id": "30", - "name": "Prometheus Detroit", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "Prometheus-Detroit-URL" - }, { - "id": "31", - "name": "Prometheus Monterrey", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "Prometheus-Monterrey-URL" - }], - "id": "29", - "name": "Prometheus", - "source": "unknown", - "type": "folder" - }, { - "id": "22", - "name": "ADX Dashboards", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "https://dataexplorer.azure.com/dashboards/" - }, { - "id": "23", - "name": "Arc Jumpstart", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "https://aka.ms/ArcJumpstart/" - }, { - "id": "24", - "name": "Azure Portal", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "https://portal.azure.com/" - } ], - "id": "1", - "name": "Favorites bar", - "source": "unknown", - "type": "folder" - }, - "other": { - "children": [ ], - "id": "25", - "name": "Other favorites", - "source": "unknown", - "type": "folder" - }, - "synced": { - "children": [ ], - "id": "26", - "name": "Mobile favorites", - "source": "unknown", - "type": "folder" - } - }, - "version": 1 -} \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/settings/Bookmarks-retail b/azure_jumpstart_ag/artifacts/settings/Bookmarks-retail deleted file mode 100644 index 3445f225f2..0000000000 --- a/azure_jumpstart_ag/artifacts/settings/Bookmarks-retail +++ /dev/null @@ -1,215 +0,0 @@ -{ - "checksum": "d77f9db622cff666aa1ae0f899c3b4ec", - "roots": { - "bookmark_bar": { - "children": [ { - "children": [ { - "children": [ { - "id": "4", - "name": "POS Chicago - Customer", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "POS-Chicago-URL-Customer" - }, { - "id": "5", - "name": "POS Chicago - Manager", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "POS-Chicago-URL-Manager" - } ], - "id": "3", - "name": "Chicago", - "source": "unknown", - "type": "folder" - }, { - "children": [ { - "id": "7", - "name": "POS Seattle - Customer", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "POS-Seattle-URL-Customer" - }, { - "id": "8", - "name": "POS Seattle - Manager", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "POS-Seattle-URL-Manager" - } ], - "id": "6", - "name": "Seattle", - "source": "unknown", - "type": "folder" - }, { - "children": [ { - "id": "10", - "name": "POS Dev - Customer", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "POS-Dev-URL-Customer" - }, { - "id": "11", - "name": "POS Dev - Manager", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "POS-Dev-URL-Manager" - } ], - "id": "9", - "name": "Dev", - "source": "unknown", - "type": "folder" - }, { - "children": [ { - "id": "13", - "name": "POS Staging - Customer", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "POS-Staging-URL-Customer" - }, { - "id": "14", - "name": "POS Staging - Manager", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "POS-Staging-URL-Manager" - } ], - "id": "12", - "name": "Staging", - "source": "unknown", - "type": "folder" - } ], - "id": "2", - "name": "POS", - "source": "unknown", - "type": "folder" - }, { - "children": [ { - "id": "16", - "name": "Grafana Dev", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "Grafana-Dev-URL" - }, { - "id": "17", - "name": "Grafana Staging", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "Grafana-Staging-URL" - }, { - "id": "18", - "name": "Grafana Prod", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "http://localhost:3000/" - } ], - "id": "15", - "name": "Grafana", - "source": "unknown", - "type": "folder" - }, { - "children": [ { - "id": "30", - "name": "Prometheus Dev", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "Prometheus-Dev-URL" - }, { - "id": "31", - "name": "Prometheus Staging", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "Prometheus-Staging-URL" - }, { - "id": "32", - "name": "Prometheus Canary - Chicago", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "Prometheus-Chicago-URL" - }, { - "id": "33", - "name": "Prometheus Prod - Seattle", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "Prometheus-Seattle-URL" - } ], - "id": "29", - "name": "Prometheus", - "source": "unknown", - "type": "folder" - }, { - "children": [ { - "id": "20", - "name": "Agora Apps Repo - Microsoft", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "https://github.com/microsoft/jumpstart-agora-apps" - }, { - "id": "21", - "name": "Agora-Apps-Repo-Your-Fork", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "Agora-Apps-Repo-Clone-URL" - } ], - "id": "19", - "name": "GitHub", - "source": "unknown", - "type": "folder" - }, { - "id": "22", - "name": "ADX Dashboards", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "https://dataexplorer.azure.com/dashboards/" - }, { - "id": "23", - "name": "Arc Jumpstart", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "https://aka.ms/ArcJumpstart/" - }, { - "id": "24", - "name": "Azure Portal", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "https://portal.azure.com/" - } ], - "id": "1", - "name": "Favorites bar", - "source": "unknown", - "type": "folder" - }, - "other": { - "children": [ ], - "id": "25", - "name": "Other favorites", - "source": "unknown", - "type": "folder" - }, - "synced": { - "children": [ ], - "id": "26", - "name": "Mobile favorites", - "source": "unknown", - "type": "folder" - } - }, - "version": 1 -} diff --git a/azure_jumpstart_ag/artifacts/settings/mq_cloudConnector.yml b/azure_jumpstart_ag/artifacts/settings/mq_cloudConnector.yml index f435db3cb6..933a109596 100644 --- a/azure_jumpstart_ag/artifacts/settings/mq_cloudConnector.yml +++ b/azure_jumpstart_ag/artifacts/settings/mq_cloudConnector.yml @@ -1,55 +1,34 @@ -apiVersion: connectivity.iotoperations.azure.com/v1beta1 -kind: DataflowEndpoint +apiVersion: mq.iotoperations.azure.com/v1beta1 +kind: MqttBridgeTopicMap metadata: - name: mq + name: my-topic-map + namespace: azure-iot-operations spec: - endpointType: mqtt - authentication: - method: serviceAccountToken - serviceAccountTokenSettings: - audience: aio-mqtt - mqttSettings: - {} + mqttBridgeConnectorRef: my-mqtt-bridge + routes: + - direction: local-to-remote + name: route-to-eventgrid + qos: 1 + source: "topic/#" --- -apiVersion: connectivity.iotoperations.azure.com/v1beta1 -kind: DataflowEndpoint +apiVersion: mq.iotoperations.azure.com/v1beta1 +kind: MqttBridgeConnector metadata: - name: eventgrid + name: my-mqtt-bridge + namespace: azure-iot-operations spec: - endpointType: mqtt - authentication: - method: systemAssignedManagedIdentity - systemAssignedManagedIdentitySettings: - audience: https://eventgrid.azure.net - mqttSettings: - host: eventGridPlaceholder:8883 + image: + repository: mcr.microsoft.com/azureiotoperations/mqttbridge + tag: 0.1.0-preview + pullPolicy: IfNotPresent + protocol: v5 + bridgeInstances: 1 + clientIdPrefix: factory-gateway- + logLevel: debug + remoteBrokerConnection: + endpoint: eventGridPlaceholder:8883 tls: - mode: Enabled ---- -apiVersion: connectivity.iotoperations.azure.com/v1beta1 -kind: Dataflow -metadata: - name: my-dataflow -spec: - profileRef: my-dataflow-profile - mode: enabled - operations: - - operationType: source - name: source1 - sourceSettings: - endpointRef: mq - dataSources: - - "topic/#" - - azure-iot-operations/data/# - - operationType: destination - name: destination1 - destinationSettings: - endpointRef: eventgrid - dataDestination: factory ---- -apiVersion: connectivity.iotoperations.azure.com/v1beta1 -kind: DataflowProfile -metadata: - name: my-dataflow-profile -spec: - instanceCount: 2 \ No newline at end of file + tlsEnabled: true + authentication: + systemAssignedManagedIdentity: + audience: https://eventgrid.azure.net \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/settings/mqtt_listener.yml b/azure_jumpstart_ag/artifacts/settings/mqtt_listener.yml index 5d82b71c8d..65d91e0cd4 100644 --- a/azure_jumpstart_ag/artifacts/settings/mqtt_listener.yml +++ b/azure_jumpstart_ag/artifacts/settings/mqtt_listener.yml @@ -16,7 +16,7 @@ spec: spec: containers: - name: mqtt-listener - image: jumpstartprod.azurecr.io/mqtt-listener:latest + image: jumpstartprod.azurecr.io/contoso-supermarket-mqtt-listener:latest resources: limits: memory: "512Mi" diff --git a/azure_jumpstart_ag/artifacts/settings/mqtt_simulator.yml b/azure_jumpstart_ag/artifacts/settings/mqtt_simulator.yml index 36b04431e4..de1f2fdfcc 100644 --- a/azure_jumpstart_ag/artifacts/settings/mqtt_simulator.yml +++ b/azure_jumpstart_ag/artifacts/settings/mqtt_simulator.yml @@ -14,7 +14,7 @@ spec: spec: containers: - name: mqtt-simulator - image: agoraarmbladev.azurecr.io/mqtt-simulator:latest + image: jumpstartprod.azurecr.io/contoso-supermarket-mqtt-simulator:latest resources: limits: cpu: "1" From dfdff8bac5921dcf189f3d590b6df3c1e5f8d4e4 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 26 Sep 2024 20:06:31 +0300 Subject: [PATCH 005/409] aio version --- .../AgConfig-contoso-hypermarket.psd1 | 2 +- .../PowerShell/AgConfig-contoso-motors.psd1 | 2 +- .../PowerShell/AgConfig-manufacturing.psd1 | 232 ------------- .../artifacts/PowerShell/AgConfig-retail.psd1 | 318 ------------------ 4 files changed, 2 insertions(+), 552 deletions(-) delete mode 100644 azure_jumpstart_ag/artifacts/PowerShell/AgConfig-manufacturing.psd1 delete mode 100644 azure_jumpstart_ag/artifacts/PowerShell/AgConfig-retail.psd1 diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index a53fdd7cf3..34576050c3 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -59,7 +59,7 @@ @{name="customlocation"; version="latest"}, @{name="kusto"; version="latest"}, @{name="storage-preview"; version="latest"}, - @{name="azure-iot-ops"; version="latest"} + @{name="azure-iot-ops"; version="0.5.1b1"} ) # PowerShell modules diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 index d2cd9b1016..09715be664 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 @@ -57,7 +57,7 @@ @{name="customlocation"; version="latest"}, @{name="kusto"; version="latest"}, @{name="storage-preview"; version="latest"}, - @{name="azure-iot-ops"; version="latest"} + @{name="azure-iot-ops"; version="0.5.1b1"} ) # PowerShell modules diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-manufacturing.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-manufacturing.psd1 deleted file mode 100644 index 1df6ed3ab9..0000000000 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-manufacturing.psd1 +++ /dev/null @@ -1,232 +0,0 @@ -@{ - # This is the PowerShell datafile used to provide configuration information for the Agora environment. Product keys and password are not encrypted and will be available on host during installation. - - # Directory paths - AgDirectories = @{ - AgDir = "C:\Ag" - AgPowerShellDir = "C:\Ag\PowerShell" - AgLogsDir = "C:\Ag\Logs" - AgVMDir = "C:\Ag\Virtual Machines" - AgIconDir = "C:\Ag\Icons" - AgToolsDir = "C:\Tools" - AgTempDir = "C:\Temp" - AgVHDXDir = "V:\VMs" - AgConfigMapDir = "C:\Ag\ConfigMaps" - AgL1Files = "C:\Ag\L1Files" - AgAppsRepo = "C:\Ag\AppsRepo" - AgMonitoringDir = "C:\Ag\Monitoring" - AgAdxDashboards = "C:\Ag\AdxDashboards" - AgDataEmulator = "C:\Ag\DataEmulator" - } - - # Required URLs - URLs = @{ - chocoInstallScript = 'https://chocolatey.org/install.ps1' - wslUbuntu = 'https://aka.ms/wslubuntu' - wslStoreStorage = 'https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi' - docker = 'https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe' - githubAPI = 'https://api.github.com' - grafana = 'https://api.github.com/repos/grafana/grafana/releases/latest' - azurePortal = 'https://portal.azure.com' - aksEEk3s = 'https://aka.ms/aks-edge/k3s-msi' - nginx = 'https://kubernetes.github.io/ingress-nginx' - prometheus = 'https://prometheus-community.github.io/helm-charts' - vcLibs = 'https://aka.ms/Microsoft.VCLibs.x64.14.00.Desktop.appx' - windowsTerminal = 'https://api.github.com/repos/microsoft/terminal/releases/latest' - aksEEReleases = 'https://api.github.com/repos/Azure/AKS-Edge/releases' - mqttExplorerReleases = 'https://api.github.com/repos/thomasnordquist/MQTT-Explorer/releases/latest' - } - - # Azure required registered resource providers - AzureProviders = @( - "Microsoft.Kubernetes", - "Microsoft.KubernetesConfiguration", - "Microsoft.ExtendedLocation", - "Microsoft.HybridCompute", - "Microsoft.GuestConfiguration", - "Microsoft.HybridConnectivity", - "Microsoft.DeviceRegistry", - "Microsoft.EventGrid" - ) - - # Az CLI required extensions - AzCLIExtensions = @( - @{name="k8s-extension"; version="latest"}, - @{name="k8s-configuration"; version="latest"}, - @{name="eventgrid"; version="latest"}, - @{name="customlocation"; version="latest"}, - @{name="kusto"; version="latest"}, - @{name="storage-preview"; version="latest"}, - @{name="azure-iot-ops"; version="0.5.1b1"} - ) - - # PowerShell modules - PowerShellModules = @( - 'Az.ConnectedKubernetes', - 'Az.KubernetesConfiguration', - 'Az.Kusto', - 'Az.EventGrid', - 'Az.Storage', - 'Az.EventHub' - ) - - # Chocolatey packages list - ChocolateyPackagesList = @( - 'az.powershell', - 'bicep', - 'kubernetes-cli', - 'vcredist140', - 'microsoft-edge', - 'azcopy10', - 'vscode', - 'git', - '7zip', - 'kubectx', - 'putty.install', - 'kubernetes-helm', - 'dotnet-sdk', - 'zoomit', - 'openssl.light', - 'mqtt-explorer', - 'gh', - 'python' - ) - - # Pip packages list - PipPackagesList = @( - 'paho-mqtt' - ) - - # VSCode extensions - VSCodeExtensions = @( - 'ms-vscode-remote.remote-containers', - 'ms-vscode-remote.remote-wsl', - 'ms-vscode.powershell', - 'redhat.vscode-yaml', - 'ZainChen.json', - 'esbenp.prettier-vscode', - 'ms-kubernetes-tools.vscode-kubernetes-tools', - 'mindaro.mindaro', - 'github.vscode-pull-request-github' - ) - - # Git branches - GitBranches = @( - 'production', - 'staging', - 'canary' , - 'main' - ) - - # VHDX blob url - ProdVHDBlobURL = 'https://jumpstartprodsg.blob.core.windows.net/agora/base/prod-w11iot/AGBase.vhdx' - PreProdVHDBlobURL = 'https://jumpstartprodsg.blob.core.windows.net/agora/base/preprod-w11iot/AGBase.vhdx' - - # L1 virtual machine configuration - HostVMDrive = "V" # This value controls the drive letter where the nested virtual - L1VMMemory = 32GB # This value controls the amount of RAM for each AKS Edge Essentials host virtual machine - L1VMNumVCPU = 8 # This value controls the number of vCPUs to assign to each AKS Edge Essentials host virtual machine. - InternalSwitch = "InternalSwitch" # This value controls the Hyper-V internal switch name used by L0 Azure virtual machine. - L1Username = "Administrator" # This value controls the Admin credential username for the L1 Hyper-V virtual machines that run on the Agora-Client. - L1Password = 'Agora123!!' # This value controls the Admin credential password for the L1 Hyper-V virtual machines that run on the Agora-Client. - L1DefaultGateway = "172.20.1.1" # This value controls the default gateway IP address used by each L1 Hyper-V virtual machines that run on the Agora-Client. - L1SwitchName = "AKS-Int" # This value controls the Hyper-V internal switch name used by each L1 Hyper-V virtual machines that run on the Agora-Client. - L1NatSubnetPrefix = "172.20.1.0/24" # This value controls the network subnet used by each L1 Hyper-V virtual machines that run on the Agora-Client. - - # NAT Configuration - natHostSubnet = "192.168.128.0/24" - natHostVMSwitchName = "InternalNAT" - natConfigure = $true - natSubnet = "192.168.46.0/24" # This value is the subnet is the NAT router will use to route to AzSMGMT to access the Internet. It can be any /24 subnet and is only used for routing. - natDNS = "%staging-natDNS%" # Do not change - can be configured by passing the optional natDNS parameter to the ARM deployment. - - # AKS Edge Essentials variables - SiteConfig = @{ - Detroit = @{ - ArcClusterName = "Ag-ArcK8s-Detroit" - NetIPAddress = "172.20.1.2" - DefaultGateway = "172.20.1.1" - PrefixLength = "24" - DNSClientServerAddress = "168.63.129.16" - ServiceIPRangeStart = "172.20.1.31" - ServiceIPRangeSize = "10" - ControlPlaneEndpointIp = "172.20.1.21" - LinuxNodeIp4Address = "172.20.1.11" - Subnet = "172.20.1.0/24" - FriendlyName = "Detroit" - IsProduction = $true - Type = "AKSEE" - Branch = "main" - HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" - HelmService = "service/prometheus-kube-prometheus-prometheus" - GrafanaDataSource = "detroit" - HelmValuesFile = "prometheus-additional-scrape-config.yaml" - clusterLogSize = "1024" - AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used - } - Monterrey = @{ - ArcClusterName = "Ag-ArcK8s-Monterrey" - NetIPAddress = "172.20.1.3" - DefaultGateway = "172.20.1.1" - PrefixLength = "24" - DNSClientServerAddress = "168.63.129.16" - ServiceIPRangeStart = "172.20.1.71" - ServiceIPRangeSize = "10" - ControlPlaneEndpointIp = "172.20.1.61" - LinuxNodeIp4Address = "172.20.1.51" - Subnet = "172.20.1.0/24" - FriendlyName = "Monterrey" - IsProduction = $true - Type = "AKSEE" - Branch = "main" - HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" - HelmService = "service/prometheus-kube-prometheus-prometheus" - GrafanaDataSource = "monterrey" - HelmValuesFile = "prometheus-additional-scrape-config.yaml" - clusterLogSize = "1024" - AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used - } - } - - # Universal resource tag and resource types - TagName = 'Project' - TagValue = 'Jumpstart_Agora' - ArcServerResourceType = 'Microsoft.HybridCompute/machines' - ArcK8sResourceType = 'Microsoft.Kubernetes/connectedClusters' - AksResourceType = 'Microsoft.ContainerService/managedClusters' - - - # Observability variables - Monitoring = @{ - AdminUser = "admin" - User = "Contoso Operator" - Email = "operator@contoso.com" - Namespace = "observability" - ProdURL = "http://localhost:3000" - Dashboards = @{ - "grafana.com" = @() # Dashboards from https://grafana.com/grafana/dashboards - "custom" = @('node-exporter-full','cluster-global') # Dashboards from https://github.com/microsoft/azure_arc/tree/main/azure_jumpstart_ag/artifacts/monitoring - } - } - - Namespaces = @( - "observability" - "images-cache" - ) - - AppConfig = @{ - inferencing_deployment = @{ - GitOpsConfigName = "contoso-motors" - KustomizationName = "contoso-motors" - KustomizationPath="./contoso_manufacturing/operations" - Namespace = "contoso-motors" - Order = 1 - } - } - - # Microsoft Edge startup settings variables - EdgeSettingRegistryPath = 'HKLM:\SOFTWARE\Policies\Microsoft\Edge' - EdgeSettingValueTrue = '00000001' - EdgeSettingValueFalse = '00000000' - -} \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-retail.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-retail.psd1 deleted file mode 100644 index 53483614f5..0000000000 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-retail.psd1 +++ /dev/null @@ -1,318 +0,0 @@ -@{ - # This is the PowerShell datafile used to provide configuration information for the Agora environment. Product keys and password are not encrypted and will be available on host during installation. - - # Directory paths - AgDirectories = @{ - AgDir = "C:\Ag" - AgPowerShellDir = "C:\Ag\PowerShell" - AgLogsDir = "C:\Ag\Logs" - AgVMDir = "C:\Ag\Virtual Machines" - AgIconDir = "C:\Ag\Icons" - AgToolsDir = "C:\Tools" - AgTempDir = "C:\Temp" - AgVHDXDir = "V:\VMs" - AgConfigMapDir = "C:\Ag\ConfigMaps" - AgL1Files = "C:\Ag\L1Files" - AgAppsRepo = "C:\Ag\AppsRepo" - AgAdxDashboards = "C:\Ag\AdxDashboards" - AgDataEmulator = "C:\Ag\DataEmulator" - AgMonitoringDir = "C:\Ag\Monitoring" - } - - # Required URLs - URLs = @{ - chocoInstallScript = 'https://chocolatey.org/install.ps1' - wslUbuntu = 'https://aka.ms/wslubuntu' - wslStoreStorage = 'https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi' - docker = 'https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe' - githubAPI = 'https://api.github.com' - grafana = 'https://api.github.com/repos/grafana/grafana/releases/latest' - azurePortal = 'https://portal.azure.com' - aksEEk3s = 'https://aka.ms/aks-edge/k3s-msi' - nginx = 'https://kubernetes.github.io/ingress-nginx' - prometheus = 'https://prometheus-community.github.io/helm-charts' - vcLibs = 'https://aka.ms/Microsoft.VCLibs.x64.14.00.Desktop.appx' - windowsTerminal = 'https://api.github.com/repos/microsoft/terminal/releases/latest' - aksEEReleases = 'https://api.github.com/repos/Azure/AKS-Edge/releases' - } - - # Azure required registered resource providers - AzureProviders = @( - "Microsoft.Kubernetes", - "Microsoft.KubernetesConfiguration", - "Microsoft.ExtendedLocation" - ) - - # Az CLI required extensions - AzCLIExtensions = @( - @{name="k8s-extension"; version="latest"}, - @{name="k8s-configuration"; version="latest"}, - @{name="azure-iot"; version="latest"} - ) - - # PowerShell modules - PowerShellModules = @( - 'Az.ConnectedKubernetes' - 'Az.KubernetesConfiguration' - 'Az.Kusto' - ) - - # Chocolatey packages list - ChocolateyPackagesList = @( - 'az.powershell', - 'kubernetes-cli', - 'vcredist140', - 'microsoft-edge', - 'azcopy10', - 'vscode', - 'git', - '7zip', - 'kubectx', - 'putty.install', - 'kubernetes-helm', - 'dotnet-sdk', - 'zoomit', - 'openssl.light', - 'mqtt-explorer', - 'gh', - 'python', - 'bicep' - ) - - # VSCode extensions - VSCodeExtensions = @( - 'ms-vscode-remote.remote-containers', - 'ms-vscode-remote.remote-wsl', - 'ms-vscode.powershell', - 'redhat.vscode-yaml', - 'ZainChen.json', - 'esbenp.prettier-vscode', - 'ms-kubernetes-tools.vscode-kubernetes-tools', - 'mindaro.mindaro', - 'github.vscode-pull-request-github' - ) - - # Git branches - GitBranches = @( - 'production', - 'staging', - 'canary' , - 'main' - ) - - # VHDX blob url - ProdVHDBlobURL = 'https://jumpstartprodsg.blob.core.windows.net/agora/base/prod-w11iot/AGBase.vhdx' - PreProdVHDBlobURL = 'https://jumpstartprodsg.blob.core.windows.net/agora/base/preprod-w11iot/AGBase.vhdx' - - # L1 virtual machine configuration - HostVMDrive = "V" # This value controls the drive letter where the nested virtual - L1VMMemory = 32GB # This value controls the amount of RAM for each AKS Edge Essentials host virtual machine - L1VMNumVCPU = 8 # This value controls the number of vCPUs to assign to each AKS Edge Essentials host virtual machine. - InternalSwitch = "InternalSwitch" # This value controls the Hyper-V internal switch name used by L0 Azure virtual machine. - L1Username = "Administrator" # This value controls the Admin credential username for the L1 Hyper-V virtual machines that run on the Agora-Client. - L1Password = 'Agora123!!' # This value controls the Admin credential password for the L1 Hyper-V virtual machines that run on the Agora-Client. - L1DefaultGateway = "172.20.1.1" # This value controls the default gateway IP address used by each L1 Hyper-V virtual machines that run on the Agora-Client. - L1SwitchName = "AKS-Int" # This value controls the Hyper-V internal switch name used by each L1 Hyper-V virtual machines that run on the Agora-Client. - L1NatSubnetPrefix = "172.20.1.0/24" # This value controls the network subnet used by each L1 Hyper-V virtual machines that run on the Agora-Client. - - # NAT Configuration - natHostSubnet = "192.168.128.0/24" - natHostVMSwitchName = "InternalNAT" - natConfigure = $true - natSubnet = "192.168.46.0/24" # This value is the subnet is the NAT router will use to route to AzSMGMT to access the Internet. It can be any /24 subnet and is only used for routing. - natDNS = "%staging-natDNS%" # Do not change - can be configured by passing the optional natDNS parameter to the ARM deployment. - - # AKS Edge Essentials variables - SiteConfig = @{ - Seattle = @{ - ArcClusterName = "Ag-ArcK8s-Seattle" - NetIPAddress = "172.20.1.2" - DefaultGateway = "172.20.1.1" - PrefixLength = "24" - DNSClientServerAddress = "168.63.129.16" - ServiceIPRangeStart = "172.20.1.31" - ServiceIPRangeSize = "10" - ControlPlaneEndpointIp = "172.20.1.21" - LinuxNodeIp4Address = "172.20.1.11" - Subnet = "172.20.1.0/24" - FriendlyName = "Seattle" - IsProduction = $true - Type = "AKSEE" - posNamespace = "contoso-supermarket" - Branch = "production" - HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" - HelmService = "service/prometheus-kube-prometheus-prometheus" - GrafanaDataSource = "seattle" - HelmValuesFile = "prometheus-additional-scrape-config.yaml" - IoTDevices = @("Freezer-1", "Freezer-2") - AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used - } - Chicago = @{ - ArcClusterName = "Ag-ArcK8s-Chicago" - NetIPAddress = "172.20.1.3" - DefaultGateway = "172.20.1.1" - PrefixLength = "24" - DNSClientServerAddress = "168.63.129.16" - ServiceIPRangeStart = "172.20.1.71" - ServiceIPRangeSize = "10" - ControlPlaneEndpointIp = "172.20.1.61" - LinuxNodeIp4Address = "172.20.1.51" - Subnet = "172.20.1.0/24" - FriendlyName = "Chicago" - IsProduction = $true - Type = "AKSEE" - posNamespace = "contoso-supermarket" - Branch = "canary" - HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" - HelmService = "service/prometheus-kube-prometheus-prometheus" - GrafanaDataSource = "chicago" - HelmValuesFile = "prometheus-additional-scrape-config.yaml" - IoTDevices = @("Freezer-1", "Freezer-2") - AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used - } - Dev = @{ - ArcClusterName = "Ag-ArcK8s-Dev" - NetIPAddress = "172.20.1.4" - DefaultGateway = "172.20.1.1" - PrefixLength = "24" - DNSClientServerAddress = "168.63.129.16" - ServiceIPRangeStart = "172.20.1.101" - ServiceIPRangeSize = "10" - ControlPlaneEndpointIp = "172.20.1.91" - LinuxNodeIp4Address = "172.20.1.81" - Subnet = "172.20.1.0/24" - FriendlyName = "Dev" - IsProduction = $false - Type = "AKSEE" - posNamespace = "contoso-supermarket" - Branch = "main" - HelmSetValue = "alertmanager.enabled=false,grafana.ingress.enabled=true,grafana.service.type=LoadBalancer,prometheus.service.type=LoadBalancer,grafana.adminPassword=adminPasswordPlaceholder" - HelmService = "service/prometheus-grafana" - GrafanaDataSource = "prometheus" - HelmValuesFile = "prometheus-additional-scrape-config.yaml" - IoTDevices = @("Freezer-1", "Freezer-2") - AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used - } - Staging = @{ - ArcClusterName = "Ag-AKS-Staging" - FriendlyName = "Staging" - IsProduction = $false - Type = "AKS" - posNamespace = "contoso-supermarket" - Branch = "staging" - HelmSetValue = "alertmanager.enabled=false,grafana.ingress.enabled=true,grafana.service.type=LoadBalancer,prometheus.service.type=LoadBalancer,grafana.adminPassword=adminPasswordPlaceholder" - HelmService = "service/prometheus-grafana" - GrafanaDataSource = "prometheus" - HelmValuesFile = "prometheus-additional-scrape-config.yaml" - IoTDevices = @("Freezer-1", "Freezer-2") - } - } - - # Universal resource tag and resource types - TagName = 'Project' - TagValue = 'Jumpstart_Agora' - ArcServerResourceType = 'Microsoft.HybridCompute/machines' - ArcK8sResourceType = 'Microsoft.Kubernetes/connectedClusters' - AksResourceType = 'Microsoft.ContainerService/managedClusters' - - # nginx variables - nginx = @{ - RepoName = "ingress-nginx" - RepoURL = "https://kubernetes.github.io/ingress-nginx" - ReleaseName = "ingress-nginx" - ChartName = "ingress-nginx/ingress-nginx" - Namespace = "ingress-nginx" - } - - # Observability variables - Monitoring = @{ - AdminUser = "admin" - User = "Contoso Operator" - Email = "operator@contoso.com" - Namespace = "observability" - ProdURL = "http://localhost:3000" - Dashboards = @{ - "grafana.com" = @() # Dashboards from https://grafana.com/grafana/dashboards - "custom" = @('freezer-monitoring','node-exporter-full','cluster-global') # Dashboards from https://github.com/microsoft/azure_arc/tree/main/azure_jumpstart_ag/retail/artifacts/monitoring - } - } - - # Microsoft Edge startup settings variables - EdgeSettingRegistryPath = 'HKLM:\SOFTWARE\Policies\Microsoft\Edge' - EdgeSettingValueTrue = '00000001' - EdgeSettingValueFalse = '00000000' - - Namespaces = @( - "contoso-supermarket" - "observability" - "sensor-monitor" - "images-cache" - ) - - AppConfig = @{ - ContosoSupermarket_contosodb = @{ - GitOpsConfigName = "config-supermarket-db" - KustomizationName = "contosodb" - KustomizationPath="./contoso_supermarket/operations/contoso_supermarket/releases/contosodb" - Namespace = "contoso-supermarket" - Order = 1 - } - ContosoSupermarket_cloudsync = @{ - GitOpsConfigName = "config-supermarket-cloudsync" - KustomizationName = "cloudsync" - KustomizationPath="./contoso_supermarket/operations/contoso_supermarket/releases/cloudsync" - Namespace = "contoso-supermarket" - Order = 2 - } - ContosoSupermarket_contosopos = @{ - GitOpsConfigName = "config-supermarket-pos" - KustomizationName = "contosopos" - KustomizationPath="./contoso_supermarket/operations/contoso_supermarket/releases/contosopos" - Namespace = "contoso-supermarket" - Order = 3 - } - ContosoSupermarket_queue_monitoring_backend = @{ - GitOpsConfigName = "config-supermarket-queue-backend" - KustomizationName = "queuebackend" - KustomizationPath="./contoso_supermarket/operations/contoso_supermarket/releases/queue-monitoring-backend" - Namespace = "contoso-supermarket" - Order = 4 - } - ContosoSupermarket_contosoai = @{ - GitOpsConfigName = "config-supermarket-ai" - KustomizationName = "contosoai" - KustomizationPath="./contoso_supermarket/operations/contoso_supermarket/releases/contosoai" - Namespace = "contoso-supermarket" - Order = 5 - } - ContosoSupermarket_queue_monitoring_frontend = @{ - GitOpsConfigName = "config-supermarket-queue-frontend" - KustomizationName = "queuefrontend" - KustomizationPath="./contoso_supermarket/operations/contoso_supermarket/releases/queue-monitoring-frontend" - Namespace = "contoso-supermarket" - Order = 6 - } - SensorMonitor = @{ - GitOpsConfigName = "config-sensormonitor" - KustomizationName = "sensor-monitor" - KustomizationPath = "./contoso_supermarket/operations/freezer_monitoring/release" - Namespace = "sensor-monitor" - AppPath = "freezer_monitoring" - ConfigMaps = @{ - "mqtt-broker-config" = @{ - ContainerName = "mqtt-broker" - RepoPath = "contents/contoso_supermarket/developer/freezer_monitoring/src/mqtt-broker/mosquitto.conf" - } - "mqtt-simulator-config" = @{ - ContainerName = "mqtt-simulator" - RepoPath = "contents/contoso_supermarket/developer/freezer_monitoring/src/mqtt-simulator/config/settings.json" - } - "mqtt2prom-config" = @{ - ContainerName = "mqtt2prom" - RepoPath = "contents/contoso_supermarket/developer/freezer_monitoring/src/mqtt2prom/config.yaml" - } - } - Order = 7 - } - } -} From 1f85082709081d6c42f319872f4d3321fae23da3 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 26 Sep 2024 20:09:16 +0300 Subject: [PATCH 006/409] Refactor AIO deployment to use message queue service instead of broker service --- .../artifacts/PowerShell/Modules/common.psm1 | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index 4a1c6c009f..44ddeb51a3 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -1212,13 +1212,13 @@ function Deploy-AIO { Start-Sleep -Seconds 10 do { - az iot ops init --cluster $arcClusterName.toLower() -g $resourceGroup --kv-id $keyVaultId --sp-app-id $spnClientId --sp-secret $spnClientSecret --sp-object-id $spnObjectId --broker-service-type loadBalancer --add-insecure-listener true --simulate-plc false --no-block --only-show-errors + az iot ops init --cluster $arcClusterName.toLower() -g $resourceGroup --kv-id $keyVaultId --sp-app-id $spnClientId --sp-secret $spnClientSecret --sp-object-id $spnObjectId --mq-service-type loadBalancer --mq-insecure true --simulate-plc false --no-block --only-show-errors if ($? -eq $false) { $aioStatus = "notDeployed" Write-Host "`n" Write-Host "[$(Get-Date -Format t)] Error: An error occured while deploying AIO on the cluster...Retrying" -ForegroundColor DarkRed Write-Host "`n" - az iot ops init --cluster $arcClusterName.toLower() -g $resourceGroup --kv-id $keyVaultId --sp-app-id $spnClientId --sp-secret $spnClientSecret --sp-object-id $spnObjectId --broker-service-type loadBalancer --add-insecure-listener true --simulate-plc false --no-block --only-show-errors + az iot ops init --cluster $arcClusterName.toLower() -g $resourceGroup --kv-id $keyVaultId --sp-app-id $spnClientId --sp-secret $spnClientSecret --sp-object-id $spnObjectId --mq-service-type loadBalancer --mq-insecure true --simulate-plc false --no-block --only-show-errors $retryCount++ } else { @@ -1257,11 +1257,19 @@ function Deploy-AIO { exit 1 # Exit the script } + do{ + $extensionPrincipalId = (az k8s-extension list --cluster-name $arcClusterName --resource-group $resourceGroup --cluster-type "connectedClusters" --query "[?extensionType=='microsoft.iotoperations.mq']" --output json | ConvertFrom-Json).identity.principalId + if($null -eq $extensionPrincipalId){ + Write-Host "Waiting for the mq extension to be installed...waiting for 60 seconds" -ForegroundColor DarkGray + Start-Sleep -Seconds 60 + } + }until($null -ne $extensionPrincipalId) + Write-Host "AIO deployed successfully on the $clusterName cluster" -ForegroundColor Green Write-Host "`n" Write-Host "[$(Get-Date -Format t)] INFO: Started Event Grid role assignment process" -ForegroundColor DarkGray #$extensionPrincipalId = (az k8s-extension list --cluster-name $arcClusterName --resource-group $resourceGroup --cluster-type "connectedClusters" --query "[?extensionType=='microsoft.iotoperations']" --output json | ConvertFrom-Json).identity.principalId - $extensionPrincipalId = (az k8s-extension list --cluster-name $arcClusterName --resource-group $resourceGroup --cluster-type "connectedClusters" --query "[?extensionType=='microsoft.iotoperations.mq']" --output json | ConvertFrom-Json).identity.principalId + #$extensionPrincipalId = (az k8s-extension list --cluster-name $arcClusterName --resource-group $resourceGroup --cluster-type "connectedClusters" --query "[?extensionType=='microsoft.iotoperations.mq']" --output json | ConvertFrom-Json).identity.principalId $eventGridTopicId = (az eventgrid topic list --resource-group $resourceGroup --query "[0].id" -o tsv --only-show-errors) $eventGridNamespaceName = (az eventgrid namespace list --resource-group $resourceGroup --query "[0].name" -o tsv --only-show-errors) $eventGridNamespaceId = (az eventgrid namespace list --resource-group $resourceGroup --query "[0].id" -o tsv --only-show-errors) From 3f2e13cf0af65a4d69bbd71365ac6b26deefdda7 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sun, 29 Sep 2024 10:52:09 +0300 Subject: [PATCH 007/409] code optimizations --- .../AgConfig-contoso-hypermarket.psd1 | 6 +++--- .../artifacts/PowerShell/AgLogonScript.ps1 | 2 +- .../artifacts/PowerShell/Modules/common.psm1 | 14 +++++++------- .../PowerShell/Modules/contoso_hypermarket.psm1 | 17 ++++++++--------- 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 34576050c3..93b1bee54b 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -143,20 +143,20 @@ natSubnet = "192.168.46.0/24" # This value is the subnet is the NAT router will use to route to AzSMGMT to access the Internet. It can be any /24 subnet and is only used for routing. natDNS = "%staging-natDNS%" # Do not change - can be configured by passing the optional natDNS parameter to the ARM deployment. - # AKS Edge Essentials variables + # Site Kubernetes cluster configurations SiteConfig = @{ Seattle = @{ ArcClusterName = "Ag-K3s-Seattle" FriendlyName = "Seattle" GrafanaDataSource = "seattle" - Type = "K3s" + Type = "k3s" HelmValuesFile = "prometheus-additional-scrape-config.yaml" } Chicago = @{ ArcClusterName = "Ag-K3s-Chicago" FriendlyName = "Chicago" GrafanaDataSource = "chicago" - Type = "K3s" + Type = "k3s" HelmValuesFile = "prometheus-additional-scrape-config.yaml" } } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index f6549ad75e..ed963a6234 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -141,7 +141,7 @@ if ($scenario -eq "contoso_supermarket") { ##################################################################### if($scenario -eq "contoso_hypermarket"){ Get-K3sConfigFile - Configure-K3sClusters + Set-K3sClusters } ##################################################################### diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index 44ddeb51a3..48cff42c00 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -376,7 +376,7 @@ function Deploy-VirtualizationInfrastructure { # Fetching latest AKS Edge Essentials msi file Write-Host "[$(Get-Date -Format t)] INFO: Fetching latest AKS Edge Essentials install file on $hostname." -ForegroundColor Gray - Invoke-WebRequest $websiteUrls["aksEEk3s"] -OutFile $deploymentFolder\AKSEEK3s.msi + Invoke-WebRequest $websiteUrls["aksEEk3s"] -OutFile $deploymentFolder\AKSEEk3s.msi # Fetching required GitHub artifacts from Jumpstart repository Write-Host "[$(Get-Date -Format t)] INFO: Fetching GitHub artifacts" -ForegroundColor Gray @@ -526,7 +526,7 @@ function Deploy-AzContainerRegistry { function Deploy-ClusterNamespaces { foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { $clusterName = $cluster.Name.ToLower() - if($cluster.Value.Type -eq "K3s"){ + if($cluster.Value.Type -eq "k3s"){ $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" kubectx }else{ @@ -545,7 +545,7 @@ function Deploy-ClusterSecrets { foreach ($namespace in $AgConfig.Namespaces) { if ($namespace -eq "contoso-supermarket" -or $namespace -eq "images-cache") { Write-Host "[$(Get-Date -Format t)] INFO: Configuring Azure Container registry on $clusterName" - if($cluster.Value.Type -eq "K3s"){ + if($cluster.Value.Type -eq "k3s"){ $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" kubectx }else{ @@ -1177,7 +1177,7 @@ function Deploy-AIO { $clusterName = $cluster.Name.ToLower() Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the $clusterName cluster" -ForegroundColor Gray Write-Host "`n" - if($cluster.Value.type -eq "K3s"){ + if($cluster.Value.type -eq "k3s"){ $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" kubectx }else{ @@ -1193,7 +1193,7 @@ function Deploy-AIO { Write-Host "[$(Get-Date -Format t)] INFO: Enabling custom locations on the Arc-enabled cluster" -ForegroundColor DarkGray Write-Host "`n" az config set extension.use_dynamic_install=yes_without_prompt - if($cluster.Value.Type -eq "K3s"){ + if($cluster.Value.Type -eq "k3s"){ az connectedk8s enable-features --name $arcClusterName ` --resource-group $resourceGroup ` --features cluster-connect custom-locations ` @@ -1232,7 +1232,7 @@ function Deploy-AIO { $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" $retryCount = 0 $maxRetries = 25 - if($cluster.Value.type -eq "K3s"){ + if($cluster.Value.type -eq "k3s"){ $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" kubectx }else{ @@ -1309,7 +1309,7 @@ function Set-MQTTIpAddress { $clusters = $AgConfig.SiteConfig.GetEnumerator() foreach ($cluster in $clusters) { $clusterName = $cluster.Name.ToLower() - if($cluster.Value.type -eq "K3s"){ + if($cluster.Value.type -eq "k3s"){ $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" kubectx }else{ diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index ddb909c784..46e8b3d5ff 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -10,18 +10,17 @@ function Get-K3sConfigFile{ $sourceFile = "https://$stagingStorageAccountName.blob.core.windows.net/$containerName/config" azcopy copy $sourceFile "C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" --check-length=false $sourceFile = "https://$stagingStorageAccountName.blob.core.windows.net/$containerName/*" - azcopy cp --check-md5 FailIfDifferentOrMissing $sourceFile "$AgLogsDir\" --include-pattern "*.log" + azcopy cp --check-md5 FailIfDifferentOrMissing $sourceFile "$AgLogsDir\" --include-pattern "*.log" } } -function Configure-K3sClusters { - Write-Host "Configuring kube-vip on K3s clusterS" - $clusters = $AgConfig.SiteConfig.GetEnumerator() - foreach ($cluster in $clusters) { +function Set-K3sClusters { + Write-Host "Configuring kube-vip on K3s clusters" + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { if ($cluster.Value.Type -eq "k3s") { - $clusterName = $cluster.Name.ToLower() - $vmName = $cluster.Value.ArcClusterName+"-$namingGuid" - $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" + $clusterName = $cluster.Value.FriendlyName.ToLower() + $vmName = $cluster.Value.ArcClusterName + "-$env:namingGuid" + $Env:KUBECONFIG="C:\Users\$env:adminUsername\.kube\ag-k3s-$clusterName" kubectx $k3sVIP = az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``true``].privateIPAddress" -otsv Write-Host "Assigning kube-vip-role on k3s cluster" @@ -176,7 +175,7 @@ status: Start-Sleep -Seconds 30 Write-Host "Creating longhorn storage on K3scluster" - kubectl apply -f "$AgToolsDir\longhorn.yaml" + kubectl apply -f "$($Agconfig.AgDirectories.AgToolsDir)\longhorn.yaml" Start-Sleep -Seconds 30 Write-Host "`n" } From 46a0def4a1973e0b92926873048e91cb7d33b69c Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 30 Sep 2024 01:57:24 +0300 Subject: [PATCH 008/409] Refactor AIO deployment to use message queue service instead of broker service --- .../artifacts/PowerShell/Bootstrap.ps1 | 4 +- .../artifacts/PowerShell/Modules/common.psm1 | 2 +- .../Modules/contoso_hypermarket.psm1 | 149 +----------------- .../artifacts/kubernetes/K3s/installK3s.sh | 2 + .../kubernetes/K3s/kubeVipDaemon.yml | 88 +++++++++++ .../artifacts/kubernetes/K3s/kubeVipRbac.yml | 41 +++++ 6 files changed, 142 insertions(+), 144 deletions(-) create mode 100644 azure_jumpstart_ag/artifacts/kubernetes/K3s/kubeVipDaemon.yml create mode 100644 azure_jumpstart_ag/artifacts/kubernetes/K3s/kubeVipRbac.yml diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 0600d97385..300e258340 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -266,11 +266,11 @@ elseif ($scenario -eq "contoso_motors") { } elseif ($scenario -eq "contoso_hypermarket") { Invoke-WebRequest ($templateBaseUrl + "artifacts/kubernetes/K3s/longhorn.yaml") -OutFile "$AgToolsDir\longhorn.yaml" + Invoke-WebRequest ($templateBaseUrl + "artifacts/kubernetes/K3s/kubeVipRbac.yml") -OutFile "$AgToolsDir\kubeVipRbac.yml" + Invoke-WebRequest ($templateBaseUrl + "artifacts/kubernetes/K3s/kubeVipDaemon.yml") -OutFile "$AgToolsDir\kubeVipDaemon.yml" Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/Bookmarks-contoso-hypermarket") -OutFile "$AgToolsDir\Bookmarks" Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/mq_cloudConnector.yml") -OutFile "$AgToolsDir\mq_cloudConnector.yml" Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/mqtt_explorer_settings.json") -OutFile "$AgToolsDir\mqtt_explorer_settings.json" - - } BITSRequest -Params @{'Uri' = 'https://aka.ms/wslubuntu'; 'Filename' = "$AgToolsDir\Ubuntu.appx" } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index 48cff42c00..524b93a8d5 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -376,7 +376,7 @@ function Deploy-VirtualizationInfrastructure { # Fetching latest AKS Edge Essentials msi file Write-Host "[$(Get-Date -Format t)] INFO: Fetching latest AKS Edge Essentials install file on $hostname." -ForegroundColor Gray - Invoke-WebRequest $websiteUrls["aksEEk3s"] -OutFile $deploymentFolder\AKSEEk3s.msi + Invoke-WebRequest $websiteUrls["aksEEk3s"] -OutFile $deploymentFolder\AKSEEK3s.msi # Fetching required GitHub artifacts from Jumpstart repository Write-Host "[$(Get-Date -Format t)] INFO: Fetching GitHub artifacts" -ForegroundColor Gray diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 46e8b3d5ff..a4b8f6c761 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -15,153 +15,21 @@ function Get-K3sConfigFile{ } function Set-K3sClusters { - Write-Host "Configuring kube-vip on K3s clusters" + Write-Host "Configuring kube-vip on K3s clusterS" foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { if ($cluster.Value.Type -eq "k3s") { $clusterName = $cluster.Value.FriendlyName.ToLower() - $vmName = $cluster.Value.ArcClusterName + "-$env:namingGuid" - $Env:KUBECONFIG="C:\Users\$env:adminUsername\.kube\ag-k3s-$clusterName" + $vmName = $cluster.Value.ArcClusterName + "-$namingGuid" + $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" kubectx $k3sVIP = az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``true``].privateIPAddress" -otsv Write-Host "Assigning kube-vip-role on k3s cluster" -$kubeVipRBAC = @" -apiVersion: v1 -kind: ServiceAccount -metadata: - name: kube-vip - namespace: kube-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - annotations: - rbac.authorization.kubernetes.io/autoupdate: "true" - name: system:kube-vip-role -rules: - - apiGroups: [""] - resources: ["services/status"] - verbs: ["update"] - - apiGroups: [""] - resources: ["services", "endpoints"] - verbs: ["list","get","watch", "update"] - - apiGroups: [""] - resources: ["nodes"] - verbs: ["list","get","watch", "update", "patch"] - - apiGroups: ["coordination.k8s.io"] - resources: ["leases"] - verbs: ["list", "get", "watch", "update", "create"] - - apiGroups: ["discovery.k8s.io"] - resources: ["endpointslices"] - verbs: ["list","get","watch", "update"] ---- -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: system:kube-vip-binding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: system:kube-vip-role -subjects: -- kind: ServiceAccount - name: kube-vip - namespace: kube-system -"@ + $kubeVipRbac = "$($Agconfig.AgDirectories.AgToolsDir)\kubeVipDaemon.yml" + kubectl apply -f $kubeVipRbac -$kubeVipRBAC | kubectl apply -f - - -$kubeVipDaemonset = @" -apiVersion: apps/v1 -kind: DaemonSet -metadata: - creationTimestamp: null - labels: - app.kubernetes.io/name: kube-vip-ds - app.kubernetes.io/version: v0.7.0 - name: kube-vip-ds - namespace: kube-system -spec: - selector: - matchLabels: - app.kubernetes.io/name: kube-vip-ds - template: - metadata: - creationTimestamp: null - labels: - app.kubernetes.io/name: kube-vip-ds - app.kubernetes.io/version: v0.7.0 - spec: - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: node-role.kubernetes.io/master - operator: Exists - - matchExpressions: - - key: node-role.kubernetes.io/control-plane - operator: Exists - containers: - - args: - - manager - env: - - name: vip_arp - value: "true" - - name: port - value: "6443" - - name: vip_interface - value: eth0 - - name: vip_cidr - value: "32" - - name: dns_mode - value: first - - name: cp_enable - value: "true" - - name: cp_namespace - value: kube-system - - name: svc_enable - value: "true" - - name: svc_leasename - value: plndr-svcs-lock - - name: vip_leaderelection - value: "true" - - name: vip_leasename - value: plndr-cp-lock - - name: vip_leaseduration - value: "5" - - name: vip_renewdeadline - value: "3" - - name: vip_retryperiod - value: "1" - - name: address - value: "$k3sVIP" - - name: prometheus_server - value: :2112 - image: ghcr.io/kube-vip/kube-vip:v0.7.0 - imagePullPolicy: Always - name: kube-vip - resources: {} - securityContext: - capabilities: - add: - - NET_ADMIN - - NET_RAW - hostNetwork: true - serviceAccountName: kube-vip - tolerations: - - effect: NoSchedule - operator: Exists - - effect: NoExecute - operator: Exists - updateStrategy: {} -status: - currentNumberScheduled: 0 - desiredNumberScheduled: 0 - numberMisscheduled: 0 - numberReady: 0 -"@ - - $kubeVipDaemonset | kubectl apply -f - + $kubeVipDaemonset = "$($Agconfig.AgDirectories.AgToolsDir)\kubeVipDaemon.yml" + (Get-Content -Path $kubeVipDaemonset) -replace 'k3sVIPPlaceholder', "$k3sVIP" | Set-Content -Path $kubeVipDaemonset + kubectl apply -f $kubeVipDaemonset Write-Host "Deploying Kube vip cloud controller on k3s cluster" kubectl apply -f https://raw.githubusercontent.com/kube-vip/kube-vip-cloud-provider/main/manifest/kube-vip-cloud-controller.yaml @@ -180,5 +48,4 @@ status: Write-Host "`n" } } - } \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index 5564d7c98a..392f8410f1 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -224,6 +224,8 @@ else echo "Downloading k3s control plane details" echo "" k3sClusterNodeConfigYaml="k3sClusterNodeConfig.yaml" + sleep 60 + azcopy cp --check-md5 FailIfDifferentOrMissing "https://$stagingStorageAccountName.blob.core.windows.net/$storageContainerName/$k3sClusterNodeConfigYaml" "/home/$adminUsername/$k3sClusterNodeConfigYaml" # Installing Rancher K3s cluster (single worker node) diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/kubeVipDaemon.yml b/azure_jumpstart_ag/artifacts/kubernetes/K3s/kubeVipDaemon.yml new file mode 100644 index 0000000000..22bbac5d2b --- /dev/null +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/kubeVipDaemon.yml @@ -0,0 +1,88 @@ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/name: kube-vip-ds + app.kubernetes.io/version: v0.7.0 + name: kube-vip-ds + namespace: kube-system +spec: + selector: + matchLabels: + app.kubernetes.io/name: kube-vip-ds + template: + metadata: + creationTimestamp: null + labels: + app.kubernetes.io/name: kube-vip-ds + app.kubernetes.io/version: v0.7.0 + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: node-role.kubernetes.io/master + operator: Exists + - matchExpressions: + - key: node-role.kubernetes.io/control-plane + operator: Exists + containers: + - args: + - manager + env: + - name: vip_arp + value: "true" + - name: port + value: "6443" + - name: vip_interface + value: eth0 + - name: vip_cidr + value: "32" + - name: dns_mode + value: first + - name: cp_enable + value: "true" + - name: cp_namespace + value: kube-system + - name: svc_enable + value: "true" + - name: svc_leasename + value: plndr-svcs-lock + - name: vip_leaderelection + value: "true" + - name: vip_leasename + value: plndr-cp-lock + - name: vip_leaseduration + value: "5" + - name: vip_renewdeadline + value: "3" + - name: vip_retryperiod + value: "1" + - name: address + value: "k3sVIPPlaceholder" + - name: prometheus_server + value: :2112 + image: ghcr.io/kube-vip/kube-vip:v0.7.0 + imagePullPolicy: Always + name: kube-vip + resources: {} + securityContext: + capabilities: + add: + - NET_ADMIN + - NET_RAW + hostNetwork: true + serviceAccountName: kube-vip + tolerations: + - effect: NoSchedule + operator: Exists + - effect: NoExecute + operator: Exists + updateStrategy: {} +status: + currentNumberScheduled: 0 + desiredNumberScheduled: 0 + numberMisscheduled: 0 + numberReady: 0 \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/kubeVipRbac.yml b/azure_jumpstart_ag/artifacts/kubernetes/K3s/kubeVipRbac.yml new file mode 100644 index 0000000000..e966a8c1f5 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/kubeVipRbac.yml @@ -0,0 +1,41 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: kube-vip + namespace: kube-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + annotations: + rbac.authorization.kubernetes.io/autoupdate: "true" + name: system:kube-vip-role +rules: + - apiGroups: [""] + resources: ["services/status"] + verbs: ["update"] + - apiGroups: [""] + resources: ["services", "endpoints"] + verbs: ["list","get","watch", "update"] + - apiGroups: [""] + resources: ["nodes"] + verbs: ["list","get","watch", "update", "patch"] + - apiGroups: ["coordination.k8s.io"] + resources: ["leases"] + verbs: ["list", "get", "watch", "update", "create"] + - apiGroups: ["discovery.k8s.io"] + resources: ["endpointslices"] + verbs: ["list","get","watch", "update"] +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: system:kube-vip-binding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: system:kube-vip-role +subjects: +- kind: ServiceAccount + name: kube-vip + namespace: kube-system \ No newline at end of file From 70be97aa2e457c80fb377477de81d0a829e3be21 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 30 Sep 2024 18:52:17 +0300 Subject: [PATCH 009/409] Refactor Winget package installation in Bootstrap.ps1 --- .../AgConfig-contoso-hypermarket.psd1 | 22 ++++++++++ .../artifacts/PowerShell/Bootstrap.ps1 | 40 ++++++++++--------- 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 93b1bee54b..d9359bb9d7 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -95,6 +95,28 @@ 'python' ) + # Winget packages list + WingetPackagesList = @( + 'Microsoft.PowerShell', + 'Microsoft.Bicep', + 'Kubernetes.kubectl', + 'vcredist140', + 'Microsoft.Edge', + 'Microsoft.Azure.AZCopy.10', + 'Microsoft.VisualStudioCode', + 'Git.Git', + '7zip.7zip', + 'ahmetb.kubectx', + 'PuTTY.PuTTY', + 'Helm.Helm', + 'Microsoft.DotNet.SDK.8', + 'Microsoft.Sysinternals.ZoomIt', + 'FireDaemon.OpenSSL', + 'thomasnordquist.MQTT-Explorer', + 'GitHub.cli', + 'Python.Python.3.12' + ) + # Pip packages list PipPackagesList = @( 'paho-mqtt' diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 300e258340..558e41219b 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -278,8 +278,21 @@ BITSRequest -Params @{'Uri' = $websiteUrls["wslStoreStorage"]; 'Filename' = "$Ag BITSRequest -Params @{'Uri' = $websiteUrls["docker"]; 'Filename' = "$AgToolsDir\DockerDesktopInstaller.exe" } BITSRequest -Params @{'Uri' = "https://dl.grafana.com/oss/release/grafana-$latestRelease.windows-amd64.msi"; 'Filename' = "$AgToolsDir\grafana-$latestRelease.windows-amd64.msi" } + +############################################################## +# Install Winget ############################################################## -# Install Chocolatey packages +# Install WinGet PowerShell modules +Install-PSResource -Name Microsoft.WinGet.Client -Scope AllUsers -Quiet -AcceptLicense -TrustRepository -Version 1.8.1911 +Install-PSResource -Name Microsoft.WinGet.DSC -Scope AllUsers -Quiet -AcceptLicense -TrustRepository -Prerelease -Version 1.8.1911-alpha +# Install WinGet CLI +$null = Repair-WinGetPackageManager -AllUsers +$winget = Join-Path -Path $env:LOCALAPPDATA -ChildPath Microsoft\WindowsApps\winget.exe +# Windows Terminal needs to be installed per user, while WinGet Configuration runs as SYSTEM. Hence, this package is installed in the logon script. +& $winget install Microsoft.WindowsTerminal --version 1.18.3181.0 -s winget + +############################################################## +# Install Winget packages ############################################################## $maxRetries = 3 $retryDelay = 30 # seconds @@ -288,25 +301,16 @@ $retryCount = 0 $success = $false while (-not $success -and $retryCount -lt $maxRetries) { - try { - Write-Header "Installing Chocolatey packages" - try { - choco config get cacheLocation - } - catch { - Write-Output "Chocolatey not detected, trying to install now" - Invoke-Expression ((New-Object System.Net.WebClient).DownloadString($AgConfig.URLs.chocoInstallScript)) - } - - Write-Host "Chocolatey packages specified" + Write-Host "Winget packages specified" - foreach ($app in $AgConfig.ChocolateyPackagesList) { - Write-Host "Installing $app" - & choco install $app /y -Force | Write-Output - } + try{ + foreach ($app in $AgConfig.WingetPackagesList) { + Write-Host "Installing $app" + & winget install -e --id $app | Write-Output + } - # If the command succeeds, set $success to $true to exit the loop - $success = $true + # If the command succeeds, set $success to $true to exit the loop + $success = $true } catch { # If an exception occurs, increment the retry count From 43bb49bda4be022b56eba0bddee3e39cb8fdee93 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 30 Sep 2024 19:00:54 +0300 Subject: [PATCH 010/409] Refactor Winget package installation in Bootstrap.ps1 --- azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 558e41219b..d6a0d20d67 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -282,12 +282,15 @@ BITSRequest -Params @{'Uri' = "https://dl.grafana.com/oss/release/grafana-$lates ############################################################## # Install Winget ############################################################## -# Install WinGet PowerShell modules +# Installing PowerShell Modules +Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force Install-PSResource -Name Microsoft.WinGet.Client -Scope AllUsers -Quiet -AcceptLicense -TrustRepository -Version 1.8.1911 Install-PSResource -Name Microsoft.WinGet.DSC -Scope AllUsers -Quiet -AcceptLicense -TrustRepository -Prerelease -Version 1.8.1911-alpha + # Install WinGet CLI $null = Repair-WinGetPackageManager -AllUsers $winget = Join-Path -Path $env:LOCALAPPDATA -ChildPath Microsoft\WindowsApps\winget.exe + # Windows Terminal needs to be installed per user, while WinGet Configuration runs as SYSTEM. Hence, this package is installed in the logon script. & $winget install Microsoft.WindowsTerminal --version 1.18.3181.0 -s winget From dc9be7399983bd20cbee816a399b863c3a411915 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Mon, 30 Sep 2024 21:48:38 -0400 Subject: [PATCH 011/409] fix naming guid --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index a4b8f6c761..1bf650d79d 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -5,7 +5,7 @@ function Get-K3sConfigFile{ $Env:KUBECONFIG="" foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { $clusterName = $cluster.Name.ToLower() - $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" + $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$Env:namingGuid" $containerName = $arcClusterName.toLower() $sourceFile = "https://$stagingStorageAccountName.blob.core.windows.net/$containerName/config" azcopy copy $sourceFile "C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" --check-length=false @@ -19,7 +19,7 @@ function Set-K3sClusters { foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { if ($cluster.Value.Type -eq "k3s") { $clusterName = $cluster.Value.FriendlyName.ToLower() - $vmName = $cluster.Value.ArcClusterName + "-$namingGuid" + $vmName = $cluster.Value.ArcClusterName + "-$Env:namingGuid" $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" kubectx $k3sVIP = az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``true``].privateIPAddress" -otsv From 551c21752727a5c93768502f6f3078c9fb9d4d93 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Mon, 30 Sep 2024 22:41:54 -0400 Subject: [PATCH 012/409] validate ip output --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 1bf650d79d..00767510ec 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -24,7 +24,8 @@ function Set-K3sClusters { kubectx $k3sVIP = az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``true``].privateIPAddress" -otsv Write-Host "Assigning kube-vip-role on k3s cluster" - $kubeVipRbac = "$($Agconfig.AgDirectories.AgToolsDir)\kubeVipDaemon.yml" + $k3sVIP + $kubeVipRbac = "$($Agconfig.AgDirectories.AgToolsDir)\kubeVipRbac.yml" kubectl apply -f $kubeVipRbac $kubeVipDaemonset = "$($Agconfig.AgDirectories.AgToolsDir)\kubeVipDaemon.yml" @@ -35,6 +36,7 @@ function Set-K3sClusters { kubectl apply -f https://raw.githubusercontent.com/kube-vip/kube-vip-cloud-provider/main/manifest/kube-vip-cloud-controller.yaml $serviceIpRange = az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``false``].privateIPAddress" -otsv + $serviceIpRange $sortedIps = $serviceIpRange | Sort-Object {[System.Version]$_} $lowestServiceIp = $sortedIps[0] $highestServiceIp = $sortedIps[-1] From 226f7c214ba59a60a92fff596e626ab21ec919d8 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 1 Oct 2024 09:43:06 +0300 Subject: [PATCH 013/409] Refactor file path in Set-K3sClusters function --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index a4b8f6c761..54e7cefabb 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -24,7 +24,7 @@ function Set-K3sClusters { kubectx $k3sVIP = az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``true``].privateIPAddress" -otsv Write-Host "Assigning kube-vip-role on k3s cluster" - $kubeVipRbac = "$($Agconfig.AgDirectories.AgToolsDir)\kubeVipDaemon.yml" + $kubeVipRbac = "$($Agconfig.AgDirectories.AgToolsDir)\kubeVipRbac.yml" kubectl apply -f $kubeVipRbac $kubeVipDaemonset = "$($Agconfig.AgDirectories.AgToolsDir)\kubeVipDaemon.yml" From 2d2b6383c824cb52fec54d8f52faaf8a3b7f0c1b Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 1 Oct 2024 10:34:01 +0300 Subject: [PATCH 014/409] Refactor file path in Set-K3sClusters function and add console output for K3s VIP and service IP range --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 54e7cefabb..9724744e4c 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -23,6 +23,7 @@ function Set-K3sClusters { $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" kubectx $k3sVIP = az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``true``].privateIPAddress" -otsv + Write-Host "K3s VIP: $k3sVIP" -ForegroundColor Green Write-Host "Assigning kube-vip-role on k3s cluster" $kubeVipRbac = "$($Agconfig.AgDirectories.AgToolsDir)\kubeVipRbac.yml" kubectl apply -f $kubeVipRbac @@ -35,6 +36,7 @@ function Set-K3sClusters { kubectl apply -f https://raw.githubusercontent.com/kube-vip/kube-vip-cloud-provider/main/manifest/kube-vip-cloud-controller.yaml $serviceIpRange = az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``false``].privateIPAddress" -otsv + Write-Host "serviceIpRange: $serviceIpRange" -ForegroundColor Green $sortedIps = $serviceIpRange | Sort-Object {[System.Version]$_} $lowestServiceIp = $sortedIps[0] $highestServiceIp = $sortedIps[-1] From 7a2c2d5eeb939c004a0d41c0305d0a2edb8e9455 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 1 Oct 2024 10:34:46 +0300 Subject: [PATCH 015/409] Refactor file path in Set-K3sClusters function and add console output for K3s VIP and service IP range --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 9724744e4c..7dd806a3c4 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -22,7 +22,7 @@ function Set-K3sClusters { $vmName = $cluster.Value.ArcClusterName + "-$namingGuid" $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" kubectx - $k3sVIP = az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``true``].privateIPAddress" -otsv + $k3sVIP = $(az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``true``].privateIPAddress" -otsv) Write-Host "K3s VIP: $k3sVIP" -ForegroundColor Green Write-Host "Assigning kube-vip-role on k3s cluster" $kubeVipRbac = "$($Agconfig.AgDirectories.AgToolsDir)\kubeVipRbac.yml" @@ -35,7 +35,7 @@ function Set-K3sClusters { Write-Host "Deploying Kube vip cloud controller on k3s cluster" kubectl apply -f https://raw.githubusercontent.com/kube-vip/kube-vip-cloud-provider/main/manifest/kube-vip-cloud-controller.yaml - $serviceIpRange = az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``false``].privateIPAddress" -otsv + $serviceIpRange = $(az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``false``].privateIPAddress" -otsv) Write-Host "serviceIpRange: $serviceIpRange" -ForegroundColor Green $sortedIps = $serviceIpRange | Sort-Object {[System.Version]$_} $lowestServiceIp = $sortedIps[0] From e0bc9af573f2408fcf90d6857e88715690f138cd Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 1 Oct 2024 10:55:29 +0300 Subject: [PATCH 016/409] Refactor file path in Set-K3sClusters function and add console output for K3s VIP and service IP range --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 7dd806a3c4..936a340921 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -18,6 +18,9 @@ function Set-K3sClusters { Write-Host "Configuring kube-vip on K3s clusterS" foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { if ($cluster.Value.Type -eq "k3s") { + az login --service-principal --username $Env:spnClientID --password=$Env:spnClientSecret --tenant $Env:spnTenantId | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\AzCLI.log") + az account set -s $subscriptionId + $clusterName = $cluster.Value.FriendlyName.ToLower() $vmName = $cluster.Value.ArcClusterName + "-$namingGuid" $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" From b3d53f5ca2876c4d44401dfc42195be52d4a2aa0 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 1 Oct 2024 10:55:55 +0300 Subject: [PATCH 017/409] Refactor file path in Set-K3sClusters function and remove console output for K3s VIP and service IP range --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 2 -- 1 file changed, 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 936a340921..4ac880ea3b 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -26,7 +26,6 @@ function Set-K3sClusters { $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" kubectx $k3sVIP = $(az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``true``].privateIPAddress" -otsv) - Write-Host "K3s VIP: $k3sVIP" -ForegroundColor Green Write-Host "Assigning kube-vip-role on k3s cluster" $kubeVipRbac = "$($Agconfig.AgDirectories.AgToolsDir)\kubeVipRbac.yml" kubectl apply -f $kubeVipRbac @@ -39,7 +38,6 @@ function Set-K3sClusters { kubectl apply -f https://raw.githubusercontent.com/kube-vip/kube-vip-cloud-provider/main/manifest/kube-vip-cloud-controller.yaml $serviceIpRange = $(az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``false``].privateIPAddress" -otsv) - Write-Host "serviceIpRange: $serviceIpRange" -ForegroundColor Green $sortedIps = $serviceIpRange | Sort-Object {[System.Version]$_} $lowestServiceIp = $sortedIps[0] $highestServiceIp = $sortedIps[-1] From 25d3c33baa705c3f368b7c4a91b10d490b054778 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 1 Oct 2024 10:56:21 +0300 Subject: [PATCH 018/409] Refactor file path in Set-K3sClusters function and remove console output for K3s VIP and service IP range --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 4ac880ea3b..ffd8c7c9b5 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -18,7 +18,7 @@ function Set-K3sClusters { Write-Host "Configuring kube-vip on K3s clusterS" foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { if ($cluster.Value.Type -eq "k3s") { - az login --service-principal --username $Env:spnClientID --password=$Env:spnClientSecret --tenant $Env:spnTenantId | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\AzCLI.log") + az login --service-principal --username $Env:spnClientID --password=$Env:spnClientSecret --tenant $Env:spnTenantId az account set -s $subscriptionId $clusterName = $cluster.Value.FriendlyName.ToLower() From 81a3bb0bac5b5f48e9223757f564dfd1c544da08 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 1 Oct 2024 11:28:25 +0300 Subject: [PATCH 019/409] Refactor file path in Set-K3sClusters function and remove console output for K3s VIP and service IP range --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index ffd8c7c9b5..4bd40c5e48 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -16,11 +16,10 @@ function Get-K3sConfigFile{ function Set-K3sClusters { Write-Host "Configuring kube-vip on K3s clusterS" + az login --service-principal --username $Env:spnClientID --password=$Env:spnClientSecret --tenant $Env:spnTenantId + az account set -s $subscriptionId foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { if ($cluster.Value.Type -eq "k3s") { - az login --service-principal --username $Env:spnClientID --password=$Env:spnClientSecret --tenant $Env:spnTenantId - az account set -s $subscriptionId - $clusterName = $cluster.Value.FriendlyName.ToLower() $vmName = $cluster.Value.ArcClusterName + "-$namingGuid" $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" From 358dfd8ac1baf85e81dd96144fb43e9ad5146884 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 3 Oct 2024 15:13:01 +0300 Subject: [PATCH 020/409] Refactor Bootstrap.ps1 to install Microsoft.PowerShell.PSResourceGet module --- azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index d6a0d20d67..cdb61a1843 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -284,6 +284,7 @@ BITSRequest -Params @{'Uri' = "https://dl.grafana.com/oss/release/grafana-$lates ############################################################## # Installing PowerShell Modules Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force +Install-Module -Name Microsoft.PowerShell.PSResourceGet -Force Install-PSResource -Name Microsoft.WinGet.Client -Scope AllUsers -Quiet -AcceptLicense -TrustRepository -Version 1.8.1911 Install-PSResource -Name Microsoft.WinGet.DSC -Scope AllUsers -Quiet -AcceptLicense -TrustRepository -Prerelease -Version 1.8.1911-alpha From 999bb94798e3a4cdeb5fb0804fbca4bafffeb29b Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 3 Oct 2024 17:39:54 +0300 Subject: [PATCH 021/409] Refactor Winget package installation in Bootstrap.ps1 and add Winget.ps1 script --- .../artifacts/PowerShell/Bootstrap.ps1 | 56 +++------------ azure_jumpstart_ag/artifacts/Winget.ps1 | 71 +++++++++++++++++++ 2 files changed, 79 insertions(+), 48 deletions(-) create mode 100644 azure_jumpstart_ag/artifacts/Winget.ps1 diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index cdb61a1843..72a89acbe1 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -254,6 +254,7 @@ Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso.svg") -OutFile $A Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso-motors.png") -OutFile $AgIconsDir\contoso-motors.png Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso-motors.svg") -OutFile $AgIconsDir\contoso-motors.svg Invoke-WebRequest ($templateBaseUrl + "artifacts/L1Files/config.json") -OutFile $AgDeploymentFolder\config.json +Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/Winget.ps1") -OutFile "$AgPowerShellDir\Winget.ps1" if($scenario -eq "contoso_supermarket"){ Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/Bookmarks-contoso-supermarket") -OutFile "$AgToolsDir\Bookmarks" @@ -285,52 +286,6 @@ BITSRequest -Params @{'Uri' = "https://dl.grafana.com/oss/release/grafana-$lates # Installing PowerShell Modules Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force Install-Module -Name Microsoft.PowerShell.PSResourceGet -Force -Install-PSResource -Name Microsoft.WinGet.Client -Scope AllUsers -Quiet -AcceptLicense -TrustRepository -Version 1.8.1911 -Install-PSResource -Name Microsoft.WinGet.DSC -Scope AllUsers -Quiet -AcceptLicense -TrustRepository -Prerelease -Version 1.8.1911-alpha - -# Install WinGet CLI -$null = Repair-WinGetPackageManager -AllUsers -$winget = Join-Path -Path $env:LOCALAPPDATA -ChildPath Microsoft\WindowsApps\winget.exe - -# Windows Terminal needs to be installed per user, while WinGet Configuration runs as SYSTEM. Hence, this package is installed in the logon script. -& $winget install Microsoft.WindowsTerminal --version 1.18.3181.0 -s winget - -############################################################## -# Install Winget packages -############################################################## -$maxRetries = 3 -$retryDelay = 30 # seconds - -$retryCount = 0 -$success = $false - -while (-not $success -and $retryCount -lt $maxRetries) { - Write-Host "Winget packages specified" - - try{ - foreach ($app in $AgConfig.WingetPackagesList) { - Write-Host "Installing $app" - & winget install -e --id $app | Write-Output - } - - # If the command succeeds, set $success to $true to exit the loop - $success = $true - } - catch { - # If an exception occurs, increment the retry count - $retryCount++ - - # If the maximum number of retries is not reached yet, display an error message - if ($retryCount -lt $maxRetries) { - Write-Host "Attempt $retryCount failed. Retrying in $retryDelay seconds..." - Start-Sleep -Seconds $retryDelay - } - else { - Write-Host "All attempts failed. Exiting..." - exit 1 # Stop script execution if maximum retries reached - } - } -} ############################################################## # Install Azure CLI (64-bit not available via Chocolatey) @@ -397,9 +352,14 @@ New-ItemProperty -Path $AgConfig.EdgeSettingRegistryPath -Name $Name -Value $AgC Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force Install-Module -Name Posh-SSH -Force +$ScheduledTaskExecutable = "C:\Program Files\PowerShell\7\pwsh.exe" $Trigger = New-ScheduledTaskTrigger -AtLogOn -$Action = New-ScheduledTaskAction -Execute "C:\Program Files\PowerShell\7\pwsh.exe" -Argument "$AgPowerShellDir\AgLogonScript.ps1" -Register-ScheduledTask -TaskName "AgLogonScript" -Trigger $Trigger -User $adminUsername -Action $Action -RunLevel "Highest" -Force +$Action = New-ScheduledTaskAction -Execute $ScheduledTaskExecutable -Argument $Env:AgDir\WinGet.ps1 +Register-ScheduledTask -TaskName "WinGetLogonScript" -Trigger $Trigger -User $adminUsername -Action $Action -RunLevel "Highest" -Force + +#$Trigger = New-ScheduledTaskTrigger -AtLogOn +#$Action = New-ScheduledTaskAction -Execute "C:\Program Files\PowerShell\7\pwsh.exe" -Argument "$AgPowerShellDir\AgLogonScript.ps1" +#Register-ScheduledTask -TaskName "AgLogonScript" -Trigger $Trigger -User $adminUsername -Action $Action -RunLevel "Highest" -Force ############################################################## # Disabling Windows Server Manager Scheduled Task diff --git a/azure_jumpstart_ag/artifacts/Winget.ps1 b/azure_jumpstart_ag/artifacts/Winget.ps1 new file mode 100644 index 0000000000..1f7bb0ae20 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/Winget.ps1 @@ -0,0 +1,71 @@ +$ErrorActionPreference = $env:ErrorActionPreference + +$AgDir = 'C:\ArcBox' +$AgLogsDir = "$AgDir\Logs" +$AgConfig = Import-PowerShellDataFile -Path $AgConfigPath + +$logFilePath = Join-Path -Path $AgLogsDir -ChildPath ('WinGet-provisioning-' + (Get-Date -Format 'yyyyMMddHHmmss') + '.log') + +Start-Transcript -Path $logFilePath -Force -ErrorAction SilentlyContinue + +# Install WinGet PowerShell modules +Install-PSResource -Name Microsoft.WinGet.Client -Scope AllUsers -Quiet -AcceptLicense -TrustRepository -Version 1.8.1911 +#Install-PSResource -Name Microsoft.WinGet.DSC -Scope AllUsers -Quiet -AcceptLicense -TrustRepository -Prerelease -Version 1.8.1911-alpha + +# Install DSC resources required for ArcBox +#Install-PSResource -Name DSCR_Font -Scope AllUsers -Quiet -AcceptLicense -TrustRepository +#Install-PSResource -Name HyperVDsc -Scope AllUsers -Quiet -AcceptLicense -TrustRepository -Prerelease +#Install-PSResource -Name NetworkingDsc -Scope AllUsers -Quiet -AcceptLicense -TrustRepository + +# Install WinGet CLI +$null = Repair-WinGetPackageManager -AllUsers + +Write-Header 'Installing WinGet packages and DSC configurations' +$winget = Join-Path -Path $env:LOCALAPPDATA -ChildPath Microsoft\WindowsApps\winget.exe + +# Windows Terminal needs to be installed per user, while WinGet Configuration runs as SYSTEM. Hence, this package is installed in the logon script. +& $winget install Microsoft.WindowsTerminal --version 1.18.3181.0 -s winget + +############################################################## +# Install Winget packages +############################################################## +$maxRetries = 3 +$retryDelay = 30 # seconds + +$retryCount = 0 +$success = $false + +while (-not $success -and $retryCount -lt $maxRetries) { + Write-Host "Winget packages specified" + + try { + foreach ($app in $AgConfig.WingetPackagesList) { + Write-Host "Installing $app" + & winget install -e --id $app | Write-Output + } + + # If the command succeeds, set $success to $true to exit the loop + $success = $true + } + catch { + # If an exception occurs, increment the retry count + $retryCount++ + + # If the maximum number of retries is not reached yet, display an error message + if ($retryCount -lt $maxRetries) { + Write-Host "Attempt $retryCount failed. Retrying in $retryDelay seconds..." + Start-Sleep -Seconds $retryDelay + } + else { + Write-Host "All attempts failed. Exiting..." + exit 1 # Stop script execution if maximum retries reached + } + } +} + +# Start remaining logon scripts +Get-ScheduledTask *LogonScript* | Start-ScheduledTask + +#Cleanup +Unregister-ScheduledTask -TaskName 'WinGetLogonScript' -Confirm:$false +Stop-Transcript \ No newline at end of file From 4f0d0cabdd85b650c25ecde08035a016759d6fde Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 3 Oct 2024 19:16:33 +0300 Subject: [PATCH 022/409] Refactor Winget package installation in Bootstrap.ps1 and Winget.ps1 scripts --- azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 | 7 +++---- .../artifacts/{ => PowerShell}/Winget.ps1 | 10 +++++----- 2 files changed, 8 insertions(+), 9 deletions(-) rename azure_jumpstart_ag/artifacts/{ => PowerShell}/Winget.ps1 (88%) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 72a89acbe1..8d70e289db 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -354,12 +354,11 @@ Install-Module -Name Posh-SSH -Force $ScheduledTaskExecutable = "C:\Program Files\PowerShell\7\pwsh.exe" $Trigger = New-ScheduledTaskTrigger -AtLogOn -$Action = New-ScheduledTaskAction -Execute $ScheduledTaskExecutable -Argument $Env:AgDir\WinGet.ps1 +$Action = New-ScheduledTaskAction -Execute $ScheduledTaskExecutable -Argument $AgPowerShellDir\WinGet.ps1 Register-ScheduledTask -TaskName "WinGetLogonScript" -Trigger $Trigger -User $adminUsername -Action $Action -RunLevel "Highest" -Force -#$Trigger = New-ScheduledTaskTrigger -AtLogOn -#$Action = New-ScheduledTaskAction -Execute "C:\Program Files\PowerShell\7\pwsh.exe" -Argument "$AgPowerShellDir\AgLogonScript.ps1" -#Register-ScheduledTask -TaskName "AgLogonScript" -Trigger $Trigger -User $adminUsername -Action $Action -RunLevel "Highest" -Force +$Action = New-ScheduledTaskAction -Execute $ScheduledTaskExecutable -Argument "$AgPowerShellDir\AgLogonScript.ps1" +Register-ScheduledTask -TaskName "AgLogonScript" -User $adminUsername -Action $Action -RunLevel "Highest" -Force ############################################################## # Disabling Windows Server Manager Scheduled Task diff --git a/azure_jumpstart_ag/artifacts/Winget.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 similarity index 88% rename from azure_jumpstart_ag/artifacts/Winget.ps1 rename to azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 index 1f7bb0ae20..b169e81309 100644 --- a/azure_jumpstart_ag/artifacts/Winget.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 @@ -1,8 +1,8 @@ -$ErrorActionPreference = $env:ErrorActionPreference +$ErrorActionPreference = 'SilentlyContinue' -$AgDir = 'C:\ArcBox' +$AgDir = 'C:\Ag' $AgLogsDir = "$AgDir\Logs" -$AgConfig = Import-PowerShellDataFile -Path $AgConfigPath +$AgConfig = Import-PowerShellDataFile -Path $Env:AgConfigPath $logFilePath = Join-Path -Path $AgLogsDir -ChildPath ('WinGet-provisioning-' + (Get-Date -Format 'yyyyMMddHHmmss') + '.log') @@ -24,7 +24,7 @@ Write-Header 'Installing WinGet packages and DSC configurations' $winget = Join-Path -Path $env:LOCALAPPDATA -ChildPath Microsoft\WindowsApps\winget.exe # Windows Terminal needs to be installed per user, while WinGet Configuration runs as SYSTEM. Hence, this package is installed in the logon script. -& $winget install Microsoft.WindowsTerminal --version 1.18.3181.0 -s winget +& $winget install Microsoft.WindowsTerminal --version 1.18.3181.0 -s winget --silent--accept-package-agreements ############################################################## # Install Winget packages @@ -41,7 +41,7 @@ while (-not $success -and $retryCount -lt $maxRetries) { try { foreach ($app in $AgConfig.WingetPackagesList) { Write-Host "Installing $app" - & winget install -e --id $app | Write-Output + & winget install -e --id $app --silent --accept-package-agreements --accept-source-agreements --ignore-warnings --log "$AgLogsDir\winget.log" > $null 2>&1 } # If the command succeeds, set $success to $true to exit the loop From 8581ef4d663f94a27b4932811c91a154b0c65c07 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 3 Oct 2024 19:20:36 +0300 Subject: [PATCH 023/409] Refactor Bootstrap.ps1 to install Az module --- azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 8d70e289db..d09488eb01 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -286,6 +286,7 @@ BITSRequest -Params @{'Uri' = "https://dl.grafana.com/oss/release/grafana-$lates # Installing PowerShell Modules Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force Install-Module -Name Microsoft.PowerShell.PSResourceGet -Force +Install-Module -Name Az -Force ############################################################## # Install Azure CLI (64-bit not available via Chocolatey) From 16b6217642c728bf7e8b0caf9eb87cd72ab477a2 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 3 Oct 2024 22:07:15 +0300 Subject: [PATCH 024/409] Refactor Bootstrap.ps1 to install PowerShell 7 and copy PSProfile.ps1 to PowerShell 7 directory --- .../artifacts/PowerShell/Bootstrap.ps1 | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index d09488eb01..e06c2cfec7 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -225,6 +225,19 @@ Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/PSProfile.ps1") -Out Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/PSProfile.ps1") -OutFile "$AgPowerShellDir\Profile.ps1" .$PsHome\Profile.ps1 +############################################################## +# Installing PowerShell 7 +############################################################## +$ProgressPreference = 'SilentlyContinue' +$url = "https://github.com/PowerShell/PowerShell/releases/latest" +$latestVersion = (Invoke-WebRequest -UseBasicParsing -Uri $url).Content | Select-String -Pattern "v[0-9]+\.[0-9]+\.[0-9]+" | Select-Object -ExpandProperty Matches | Select-Object -ExpandProperty Value +$downloadUrl = "https://github.com/PowerShell/PowerShell/releases/download/$latestVersion/PowerShell-$($latestVersion.Substring(1,5))-win-x64.msi" +Invoke-WebRequest -UseBasicParsing -Uri $downloadUrl -OutFile .\PowerShell7.msi +Start-Process msiexec.exe -Wait -ArgumentList '/I PowerShell7.msi /quiet ADD_EXPLORER_CONTEXT_MENU_OPENPOWERSHELL=1 ADD_FILE_CONTEXT_MENU_RUNPOWERSHELL=1 ENABLE_PSREMOTING=1 REGISTER_MANIFEST=1 USE_MU=1 ENABLE_MU=1 ADD_PATH=1' +Remove-Item .\PowerShell7.msi + +Copy-Item $PsHome\Profile.ps1 -Destination "C:\Program Files\PowerShell\7\" + ############################################################## # Get latest Grafana OSS release ############################################################## From 016ec2da0c6913364aa75f7bdb4a893afe96767b Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 3 Oct 2024 22:08:38 +0300 Subject: [PATCH 025/409] Refactor Bootstrap.ps1 to use PowerShell 7 and update scheduled tasks --- azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index e06c2cfec7..474c3a1c57 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -368,10 +368,10 @@ Install-Module -Name Posh-SSH -Force $ScheduledTaskExecutable = "C:\Program Files\PowerShell\7\pwsh.exe" $Trigger = New-ScheduledTaskTrigger -AtLogOn -$Action = New-ScheduledTaskAction -Execute $ScheduledTaskExecutable -Argument $AgPowerShellDir\WinGet.ps1 +$Action = New-ScheduledTaskAction -Execute "${ScheduledTaskExecutable}" -Argument $AgPowerShellDir\WinGet.ps1 Register-ScheduledTask -TaskName "WinGetLogonScript" -Trigger $Trigger -User $adminUsername -Action $Action -RunLevel "Highest" -Force -$Action = New-ScheduledTaskAction -Execute $ScheduledTaskExecutable -Argument "$AgPowerShellDir\AgLogonScript.ps1" +$Action = New-ScheduledTaskAction -Execute "${ScheduledTaskExecutable}" -Argument "$AgPowerShellDir\AgLogonScript.ps1" Register-ScheduledTask -TaskName "AgLogonScript" -User $adminUsername -Action $Action -RunLevel "Highest" -Force ############################################################## From 9420085da3942a577016252b7a0aa420892179c8 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 3 Oct 2024 22:38:14 +0300 Subject: [PATCH 026/409] Refactor Winget package installation in Bootstrap.ps1 and Winget.ps1 scripts --- azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 index b169e81309..a1c7c7d930 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 @@ -24,7 +24,7 @@ Write-Header 'Installing WinGet packages and DSC configurations' $winget = Join-Path -Path $env:LOCALAPPDATA -ChildPath Microsoft\WindowsApps\winget.exe # Windows Terminal needs to be installed per user, while WinGet Configuration runs as SYSTEM. Hence, this package is installed in the logon script. -& $winget install Microsoft.WindowsTerminal --version 1.18.3181.0 -s winget --silent--accept-package-agreements +& $winget install Microsoft.WindowsTerminal --version 1.18.3181.0 -s winget --silent --accept-package-agreements ############################################################## # Install Winget packages @@ -41,7 +41,7 @@ while (-not $success -and $retryCount -lt $maxRetries) { try { foreach ($app in $AgConfig.WingetPackagesList) { Write-Host "Installing $app" - & winget install -e --id $app --silent --accept-package-agreements --accept-source-agreements --ignore-warnings --log "$AgLogsDir\winget.log" > $null 2>&1 + & $winget install -e --id $app --silent --accept-package-agreements --accept-source-agreements --ignore-warnings --log "$AgLogsDir\winget.log" > $null 2>&1 } # If the command succeeds, set $success to $true to exit the loop From 63660b06c333fb03eea89c1535c5c36fa83a0f20 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 3 Oct 2024 22:39:18 +0300 Subject: [PATCH 027/409] Refactor package installation in AgConfig-contoso-hypermarket.psd1, AgConfig-contoso-motors.psd1, and AgConfig-contoso-supermarket.psd1 --- .../AgConfig-contoso-hypermarket.psd1 | 23 ----------- .../PowerShell/AgConfig-contoso-motors.psd1 | 39 +++++++++---------- .../AgConfig-contoso-supermarket.psd1 | 39 +++++++++---------- 3 files changed, 38 insertions(+), 63 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index d9359bb9d7..87a558feef 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -72,29 +72,6 @@ 'Az.EventHub' ) - # Chocolatey packages list - ChocolateyPackagesList = @( - 'az.powershell', - 'powershell-core', - 'bicep', - 'kubernetes-cli', - 'vcredist140', - 'microsoft-edge', - 'azcopy10', - 'vscode', - 'git', - '7zip', - 'kubectx', - 'putty.install', - 'kubernetes-helm', - 'dotnet-sdk', - 'zoomit', - 'openssl.light', - 'mqtt-explorer', - 'gh', - 'python' - ) - # Winget packages list WingetPackagesList = @( 'Microsoft.PowerShell', diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 index 09715be664..5ec699d23a 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 @@ -70,27 +70,26 @@ 'Az.EventHub' ) - # Chocolatey packages list - ChocolateyPackagesList = @( - 'az.powershell', - 'powershell-core', - 'bicep', - 'kubernetes-cli', + # Winget packages list + WingetPackagesList = @( + 'Microsoft.PowerShell', + 'Microsoft.Bicep', + 'Kubernetes.kubectl', 'vcredist140', - 'microsoft-edge', - 'azcopy10', - 'vscode', - 'git', - '7zip', - 'kubectx', - 'putty.install', - 'kubernetes-helm', - 'dotnet-sdk', - 'zoomit', - 'openssl.light', - 'mqtt-explorer', - 'gh', - 'python' + 'Microsoft.Edge', + 'Microsoft.Azure.AZCopy.10', + 'Microsoft.VisualStudioCode', + 'Git.Git', + '7zip.7zip', + 'ahmetb.kubectx', + 'PuTTY.PuTTY', + 'Helm.Helm', + 'Microsoft.DotNet.SDK.8', + 'Microsoft.Sysinternals.ZoomIt', + 'FireDaemon.OpenSSL', + 'thomasnordquist.MQTT-Explorer', + 'GitHub.cli', + 'Python.Python.3.12' ) # Pip packages list diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 index 9e900f5c42..b4e0c302ca 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 @@ -57,27 +57,26 @@ 'Az.Kusto' ) - # Chocolatey packages list - ChocolateyPackagesList = @( - 'az.powershell', - 'powershell-core', - 'kubernetes-cli', + # Winget packages list + WingetPackagesList = @( + 'Microsoft.PowerShell', + 'Microsoft.Bicep', + 'Kubernetes.kubectl', 'vcredist140', - 'microsoft-edge', - 'azcopy10', - 'vscode', - 'git', - '7zip', - 'kubectx', - 'putty.install', - 'kubernetes-helm', - 'dotnet-sdk', - 'zoomit', - 'openssl.light', - 'mqtt-explorer', - 'gh', - 'python', - 'bicep' + 'Microsoft.Edge', + 'Microsoft.Azure.AZCopy.10', + 'Microsoft.VisualStudioCode', + 'Git.Git', + '7zip.7zip', + 'ahmetb.kubectx', + 'PuTTY.PuTTY', + 'Helm.Helm', + 'Microsoft.DotNet.SDK.8', + 'Microsoft.Sysinternals.ZoomIt', + 'FireDaemon.OpenSSL', + 'thomasnordquist.MQTT-Explorer', + 'GitHub.cli', + 'Python.Python.3.12' ) # VSCode extensions From b350261ddf84e5a4c9f75abec83f852915275231 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Thu, 3 Oct 2024 21:13:51 -0400 Subject: [PATCH 028/409] add condition for hypermarket k3s kubectx --- .../artifacts/PowerShell/AgLogonScript.ps1 | 16 ++++++++-------- .../artifacts/PowerShell/Modules/common.psm1 | 9 +++++++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index ed963a6234..eb4f95f9a8 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -199,14 +199,14 @@ if ($scenario -eq "contoso_supermarket") { Deploy-SupermarketConfigs } -if ($scenario -eq "contoso_motors" -or $scenario -eq "contoso_hypermarket") { - Deploy-AIO - if($scenario -eq "contoso_motors"){ - Deploy-MotorsConfigs - } - $mqttIpArray=Set-MQTTIpAddress - Deploy-MQTTExplorer -mqttIpArray $mqttIpArray -} +# if ($scenario -eq "contoso_motors" -or $scenario -eq "contoso_hypermarket") { +# Deploy-AIO +# if($scenario -eq "contoso_motors"){ +# Deploy-MotorsConfigs +# } +# $mqttIpArray=Set-MQTTIpAddress +# Deploy-MQTTExplorer -mqttIpArray $mqttIpArray +# } ############################################################## # Deploy Kubernetes Prometheus Stack for Observability diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index 524b93a8d5..c9f6b8c92f 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -954,8 +954,13 @@ function Deploy-Prometheus { # Deploying Kube Prometheus Stack for stores $AgConfig.SiteConfig.GetEnumerator() | ForEach-Object { Write-Host "[$(Get-Date -Format t)] INFO: Deploying Kube Prometheus Stack for $($_.Value.FriendlyName) environment" -ForegroundColor Gray - kubectx $_.Value.FriendlyName.ToLower() | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Observability.log") - + if ($Env:scenario -eq "contoso_hypermarket") { + $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$($_.Value.FriendlyName.ToLower())" + kubectx | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Observability.log") + } + else { + kubectx $_.Value.FriendlyName.ToLower() | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Observability.log") + } # Wait for Kubernetes API server to become available $apiServer = kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}' $apiServerAddress = $apiServer -replace '.*https://| .*$' From b64a00299f43c6ecae114dd4469315325ce2d983 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Fri, 4 Oct 2024 06:52:05 -0400 Subject: [PATCH 029/409] add helm set values --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 93b1bee54b..4da1bbbd08 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -151,6 +151,8 @@ GrafanaDataSource = "seattle" Type = "k3s" HelmValuesFile = "prometheus-additional-scrape-config.yaml" + HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" + HelmService = "service/prometheus-kube-prometheus-prometheus" } Chicago = @{ ArcClusterName = "Ag-K3s-Chicago" @@ -158,6 +160,8 @@ GrafanaDataSource = "chicago" Type = "k3s" HelmValuesFile = "prometheus-additional-scrape-config.yaml" + HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" + HelmService = "service/prometheus-kube-prometheus-prometheus" } } From e28ac3273fc64c18d3277b0906ba041afe4cb091 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Fri, 4 Oct 2024 15:14:09 -0400 Subject: [PATCH 030/409] add production config to monitoring sites --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 4da1bbbd08..6a78075d1d 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -153,6 +153,7 @@ HelmValuesFile = "prometheus-additional-scrape-config.yaml" HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" HelmService = "service/prometheus-kube-prometheus-prometheus" + IsProduction = $true } Chicago = @{ ArcClusterName = "Ag-K3s-Chicago" @@ -162,6 +163,7 @@ HelmValuesFile = "prometheus-additional-scrape-config.yaml" HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" HelmService = "service/prometheus-kube-prometheus-prometheus" + IsProduction = $true } } From 82e566e85be2581c9aa2e790a53a5da4324f7ab8 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Fri, 4 Oct 2024 17:06:31 -0400 Subject: [PATCH 031/409] revert naming --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 13a98471be..4bd40c5e48 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -5,7 +5,7 @@ function Get-K3sConfigFile{ $Env:KUBECONFIG="" foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { $clusterName = $cluster.Name.ToLower() - $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$Env:namingGuid" + $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" $containerName = $arcClusterName.toLower() $sourceFile = "https://$stagingStorageAccountName.blob.core.windows.net/$containerName/config" azcopy copy $sourceFile "C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" --check-length=false @@ -21,7 +21,7 @@ function Set-K3sClusters { foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { if ($cluster.Value.Type -eq "k3s") { $clusterName = $cluster.Value.FriendlyName.ToLower() - $vmName = $cluster.Value.ArcClusterName + "-$Env:namingGuid" + $vmName = $cluster.Value.ArcClusterName + "-$namingGuid" $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" kubectx $k3sVIP = $(az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``true``].privateIPAddress" -otsv) From f10120070f569c30db78b7001b2241765b9524f3 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Fri, 4 Oct 2024 20:10:41 -0400 Subject: [PATCH 032/409] uncomment AIO --- .../artifacts/PowerShell/AgLogonScript.ps1 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index eb4f95f9a8..ed963a6234 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -199,14 +199,14 @@ if ($scenario -eq "contoso_supermarket") { Deploy-SupermarketConfigs } -# if ($scenario -eq "contoso_motors" -or $scenario -eq "contoso_hypermarket") { -# Deploy-AIO -# if($scenario -eq "contoso_motors"){ -# Deploy-MotorsConfigs -# } -# $mqttIpArray=Set-MQTTIpAddress -# Deploy-MQTTExplorer -mqttIpArray $mqttIpArray -# } +if ($scenario -eq "contoso_motors" -or $scenario -eq "contoso_hypermarket") { + Deploy-AIO + if($scenario -eq "contoso_motors"){ + Deploy-MotorsConfigs + } + $mqttIpArray=Set-MQTTIpAddress + Deploy-MQTTExplorer -mqttIpArray $mqttIpArray +} ############################################################## # Deploy Kubernetes Prometheus Stack for Observability From 7c0e66950a6a5f1775ac55784f638d2732714085 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sat, 5 Oct 2024 20:58:25 +0300 Subject: [PATCH 033/409] adding AIO patch --- .../artifacts/PowerShell/Modules/common.psm1 | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index 330dd70409..06d26ac201 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -1079,6 +1079,21 @@ function Deploy-Prometheus { Write-Host } +function Update-AzureIoTOpsExtension { + try { + Write-Host "Starting patching of azure-iot-ops extension..." -ForegroundColor Green + & "C:\Program Files\Microsoft SDKs\Azure\CLI2\python.exe" -m pip install -U --target "C:\Program Files\Microsoft SDKs\Azure\CLI2\Lib\site-packages\azure-cli-extensions\azure-iot-ops" azure-identity==1.17.1 + if ($LASTEXITCODE -eq 0) { + Write-Host "Installation of azure-iot-ops extension completed successfully." -ForegroundColor Green + } else { + Write-Host "Installation of azure-iot-ops extension failed with exit code $LASTEXITCODE." -ForegroundColor Red + } + } catch { + Write-Host "An error occurred during the patching of the azure-iot-ops extension." -ForegroundColor Red + Write-Host $_.Exception.Message -ForegroundColor Red + } +} + # Deploys Azure IoT Operations on all k8s clusters in the config file function Deploy-AIO { $sites = $AgConfig.SiteConfig.GetEnumerator() From 17cb549fe5a80ac02d6951348b4fb6b4b4e0c3c0 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sat, 5 Oct 2024 20:59:07 +0300 Subject: [PATCH 034/409] adding aio patch --- .../artifacts/PowerShell/Modules/common.psm1 | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index 330dd70409..06d26ac201 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -1079,6 +1079,21 @@ function Deploy-Prometheus { Write-Host } +function Update-AzureIoTOpsExtension { + try { + Write-Host "Starting patching of azure-iot-ops extension..." -ForegroundColor Green + & "C:\Program Files\Microsoft SDKs\Azure\CLI2\python.exe" -m pip install -U --target "C:\Program Files\Microsoft SDKs\Azure\CLI2\Lib\site-packages\azure-cli-extensions\azure-iot-ops" azure-identity==1.17.1 + if ($LASTEXITCODE -eq 0) { + Write-Host "Installation of azure-iot-ops extension completed successfully." -ForegroundColor Green + } else { + Write-Host "Installation of azure-iot-ops extension failed with exit code $LASTEXITCODE." -ForegroundColor Red + } + } catch { + Write-Host "An error occurred during the patching of the azure-iot-ops extension." -ForegroundColor Red + Write-Host $_.Exception.Message -ForegroundColor Red + } +} + # Deploys Azure IoT Operations on all k8s clusters in the config file function Deploy-AIO { $sites = $AgConfig.SiteConfig.GetEnumerator() From a20747d692aec58fc050909c9c667457bfda2e20 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Wed, 9 Oct 2024 16:03:44 -0400 Subject: [PATCH 035/409] comment AIO --- .../artifacts/PowerShell/AgLogonScript.ps1 | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 289e65dc9a..26cc7b664e 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -199,15 +199,15 @@ if ($scenario -eq "contoso_supermarket") { Deploy-SupermarketConfigs } -if ($scenario -eq "contoso_motors" -or $scenario -eq "contoso_hypermarket") { - Update-AzureIoTOpsExtension - Deploy-AIO - if($scenario -eq "contoso_motors"){ - Deploy-MotorsConfigs - } - $mqttIpArray=Set-MQTTIpAddress - Deploy-MQTTExplorer -mqttIpArray $mqttIpArray -} +# if ($scenario -eq "contoso_motors" -or $scenario -eq "contoso_hypermarket") { +# Update-AzureIoTOpsExtension +# Deploy-AIO +# if($scenario -eq "contoso_motors"){ +# Deploy-MotorsConfigs +# } +# $mqttIpArray=Set-MQTTIpAddress +# Deploy-MQTTExplorer -mqttIpArray $mqttIpArray +# } ############################################################## # Deploy Kubernetes Prometheus Stack for Observability From c7e631237a0e78904ad33253e149258cfd042a9d Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sat, 12 Oct 2024 14:42:43 -0400 Subject: [PATCH 036/409] comment chicago site --- .../AgConfig-contoso-hypermarket.psd1 | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 6a78075d1d..0d8c88b898 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -155,16 +155,16 @@ HelmService = "service/prometheus-kube-prometheus-prometheus" IsProduction = $true } - Chicago = @{ - ArcClusterName = "Ag-K3s-Chicago" - FriendlyName = "Chicago" - GrafanaDataSource = "chicago" - Type = "k3s" - HelmValuesFile = "prometheus-additional-scrape-config.yaml" - HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" - HelmService = "service/prometheus-kube-prometheus-prometheus" - IsProduction = $true - } + # Chicago = @{ + # ArcClusterName = "Ag-K3s-Chicago" + # FriendlyName = "Chicago" + # GrafanaDataSource = "chicago" + # Type = "k3s" + # HelmValuesFile = "prometheus-additional-scrape-config.yaml" + # HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" + # HelmService = "service/prometheus-kube-prometheus-prometheus" + # IsProduction = $true + # } } # Universal resource tag and resource types From 9b2a73e47aa0fd9f038539567782674c1e86f81b Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sat, 12 Oct 2024 14:43:18 -0400 Subject: [PATCH 037/409] enable alert manager --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 0d8c88b898..290ac6fda6 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -151,7 +151,7 @@ GrafanaDataSource = "seattle" Type = "k3s" HelmValuesFile = "prometheus-additional-scrape-config.yaml" - HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" + HelmSetValue = "alertmanager.enabled=true,grafana.enabled=false,prometheus.service.type=LoadBalancer" HelmService = "service/prometheus-kube-prometheus-prometheus" IsProduction = $true } From 8967508fd6ea69f0c4a262873030cc39ef528b14 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sat, 12 Oct 2024 18:17:03 -0400 Subject: [PATCH 038/409] disable alert manager --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 290ac6fda6..0d8c88b898 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -151,7 +151,7 @@ GrafanaDataSource = "seattle" Type = "k3s" HelmValuesFile = "prometheus-additional-scrape-config.yaml" - HelmSetValue = "alertmanager.enabled=true,grafana.enabled=false,prometheus.service.type=LoadBalancer" + HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" HelmService = "service/prometheus-kube-prometheus-prometheus" IsProduction = $true } From c297af7141ad6179c4309042bcd60b42311a4dbc Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Sun, 13 Oct 2024 16:11:18 -0500 Subject: [PATCH 039/409] Merge branch 'agora_2.0' of https://github.com/dkirby-ms/azure_arc into agora_2.0 --- .../artifacts/kubernetes/K3s/installK3s.sh | 9 +++++---- .../bicep/kubernetes/ubuntuRancher.bicep | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index 392f8410f1..6aa9b9ccc5 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -16,6 +16,7 @@ echo $logAnalyticsWorkspace:$6 | awk '{print substr($1,2); }' >> vars.sh echo $templateBaseUrl:$7 | awk '{print substr($1,2); }' >> vars.sh echo $storageContainerName:$8 | awk '{print substr($1,2); }' >> vars.sh echo $k3sControlPlane:$9 | awk '{print substr($1,2); }' >> vars.sh +echo $resourceGroup:$10 | awk '{print substr($1,2); }' >> vars.sh sed -i '2s/^/export adminUsername=/' vars.sh sed -i '3s/^/export subscriptionId=/' vars.sh @@ -65,15 +66,15 @@ sudo chmod +x /usr/local/bin/azcopy export AZCOPY_AUTO_LOGIN_TYPE=MSI # Function to check if dpkg lock is in place -check_dpkg_lock() { - while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1; do - echo "Waiting for other package management processes to complete..." +check_vm_extension_lock() { + while sudo -u $adminUsername az vm extension list --resource-group $resourceGroup --vm-name $vmName --query "[?provisioningState=='Creating' || provisioningState=='Updating' || provisioningState=='Deleting']" -o tsv | grep -q .; do + echo "Waiting for other VM extension operations to complete..." sleep 5 done } # Run the lock check before attempting the installation -check_dpkg_lock +check_vm_extension_lock() # Installing Azure CLI & Azure Arc extensions curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep index 8bb0444f74..25797f97a6 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep @@ -166,7 +166,7 @@ resource vmInstallscriptK3s 'Microsoft.Compute/virtualMachines/extensions@2022-0 autoUpgradeMinorVersion: true settings: {} protectedSettings: { - commandToExecute: 'bash installK3s.sh ${adminUsername} ${subscription().subscriptionId} ${vmName} ${azureLocation} ${stagingStorageAccountName} ${logAnalyticsWorkspace} ${templateBaseUrl} ${storageContainerName} ${k3sControlPlane}' + commandToExecute: 'bash installK3s.sh ${adminUsername} ${subscription().subscriptionId} ${vmName} ${azureLocation} ${stagingStorageAccountName} ${logAnalyticsWorkspace} ${templateBaseUrl} ${storageContainerName} ${k3sControlPlane} ${resourceGroup().name}' fileUris: [ '${templateBaseUrl}artifacts/kubernetes/K3s/installK3s.sh' ] @@ -176,4 +176,4 @@ resource vmInstallscriptK3s 'Microsoft.Compute/virtualMachines/extensions@2022-0 vmRoleAssignment_Owner vmRoleAssignment_Storage ] -} \ No newline at end of file +} From 57b53d5fefc7a24fbf07da22ebcc7d22ef097d92 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Sun, 13 Oct 2024 16:17:21 -0500 Subject: [PATCH 040/409] add another check --- azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index 6aa9b9ccc5..d264c3cf3c 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -97,6 +97,8 @@ done sudo -u $adminUsername az account set --subscription $subscriptionId az -v +check_vm_extension_lock() + if [[ "$k3sControlPlane" == "true" ]]; then # Installing Azure Arc extensions From 733a5ad0546608b348b07518a831e7ed9738c343 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sun, 13 Oct 2024 18:17:29 -0400 Subject: [PATCH 041/409] add retry to Azure Arc Onboarding --- .../artifacts/kubernetes/K3s/installK3s.sh | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index 392f8410f1..d523193876 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -164,7 +164,29 @@ if [[ "$k3sControlPlane" == "true" ]]; then workspaceResourceId=$(sudo -u $adminUsername az resource show --resource-group $resourceGroup --name $logAnalyticsWorkspace --resource-type "Microsoft.OperationalInsights/workspaces" --query id -o tsv) echo "Log Analytics workspace id $workspaceResourceId" - sudo -u $adminUsername az connectedk8s connect --name $vmName --resource-group $resourceGroup --location $location + # sudo -u $adminUsername az connectedk8s connect --name $vmName --resource-group $resourceGroup --location $location + + max_retries=5 + retry_count=0 + success=false + + while [ $retry_count -lt $max_retries ]; do + sudo -u $adminUsername az connectedk8s connect --name $vmName --resource-group $resourceGroup --location $location + if [ $? -eq 0 ]; then + success=true + break + else + echo "Attempt $((retry_count+1)) failed. Retrying..." + retry_count=$((retry_count+1)) + sleep 5 + fi + done + + if [ "$success" = false ]; then + echo "Error: Failed to onboard the cluster to Azure Arc after $max_retries attempts." + exit 1 + fi + echo "Onboarding the k3s cluster to Azure Arc completed" # Verify if cluster is connected to Azure Arc successfully From 588b567237fdc374bd14766e430e77649b84efb1 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sun, 13 Oct 2024 18:18:51 -0400 Subject: [PATCH 042/409] comment observability --- azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 26cc7b664e..6741aa7f61 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -212,7 +212,7 @@ if ($scenario -eq "contoso_supermarket") { ############################################################## # Deploy Kubernetes Prometheus Stack for Observability ############################################################## -Deploy-Prometheus -AgConfig $AgConfig +# Deploy-Prometheus -AgConfig $AgConfig ##################################################################### # Deploy Azure Workbook for Infrastructure Observability From d52b586d0638d997d10fdb1cf97f0a81f90ce5da Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Sun, 13 Oct 2024 17:23:52 -0500 Subject: [PATCH 043/409] bug --- azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index d264c3cf3c..6d32d5a022 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -43,7 +43,7 @@ chmod +x vars.sh . ./vars.sh # Creating login message of the day (motd) -sudo curl -v -o /etc/profile.d/welcomeK3s.sh ${templateBaseUrl}artifacts/welcomeK3s.sh +curl -v -o /etc/profile.d/welcomeK3s.sh ${templateBaseUrl}artifacts/welcomeK3s.sh # Syncing this script log to 'jumpstart_logs' directory for ease of troubleshooting sudo -u $adminUsername mkdir -p /home/${adminUsername}/jumpstart_logs @@ -74,7 +74,7 @@ check_vm_extension_lock() { } # Run the lock check before attempting the installation -check_vm_extension_lock() +check_vm_extension_lock # Installing Azure CLI & Azure Arc extensions curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash @@ -97,7 +97,7 @@ done sudo -u $adminUsername az account set --subscription $subscriptionId az -v -check_vm_extension_lock() +check_vm_extension_lock if [[ "$k3sControlPlane" == "true" ]]; then From e057d45509233f958333d8bef4a0332a5a9dc823 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Sun, 13 Oct 2024 18:12:34 -0500 Subject: [PATCH 044/409] bug --- azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index 6d32d5a022..837194f50c 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -27,6 +27,7 @@ sed -i '7s/^/export logAnalyticsWorkspace=/' vars.sh sed -i '8s/^/export templateBaseUrl=/' vars.sh sed -i '9s/^/export storageContainerName=/' vars.sh sed -i '10s/^/export k3sControlPlane=/' vars.sh +sed -i '11s/^/export resourceGroup=/' vars.sh export vmName=$3 From 58e1474161342d95b6b456593e78a2c4753841ce Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sun, 13 Oct 2024 20:43:02 -0400 Subject: [PATCH 045/409] diable container insights --- .../artifacts/kubernetes/K3s/installK3s.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index d523193876..d476aae940 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -211,13 +211,13 @@ echo "" echo "Enabling Container Insights and Microsoft Defender for Containers cluster extensions" echo "" -# Check and install azuremonitor-containers extension -if is_extension_installed "azuremonitor-containers"; then - echo "Extension 'azuremonitor-containers' is already installed." -else - echo "Extension 'azuremonitor-containers' is not installed - triggering installation" - sudo -u $adminUsername az k8s-extension create -n "azuremonitor-containers" --cluster-name $vmName --resource-group $resourceGroup --cluster-type connectedClusters --extension-type Microsoft.AzureMonitor.Containers --configuration-settings logAnalyticsWorkspaceResourceID=$workspaceResourceId --only-show-errors -fi +# # Check and install azuremonitor-containers extension +# if is_extension_installed "azuremonitor-containers"; then +# echo "Extension 'azuremonitor-containers' is already installed." +# else +# echo "Extension 'azuremonitor-containers' is not installed - triggering installation" +# sudo -u $adminUsername az k8s-extension create -n "azuremonitor-containers" --cluster-name $vmName --resource-group $resourceGroup --cluster-type connectedClusters --extension-type Microsoft.AzureMonitor.Containers --configuration-settings logAnalyticsWorkspaceResourceID=$workspaceResourceId --only-show-errors +# fi # Check and install microsoft.azuredefender.kubernetes extension if is_extension_installed "microsoft.azuredefender.kubernetes"; then From fb8b54f85a8ac95db181d2232af26b2f63bf6ca3 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Sun, 13 Oct 2024 19:55:30 -0500 Subject: [PATCH 046/409] bash bugfix --- azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index 837194f50c..389cbaa52f 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -16,7 +16,7 @@ echo $logAnalyticsWorkspace:$6 | awk '{print substr($1,2); }' >> vars.sh echo $templateBaseUrl:$7 | awk '{print substr($1,2); }' >> vars.sh echo $storageContainerName:$8 | awk '{print substr($1,2); }' >> vars.sh echo $k3sControlPlane:$9 | awk '{print substr($1,2); }' >> vars.sh -echo $resourceGroup:$10 | awk '{print substr($1,2); }' >> vars.sh +echo $resourceGroup:${10}| awk '{print substr($1,2); }' >> vars.sh sed -i '2s/^/export adminUsername=/' vars.sh sed -i '3s/^/export subscriptionId=/' vars.sh From a91e556f0db5c36ea0b2d23e4a115660e396f8cd Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sun, 13 Oct 2024 20:57:20 -0400 Subject: [PATCH 047/409] revert changes --- .../AgConfig-contoso-hypermarket.psd1 | 20 +++++++++---------- .../artifacts/PowerShell/AgLogonScript.ps1 | 20 +++++++++---------- .../artifacts/kubernetes/K3s/installK3s.sh | 16 +++++++-------- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 0d8c88b898..6a78075d1d 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -155,16 +155,16 @@ HelmService = "service/prometheus-kube-prometheus-prometheus" IsProduction = $true } - # Chicago = @{ - # ArcClusterName = "Ag-K3s-Chicago" - # FriendlyName = "Chicago" - # GrafanaDataSource = "chicago" - # Type = "k3s" - # HelmValuesFile = "prometheus-additional-scrape-config.yaml" - # HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" - # HelmService = "service/prometheus-kube-prometheus-prometheus" - # IsProduction = $true - # } + Chicago = @{ + ArcClusterName = "Ag-K3s-Chicago" + FriendlyName = "Chicago" + GrafanaDataSource = "chicago" + Type = "k3s" + HelmValuesFile = "prometheus-additional-scrape-config.yaml" + HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" + HelmService = "service/prometheus-kube-prometheus-prometheus" + IsProduction = $true + } } # Universal resource tag and resource types diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 6741aa7f61..289e65dc9a 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -199,20 +199,20 @@ if ($scenario -eq "contoso_supermarket") { Deploy-SupermarketConfigs } -# if ($scenario -eq "contoso_motors" -or $scenario -eq "contoso_hypermarket") { -# Update-AzureIoTOpsExtension -# Deploy-AIO -# if($scenario -eq "contoso_motors"){ -# Deploy-MotorsConfigs -# } -# $mqttIpArray=Set-MQTTIpAddress -# Deploy-MQTTExplorer -mqttIpArray $mqttIpArray -# } +if ($scenario -eq "contoso_motors" -or $scenario -eq "contoso_hypermarket") { + Update-AzureIoTOpsExtension + Deploy-AIO + if($scenario -eq "contoso_motors"){ + Deploy-MotorsConfigs + } + $mqttIpArray=Set-MQTTIpAddress + Deploy-MQTTExplorer -mqttIpArray $mqttIpArray +} ############################################################## # Deploy Kubernetes Prometheus Stack for Observability ############################################################## -# Deploy-Prometheus -AgConfig $AgConfig +Deploy-Prometheus -AgConfig $AgConfig ##################################################################### # Deploy Azure Workbook for Infrastructure Observability diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index d476aae940..d2b479e64d 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -176,7 +176,7 @@ if [[ "$k3sControlPlane" == "true" ]]; then success=true break else - echo "Attempt $((retry_count+1)) failed. Retrying..." + echo "Failed to onboard cluster to Azure Arc. Retrying (Attempt $((retry_count+1)))..." retry_count=$((retry_count+1)) sleep 5 fi @@ -211,13 +211,13 @@ echo "" echo "Enabling Container Insights and Microsoft Defender for Containers cluster extensions" echo "" -# # Check and install azuremonitor-containers extension -# if is_extension_installed "azuremonitor-containers"; then -# echo "Extension 'azuremonitor-containers' is already installed." -# else -# echo "Extension 'azuremonitor-containers' is not installed - triggering installation" -# sudo -u $adminUsername az k8s-extension create -n "azuremonitor-containers" --cluster-name $vmName --resource-group $resourceGroup --cluster-type connectedClusters --extension-type Microsoft.AzureMonitor.Containers --configuration-settings logAnalyticsWorkspaceResourceID=$workspaceResourceId --only-show-errors -# fi +# Check and install azuremonitor-containers extension +if is_extension_installed "azuremonitor-containers"; then + echo "Extension 'azuremonitor-containers' is already installed." +else + echo "Extension 'azuremonitor-containers' is not installed - triggering installation" + sudo -u $adminUsername az k8s-extension create -n "azuremonitor-containers" --cluster-name $vmName --resource-group $resourceGroup --cluster-type connectedClusters --extension-type Microsoft.AzureMonitor.Containers --configuration-settings logAnalyticsWorkspaceResourceID=$workspaceResourceId --only-show-errors +fi # Check and install microsoft.azuredefender.kubernetes extension if is_extension_installed "microsoft.azuredefender.kubernetes"; then From 02c16d72e50e1f6598bc8917afe277faf97af8c2 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sun, 13 Oct 2024 20:58:26 -0400 Subject: [PATCH 048/409] remove code --- azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index d2b479e64d..d2f18c9555 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -164,8 +164,6 @@ if [[ "$k3sControlPlane" == "true" ]]; then workspaceResourceId=$(sudo -u $adminUsername az resource show --resource-group $resourceGroup --name $logAnalyticsWorkspace --resource-type "Microsoft.OperationalInsights/workspaces" --query id -o tsv) echo "Log Analytics workspace id $workspaceResourceId" - # sudo -u $adminUsername az connectedk8s connect --name $vmName --resource-group $resourceGroup --location $location - max_retries=5 retry_count=0 success=false From dae0d301b94cceb4d9f1673364ab6fd6f22cad4e Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sun, 13 Oct 2024 21:00:26 -0400 Subject: [PATCH 049/409] update username --- .../contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep | 4 ++-- .../bicep/kubernetes/ubuntuRancherNodes.bicep | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep index 8bb0444f74..0e27185ff3 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep @@ -2,7 +2,7 @@ param vmName string = 'Ag-K3s-${namingGuid}' @description('Username for the Virtual Machine') -param adminUsername string = 'arcdemo' +param adminUsername string = 'agora' @description('RSA public key used for securing SSH access to ArcBox resources. This parameter is only needed when deploying the DataOps or DevOps flavors.') @secure() @@ -176,4 +176,4 @@ resource vmInstallscriptK3s 'Microsoft.Compute/virtualMachines/extensions@2022-0 vmRoleAssignment_Owner vmRoleAssignment_Storage ] -} \ No newline at end of file +} diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep index 47c84430e0..aea2f9b508 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep @@ -3,7 +3,7 @@ param vmName string = 'Ag-K3s-Node-${namingGuid}' @description('Username for the Virtual Machine') -param adminUsername string = 'arcdemo' +param adminUsername string = 'agora' @description('RSA public key used for securing SSH access to ArcBox resources. This parameter is only needed when deploying the DataOps or DevOps flavors.') @secure() @@ -155,4 +155,4 @@ resource vmInstallscriptK3s 'Microsoft.Compute/virtualMachines/extensions@2022-0 vmRoleAssignment_Owner vmRoleAssignment_Storage ] -} \ No newline at end of file +} From bbc59c19fef436741367e08fa837a6cbed7561a6 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Sun, 13 Oct 2024 20:38:34 -0500 Subject: [PATCH 050/409] exclude extension --- azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index 389cbaa52f..39a9a3f38f 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -68,7 +68,7 @@ export AZCOPY_AUTO_LOGIN_TYPE=MSI # Function to check if dpkg lock is in place check_vm_extension_lock() { - while sudo -u $adminUsername az vm extension list --resource-group $resourceGroup --vm-name $vmName --query "[?provisioningState=='Creating' || provisioningState=='Updating' || provisioningState=='Deleting']" -o tsv | grep -q .; do + while sudo -u $adminUsername az vm extension list --resource-group $resourceGroup --vm-name $vmName --query "[?provisioningState=='Creating' || provisioningState=='Updating' || provisioningState=='Deleting'] | [?name!='installscript_k3s']" -o tsv | grep -q .; do echo "Waiting for other VM extension operations to complete..." sleep 5 done From 8a48d529bcd0a75ce08aa1ecbe279c65ae45d572 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 14 Oct 2024 09:40:18 +0300 Subject: [PATCH 051/409] Refactor sleep duration for retrying Azure Arc onboarding --- azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index d2f18c9555..6f04b3aa9a 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -176,7 +176,7 @@ if [[ "$k3sControlPlane" == "true" ]]; then else echo "Failed to onboard cluster to Azure Arc. Retrying (Attempt $((retry_count+1)))..." retry_count=$((retry_count+1)) - sleep 5 + sleep 10 fi done From e08de18563aa1735e72d921d0217c6af62dbe7eb Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Mon, 14 Oct 2024 07:00:02 -0400 Subject: [PATCH 052/409] Initial code for Fabric automation --- .../PowerShell/SetupFabricWorkspace.ps1 | 381 ++++++++++++++++++ .../fabric-hypermarket-dashboard.json | 225 +++++++++++ 2 files changed, 606 insertions(+) create mode 100644 azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 create mode 100644 azure_jumpstart_ag/artifacts/adx_dashboards/fabric-hypermarket-dashboard.json diff --git a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 new file mode 100644 index 0000000000..db96c774f9 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 @@ -0,0 +1,381 @@ +param ( + [string]$tenantID, # Azure AD tenant id where Fabric workspace is created + [string]$loginAs = "user", # Use this to switch beteween user or managed-identity. Use user type until managed identity is supported by all services used in this scenario + [string]$runLocally = "false" # Use this flag to run locally outside of Agora Client VM +) + +#################################################################################################### +# This PS script create all necessary Microsoft Fabric items to support Agora Retail 2.0 +# data pipeline integration and dashboards + +# access rights deploy Microsoft Fabric items used in Agora Manufacturing scenario. +# Make sure Create Workpace is enabled in Frabric for service principals. +#Access settings using https://app.fabric.microsoft.com/admin-portal/tenantSettings?experience=power-bi + +#################################################################################################### +$ProgressPreference = "SilentlyContinue" +Set-PSDebug -Strict + +az config set extension.use_dynamic_install=yes_without_prompt +az extension add --name microsoft-fabric --allow-preview true + +##################################################################### +# Initialize the environment +##################################################################### +if ($runLocally -eq "true") { + $AgConfig = Import-PowerShellDataFile -Path $Env:AgConfigPath + $AgLogsDir = "." + $namingGuid = (New-Guid).ToString().Substring(31, 5) + $resourceGroup = "rg-fabric" + $azureLocation = "eastus" +} +else { + $AgConfig = Import-PowerShellDataFile -Path $Env:AgConfigPath + $AgLogsDir = $AgConfig.AgDirectories["AgLogsDir"] + $namingGuid = $Env:namingGuid + $tenantID = $Env:tenantId + $resourceGroup = $Env:resourceGroup + $azureLocation = $Env:azureLocation +} + +Start-Transcript -Path ($AgLogsDir + "\SetupFabricWorkspace.log") +Write-Host "[$(Get-Date -Format t)] INFO: Configuring Fabric Wrokspace" -ForegroundColor DarkGreen + +# Define variables to create Fabric workspace and KQL database +$fabricResource = "https://api.fabric.microsoft.com" # Fabric API resource to get access tokens for authorization to Fabric +$kustoResource = "https://api.kusto.windows.net" # Kusto API resource to get access tokens for authorization KQL database +$powerbiResource = "https://analysis.windows.net/powerbi/api" # Power BI API resource to get access token for authorization to Power BI +$AgScenarioPrefix = "JSAgoraHyperMarket" # Prefix to use for Fabric workspace and other items created in Fabric + +# Login to Azure as end user or managed identity to get access tokens for different API endpoints +if ($userType -eq "user") { + # login using interactive logon + az login --tenant $tenantID --allow-no-subscriptions +} +else { + # Login using managed identity + az login --identity +} + +# Get access token to authorize access to Fabric APIs +$fabricAccessToken = (az account get-access-token --resource $fabricResource --query accessToken --output tsv) +if ($accessToken -eq '') { + write-host "ERROR: Failed to get access token using managed identity." + Exit +} + +# Create Fabric workspace. Generate new guid or use guid prefix in agora deployment +$fabricWorkspaceName = "$AgScenarioPrefix-$namingGuid".ToLower() +$fabricCapacityName = "jsagoraeastus" # $fabricWorkspaceName + +# List Fabric capacities to assign to Fabric workspace to avoid Powrer BI Premium license +write-host "INFO: Checking if there is a Fabric capacity created with specified name." +$fabricCapacityApi = "https://api.fabric.microsoft.com/v1/capacities" +$headers = @{"Authorization" = "Bearer $fabricAccessToken";} +$httpResp = Invoke-WebRequest -Method Get -Uri $fabricCapacityApi -Headers $headers +if (!($httpResp.StatusCode -eq 200)){ + Write-Host "ERROR: Failed to get Fabric capacities." + Exit +} + +# Display current Fabric capacities +$fabricCapacities = (ConvertFrom-Json($httpResp.Content)).value +foreach ($fabricCapacity in $fabricCapacities){ + Write-Host "INFO: Fabric capacity name: $($fabricCapacity.displayName), id: $($fabricCapacity.id), state: $($fabricCapacity.state)" +} + +# Verify if Fabric capacity exists with specific name +$fabricCapacity = $fabricCapacities | Where-Object { $_.displayName -eq $fabriccapacityName } +if ($fabricCapacity.id -eq '' -or $null -eq $fabricCapacity.id){ + Write-Host "ERROR: Fabric capacity not found with capacity name '$fabriccapacityName'" + + # Create new fabric capactiy + Write-Host "INFO: Creating Fabric capacity with capacity name '$fabriccapacityName'" + az fabric capacity create --resource-group $resourceGroup --capacity-name $fabriccapacityName --sku "{name:F2,tier:Fabric}" --location $azureLocation + Write-Host "INFO: Created Fabric capacity. with capacity name '$fabriccapacityName'" +} +else { + Write-Host "INFO: Found Fabric capacity with capacity name '$fabriccapacityName'" +} + +# Create Fabric Workspace +$fabricWorkspacesApi = "https://api.fabric.microsoft.com/v1/workspaces" +$fabricCapacityId = $fabricCapacity.Id +Write-Host "INFO: Creating Fabric workspace with name '$fabricWorkspaceName' and assigning Fabric Capacity id '$fabricCapacityId'" + +$apiPayload = "{'displayName': '$fabricWorkspaceName', 'capacityId': '$fabricCapacityId', 'Description': 'Jumpstart Agora Retail data analytics workspace.'}" +$headers = @{"Authorization" = "Bearer $fabricAccessToken"; "Content-Type" = "application/json" } +$workspaceResp = Invoke-WebRequest -Method Post -Uri $fabricWorkspacesApi -Body $apiPayload -Headers $headers +if (($workspaceResp.StatusCode -ge 200) -and ($workspaceResp.StatusCode -le 204)){ + Write-Host "INFO: Fabric workspace created with name '$fabricWorkspaceName' and assigned Fabric Capacity with id '$fabricCapacityId'" +} +else { + Write-Host "ERROR: Failed to create Fabric workspace." + Exit +} + +# Get newly created Fabric workspace id to create KQL database and other Fabric items +$fabricWorkspaceId = (ConvertFrom-Json($workspaceResp.Content)).id +Write-Host "INFO: Fabric workspace id is $fabricWorkspaceId" + +# Create Eventhouse to store retail data +$eventhouseApi = "https://api.fabric.microsoft.com/v1/workspaces/$fabricWorkspaceId/eventhouses" +$eventhouseName = "$AgScenarioPrefix-KQL".ToLower() +$apiPayload = "{'displayName': '$eventhouseName', 'description': 'Eventhouse to host KQL database for Agora Hypermarket data.'}" +$headers = @{"Authorization" = "Bearer $fabricAccessToken"; "Content-Type" = "application/json" } + +Write-Host "INFO: Creating Eventhouse with name $eventhouseName." +$eventhouseResp = Invoke-WebRequest -Method Post -Uri $eventhouseApi -Body $apiPayload -Headers $headers +if (($eventhouseResp.StatusCode -ge 200) -or ($eventhouseResp.StatusCode -le 204)){ + Write-Host "INFO: Eventhouse created with name $eventhouseName." +} +else { + Write-Host "ERROR: Failed to create Eventhouse." + Exit +} + +# Get KQL database created in Eventhouse +Write-Host "INFO: Get default KQL database created in Eventhouse." +$kqlDatabasesApi = "https://api.fabric.microsoft.com/v1/workspaces/$fabricWorkspaceId/kqlDatabases" +$headers = @{"Authorization" = "Bearer $fabricAccessToken";} +$kqlDatabasesResp = Invoke-WebRequest -Method Get -Uri $kqlDatabasesApi -Headers $headers +$kqlDatabaseInfo = (ConvertFrom-Json($kqlDatabasesResp.Content)).value +$kqlQueryServiceUri = $kqlDatabaseInfo[0].properties.queryServiceUri +$kqlDatabaseId = $kqlDatabaseInfo[0].id + +# Create KQL database tables to store retail data +$databaseName = $eventhouseName + +# Get access token to authorize with the Kusto query endpoint +Write-Host "INFO: Get access token to authorize access to Kusto API endpoint $kustoResource" +$kustoAccessToken = (az account get-access-token --resource $kustoResource --query accessToken --output tsv) +if ($kustoAccessToken -eq '') { + write-host "ERROR: Failed to get access token to access Kusto endpoint $kustoResource." + Exit +} + +$headers = @{ + "Authorization" = "Bearer $kustoAccessToken" + "Content-Type" = "application/json" +} + +# Create payload to create tables in the KQL database +Write-Host "INFO: Creating products table." +$body = @{ + db = $databaseName + csl = ".create table products (product_id:int, name:string, stock:int, price_range:dynamic, photo_path:string, category:string)" +} | ConvertTo-Json + +$httpResp = Invoke-RestMethod -Method Post -Uri "$kqlQueryServiceUri/v1/rest/mgmt" -Headers $headers -Body $body +if (($httpResp.StatusCode -ge 200) -or ($httpResp.StatusCode -le 204)){ + Write-Host "INFO: products table created." +} +else { + Write-Host "ERROR: Failed to create products table." + Exit +} + +# Create payload +Write-Host "INFO: Creating orders table." +$body = @{ + db = $databaseName + csl = ".create table orders (store_id:string, order_id:string, order_date:datetime, line_items:dynamic, order_total:real)" +} | ConvertTo-Json + +# Create Inventory table +$httpResp = Invoke-RestMethod -Method Post -Uri "$kqlQueryServiceUri/v1/rest/mgmt" -Headers $headers -Body $body +if (($httpResp.StatusCode -ge 200) -or ($httpResp.StatusCode -le 204)){ + Write-Host "INFO: orders table created." +} +else { + Write-Host "ERROR: Failed to create orders table." + Exit +} + +# Create payload +Write-Host "INFO: Creating inventory table." +$body = @{ + db = $databaseName + csl = ".create table inventory (date_time:datetime,store_id:string,product_id:int,retail_price:real,in_stock:int)" +} | ConvertTo-Json + +# Create inventory table +$httpResp = Invoke-RestMethod -Method Post -Uri "$kqlQueryServiceUri/v1/rest/mgmt" -Headers $headers -Body $body +if (($httpResp.StatusCode -ge 200) -or ($httpResp.StatusCode -le 204)){ + Write-Host "INFO: inventory table created." +} +else { + Write-Host "ERROR: Failed to create inventory table." + Exit +} + +# Create ingestion mapping +$mappingQuery = @" +{ + "db": "$kqlDatabaseId", + "csl": ".create table ['orders'] ingestion json mapping 'orders_mapping' '[{\"column\":\"store_id\", \"Properties\":{\"Path\":\"$[\\'store_id\\']\"}},{\"column\":\"order_id\", \"Properties\":{\"Path\":\"$[\\'order_id\\']\"}},{\"column\":\"order_date\", \"Properties\":{\"Path\":\"$[\\'order_date\\']\"}},{\"column\":\"line_items\", \"Properties\":{\"Path\":\"$[\\'line_items\\']\"}},{\"column\":\"order_total\", \"Properties\":{\"Path\":\"$[\\'order_total\\']\"}}]'", + "properties": null +} +"@ + +$httpResp = Invoke-RestMethod -Method Post -Uri "$kqlQueryServiceUri/v1/rest/mgmt" -Headers $headers -Body $mappingQuery +if (($httpResp.StatusCode -ge 200) -or ($httpResp.StatusCode -le 204)){ + Write-Host "INFO: orders mapping created." +} +else { + Write-Host "ERROR: Failed to create orders mapping." + Exit +} + +# Download dashboard report and Update to use KQL database +$hyperMarketDashboardReport = "hypermarket-fabric-dashboard.json" +Write-Host "INFO: Downloading and preparing dashboard report to import into Fabric workspace." +$ordersDashboardBody = (Invoke-WebRequest -Method Get -Uri "$env:templateBaseUrl/artifacts/adx_dashboards/$hyperMarketDashboardReport").Content -replace '{{KQL_CLUSTER_URI}}', $queryServiceUri -replace '{{KQL_DATABASE_ID}}', $kqlDatabaseId -replace '{{FABRIC_WORKSPACE_ID}}', $fabricWorkspaceId +$ordersDashboardBody = (Get-Content -Path "C:\azure_arc\azure_jumpstart_ag\artifacts\adx_dashboards\fabric-hypermarket-dashboard.json") -replace '{{KQL_CLUSTER_URI}}', $queryServiceUri -replace '{{KQL_DATABASE_ID}}', $kqlDatabaseId -replace '{{FABRIC_WORKSPACE_ID}}', $fabricWorkspaceId + +# Convert the KQL dashboard report payload to base64 +Write-Host "INFO: Conerting report content into base64 encoded format." +$base64Payload = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($ordersDashboardBody)) + +# Build KQL dashboard report payload from the report template +$body = @" +{ + "displayName": "Contoso_Hypermarket", + "description": "Contoso Hypermarket Dashboard Report", + "definition": { + "parts": [ + { + "path": "fabric-hypermarket-dashboard.json", + "payload": "$base64Payload", + "payloadType": "InlineBase64" + } + ] + } +} +"@ + +# Create KQL dashboard report +$kqlDashboardsApi = "https://api.fabric.microsoft.com/v1/workspaces/$fabricWorkspaceId/kqlDashboards" +$headers = @{"Authorization" = "Bearer $fabricAccessToken"; "Content-Type" = "application/json"} +$httpResp = Invoke-RestMethod -Method Post -Uri $kqlDashboardsApi -Headers $headers -Body $body +if (($httpResp.StatusCode -ge 200) -or ($httpResp.StatusCode -le 204)){ + Write-Host "INFO: Created KQL dashboard report." +} +else { + Write-Host "ERROR: Failed to create KQL dashboard report." + Exit +} + +# Get access token to authorize Power BI service. +Write-Host "INFO: Get access token to access Power BI APIs." +$powerbiAccessToken = (az account get-access-token --resource $powerbiResource --query accessToken --output tsv) +if ($powerbiAccessToken -eq '') { + Write-Host "ERROR: Failed to get access token to access Power BI service." + Exit +} + +# Power BI API endpoint to create EventHut connection +$powerBIEndpoint = "https://api.powerbi.com/v2.0/myorg/me/gatewayClusterCloudDatasource" + +# Create body to create EventHub data source +$eventHubNamespace = "" +$eventHubName = "" +$eventHugNameKeyName = "" +$eventHubSecret = "" + +$connectionBody = @" +{ + "datasourceName": "Agora_Retail_2_0_EventHub_Connection", + "datasourceType": "Extension", + "connectionDetails": "{\"endpoint\":\"$eventHubNamespace\",\"entityPath\":\"$eventHubName\"}", + "singleSignOnType": "None", + "mashupTestConnectionDetails": { + "functionName": "EventHub.Contents", + "moduleName": "EventHub", + "moduleVersion": "1.0.8", + "parameters": [ + { + "name": "endpoint", + "type": "text", + "isRequired": true, + "value": "$eventHubNamespace" + }, + { + "name": "entityPath", + "type": "text", + "isRequired": true, + "value": "orders" + } + ] + }, + "referenceDatasource": false, + "credentialDetails": { + "credentialType": "Basic", + "credentials": "{\"credentialData\":[{\"name\":\"username\",\"value\":\"$eventHugNameKeyName\"},{\"name\":\"password\",\"value\":\"$eventHubSecret\"}]}", + "encryptedConnection": "Any", + "privacyLevel": "Organizational", + "skipTestConnection": false, + "encryptionAlgorithm": "NONE", + "credentialSources": [] + }, + "allowDatasourceThroughGateway": true +} +"@ + +# Call API to create Event Hub connection in Power BI +$connectionResp = Invoke-RestMethod -Method Post -Uri $powerBIEndpoint -Body $connectionBody -ContentType "application/json" -Headers @{ + Authorization = "Bearer $powerbiAccessToken" +} + +# Get connection id +$DataSourceConnectionId = $connectionResp.id + +# Create header to authorize with Power BI service +$headers = @{ + "Authorization" = "Bearer $powerbiAccessToken" + "Content-Type" = "application/json" +} + +# Get MWC token to authorize and create data connections. This is a temporary workaround until Fabric releases API to create data connections +$mwcTokenBody = @" +{ + "type": "[Start] GetMWCTokenV2", + "workloadType": "Kusto", + "artifactObjectIds": [ + "$kqlDatabaseId" + ], + "workspaceObjectId": "$fabricWorkspaceId", + "capacityObjectId": "$fabricCapacityId" +} +"@ + +$mwcTokenApi = "https://wabi-us-central-b-primary-redirect.analysis.windows.net/metadata/v201606/generatemwctokenv2" +$mwcTokenResp = Invoke-RestMethod -Method Post -Uri $mwcTokenApi -Headers $headers -Body $mwcTokenBody +$mwcToken = $mwcTokenResp.token + +# Event Hub connection body +$streamApi = "https://pbipeastus1-eastus.pbidedicated.windows.net/webapi/capacities/$fabricCapacityId/workloads/Kusto/KustoService/direct/v1/databases/$kqlDatabaseId/dataConnections/$DataSourceConnectionId" +$streamBody = @" +{ + "DataConnectionType": "EventHubDataConnection", + "DataConnectionProperties": { + "DatabaseArtifactId": "$kqlDatabaseId", + "TableName": "orders", + "MappingRuleName": "orders_mapping", + "EventSystemProperties": [], + "ConsumerGroup": "fabric", + "Compression": "None", + "DataFormat": "multijson", + "DataSourceConnectionId": "$DataSourceConnectionId", + "DataConnectionType": "EventHubDataConnection", + "DataConnectionName": "Test-EventHub-Connection" + } +} +"@ + +# Use MWC Token to create event data connection +$dataSourceConnectionId = Invoke-RestMethod -Method Post -Uri $streamApi -Body $streamBody -ContentType "application/json" -Headers @{ + Authorization = "MwcToken $mwcToken" +} + +$dataSourceConnectionId \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/adx_dashboards/fabric-hypermarket-dashboard.json b/azure_jumpstart_ag/artifacts/adx_dashboards/fabric-hypermarket-dashboard.json new file mode 100644 index 0000000000..0efab7f01c --- /dev/null +++ b/azure_jumpstart_ag/artifacts/adx_dashboards/fabric-hypermarket-dashboard.json @@ -0,0 +1,225 @@ +{ + "schema_version": "53", + "title": "Agora Retail 2.0 - Contoso Hypermarket", + "tiles": [ + { + "id": "bf1564b8-c635-4dd4-b82c-7859783c06ff", + "title": "Store Orders", + "visualType": "column", + "pageId": "9fb7339e-3f60-4f8e-b96d-923c278b671c", + "layout": { + "x": 9, + "y": 2, + "width": 9, + "height": 7 + }, + "queryRef": { + "kind": "query", + "queryId": "cdbf9c2a-a0bf-41ec-84e2-e6e4b1bbb38d" + }, + "visualOptions": { + "multipleYAxes": { + "base": { + "id": "-1", + "label": "Orders", + "columns": [], + "yAxisMaximumValue": null, + "yAxisMinimumValue": null, + "yAxisScale": "linear", + "horizontalLines": [] + }, + "additional": [], + "showMultiplePanels": false + }, + "hideLegend": true, + "legendLocation": "bottom", + "xColumnTitle": "Order Date", + "xColumn": null, + "yColumns": null, + "seriesColumns": null, + "xAxisScale": "linear", + "verticalLine": "", + "crossFilterDisabled": false, + "drillthroughDisabled": false, + "crossFilter": [], + "drillthrough": [] + } + }, + { + "id": "e56a7a19-a204-4819-843b-28ab6471337f", + "title": "Orders by Product", + "visualType": "pie", + "pageId": "9fb7339e-3f60-4f8e-b96d-923c278b671c", + "layout": { + "x": 0, + "y": 2, + "width": 9, + "height": 7 + }, + "queryRef": { + "kind": "query", + "queryId": "59491618-8a0e-4e5b-938d-554bbc38f56e" + }, + "visualOptions": { + "hideLegend": false, + "legendLocation": "right", + "xColumn": null, + "yColumns": null, + "seriesColumns": null, + "crossFilterDisabled": false, + "drillthroughDisabled": false, + "labelDisabled": false, + "pie__label": [ + "name", + "percentage" + ], + "tooltipDisabled": false, + "pie__tooltip": [ + "name", + "percentage", + "value" + ], + "pie__orderBy": "size", + "pie__kind": "pie", + "pie__topNSlices": null, + "crossFilter": [], + "drillthrough": [] + } + }, + { + "id": "9f9c926a-833b-469e-90e8-8bddc9387d12", + "title": "", + "visualType": "markdownCard", + "pageId": "9fb7339e-3f60-4f8e-b96d-923c278b671c", + "layout": { + "x": 0, + "y": 0, + "width": 18, + "height": 2 + }, + "markdownText": "# Agora Retail 2.0 - Hypermart Dashboard Reports", + "visualOptions": {} + }, + { + "id": "14872fbe-c900-4b12-a503-17535c8b6508", + "title": "Product Inventory", + "visualType": "line", + "pageId": "9fb7339e-3f60-4f8e-b96d-923c278b671c", + "layout": { + "x": 0, + "y": 9, + "width": 9, + "height": 7 + }, + "queryRef": { + "kind": "query", + "queryId": "8f13c521-66ac-47af-8637-263824635c7f" + }, + "visualOptions": { + "multipleYAxes": { + "base": { + "id": "-1", + "label": "Quantity in Stock", + "columns": [], + "yAxisMaximumValue": null, + "yAxisMinimumValue": null, + "yAxisScale": "linear", + "horizontalLines": [] + }, + "additional": [], + "showMultiplePanels": false + }, + "hideLegend": false, + "legendLocation": "right", + "xColumnTitle": "Date", + "xColumn": "date_time", + "yColumns": [ + "in_stock" + ], + "seriesColumns": [ + "product_id" + ], + "xAxisScale": "linear", + "verticalLine": "", + "crossFilterDisabled": false, + "drillthroughDisabled": false, + "crossFilter": [], + "drillthrough": [] + } + } + ], + "baseQueries": [], + "parameters": [ + { + "kind": "duration", + "id": "a68b53ea-f5e6-45f3-9197-55a36e7d0d1a", + "displayName": "Time range", + "description": "", + "beginVariableName": "_startTime", + "endVariableName": "_endTime", + "defaultValue": { + "kind": "dynamic", + "count": 1, + "unit": "hours" + }, + "showOnPages": { + "kind": "all" + } + } + ], + "dataSources": [ + { + "kind": "kusto-trident", + "scopeId": "kusto-trident", + "clusterUri": "{{KQL_CLUSTER_URI}}", + "database": "{{KQL_DATABASE_ID}}", + "name": "contosohypermarket", + "id": "0d698e85-cad2-4c2c-9791-0bb4de278f5f", + "workspace": "{{FABRIC_WORKSPACE_ID}}" + } + ], + "pages": [ + { + "name": "Sales dashboard", + "id": "9fb7339e-3f60-4f8e-b96d-923c278b671c" + } + ], + "queries": [ + { + "dataSource": { + "kind": "inline", + "dataSourceId": "0d698e85-cad2-4c2c-9791-0bb4de278f5f" + }, + "text": "orders\n| project order_date, d=parse_json(tostring(line_items))\n| mv-expand bagexpansion=array d\n| project order_date, itemid=d.id, name=tostring(d.name), price=todecimal(d.price)\n| where order_date != \"\"\n| where order_date between (_startTime.._endTime)| summarize OrderCount = count() by bin(order_date, 1h), name| render linechart", + "id": "cdbf9c2a-a0bf-41ec-84e2-e6e4b1bbb38d", + "usedVariables": [ + "_endTime", + "_startTime" + ] + }, + { + "dataSource": { + "kind": "inline", + "dataSourceId": "0d698e85-cad2-4c2c-9791-0bb4de278f5f" + }, + "text": "orders\n| project order_date, order_total, d=parse_json(tostring(line_items))\n| mv-expand bagexpansion=array d\n| project order_date, product_id=toint(d.product_id), store_id=tostring(d.store_id), price=todecimal(d.price), item_total = d.item_total, order_total\n| join kind=inner (\n products\n | project product_id, name\n) on product_id\n| where order_date != \"\"\n| where order_date between (_startTime.._endTime)\n| summarize OrderCount = count() by name| render piechart", + "id": "59491618-8a0e-4e5b-938d-554bbc38f56e", + "usedVariables": [ + "_endTime", + "_startTime" + ] + }, + { + "dataSource": { + "kind": "inline", + "dataSourceId": "0d698e85-cad2-4c2c-9791-0bb4de278f5f" + }, + "text": "inventory\n| where date_time between (_startTime.._endTime)\n| summarize arg_max(in_stock, *) by product_id, bin(date_time, 3h)\n| project date_time, product_id, in_stock\n| order by date_time asc\n|order by product_id, in_stock\n", + "id": "8f13c521-66ac-47af-8637-263824635c7f", + "usedVariables": [ + "_endTime", + "_startTime" + ] + } + ] +} \ No newline at end of file From 94fac548b247808cddf90f3cdbd315f4d74cd0a0 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Mon, 14 Oct 2024 07:33:03 -0500 Subject: [PATCH 053/409] pindown connectedk8s --- .../artifacts/kubernetes/K3s/installK3s.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index 39a9a3f38f..8ab9af1dd7 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -67,15 +67,15 @@ sudo chmod +x /usr/local/bin/azcopy export AZCOPY_AUTO_LOGIN_TYPE=MSI # Function to check if dpkg lock is in place -check_vm_extension_lock() { - while sudo -u $adminUsername az vm extension list --resource-group $resourceGroup --vm-name $vmName --query "[?provisioningState=='Creating' || provisioningState=='Updating' || provisioningState=='Deleting'] | [?name!='installscript_k3s']" -o tsv | grep -q .; do - echo "Waiting for other VM extension operations to complete..." +check_dpkg_lock() { + while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1; do + echo "Waiting for other package management processes to complete..." sleep 5 done } # Run the lock check before attempting the installation -check_vm_extension_lock +check_dpkg_lock # Installing Azure CLI & Azure Arc extensions curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash @@ -98,7 +98,7 @@ done sudo -u $adminUsername az account set --subscription $subscriptionId az -v -check_vm_extension_lock +check_dpkg_lock if [[ "$k3sControlPlane" == "true" ]]; then @@ -106,7 +106,7 @@ if [[ "$k3sControlPlane" == "true" ]]; then echo "" echo "Installing Azure Arc extensions" echo "" - sudo -u $adminUsername az extension add --name connectedk8s + sudo -u $adminUsername az extension add --name connectedk8s --version 1.9.3 sudo -u $adminUsername az extension add --name k8s-configuration sudo -u $adminUsername az extension add --name k8s-extension From 1ed599c9894669956f5dc0b99b7dc1cf2fed33c5 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Mon, 14 Oct 2024 09:48:11 -0400 Subject: [PATCH 054/409] comment chicago store --- .../AgConfig-contoso-hypermarket.psd1 | 20 +++++++------- .../artifacts/PowerShell/AgLogonScript.ps1 | 26 +++++++++---------- .../artifacts/kubernetes/K3s/installK3s.sh | 14 +++++----- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 6a78075d1d..0d8c88b898 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -155,16 +155,16 @@ HelmService = "service/prometheus-kube-prometheus-prometheus" IsProduction = $true } - Chicago = @{ - ArcClusterName = "Ag-K3s-Chicago" - FriendlyName = "Chicago" - GrafanaDataSource = "chicago" - Type = "k3s" - HelmValuesFile = "prometheus-additional-scrape-config.yaml" - HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" - HelmService = "service/prometheus-kube-prometheus-prometheus" - IsProduction = $true - } + # Chicago = @{ + # ArcClusterName = "Ag-K3s-Chicago" + # FriendlyName = "Chicago" + # GrafanaDataSource = "chicago" + # Type = "k3s" + # HelmValuesFile = "prometheus-additional-scrape-config.yaml" + # HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" + # HelmService = "service/prometheus-kube-prometheus-prometheus" + # IsProduction = $true + # } } # Universal resource tag and resource types diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 289e65dc9a..7a38c5e8f6 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -199,20 +199,20 @@ if ($scenario -eq "contoso_supermarket") { Deploy-SupermarketConfigs } -if ($scenario -eq "contoso_motors" -or $scenario -eq "contoso_hypermarket") { - Update-AzureIoTOpsExtension - Deploy-AIO - if($scenario -eq "contoso_motors"){ - Deploy-MotorsConfigs - } - $mqttIpArray=Set-MQTTIpAddress - Deploy-MQTTExplorer -mqttIpArray $mqttIpArray -} +# if ($scenario -eq "contoso_motors" -or $scenario -eq "contoso_hypermarket") { +# Update-AzureIoTOpsExtension +# Deploy-AIO +# if($scenario -eq "contoso_motors"){ +# Deploy-MotorsConfigs +# } +# $mqttIpArray=Set-MQTTIpAddress +# Deploy-MQTTExplorer -mqttIpArray $mqttIpArray +# } -############################################################## -# Deploy Kubernetes Prometheus Stack for Observability -############################################################## -Deploy-Prometheus -AgConfig $AgConfig +# ############################################################## +# # Deploy Kubernetes Prometheus Stack for Observability +# ############################################################## +# Deploy-Prometheus -AgConfig $AgConfig ##################################################################### # Deploy Azure Workbook for Infrastructure Observability diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index d2f18c9555..8b659bd9a5 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -209,13 +209,13 @@ echo "" echo "Enabling Container Insights and Microsoft Defender for Containers cluster extensions" echo "" -# Check and install azuremonitor-containers extension -if is_extension_installed "azuremonitor-containers"; then - echo "Extension 'azuremonitor-containers' is already installed." -else - echo "Extension 'azuremonitor-containers' is not installed - triggering installation" - sudo -u $adminUsername az k8s-extension create -n "azuremonitor-containers" --cluster-name $vmName --resource-group $resourceGroup --cluster-type connectedClusters --extension-type Microsoft.AzureMonitor.Containers --configuration-settings logAnalyticsWorkspaceResourceID=$workspaceResourceId --only-show-errors -fi +# # Check and install azuremonitor-containers extension +# if is_extension_installed "azuremonitor-containers"; then +# echo "Extension 'azuremonitor-containers' is already installed." +# else +# echo "Extension 'azuremonitor-containers' is not installed - triggering installation" +# sudo -u $adminUsername az k8s-extension create -n "azuremonitor-containers" --cluster-name $vmName --resource-group $resourceGroup --cluster-type connectedClusters --extension-type Microsoft.AzureMonitor.Containers --configuration-settings logAnalyticsWorkspaceResourceID=$workspaceResourceId --only-show-errors +# fi # Check and install microsoft.azuredefender.kubernetes extension if is_extension_installed "microsoft.azuredefender.kubernetes"; then From 3f50713c1623cb61717a44f14f0a86d1f6a43fd3 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Mon, 14 Oct 2024 08:50:33 -0500 Subject: [PATCH 055/409] typo --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 4bd40c5e48..60c02eadab 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -15,7 +15,7 @@ function Get-K3sConfigFile{ } function Set-K3sClusters { - Write-Host "Configuring kube-vip on K3s clusterS" + Write-Host "Configuring kube-vip on K3s clusters" az login --service-principal --username $Env:spnClientID --password=$Env:spnClientSecret --tenant $Env:spnTenantId az account set -s $subscriptionId foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { From 339a564e17867eea075f3dce559ece4d71dfa469 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Mon, 14 Oct 2024 11:27:39 -0500 Subject: [PATCH 056/409] no hyper-v in contoso_hypermarket --- azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 289e65dc9a..cae066cd13 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -247,8 +247,11 @@ if($scenario -eq "contoso_supermarket"){ ############################################################## Write-Host "[$(Get-Date -Format t)] INFO: Cleaning up scripts and uploading logs (Step 17/17)" -ForegroundColor DarkGreen # Creating Hyper-V Manager desktop shortcut -Write-Host "[$(Get-Date -Format t)] INFO: Creating Hyper-V desktop shortcut." -ForegroundColor Gray -Copy-Item -Path "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\Hyper-V Manager.lnk" -Destination "C:\Users\All Users\Desktop" -Force + +if($scenario -ne "contoso_hypermarket") { + Write-Host "[$(Get-Date -Format t)] INFO: Creating Hyper-V desktop shortcut." -ForegroundColor Gray + Copy-Item -Path "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\Hyper-V Manager.lnk" -Destination "C:\Users\All Users\Desktop" -Force +} if($scenario -eq "contoso_supermarket"){ Write-Host "[$(Get-Date -Format t)] INFO: Cleaning up images-cache job" -ForegroundColor Gray From 50bc78d8f5755b11b5eaf94ef3e434daf5253ea2 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Mon, 14 Oct 2024 13:55:12 -0500 Subject: [PATCH 057/409] address issue with kubectx not working correctly --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 60c02eadab..24900979fc 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -3,6 +3,7 @@ function Get-K3sConfigFile{ Write-Host "Downloading k3s Kubeconfigs" $Env:AZCOPY_AUTO_LOGIN_TYPE="PSCRED" $Env:KUBECONFIG="" + $contexts="" foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { $clusterName = $cluster.Name.ToLower() $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" @@ -11,7 +12,12 @@ function Get-K3sConfigFile{ azcopy copy $sourceFile "C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" --check-length=false $sourceFile = "https://$stagingStorageAccountName.blob.core.windows.net/$containerName/*" azcopy cp --check-md5 FailIfDifferentOrMissing $sourceFile "$AgLogsDir\" --include-pattern "*.log" + $kubeconfigpath = $kubeconfigpath + "$Env:USERPROFILE\.kube\ag-k3s-$clusterName" + ";" } + $Env:KUBECONFIG = $kubeconfigpath # Set the KUBECONFIG environment variable to the merged kubeconfig path + kubectl config view --merge --flatten > "$Env:USERPROFILE\.kube\config-raw" + $Env:KUBECONFIG = "$Env:USERPROFILE\.kube\config-raw" + kubectx # display available clusters } function Set-K3sClusters { From 0f5a8818157b2dbbb5c6ff9441cd43806b4607c7 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Mon, 14 Oct 2024 20:35:14 -0400 Subject: [PATCH 058/409] Update SetupFabricWorkspace.ps1 --- .../PowerShell/SetupFabricWorkspace.ps1 | 122 +++++++++++++----- 1 file changed, 92 insertions(+), 30 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 index db96c774f9..85b14d36ab 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 @@ -1,7 +1,5 @@ param ( - [string]$tenantID, # Azure AD tenant id where Fabric workspace is created - [string]$loginAs = "user", # Use this to switch beteween user or managed-identity. Use user type until managed identity is supported by all services used in this scenario - [string]$runLocally = "false" # Use this flag to run locally outside of Agora Client VM + [string]$fabricConfigFile = "C:\Temp\fabric\FabricConfig.json" # Used to run the script locally ) #################################################################################################### @@ -12,30 +10,42 @@ param ( # Make sure Create Workpace is enabled in Frabric for service principals. #Access settings using https://app.fabric.microsoft.com/admin-portal/tenantSettings?experience=power-bi +# NOTE: To run locally create a file named FabricConfig.json with the following content +# +# { +# "tenantID": "", # Azure AD tenant ID where Agora Retail 2.0 is deployed +# "runAs": "user", # Indicates whether to run under regular user account or managed identity +# "azureLocation": "eastus", # Region where Agora Retail 2.0 is deployed +# "resourceGroup": "rg-fabric", # Resource group where Agora Retail 2.0 is deployed +# "templateBaseUrl": "https://raw.githubusercontent.com/main/azure_arc/main/azure_arc_data/azure_jumpstart_ag/artifacts" +# } +# #################################################################################################### $ProgressPreference = "SilentlyContinue" Set-PSDebug -Strict -az config set extension.use_dynamic_install=yes_without_prompt -az extension add --name microsoft-fabric --allow-preview true - ##################################################################### # Initialize the environment ##################################################################### -if ($runLocally -eq "true") { - $AgConfig = Import-PowerShellDataFile -Path $Env:AgConfigPath - $AgLogsDir = "." +if ([System.IO.File]::Exists($fabricConfigFile)){ + $fabricConfig = Get-Content $fabricConfigFile | ConvertFrom-Json + $runAs = $fabricConfig.runAs + $tenantID= $fabricConfig.tenantID + $resourceGroup = $fabricConfig.resourceGroup + $azureLocation = $fabricConfig.azureLocation + $templateBaseUrl = $fabricConfig.templateBaseUrl $namingGuid = (New-Guid).ToString().Substring(31, 5) - $resourceGroup = "rg-fabric" - $azureLocation = "eastus" + $fabricCapacityName = $fabricConfig.fabricCapacityName + $AgLogsDir = "." } else { $AgConfig = Import-PowerShellDataFile -Path $Env:AgConfigPath $AgLogsDir = $AgConfig.AgDirectories["AgLogsDir"] - $namingGuid = $Env:namingGuid $tenantID = $Env:tenantId $resourceGroup = $Env:resourceGroup $azureLocation = $Env:azureLocation + $templateBaseUrl = $env:templateBaseUrl + $namingGuid = $Env:namingGuid } Start-Transcript -Path ($AgLogsDir + "\SetupFabricWorkspace.log") @@ -48,7 +58,7 @@ $powerbiResource = "https://analysis.windows.net/powerbi/api" # Power BI API res $AgScenarioPrefix = "JSAgoraHyperMarket" # Prefix to use for Fabric workspace and other items created in Fabric # Login to Azure as end user or managed identity to get access tokens for different API endpoints -if ($userType -eq "user") { +if ($runAs -eq "user") { # login using interactive logon az login --tenant $tenantID --allow-no-subscriptions } @@ -66,7 +76,9 @@ if ($accessToken -eq '') { # Create Fabric workspace. Generate new guid or use guid prefix in agora deployment $fabricWorkspaceName = "$AgScenarioPrefix-$namingGuid".ToLower() -$fabricCapacityName = "jsagoraeastus" # $fabricWorkspaceName +if ($fabricCapacityName -eq "") { + $fabricCapacityName = $fabricWorkspaceName +} # List Fabric capacities to assign to Fabric workspace to avoid Powrer BI Premium license write-host "INFO: Checking if there is a Fabric capacity created with specified name." @@ -228,10 +240,9 @@ else { } # Download dashboard report and Update to use KQL database -$hyperMarketDashboardReport = "hypermarket-fabric-dashboard.json" +$hyperMarketDashboardReport = "fabric-hypermarket-dashboard.json" Write-Host "INFO: Downloading and preparing dashboard report to import into Fabric workspace." -$ordersDashboardBody = (Invoke-WebRequest -Method Get -Uri "$env:templateBaseUrl/artifacts/adx_dashboards/$hyperMarketDashboardReport").Content -replace '{{KQL_CLUSTER_URI}}', $queryServiceUri -replace '{{KQL_DATABASE_ID}}', $kqlDatabaseId -replace '{{FABRIC_WORKSPACE_ID}}', $fabricWorkspaceId -$ordersDashboardBody = (Get-Content -Path "C:\azure_arc\azure_jumpstart_ag\artifacts\adx_dashboards\fabric-hypermarket-dashboard.json") -replace '{{KQL_CLUSTER_URI}}', $queryServiceUri -replace '{{KQL_DATABASE_ID}}', $kqlDatabaseId -replace '{{FABRIC_WORKSPACE_ID}}', $fabricWorkspaceId +$ordersDashboardBody = (Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/adx_dashboards/$hyperMarketDashboardReport").Content -replace '{{KQL_CLUSTER_URI}}', $kqlQueryServiceUri -replace '{{KQL_DATABASE_ID}}', $kqlDatabaseId -replace '{{FABRIC_WORKSPACE_ID}}', $fabricWorkspaceId # Convert the KQL dashboard report payload to base64 Write-Host "INFO: Conerting report content into base64 encoded format." @@ -277,17 +288,44 @@ if ($powerbiAccessToken -eq '') { # Power BI API endpoint to create EventHut connection $powerBIEndpoint = "https://api.powerbi.com/v2.0/myorg/me/gatewayClusterCloudDatasource" -# Create body to create EventHub data source -$eventHubNamespace = "" -$eventHubName = "" -$eventHugNameKeyName = "" -$eventHubSecret = "" +# Get Evenhub connection details +$eventHubInfo = (az resource list --resource-group $resourceGroup --resource-type "Microsoft.EventHub/namespaces" | ConvertFrom-Json) +if ($eventHubInfo.Count -ne 1) { + Write-Host "ERROR: Resource group contains no Eventhub namespaces or more than one. Make sure to have only one EventHub namesapce in the resource group." +} + +$eventHubNamespace = $eventHubInfo[0].name +$eventHubName = "orders" + +# Make sure Eventhub with name 'orders' exists +$eventHubs = az eventhubs eventhub list --namespace-name $eventHubInfo[0].name --resource-group $resourceGroup | ConvertFrom-Json +$eventHubOrders = $eventHubs | Where-Object { $_.name -eq "orders" } +if ($null -eq $eventHubOrders) { + Write-Host "ERROR: Event Hub with name 'orders' not found." + Exit +} + +# Get authorization key +$authRuleName = "FabricAutomation" +az eventhubs eventhub authorization-rule create --resource-group $resourceGroup --namespace-name $eventHubNamespace --eventhub-name $eventHubName --name $authRuleName --rights [Listen, Send] +# Get Event Hub credentials +Write-Host "INFO: Retrieving Event Hub key for '$authRuleName' Shared Acess Policy." +$eventHubKey = az eventhubs eventhub authorization-rule keys list --resource-group $resourceGroup --namespace-name $eventHubNamespace --eventhub-name $eventHubName --name $authRuleName --query primaryKey --output tsv +if ($eventHubKey -eq '') { + Write-Host "ERROR: Failed to retrieve Event Hub key." + Exit +} + +Write-Host "INFO: Received Event Hub key." + +# Create body to create EventHub data source +$eventHubEndpoint = "$eventHubNamespace.servicebus.windows.net" $connectionBody = @" { "datasourceName": "Agora_Retail_2_0_EventHub_Connection", "datasourceType": "Extension", - "connectionDetails": "{\"endpoint\":\"$eventHubNamespace\",\"entityPath\":\"$eventHubName\"}", + "connectionDetails": "{\"endpoint\":\"$eventHubEndpoint\",\"entityPath\":\"$eventHubName\"}", "singleSignOnType": "None", "mashupTestConnectionDetails": { "functionName": "EventHub.Contents", @@ -298,7 +336,7 @@ $connectionBody = @" "name": "endpoint", "type": "text", "isRequired": true, - "value": "$eventHubNamespace" + "value": "$eventHubEndpoint" }, { "name": "entityPath", @@ -311,7 +349,7 @@ $connectionBody = @" "referenceDatasource": false, "credentialDetails": { "credentialType": "Basic", - "credentials": "{\"credentialData\":[{\"name\":\"username\",\"value\":\"$eventHugNameKeyName\"},{\"name\":\"password\",\"value\":\"$eventHubSecret\"}]}", + "credentials": "{\"credentialData\":[{\"name\":\"username\",\"value\":\"$authRuleName\"},{\"name\":\"password\",\"value\":\"$eventHubKey\"}]}", "encryptedConnection": "Any", "privacyLevel": "Organizational", "skipTestConnection": false, @@ -323,12 +361,18 @@ $connectionBody = @" "@ # Call API to create Event Hub connection in Power BI -$connectionResp = Invoke-RestMethod -Method Post -Uri $powerBIEndpoint -Body $connectionBody -ContentType "application/json" -Headers @{ - Authorization = "Bearer $powerbiAccessToken" +Write-Host "INFO: Calling API to create EventHub data connection." +$dataConnectionResp = Invoke-RestMethod -Method Post -Uri $powerBIEndpoint -Body $connectionBody -ContentType "application/json" -Headers @{ Authorization = "Bearer $powerbiAccessToken" } +if (($dataConnectionResp.StatusCode -ge 200) -or ($dataConnectionResp.StatusCode -le 204)){ + Write-Host "INFO: Created EventHub data connection." +} +else { + Write-Host "ERROR: Failed to create EventHub data connection." + Exit } # Get connection id -$DataSourceConnectionId = $connectionResp.id +$DataSourceConnectionId = $dataConnectionResp.id # Create header to authorize with Power BI service $headers = @{ @@ -349,8 +393,17 @@ $mwcTokenBody = @" } "@ +Write-Host "INFO: Requesting MWC token from Power BI API." $mwcTokenApi = "https://wabi-us-central-b-primary-redirect.analysis.windows.net/metadata/v201606/generatemwctokenv2" $mwcTokenResp = Invoke-RestMethod -Method Post -Uri $mwcTokenApi -Headers $headers -Body $mwcTokenBody +if (($mwcTokenResp.StatusCode -ge 200) -or ($mwcTokenResp.StatusCode -le 204)){ + Write-Host "INFO: Received MWC token." +} +else { + Write-Host "ERROR: Failed to get MWC token." + Exit +} + $mwcToken = $mwcTokenResp.token # Event Hub connection body @@ -368,14 +421,23 @@ $streamBody = @" "DataFormat": "multijson", "DataSourceConnectionId": "$DataSourceConnectionId", "DataConnectionType": "EventHubDataConnection", - "DataConnectionName": "Test-EventHub-Connection" + "DataConnectionName": "Contoso-Hypermarket-EventHub-Connection" } } "@ # Use MWC Token to create event data connection + Write-Host "INFO: Creating eventstream in KQL database to ingest data." $dataSourceConnectionId = Invoke-RestMethod -Method Post -Uri $streamApi -Body $streamBody -ContentType "application/json" -Headers @{ Authorization = "MwcToken $mwcToken" } +if (($mwcTokenResp.StatusCode -ge 200) -or ($mwcTokenResp.StatusCode -le 204)){ + Write-Host "INFO: Created eventstream in KQL database." +} +else { + Write-Host "ERROR: Failed to create eventstream in KQL database." + Exit +} -$dataSourceConnectionId \ No newline at end of file +# Import data sceince notebook for sales forecast +# TBD \ No newline at end of file From 9df3efcc9fefca0595c40943fa1954d9427a2d67 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Mon, 14 Oct 2024 20:44:05 -0400 Subject: [PATCH 059/409] Update SetupFabricWorkspace.ps1 --- .../artifacts/PowerShell/SetupFabricWorkspace.ps1 | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 index 85b14d36ab..d46a780845 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 @@ -69,7 +69,7 @@ else { # Get access token to authorize access to Fabric APIs $fabricAccessToken = (az account get-access-token --resource $fabricResource --query accessToken --output tsv) -if ($accessToken -eq '') { +if ($fabricAccessToken -eq '') { write-host "ERROR: Failed to get access token using managed identity." Exit } @@ -428,9 +428,7 @@ $streamBody = @" # Use MWC Token to create event data connection Write-Host "INFO: Creating eventstream in KQL database to ingest data." -$dataSourceConnectionId = Invoke-RestMethod -Method Post -Uri $streamApi -Body $streamBody -ContentType "application/json" -Headers @{ - Authorization = "MwcToken $mwcToken" -} +$dataSourceConnectionId = Invoke-RestMethod -Method Post -Uri $streamApi -Body $streamBody -ContentType "application/json" -Headers @{ Authorization = "MwcToken $mwcToken" } if (($mwcTokenResp.StatusCode -ge 200) -or ($mwcTokenResp.StatusCode -le 204)){ Write-Host "INFO: Created eventstream in KQL database." } From f5e63d6637fa8581de3cd82e5434bfc3f026a7ab Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 15 Oct 2024 11:13:18 +0300 Subject: [PATCH 060/409] Make powershell module dynamic --- .../AgConfig-contoso-hypermarket.psd1 | 12 ++++++------ .../PowerShell/AgConfig-contoso-motors.psd1 | 12 ++++++------ .../AgConfig-contoso-supermarket.psd1 | 6 +++--- .../artifacts/PowerShell/Modules/common.psm1 | 17 ++++++++++++++--- 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 6a78075d1d..ab413b6903 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -64,12 +64,12 @@ # PowerShell modules PowerShellModules = @( - 'Az.ConnectedKubernetes', - 'Az.KubernetesConfiguration', - 'Az.Kusto', - 'Az.EventGrid', - 'Az.Storage', - 'Az.EventHub' + @{name='Az.ConnectedKubernetes'; version="0.10.3"}, + @{name='Az.KubernetesConfiguration'; version="latest"}, + @{name='Az.Kusto'; version="latest"}, + @{name='Az.EventGrid'; version="latest"}, + @{name='Az.Storage'; version="latest"}, + @{name='Az.EventHub'; version="latest"} ) # Chocolatey packages list diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 index 09715be664..0cf7e1283e 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 @@ -62,12 +62,12 @@ # PowerShell modules PowerShellModules = @( - 'Az.ConnectedKubernetes', - 'Az.KubernetesConfiguration', - 'Az.Kusto', - 'Az.EventGrid', - 'Az.Storage', - 'Az.EventHub' + @{name='Az.ConnectedKubernetes'; version="0.10.3"}, + @{name='Az.KubernetesConfiguration'; version="latest"}, + @{name='Az.Kusto'; version="latest"}, + @{name='Az.EventGrid'; version="latest"}, + @{name='Az.Storage'; version="latest"}, + @{name='Az.EventHub'; version="latest"} ) # Chocolatey packages list diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 index 9e900f5c42..ee254513d0 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 @@ -52,9 +52,9 @@ # PowerShell modules PowerShellModules = @( - 'Az.ConnectedKubernetes' - 'Az.KubernetesConfiguration' - 'Az.Kusto' + @{name='Az.ConnectedKubernetes'; version="0.10.3"}, + @{name='Az.KubernetesConfiguration'; version="latest"}, + @{name='Az.Kusto'; version="latest"} ) # Chocolatey packages list diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index d1fc89d36e..c089402737 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -36,11 +36,22 @@ function Deploy-AzPowerShell { $psCred = New-Object System.Management.Automation.PSCredential($Env:spnClientID , $azurePassword) Connect-AzAccount -Credential $psCred -TenantId $Env:spnTenantId -ServicePrincipal -Subscription $subscriptionId | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\AzPowerShell.log") Set-AzContext -Subscription $subscriptionId - # Install PowerShell modules + + # Making module install dynamic if ($AgConfig.PowerShellModules.Count -ne 0) { - Write-Host "[$(Get-Date -Format t)] INFO: Installing PowerShell modules: " ($AgConfig.PowerShellModules -join ', ') -ForegroundColor Gray + Write-Host "[$(Get-Date -Format t)] INFO: Installing PowerShell modules" -ForegroundColor Gray foreach ($module in $AgConfig.PowerShellModules) { - Install-Module -Name $module -Force | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\AzPowerShell.log") + $moduleName = $module.name + $moduleVersion = $module.version + if ($extensionVersion -ne "latest" -and $null -ne $moduleVersion) { + # Install extension with specific version + Install-Module $moduleName -Repository PSGallery -Force -AllowClobber -ErrorAction Stop -RequiredVersion $moduleVersion + Write-Host "Installed $moduleName version $moduleVersion" + } else { + # Install extension without specifying a version + Install-Module -Name $moduleName -Force + Write-Host "Installed $moduleName (latest version)" + } } } From 06c3759e55def2a7ba96c761272e0cd4e81a4a71 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 15 Oct 2024 11:39:12 +0300 Subject: [PATCH 061/409] Refactor PowerShell module installation logic --- azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index c089402737..08d4ea21d9 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -43,7 +43,7 @@ function Deploy-AzPowerShell { foreach ($module in $AgConfig.PowerShellModules) { $moduleName = $module.name $moduleVersion = $module.version - if ($extensionVersion -ne "latest" -and $null -ne $moduleVersion) { + if ($moduleVersion -ne "latest" -and $null -ne $moduleVersion) { # Install extension with specific version Install-Module $moduleName -Repository PSGallery -Force -AllowClobber -ErrorAction Stop -RequiredVersion $moduleVersion Write-Host "Installed $moduleName version $moduleVersion" From 0be8e63017f22df877e906b072c5159e2e3ced57 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Tue, 15 Oct 2024 07:31:38 -0500 Subject: [PATCH 062/409] comments --- azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 | 3 ++- azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index cae066cd13..4a8c384e71 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -231,7 +231,7 @@ if($scenario -eq "contoso_motors"){ } ############################################################## -# Creating bookmarks +# Creating bookmarks and setting merged kubeconfigs ############################################################## Write-Host "[$(Get-Date -Format t)] INFO: Creating Microsoft Edge Bookmarks in Favorites Bar (Step 15/17)" -ForegroundColor DarkGreen if($scenario -eq "contoso_supermarket"){ @@ -240,6 +240,7 @@ if($scenario -eq "contoso_supermarket"){ Deploy-MotorsBookmarks }elseif($scenario -eq "contoso_hypermarket"){ #Deploy-HypermarketBookmarks + $Env:KUBECONFIG = "$Env:USERPROFILE\.kube\config-raw" } ############################################################## diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index 00fd576c35..d9c5b41040 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -489,10 +489,10 @@ function Deploy-VirtualizationInfrastructure { ##################################################################### Write-Host "[$(Get-Date -Format t)] INFO: All three kubeconfig files are present. Merging kubeconfig files for use with kubectx." -ForegroundColor Gray $kubeconfigpath = "" - foreach ($VMName in $VMNames) { + foreach ($VMName in $VMNames) { # Create a kubeconfig path for each VM $kubeconfigpath = $kubeconfigpath + "$Env:USERPROFILE\.kube\config-" + $VMName.ToLower() + ";" } - $Env:KUBECONFIG = $kubeconfigpath + $Env:KUBECONFIG = $kubeconfigpath # Set the KUBECONFIG environment variable to the merged kubeconfig path kubectl config view --merge --flatten > "$Env:USERPROFILE\.kube\config-raw" | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\L1AKSInfra.log") kubectl config get-clusters --kubeconfig="$Env:USERPROFILE\.kube\config-raw" | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\L1AKSInfra.log") Rename-Item -Path "$Env:USERPROFILE\.kube\config-raw" -NewName "$Env:USERPROFILE\.kube\config" From 5926caffc6cf0b05020c25c1de8836526d7fa432 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Tue, 15 Oct 2024 11:24:11 -0400 Subject: [PATCH 063/409] comment CI --- .../AgConfig-contoso-hypermarket.psd1 | 20 +++++++++---------- .../artifacts/PowerShell/AgLogonScript.ps1 | 2 +- .../artifacts/kubernetes/K3s/installK3s.sh | 8 ++++---- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 80c9356ab5..ab413b6903 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -155,16 +155,16 @@ HelmService = "service/prometheus-kube-prometheus-prometheus" IsProduction = $true } - # Chicago = @{ - # ArcClusterName = "Ag-K3s-Chicago" - # FriendlyName = "Chicago" - # GrafanaDataSource = "chicago" - # Type = "k3s" - # HelmValuesFile = "prometheus-additional-scrape-config.yaml" - # HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" - # HelmService = "service/prometheus-kube-prometheus-prometheus" - # IsProduction = $true - # } + Chicago = @{ + ArcClusterName = "Ag-K3s-Chicago" + FriendlyName = "Chicago" + GrafanaDataSource = "chicago" + Type = "k3s" + HelmValuesFile = "prometheus-additional-scrape-config.yaml" + HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" + HelmService = "service/prometheus-kube-prometheus-prometheus" + IsProduction = $true + } } # Universal resource tag and resource types diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 7a38c5e8f6..2d024ceaeb 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -212,7 +212,7 @@ if ($scenario -eq "contoso_supermarket") { # ############################################################## # # Deploy Kubernetes Prometheus Stack for Observability # ############################################################## -# Deploy-Prometheus -AgConfig $AgConfig +Deploy-Prometheus -AgConfig $AgConfig ##################################################################### # Deploy Azure Workbook for Infrastructure Observability diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index b19ff7e28d..9d86fb089f 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -204,10 +204,10 @@ is_extension_installed() { fi } -# Enabling Container Insights and Microsoft Defender for Containers cluster extensions -echo "" -echo "Enabling Container Insights and Microsoft Defender for Containers cluster extensions" -echo "" +# # Enabling Container Insights and Microsoft Defender for Containers cluster extensions +# echo "" +# echo "Enabling Container Insights and Microsoft Defender for Containers cluster extensions" +# echo "" # # Check and install azuremonitor-containers extension # if is_extension_installed "azuremonitor-containers"; then From 97fe497baf203ca57790ee7cd540679112fc580a Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Tue, 15 Oct 2024 16:00:01 -0400 Subject: [PATCH 064/409] Create orders-sales-forecast.ipynb --- .../artifacts/notebooks/orders-sales-forecast.ipynb | 1 + 1 file changed, 1 insertion(+) create mode 100644 azure_jumpstart_ag/artifacts/notebooks/orders-sales-forecast.ipynb diff --git a/azure_jumpstart_ag/artifacts/notebooks/orders-sales-forecast.ipynb b/azure_jumpstart_ag/artifacts/notebooks/orders-sales-forecast.ipynb new file mode 100644 index 0000000000..921bc1a50f --- /dev/null +++ b/azure_jumpstart_ag/artifacts/notebooks/orders-sales-forecast.ipynb @@ -0,0 +1 @@ +{"cells":[{"cell_type":"markdown","id":"7a59fda1-4e93-45fb-8d19-7db1a882cc5e","metadata":{"jupyter":{"magics_cell_name":"magics-cell-markdown","magics_signature":"27ac753c3c60167f65c4d05fa7809cd85f1f0273d5b842aca4f65a01"},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"source":["\n","#### Run the cell below to install the required packages for Copilot\n"]},{"cell_type":"code","execution_count":null,"id":"201b7702-02d9-4d89-abc7-0cdbf6277f24","metadata":{"jupyter":{"magics_cell_name":"magics-cell-code","magics_signature":"6565d62221c469ab3707694ccbef2e4568d575dc1ba3ebac23f0f052","magics_version":"1.0"},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"outputs":[],"source":["\n","#Run this cell to install the required packages for Copilot\n","%load_ext dscopilot_installer\n","%activate_dscopilot\n"]},{"cell_type":"markdown","id":"ef02f63e-941b-42c0-8481-ce8aac727fa8","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["# Contoso Hypermarket Orders sales forecast ML notebook"]},{"cell_type":"markdown","id":"b1418874-4b23-4dae-8748-07e756bf70f4","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["### Set up MLflow experiment tracking"]},{"cell_type":"code","execution_count":null,"id":"edac2e41-e4ec-4a84-adad-d57938e17562","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Set up MLflow for experiment tracking\n","import mlflow\n","\n","IS_SAMPLE = False # if TRUE, use only rows of data for training, otherwise use all data\n","SAMPLE_ROWS = 5000 # if IS_SAMPLE is True, use only this number of rows for training\n","EXPERIMENT_NAME = \"orders-sales-forecast\" # MLflow experiment name\n","\n","mlflow.set_experiment(EXPERIMENT_NAME)\n","mlflow.autolog(disable=True) # Disable MLflow autologging"]},{"cell_type":"markdown","id":"9fa68416-1c4d-4481-8ec2-c2571310afbf","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["### Load orders data from KQL database to prepare for ML modeling\n","\n","> [!IMPORTANT]\n","> Make sure you have enough data generated using data emulator."]},{"cell_type":"code","execution_count":null,"id":"941a85a3-eaf6-4f2d-b862-2822a11cba86","metadata":{"jupyter":{"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"outputs":[],"source":["# Read from Kusto\n","# kustoQuery = \"['orders'] | mv-expand li = parse_json(line_items) | project order_date, store_id, order_id, product_id = toint(li.product_id), quantity = toint(li.quantity), price = toreal(li.price), item_total = toreal(li.item_total), order_total\"\n","ordersQuery = \"['orders'] | mv-expand li = parse_json(line_items) | project order_date, store_id, order_id, product_id = toint(li.product_id), quantity = toint(li.quantity), price = toreal(li.price), item_total = toreal(li.item_total), order_total\"\n","inventoryQuery = \"['inventory'] | project date_time, store_id, product_id, in_stock, retail_price\"\n","productsQuery = \"['products'] | project product_id, name, category, photo_path, price_range, stock\"\n","# The query URI for reading the data e.g. https://<>.kusto.data.microsoft.com.\n","kustoUri = \"https://trd-g8jnmstet4k7q79z9v.z1.kusto.fabric.microsoft.com\"\n","# The database with data to be read.\n","database = \"contosohypermarket\"\n","# The access credentials.\n","accessToken = mssparkutils.credentials.getToken(kustoUri)\n","ordersDf = spark.read\\\n"," .format(\"com.microsoft.kusto.spark.synapse.datasource\")\\\n"," .option(\"accessToken\", accessToken)\\\n"," .option(\"kustoCluster\", kustoUri)\\\n"," .option(\"kustoDatabase\", database)\\\n"," .option(\"kustoQuery\", ordersQuery).load()\n","inventoryDf = spark.read\\\n"," .format(\"com.microsoft.kusto.spark.synapse.datasource\")\\\n"," .option(\"accessToken\", accessToken)\\\n"," .option(\"kustoCluster\", kustoUri)\\\n"," .option(\"kustoDatabase\", database)\\\n"," .option(\"kustoQuery\", inventoryQuery).load()\n","productsDf = spark.read\\\n"," .format(\"com.microsoft.kusto.spark.synapse.datasource\")\\\n"," .option(\"accessToken\", accessToken)\\\n"," .option(\"kustoCluster\", kustoUri)\\\n"," .option(\"kustoDatabase\", database)\\\n"," .option(\"kustoQuery\", productsQuery).load()"]},{"cell_type":"code","execution_count":null,"id":"dca0ec6b-628f-4e91-9c60-5d7b1e78e0ed","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["### Verifying token availability\n","import requests\n","\n","# Define a simple test query\n","test_query = \"['inventory'] | take 1\"\n","\n","# Define the request headers with the access token\n","headers = {\n"," \"Authorization\": f\"Bearer {accessToken}\",\n"," \"Content-Type\": \"application/json\"\n","}\n","\n","# Define the request payload\n","payload = {\n"," \"db\": database,\n"," \"csl\": test_query\n","}\n","\n","# Make the request to the Kusto cluster\n","response = requests.post(f\"{kustoUri}/v1/rest/query\", headers=headers, json=payload)\n","\n","# Check if the request was successful\n","if response.status_code == 200:\n"," print(\"Access token is valid and has the necessary permissions.\")\n","else:\n"," print(f\"Failed to validate access token. Status code: {response.status_code}, Response: {response.text}\")"]},{"cell_type":"markdown","id":"d3363923-eb3e-4c3a-928e-3f304fc85fd0","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["## Step 2: Perform Exploratory Data Analysis"]},{"cell_type":"markdown","id":"0b764c51-1738-49a5-a8cf-e340518e9d8a","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["### Import libraries\n","\n","Before any analysis, you need to import the required libraries."]},{"cell_type":"code","execution_count":null,"id":"eece5426-68f6-4a0b-a478-2d4381322ac3","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Importing required libraries\n","import warnings\n","import itertools\n","import numpy as np\n","import matplotlib.pyplot as plt\n","warnings.filterwarnings(\"ignore\")\n","plt.style.use('fivethirtyeight')\n","import pandas as pd\n","import statsmodels.api as sm\n","import matplotlib\n","matplotlib.rcParams['axes.labelsize'] = 14\n","matplotlib.rcParams['xtick.labelsize'] = 12\n","matplotlib.rcParams['ytick.labelsize'] = 12\n","matplotlib.rcParams['text.color'] = 'k'\n","from sklearn.metrics import mean_squared_error,mean_absolute_percentage_error\n"]},{"cell_type":"markdown","id":"e48037a1-e1cb-4d33-9aa5-57faea8be1a2","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["### Display raw data"]},{"cell_type":"code","execution_count":null,"id":"1f672306-d3c7-4f1a-89f7-0851e8a90082","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Display data in dataframes.\n","ordersDf.show()\n","productsDf.show()\n","inventoryDf.show()"]},{"cell_type":"code","execution_count":null,"id":"27bf7c95-671a-4a9e-bf04-f80ad0befa73","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Importing functions\n","from pyspark.sql import functions as F\n","\n","# Filter the orders DataFrame for entries from Chicago\n","chicago_sales_df = ordersDf.filter(ordersDf.store_id == 'CHI')\n","\n","# Join the orders DataFrame with the products DataFrame to include product_id and name\n","sales_chicago_df = (\n"," chicago_sales_df\n"," .join(productsDf, on='product_id', how='inner') # Join on product_id\n"," .select(\n"," 'order_date',\n"," 'product_id',\n"," 'name', # Include product name\n"," 'price',\n"," 'quantity',\n"," (chicago_sales_df.price * chicago_sales_df.quantity).alias('sales') # Calculate sales\n"," )\n",")\n","\n","# Show the new DataFrame with the additional columns\n","sales_chicago_df.show()"]},{"cell_type":"code","execution_count":null,"id":"9749c9d9-7b66-49ca-ab48-1bef9c771478","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Show distinct product names in the dataframe\n","sales_chicago_df.select(\"name\").distinct().show()"]},{"cell_type":"code","execution_count":null,"id":"660ed236-aa9f-4d03-908a-a43af5e32e98","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["### Pre-processing data\n","# Dropping columns that have no impact. Retaining Order Date and Sales.\n","# cols = ['order_id', 'product_id', 'price', 'order_total']\n","# products = products.drop(*cols)\n","# products.show()\n","# Importing functions\n","from pyspark.sql import functions as F\n","\n","# Filter the orders DataFrame for entries from Chicago\n","chicago_sales_df = ordersDf.filter(ordersDf.store_id == 'CHI')\n","\n","# Join the orders DataFrame with the products DataFrame to include product_id and name\n","sales_chicago_df = (\n"," chicago_sales_df\n"," .join(productsDf, on='product_id', how='inner') # Join on product_id\n"," .select(\n"," 'order_date',\n"," (chicago_sales_df.price * chicago_sales_df.quantity).alias('sales') # Calculate sales\n"," )\n",")\n","\n","# Show the new DataFrame with only order_date and sales columns\n","sales_chicago_df.show()"]},{"cell_type":"code","execution_count":null,"id":"bd93e71e-4786-461a-b3ae-bc0cdedc0fca","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# products = products.groupBy('product_id')\n","# Sort the DataFrame by 'order_date'\n","sorted_sales_chicago_df = sales_chicago_df.orderBy('order_date')\n","\n","# Show the sorted DataFrame\n","sorted_sales_chicago_df.show()"]},{"cell_type":"markdown","id":"57d0a9e5-6958-4bd2-b55e-fbd4e660adcc","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["### Data Preparation for ML Experiment"]},{"cell_type":"code","execution_count":null,"id":"62880ccb-d1ba-4717-bf95-667b4e550035","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["from pyspark.sql import functions as F\n","\n","# Truncate 'order_date' to the first day of the month and group by it, summing the 'sales'\n","grouped_sales_chicago_df = sorted_sales_chicago_df.withColumn(\n"," 'order_date_trunc', F.date_trunc('month', 'order_date')\n",").groupBy('order_date_trunc').agg(F.sum('sales').alias('sales_sum'))"]},{"cell_type":"code","execution_count":null,"id":"300b1861-bf24-40b6-bd7c-db7bc1145c47","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Add 67 months to 'order_date_trunc'\n","adjusted_sales_chicago_df = grouped_sales_chicago_df.withColumn(\n"," 'adjusted_order_date', F.expr(\"add_months(order_date_trunc, 67)\")\n",")"]},{"cell_type":"code","execution_count":null,"id":"1c4213ca-6d65-4d73-955b-a80e68435ea5","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Select relevant columns\n","final_sales_chicago_df = adjusted_sales_chicago_df.select(\n"," 'adjusted_order_date', 'sales_sum'\n",")"]},{"cell_type":"code","execution_count":null,"id":"b7ed65d3-adb6-4bd2-8312-1161be2bffd3","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Find the maximum 'adjusted_order_date'\n","max_date = final_sales_chicago_df.agg(F.max('adjusted_order_date')).collect()[0][0]\n","print(\"Maximum adjusted order date:\", max_date)"]},{"cell_type":"code","execution_count":null,"id":"936b6a07-2c91-4385-8c38-83ff3b7ea447","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Show the resulting DataFrame\n","final_sales_chicago_df.show()"]},{"cell_type":"markdown","id":"54f2e3b3-4c12-4a3c-a6b3-44b4ca0cd519","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["##### Demonstrate the impact order date on the sales for all sales in Chicago."]},{"cell_type":"code","execution_count":null,"id":"7eb35b38-c3c6-4bac-b324-de48c8e0cce9","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["import matplotlib.pyplot as plt\n","\n","# Step 1: Convert the Spark DataFrame to Pandas\n","final_sales_chicago_pd_df = final_sales_chicago_df.toPandas()\n","\n","# Step 2: Plot the impact of 'adjusted_order_date' on 'sales_sum'\n","plt.figure(figsize=(12, 3))\n","plt.plot(final_sales_chicago_pd_df['adjusted_order_date'], final_sales_chicago_pd_df['sales_sum'])\n","\n","# Add labels and title\n","plt.xlabel('Order Date')\n","plt.ylabel('Sales')\n","plt.title('Impact of Order Date on Sales')\n","\n","# Step 3: Show the plot\n","plt.show()"]},{"cell_type":"code","execution_count":null,"id":"52ef6009-afe3-49ed-acd9-2a983660aa57","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["### Debugging\n","# Check if the DataFrame has data\n","print(final_sales_chicago_pd_df.head()) # This will print the first few rows to check the contents\n","print(final_sales_chicago_pd_df.info()) # This will show if there are any NaN values or data type issues\n","# Ensure 'adjusted_order_date' is in datetime format\n","final_sales_chicago_pd_df['adjusted_order_date'] = pd.to_datetime(final_sales_chicago_pd_df['adjusted_order_date'])\n","\n","# Sort the DataFrame by date\n","final_sales_chicago_pd_df = final_sales_chicago_pd_df.sort_values('adjusted_order_date')\n","\n","# Check the data after sorting\n","print(final_sales_chicago_pd_df.head())\n"]},{"cell_type":"code","execution_count":null,"id":"82b2d558-6189-4236-86d0-dd1fcb70a487","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["import pandas as pd\n","import matplotlib.pyplot as plt\n","\n","# Filtering Chicago data\n","sales_chicago_df = ordersDf.filter(ordersDf.store_id == 'CHI')\n","\n","# Creating a 'sales' column by multiplying price and quantity\n","sales_chicago_df = sales_chicago_df.withColumn('sales', sales_chicago_df['price'] * sales_chicago_df['quantity'])\n","\n","# Selecting relevant columns: order_date, sales\n","sales_chicago_df = sales_chicago_df.select('order_date', 'sales')\n","\n","# Converting the DataFrame to Pandas\n","sales_chicago_pd_df = sales_chicago_df.toPandas()\n","\n","# Confirming that 'order_date' is in datetime format\n","sales_chicago_pd_df['order_date'] = pd.to_datetime(sales_chicago_pd_df['order_date'])\n","\n","# Group by 'order_date' and sum the sales\n","sales_chicago_pd_df = sales_chicago_pd_df.groupby('order_date')['sales'].sum().reset_index()\n","\n","# Resample the data to get monthly sales\n","sales_chicago_pd_df.set_index('order_date', inplace=True)\n","sales_chicago_monthly = sales_chicago_pd_df['sales'].resample('MS').sum().reset_index()\n","\n","# Plot sales over time\n","plt.figure(figsize=(12, 6))\n","plt.plot(sales_chicago_monthly['order_date'], sales_chicago_monthly['sales'], marker='o')\n","\n","# Adding labels and title\n","plt.xlabel('Order Date')\n","plt.ylabel('Total Sales')\n","plt.title('Impact of Order Date on Sales in Chicago')\n","\n","plt.show()"]}],"metadata":{"dependencies":{},"kernel_info":{"name":"synapse_pyspark"},"kernelspec":{"display_name":"Synapse PySpark","language":"Python","name":"synapse_pyspark"},"language_info":{"name":"python"},"microsoft":{"language":"python","language_group":"synapse_pyspark","ms_spell_check":{"ms_spell_check_language":"en"}},"nteract":{"version":"nteract-front-end@1.0.0"},"spark_compute":{"compute_id":"/trident/default","session_options":{"conf":{"spark.synapse.nbs.session.timeout":"1200000"}}},"widgets":{}},"nbformat":4,"nbformat_minor":5} From 78db07a5ac8c69374b26a916fa4d847fc5d4b716 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Tue, 15 Oct 2024 16:24:53 -0400 Subject: [PATCH 065/409] Update orders-sales-forecast.ipynb --- .../artifacts/notebooks/orders-sales-forecast.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/notebooks/orders-sales-forecast.ipynb b/azure_jumpstart_ag/artifacts/notebooks/orders-sales-forecast.ipynb index 921bc1a50f..f17f809f04 100644 --- a/azure_jumpstart_ag/artifacts/notebooks/orders-sales-forecast.ipynb +++ b/azure_jumpstart_ag/artifacts/notebooks/orders-sales-forecast.ipynb @@ -1 +1 @@ -{"cells":[{"cell_type":"markdown","id":"7a59fda1-4e93-45fb-8d19-7db1a882cc5e","metadata":{"jupyter":{"magics_cell_name":"magics-cell-markdown","magics_signature":"27ac753c3c60167f65c4d05fa7809cd85f1f0273d5b842aca4f65a01"},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"source":["\n","#### Run the cell below to install the required packages for Copilot\n"]},{"cell_type":"code","execution_count":null,"id":"201b7702-02d9-4d89-abc7-0cdbf6277f24","metadata":{"jupyter":{"magics_cell_name":"magics-cell-code","magics_signature":"6565d62221c469ab3707694ccbef2e4568d575dc1ba3ebac23f0f052","magics_version":"1.0"},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"outputs":[],"source":["\n","#Run this cell to install the required packages for Copilot\n","%load_ext dscopilot_installer\n","%activate_dscopilot\n"]},{"cell_type":"markdown","id":"ef02f63e-941b-42c0-8481-ce8aac727fa8","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["# Contoso Hypermarket Orders sales forecast ML notebook"]},{"cell_type":"markdown","id":"b1418874-4b23-4dae-8748-07e756bf70f4","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["### Set up MLflow experiment tracking"]},{"cell_type":"code","execution_count":null,"id":"edac2e41-e4ec-4a84-adad-d57938e17562","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Set up MLflow for experiment tracking\n","import mlflow\n","\n","IS_SAMPLE = False # if TRUE, use only rows of data for training, otherwise use all data\n","SAMPLE_ROWS = 5000 # if IS_SAMPLE is True, use only this number of rows for training\n","EXPERIMENT_NAME = \"orders-sales-forecast\" # MLflow experiment name\n","\n","mlflow.set_experiment(EXPERIMENT_NAME)\n","mlflow.autolog(disable=True) # Disable MLflow autologging"]},{"cell_type":"markdown","id":"9fa68416-1c4d-4481-8ec2-c2571310afbf","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["### Load orders data from KQL database to prepare for ML modeling\n","\n","> [!IMPORTANT]\n","> Make sure you have enough data generated using data emulator."]},{"cell_type":"code","execution_count":null,"id":"941a85a3-eaf6-4f2d-b862-2822a11cba86","metadata":{"jupyter":{"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"outputs":[],"source":["# Read from Kusto\n","# kustoQuery = \"['orders'] | mv-expand li = parse_json(line_items) | project order_date, store_id, order_id, product_id = toint(li.product_id), quantity = toint(li.quantity), price = toreal(li.price), item_total = toreal(li.item_total), order_total\"\n","ordersQuery = \"['orders'] | mv-expand li = parse_json(line_items) | project order_date, store_id, order_id, product_id = toint(li.product_id), quantity = toint(li.quantity), price = toreal(li.price), item_total = toreal(li.item_total), order_total\"\n","inventoryQuery = \"['inventory'] | project date_time, store_id, product_id, in_stock, retail_price\"\n","productsQuery = \"['products'] | project product_id, name, category, photo_path, price_range, stock\"\n","# The query URI for reading the data e.g. https://<>.kusto.data.microsoft.com.\n","kustoUri = \"https://trd-g8jnmstet4k7q79z9v.z1.kusto.fabric.microsoft.com\"\n","# The database with data to be read.\n","database = \"contosohypermarket\"\n","# The access credentials.\n","accessToken = mssparkutils.credentials.getToken(kustoUri)\n","ordersDf = spark.read\\\n"," .format(\"com.microsoft.kusto.spark.synapse.datasource\")\\\n"," .option(\"accessToken\", accessToken)\\\n"," .option(\"kustoCluster\", kustoUri)\\\n"," .option(\"kustoDatabase\", database)\\\n"," .option(\"kustoQuery\", ordersQuery).load()\n","inventoryDf = spark.read\\\n"," .format(\"com.microsoft.kusto.spark.synapse.datasource\")\\\n"," .option(\"accessToken\", accessToken)\\\n"," .option(\"kustoCluster\", kustoUri)\\\n"," .option(\"kustoDatabase\", database)\\\n"," .option(\"kustoQuery\", inventoryQuery).load()\n","productsDf = spark.read\\\n"," .format(\"com.microsoft.kusto.spark.synapse.datasource\")\\\n"," .option(\"accessToken\", accessToken)\\\n"," .option(\"kustoCluster\", kustoUri)\\\n"," .option(\"kustoDatabase\", database)\\\n"," .option(\"kustoQuery\", productsQuery).load()"]},{"cell_type":"code","execution_count":null,"id":"dca0ec6b-628f-4e91-9c60-5d7b1e78e0ed","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["### Verifying token availability\n","import requests\n","\n","# Define a simple test query\n","test_query = \"['inventory'] | take 1\"\n","\n","# Define the request headers with the access token\n","headers = {\n"," \"Authorization\": f\"Bearer {accessToken}\",\n"," \"Content-Type\": \"application/json\"\n","}\n","\n","# Define the request payload\n","payload = {\n"," \"db\": database,\n"," \"csl\": test_query\n","}\n","\n","# Make the request to the Kusto cluster\n","response = requests.post(f\"{kustoUri}/v1/rest/query\", headers=headers, json=payload)\n","\n","# Check if the request was successful\n","if response.status_code == 200:\n"," print(\"Access token is valid and has the necessary permissions.\")\n","else:\n"," print(f\"Failed to validate access token. Status code: {response.status_code}, Response: {response.text}\")"]},{"cell_type":"markdown","id":"d3363923-eb3e-4c3a-928e-3f304fc85fd0","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["## Step 2: Perform Exploratory Data Analysis"]},{"cell_type":"markdown","id":"0b764c51-1738-49a5-a8cf-e340518e9d8a","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["### Import libraries\n","\n","Before any analysis, you need to import the required libraries."]},{"cell_type":"code","execution_count":null,"id":"eece5426-68f6-4a0b-a478-2d4381322ac3","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Importing required libraries\n","import warnings\n","import itertools\n","import numpy as np\n","import matplotlib.pyplot as plt\n","warnings.filterwarnings(\"ignore\")\n","plt.style.use('fivethirtyeight')\n","import pandas as pd\n","import statsmodels.api as sm\n","import matplotlib\n","matplotlib.rcParams['axes.labelsize'] = 14\n","matplotlib.rcParams['xtick.labelsize'] = 12\n","matplotlib.rcParams['ytick.labelsize'] = 12\n","matplotlib.rcParams['text.color'] = 'k'\n","from sklearn.metrics import mean_squared_error,mean_absolute_percentage_error\n"]},{"cell_type":"markdown","id":"e48037a1-e1cb-4d33-9aa5-57faea8be1a2","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["### Display raw data"]},{"cell_type":"code","execution_count":null,"id":"1f672306-d3c7-4f1a-89f7-0851e8a90082","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Display data in dataframes.\n","ordersDf.show()\n","productsDf.show()\n","inventoryDf.show()"]},{"cell_type":"code","execution_count":null,"id":"27bf7c95-671a-4a9e-bf04-f80ad0befa73","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Importing functions\n","from pyspark.sql import functions as F\n","\n","# Filter the orders DataFrame for entries from Chicago\n","chicago_sales_df = ordersDf.filter(ordersDf.store_id == 'CHI')\n","\n","# Join the orders DataFrame with the products DataFrame to include product_id and name\n","sales_chicago_df = (\n"," chicago_sales_df\n"," .join(productsDf, on='product_id', how='inner') # Join on product_id\n"," .select(\n"," 'order_date',\n"," 'product_id',\n"," 'name', # Include product name\n"," 'price',\n"," 'quantity',\n"," (chicago_sales_df.price * chicago_sales_df.quantity).alias('sales') # Calculate sales\n"," )\n",")\n","\n","# Show the new DataFrame with the additional columns\n","sales_chicago_df.show()"]},{"cell_type":"code","execution_count":null,"id":"9749c9d9-7b66-49ca-ab48-1bef9c771478","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Show distinct product names in the dataframe\n","sales_chicago_df.select(\"name\").distinct().show()"]},{"cell_type":"code","execution_count":null,"id":"660ed236-aa9f-4d03-908a-a43af5e32e98","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["### Pre-processing data\n","# Dropping columns that have no impact. Retaining Order Date and Sales.\n","# cols = ['order_id', 'product_id', 'price', 'order_total']\n","# products = products.drop(*cols)\n","# products.show()\n","# Importing functions\n","from pyspark.sql import functions as F\n","\n","# Filter the orders DataFrame for entries from Chicago\n","chicago_sales_df = ordersDf.filter(ordersDf.store_id == 'CHI')\n","\n","# Join the orders DataFrame with the products DataFrame to include product_id and name\n","sales_chicago_df = (\n"," chicago_sales_df\n"," .join(productsDf, on='product_id', how='inner') # Join on product_id\n"," .select(\n"," 'order_date',\n"," (chicago_sales_df.price * chicago_sales_df.quantity).alias('sales') # Calculate sales\n"," )\n",")\n","\n","# Show the new DataFrame with only order_date and sales columns\n","sales_chicago_df.show()"]},{"cell_type":"code","execution_count":null,"id":"bd93e71e-4786-461a-b3ae-bc0cdedc0fca","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# products = products.groupBy('product_id')\n","# Sort the DataFrame by 'order_date'\n","sorted_sales_chicago_df = sales_chicago_df.orderBy('order_date')\n","\n","# Show the sorted DataFrame\n","sorted_sales_chicago_df.show()"]},{"cell_type":"markdown","id":"57d0a9e5-6958-4bd2-b55e-fbd4e660adcc","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["### Data Preparation for ML Experiment"]},{"cell_type":"code","execution_count":null,"id":"62880ccb-d1ba-4717-bf95-667b4e550035","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["from pyspark.sql import functions as F\n","\n","# Truncate 'order_date' to the first day of the month and group by it, summing the 'sales'\n","grouped_sales_chicago_df = sorted_sales_chicago_df.withColumn(\n"," 'order_date_trunc', F.date_trunc('month', 'order_date')\n",").groupBy('order_date_trunc').agg(F.sum('sales').alias('sales_sum'))"]},{"cell_type":"code","execution_count":null,"id":"300b1861-bf24-40b6-bd7c-db7bc1145c47","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Add 67 months to 'order_date_trunc'\n","adjusted_sales_chicago_df = grouped_sales_chicago_df.withColumn(\n"," 'adjusted_order_date', F.expr(\"add_months(order_date_trunc, 67)\")\n",")"]},{"cell_type":"code","execution_count":null,"id":"1c4213ca-6d65-4d73-955b-a80e68435ea5","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Select relevant columns\n","final_sales_chicago_df = adjusted_sales_chicago_df.select(\n"," 'adjusted_order_date', 'sales_sum'\n",")"]},{"cell_type":"code","execution_count":null,"id":"b7ed65d3-adb6-4bd2-8312-1161be2bffd3","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Find the maximum 'adjusted_order_date'\n","max_date = final_sales_chicago_df.agg(F.max('adjusted_order_date')).collect()[0][0]\n","print(\"Maximum adjusted order date:\", max_date)"]},{"cell_type":"code","execution_count":null,"id":"936b6a07-2c91-4385-8c38-83ff3b7ea447","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Show the resulting DataFrame\n","final_sales_chicago_df.show()"]},{"cell_type":"markdown","id":"54f2e3b3-4c12-4a3c-a6b3-44b4ca0cd519","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["##### Demonstrate the impact order date on the sales for all sales in Chicago."]},{"cell_type":"code","execution_count":null,"id":"7eb35b38-c3c6-4bac-b324-de48c8e0cce9","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["import matplotlib.pyplot as plt\n","\n","# Step 1: Convert the Spark DataFrame to Pandas\n","final_sales_chicago_pd_df = final_sales_chicago_df.toPandas()\n","\n","# Step 2: Plot the impact of 'adjusted_order_date' on 'sales_sum'\n","plt.figure(figsize=(12, 3))\n","plt.plot(final_sales_chicago_pd_df['adjusted_order_date'], final_sales_chicago_pd_df['sales_sum'])\n","\n","# Add labels and title\n","plt.xlabel('Order Date')\n","plt.ylabel('Sales')\n","plt.title('Impact of Order Date on Sales')\n","\n","# Step 3: Show the plot\n","plt.show()"]},{"cell_type":"code","execution_count":null,"id":"52ef6009-afe3-49ed-acd9-2a983660aa57","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["### Debugging\n","# Check if the DataFrame has data\n","print(final_sales_chicago_pd_df.head()) # This will print the first few rows to check the contents\n","print(final_sales_chicago_pd_df.info()) # This will show if there are any NaN values or data type issues\n","# Ensure 'adjusted_order_date' is in datetime format\n","final_sales_chicago_pd_df['adjusted_order_date'] = pd.to_datetime(final_sales_chicago_pd_df['adjusted_order_date'])\n","\n","# Sort the DataFrame by date\n","final_sales_chicago_pd_df = final_sales_chicago_pd_df.sort_values('adjusted_order_date')\n","\n","# Check the data after sorting\n","print(final_sales_chicago_pd_df.head())\n"]},{"cell_type":"code","execution_count":null,"id":"82b2d558-6189-4236-86d0-dd1fcb70a487","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["import pandas as pd\n","import matplotlib.pyplot as plt\n","\n","# Filtering Chicago data\n","sales_chicago_df = ordersDf.filter(ordersDf.store_id == 'CHI')\n","\n","# Creating a 'sales' column by multiplying price and quantity\n","sales_chicago_df = sales_chicago_df.withColumn('sales', sales_chicago_df['price'] * sales_chicago_df['quantity'])\n","\n","# Selecting relevant columns: order_date, sales\n","sales_chicago_df = sales_chicago_df.select('order_date', 'sales')\n","\n","# Converting the DataFrame to Pandas\n","sales_chicago_pd_df = sales_chicago_df.toPandas()\n","\n","# Confirming that 'order_date' is in datetime format\n","sales_chicago_pd_df['order_date'] = pd.to_datetime(sales_chicago_pd_df['order_date'])\n","\n","# Group by 'order_date' and sum the sales\n","sales_chicago_pd_df = sales_chicago_pd_df.groupby('order_date')['sales'].sum().reset_index()\n","\n","# Resample the data to get monthly sales\n","sales_chicago_pd_df.set_index('order_date', inplace=True)\n","sales_chicago_monthly = sales_chicago_pd_df['sales'].resample('MS').sum().reset_index()\n","\n","# Plot sales over time\n","plt.figure(figsize=(12, 6))\n","plt.plot(sales_chicago_monthly['order_date'], sales_chicago_monthly['sales'], marker='o')\n","\n","# Adding labels and title\n","plt.xlabel('Order Date')\n","plt.ylabel('Total Sales')\n","plt.title('Impact of Order Date on Sales in Chicago')\n","\n","plt.show()"]}],"metadata":{"dependencies":{},"kernel_info":{"name":"synapse_pyspark"},"kernelspec":{"display_name":"Synapse PySpark","language":"Python","name":"synapse_pyspark"},"language_info":{"name":"python"},"microsoft":{"language":"python","language_group":"synapse_pyspark","ms_spell_check":{"ms_spell_check_language":"en"}},"nteract":{"version":"nteract-front-end@1.0.0"},"spark_compute":{"compute_id":"/trident/default","session_options":{"conf":{"spark.synapse.nbs.session.timeout":"1200000"}}},"widgets":{}},"nbformat":4,"nbformat_minor":5} +{"cells":[{"cell_type":"markdown","id":"7a59fda1-4e93-45fb-8d19-7db1a882cc5e","metadata":{"jupyter":{"magics_cell_name":"magics-cell-markdown","magics_signature":"27ac753c3c60167f65c4d05fa7809cd85f1f0273d5b842aca4f65a01"},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"source":["\n","#### Run the cell below to install the required packages for Copilot\n"]},{"cell_type":"code","execution_count":null,"id":"201b7702-02d9-4d89-abc7-0cdbf6277f24","metadata":{"jupyter":{"magics_cell_name":"magics-cell-code","magics_signature":"6565d62221c469ab3707694ccbef2e4568d575dc1ba3ebac23f0f052","magics_version":"1.0"},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"outputs":[],"source":["\n","#Run this cell to install the required packages for Copilot\n","%load_ext dscopilot_installer\n","%activate_dscopilot\n"]},{"cell_type":"markdown","id":"ef02f63e-941b-42c0-8481-ce8aac727fa8","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["# Contoso Hypermarket Orders sales forecast ML notebook"]},{"cell_type":"markdown","id":"b1418874-4b23-4dae-8748-07e756bf70f4","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["### Set up MLflow experiment tracking"]},{"cell_type":"code","execution_count":null,"id":"edac2e41-e4ec-4a84-adad-d57938e17562","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Set up MLflow for experiment tracking\n","import mlflow\n","\n","IS_SAMPLE = False # if TRUE, use only rows of data for training, otherwise use all data\n","SAMPLE_ROWS = 5000 # if IS_SAMPLE is True, use only this number of rows for training\n","EXPERIMENT_NAME = \"orders-sales-forecast\" # MLflow experiment name\n","\n","mlflow.set_experiment(EXPERIMENT_NAME)\n","mlflow.autolog(disable=True) # Disable MLflow autologging"]},{"cell_type":"markdown","id":"9fa68416-1c4d-4481-8ec2-c2571310afbf","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["### Load orders data from KQL database to prepare for ML modeling\n","\n","> [!IMPORTANT]\n","> Make sure you have enough data generated using data emulator."]},{"cell_type":"code","execution_count":null,"id":"941a85a3-eaf6-4f2d-b862-2822a11cba86","metadata":{"jupyter":{"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"outputs":[],"source":["# Read from Kusto\n","# kustoQuery = \"['orders'] | mv-expand li = parse_json(line_items) | project order_date, store_id, order_id, product_id = toint(li.product_id), quantity = toint(li.quantity), price = toreal(li.price), item_total = toreal(li.item_total), order_total\"\n","ordersQuery = \"['orders'] | mv-expand li = parse_json(line_items) | project order_date, store_id, order_id, product_id = toint(li.product_id), quantity = toint(li.quantity), price = toreal(li.price), item_total = toreal(li.item_total), order_total\"\n","inventoryQuery = \"['inventory'] | project date_time, store_id, product_id, in_stock, retail_price\"\n","productsQuery = \"['products'] | project product_id, name, category, photo_path, price_range, stock\"\n","# The query URI for reading the data e.g. https://<>.kusto.data.microsoft.com.\n","kustoUri = \"{{KQL_CLUSTER_URI}}\"\n","# The database with data to be read.\n","database = \"{{KQL_DATABASE_NAME}}\"\n","# The access credentials.\n","accessToken = mssparkutils.credentials.getToken(kustoUri)\n","ordersDf = spark.read\\\n"," .format(\"com.microsoft.kusto.spark.synapse.datasource\")\\\n"," .option(\"accessToken\", accessToken)\\\n"," .option(\"kustoCluster\", kustoUri)\\\n"," .option(\"kustoDatabase\", database)\\\n"," .option(\"kustoQuery\", ordersQuery).load()\n","inventoryDf = spark.read\\\n"," .format(\"com.microsoft.kusto.spark.synapse.datasource\")\\\n"," .option(\"accessToken\", accessToken)\\\n"," .option(\"kustoCluster\", kustoUri)\\\n"," .option(\"kustoDatabase\", database)\\\n"," .option(\"kustoQuery\", inventoryQuery).load()\n","productsDf = spark.read\\\n"," .format(\"com.microsoft.kusto.spark.synapse.datasource\")\\\n"," .option(\"accessToken\", accessToken)\\\n"," .option(\"kustoCluster\", kustoUri)\\\n"," .option(\"kustoDatabase\", database)\\\n"," .option(\"kustoQuery\", productsQuery).load()"]},{"cell_type":"code","execution_count":null,"id":"dca0ec6b-628f-4e91-9c60-5d7b1e78e0ed","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["### Verifying token availability\n","import requests\n","\n","# Define a simple test query\n","test_query = \"['inventory'] | take 1\"\n","\n","# Define the request headers with the access token\n","headers = {\n"," \"Authorization\": f\"Bearer {accessToken}\",\n"," \"Content-Type\": \"application/json\"\n","}\n","\n","# Define the request payload\n","payload = {\n"," \"db\": database,\n"," \"csl\": test_query\n","}\n","\n","# Make the request to the Kusto cluster\n","response = requests.post(f\"{kustoUri}/v1/rest/query\", headers=headers, json=payload)\n","\n","# Check if the request was successful\n","if response.status_code == 200:\n"," print(\"Access token is valid and has the necessary permissions.\")\n","else:\n"," print(f\"Failed to validate access token. Status code: {response.status_code}, Response: {response.text}\")"]},{"cell_type":"markdown","id":"d3363923-eb3e-4c3a-928e-3f304fc85fd0","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["## Step 2: Perform Exploratory Data Analysis"]},{"cell_type":"markdown","id":"0b764c51-1738-49a5-a8cf-e340518e9d8a","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["### Import libraries\n","\n","Before any analysis, you need to import the required libraries."]},{"cell_type":"code","execution_count":null,"id":"eece5426-68f6-4a0b-a478-2d4381322ac3","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Importing required libraries\n","import warnings\n","import itertools\n","import numpy as np\n","import matplotlib.pyplot as plt\n","warnings.filterwarnings(\"ignore\")\n","plt.style.use('fivethirtyeight')\n","import pandas as pd\n","import statsmodels.api as sm\n","import matplotlib\n","matplotlib.rcParams['axes.labelsize'] = 14\n","matplotlib.rcParams['xtick.labelsize'] = 12\n","matplotlib.rcParams['ytick.labelsize'] = 12\n","matplotlib.rcParams['text.color'] = 'k'\n","from sklearn.metrics import mean_squared_error,mean_absolute_percentage_error\n"]},{"cell_type":"markdown","id":"e48037a1-e1cb-4d33-9aa5-57faea8be1a2","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["### Display raw data"]},{"cell_type":"code","execution_count":null,"id":"1f672306-d3c7-4f1a-89f7-0851e8a90082","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Display data in dataframes.\n","ordersDf.show()\n","productsDf.show()\n","inventoryDf.show()"]},{"cell_type":"code","execution_count":null,"id":"27bf7c95-671a-4a9e-bf04-f80ad0befa73","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Importing functions\n","from pyspark.sql import functions as F\n","\n","# Filter the orders DataFrame for entries from Chicago\n","chicago_sales_df = ordersDf.filter(ordersDf.store_id == 'CHI')\n","\n","# Join the orders DataFrame with the products DataFrame to include product_id and name\n","sales_chicago_df = (\n"," chicago_sales_df\n"," .join(productsDf, on='product_id', how='inner') # Join on product_id\n"," .select(\n"," 'order_date',\n"," 'product_id',\n"," 'name', # Include product name\n"," 'price',\n"," 'quantity',\n"," (chicago_sales_df.price * chicago_sales_df.quantity).alias('sales') # Calculate sales\n"," )\n",")\n","\n","# Show the new DataFrame with the additional columns\n","sales_chicago_df.show()"]},{"cell_type":"code","execution_count":null,"id":"9749c9d9-7b66-49ca-ab48-1bef9c771478","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Show distinct product names in the dataframe\n","sales_chicago_df.select(\"name\").distinct().show()"]},{"cell_type":"code","execution_count":null,"id":"660ed236-aa9f-4d03-908a-a43af5e32e98","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["### Pre-processing data\n","# Dropping columns that have no impact. Retaining Order Date and Sales.\n","# cols = ['order_id', 'product_id', 'price', 'order_total']\n","# products = products.drop(*cols)\n","# products.show()\n","# Importing functions\n","from pyspark.sql import functions as F\n","\n","# Filter the orders DataFrame for entries from Chicago\n","chicago_sales_df = ordersDf.filter(ordersDf.store_id == 'CHI')\n","\n","# Join the orders DataFrame with the products DataFrame to include product_id and name\n","sales_chicago_df = (\n"," chicago_sales_df\n"," .join(productsDf, on='product_id', how='inner') # Join on product_id\n"," .select(\n"," 'order_date',\n"," (chicago_sales_df.price * chicago_sales_df.quantity).alias('sales') # Calculate sales\n"," )\n",")\n","\n","# Show the new DataFrame with only order_date and sales columns\n","sales_chicago_df.show()"]},{"cell_type":"code","execution_count":null,"id":"bd93e71e-4786-461a-b3ae-bc0cdedc0fca","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# products = products.groupBy('product_id')\n","# Sort the DataFrame by 'order_date'\n","sorted_sales_chicago_df = sales_chicago_df.orderBy('order_date')\n","\n","# Show the sorted DataFrame\n","sorted_sales_chicago_df.show()"]},{"cell_type":"markdown","id":"57d0a9e5-6958-4bd2-b55e-fbd4e660adcc","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["### Data Preparation for ML Experiment"]},{"cell_type":"code","execution_count":null,"id":"62880ccb-d1ba-4717-bf95-667b4e550035","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["from pyspark.sql import functions as F\n","\n","# Truncate 'order_date' to the first day of the month and group by it, summing the 'sales'\n","grouped_sales_chicago_df = sorted_sales_chicago_df.withColumn(\n"," 'order_date_trunc', F.date_trunc('month', 'order_date')\n",").groupBy('order_date_trunc').agg(F.sum('sales').alias('sales_sum'))"]},{"cell_type":"code","execution_count":null,"id":"300b1861-bf24-40b6-bd7c-db7bc1145c47","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Add 67 months to 'order_date_trunc'\n","adjusted_sales_chicago_df = grouped_sales_chicago_df.withColumn(\n"," 'adjusted_order_date', F.expr(\"add_months(order_date_trunc, 67)\")\n",")"]},{"cell_type":"code","execution_count":null,"id":"1c4213ca-6d65-4d73-955b-a80e68435ea5","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Select relevant columns\n","final_sales_chicago_df = adjusted_sales_chicago_df.select(\n"," 'adjusted_order_date', 'sales_sum'\n",")"]},{"cell_type":"code","execution_count":null,"id":"b7ed65d3-adb6-4bd2-8312-1161be2bffd3","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Find the maximum 'adjusted_order_date'\n","max_date = final_sales_chicago_df.agg(F.max('adjusted_order_date')).collect()[0][0]\n","print(\"Maximum adjusted order date:\", max_date)"]},{"cell_type":"code","execution_count":null,"id":"936b6a07-2c91-4385-8c38-83ff3b7ea447","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["# Show the resulting DataFrame\n","final_sales_chicago_df.show()"]},{"cell_type":"markdown","id":"54f2e3b3-4c12-4a3c-a6b3-44b4ca0cd519","metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"source":["##### Demonstrate the impact order date on the sales for all sales in Chicago."]},{"cell_type":"code","execution_count":null,"id":"7eb35b38-c3c6-4bac-b324-de48c8e0cce9","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["import matplotlib.pyplot as plt\n","\n","# Step 1: Convert the Spark DataFrame to Pandas\n","final_sales_chicago_pd_df = final_sales_chicago_df.toPandas()\n","\n","# Step 2: Plot the impact of 'adjusted_order_date' on 'sales_sum'\n","plt.figure(figsize=(12, 3))\n","plt.plot(final_sales_chicago_pd_df['adjusted_order_date'], final_sales_chicago_pd_df['sales_sum'])\n","\n","# Add labels and title\n","plt.xlabel('Order Date')\n","plt.ylabel('Sales')\n","plt.title('Impact of Order Date on Sales')\n","\n","# Step 3: Show the plot\n","plt.show()"]},{"cell_type":"code","execution_count":null,"id":"52ef6009-afe3-49ed-acd9-2a983660aa57","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["### Debugging\n","# Check if the DataFrame has data\n","print(final_sales_chicago_pd_df.head()) # This will print the first few rows to check the contents\n","print(final_sales_chicago_pd_df.info()) # This will show if there are any NaN values or data type issues\n","# Ensure 'adjusted_order_date' is in datetime format\n","final_sales_chicago_pd_df['adjusted_order_date'] = pd.to_datetime(final_sales_chicago_pd_df['adjusted_order_date'])\n","\n","# Sort the DataFrame by date\n","final_sales_chicago_pd_df = final_sales_chicago_pd_df.sort_values('adjusted_order_date')\n","\n","# Check the data after sorting\n","print(final_sales_chicago_pd_df.head())\n"]},{"cell_type":"code","execution_count":null,"id":"82b2d558-6189-4236-86d0-dd1fcb70a487","metadata":{"jupyter":{"outputs_hidden":false,"source_hidden":false},"microsoft":{"language":"python","language_group":"synapse_pyspark"},"nteract":{"transient":{"deleting":false}}},"outputs":[],"source":["import pandas as pd\n","import matplotlib.pyplot as plt\n","\n","# Filtering Chicago data\n","sales_chicago_df = ordersDf.filter(ordersDf.store_id == 'CHI')\n","\n","# Creating a 'sales' column by multiplying price and quantity\n","sales_chicago_df = sales_chicago_df.withColumn('sales', sales_chicago_df['price'] * sales_chicago_df['quantity'])\n","\n","# Selecting relevant columns: order_date, sales\n","sales_chicago_df = sales_chicago_df.select('order_date', 'sales')\n","\n","# Converting the DataFrame to Pandas\n","sales_chicago_pd_df = sales_chicago_df.toPandas()\n","\n","# Confirming that 'order_date' is in datetime format\n","sales_chicago_pd_df['order_date'] = pd.to_datetime(sales_chicago_pd_df['order_date'])\n","\n","# Group by 'order_date' and sum the sales\n","sales_chicago_pd_df = sales_chicago_pd_df.groupby('order_date')['sales'].sum().reset_index()\n","\n","# Resample the data to get monthly sales\n","sales_chicago_pd_df.set_index('order_date', inplace=True)\n","sales_chicago_monthly = sales_chicago_pd_df['sales'].resample('MS').sum().reset_index()\n","\n","# Plot sales over time\n","plt.figure(figsize=(12, 6))\n","plt.plot(sales_chicago_monthly['order_date'], sales_chicago_monthly['sales'], marker='o')\n","\n","# Adding labels and title\n","plt.xlabel('Order Date')\n","plt.ylabel('Total Sales')\n","plt.title('Impact of Order Date on Sales in Chicago')\n","\n","plt.show()"]}],"metadata":{"dependencies":{},"kernel_info":{"name":"synapse_pyspark"},"kernelspec":{"display_name":"Synapse PySpark","language":"Python","name":"synapse_pyspark"},"language_info":{"name":"python"},"microsoft":{"language":"python","language_group":"synapse_pyspark","ms_spell_check":{"ms_spell_check_language":"en"}},"nteract":{"version":"nteract-front-end@1.0.0"},"spark_compute":{"compute_id":"/trident/default","session_options":{"conf":{"spark.synapse.nbs.session.timeout":"1200000"}}},"widgets":{}},"nbformat":4,"nbformat_minor":5} From 2a139a8232e554b1aedec97ad6956c5497b874b9 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Tue, 15 Oct 2024 16:51:26 -0400 Subject: [PATCH 066/409] Update SetupFabricWorkspace.ps1 --- .../PowerShell/SetupFabricWorkspace.ps1 | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 index d46a780845..5a29eb18e6 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 @@ -154,6 +154,7 @@ $kqlDatabasesResp = Invoke-WebRequest -Method Get -Uri $kqlDatabasesApi -Headers $kqlDatabaseInfo = (ConvertFrom-Json($kqlDatabasesResp.Content)).value $kqlQueryServiceUri = $kqlDatabaseInfo[0].properties.queryServiceUri $kqlDatabaseId = $kqlDatabaseInfo[0].id +$kqlDatabaseName = $kqlDatabaseInfo[0].displayName # Create KQL database tables to store retail data $databaseName = $eventhouseName @@ -438,4 +439,44 @@ else { } # Import data sceince notebook for sales forecast -# TBD \ No newline at end of file +# Download dashboard report and Update to use KQL database +$ordersSalesForecastNotebook = "orders-sales-forecast.ipynb" +Write-Host "INFO: Downloading and preparing nootebook to import into Fabric workspace." +$ordersNotebookBody = (Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/notebooks/$ordersSalesForecastNotebook").Content -replace '{{KQL_CLUSTER_URI}}', $kqlQueryServiceUri -replace '{{KQL_DATABASE_NAME}}', $kqlDatabaseName + +# Convert the KQL dashboard report payload to base64 +Write-Host "INFO: Conerting report content into base64 encoded format." +$base64Payload = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($ordersNotebookBody)) + +# Build KQL dashboard report payload from the report template +$body = @" +{ + "displayName": "Orders Sales Forecast Notebook", + "description": "A notebook description", + "definition": { + "format": "ipynb", + "parts": [ + { + "path": "$ordersSalesForecastNotebook", + "payload": "$base64Payload", + "payloadType": "InlineBase64" + } + ] + } +} +"@ + +# Create KQL dashboard report +$nootebookApi = "https://api.fabric.microsoft.com/v1/workspaces/$fabricWorkspaceId/notebooks" +$headers = @{"Authorization" = "Bearer $fabricAccessToken"; "Content-Type" = "application/json"} +$httpResp = Invoke-RestMethod -Method Post -Uri $nootebookApi -Headers $headers -Body $body +if (($httpResp.StatusCode -ge 200) -or ($httpResp.StatusCode -le 204)){ + Write-Host "INFO: Created notebook in Fabric workspace." +} +else { + Write-Host "ERROR: Failed to create notebook." + Exit +} + +# Stop logging into the log file +Stop-Transcript \ No newline at end of file From 6e8ca439e7c57c3edd22f3cd71fd561a8fa12892 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Wed, 16 Oct 2024 14:33:44 -0500 Subject: [PATCH 067/409] add pull secret --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 1 + azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 6a78075d1d..b1b89ba8bd 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -191,6 +191,7 @@ Namespaces = @( "observability" "images-cache" + "contoso-hypermarket" ) AppConfig = @{ diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index d9c5b41040..3ae505c541 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -542,7 +542,7 @@ function Deploy-ClusterSecrets { foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { $clusterName = $cluster.Name.ToLower() foreach ($namespace in $AgConfig.Namespaces) { - if ($namespace -eq "contoso-supermarket" -or $namespace -eq "images-cache") { + if ($namespace -eq "contoso-supermarket" -or $namespace -eq "images-cache" -or $namespace -eq "contoso-hypermarket") { Write-Host "[$(Get-Date -Format t)] INFO: Configuring Azure Container registry on $clusterName" if($cluster.Value.Type -eq "k3s"){ $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" From b3a50ba6117f36157de4ef68cad24130ba321fd2 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Wed, 16 Oct 2024 16:34:34 -0400 Subject: [PATCH 068/409] add Application dashboard --- .../AgConfig-contoso-hypermarket.psd1 | 2 +- .../monitoring/grafana-cluster-pods.json | 2396 +++++++++++++++++ .../monitoring/grafana-cluster-workloads.json | 2213 +++++++++++++++ 3 files changed, 4610 insertions(+), 1 deletion(-) create mode 100644 azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json create mode 100644 azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index ab413b6903..ec160e8b64 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -184,7 +184,7 @@ ProdURL = "http://localhost:3000" Dashboards = @{ "grafana.com" = @() # Dashboards from https://grafana.com/grafana/dashboards - "custom" = @('node-exporter-full','cluster-global') # Dashboards from https://github.com/microsoft/azure_arc/tree/main/azure_jumpstart_ag/artifacts/monitoring + "custom" = @('node-exporter-full','cluster-global', 'cluster-workloads', 'cluster-pods') # Dashboards from https://github.com/microsoft/azure_arc/tree/main/azure_jumpstart_ag/artifacts/monitoring } } diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json new file mode 100644 index 0000000000..5ccb8f18a5 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json @@ -0,0 +1,2396 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 23, + "links": [], + "panels": [ + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 17, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "CPU Usage", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 1 + }, + "hiddenSeries": false, + "id": 1, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "requests", + "color": "#F2495C", + "fill": 0, + "hideTooltip": true, + "legend": true, + "linewidth": 2, + "stack": false + }, + { + "alias": "limits", + "color": "#FF9830", + "fill": 0, + "hideTooltip": true, + "legend": true, + "linewidth": 2, + "stack": false + } + ], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "time_series", + "legendFormat": "{{container}}", + "refId": "A" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", namespace=\"$namespace\", pod=\"$pod\", resource=\"cpu\"}\r\n)\r\n", + "format": "time_series", + "legendFormat": "requests", + "refId": "B" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", namespace=\"$namespace\", pod=\"$pod\", resource=\"cpu\"}\r\n)\r\n", + "format": "time_series", + "legendFormat": "limits", + "refId": "C" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "CPU Usage", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 8 + }, + "id": 18, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "CPU Throttling", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 9 + }, + "hiddenSeries": false, + "id": 2, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(increase(container_cpu_cfs_throttled_periods_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\"}[$__rate_interval])) by (container) /sum(increase(container_cpu_cfs_periods_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\"}[$__rate_interval])) by (container)", + "format": "time_series", + "legendFormat": "{{container}}", + "refId": "A" + } + ], + "thresholds": [ + { + "colorMode": "critical", + "fill": true, + "line": true, + "op": "gt", + "value": 0.25, + "yaxis": "left" + } + ], + "timeRegions": [], + "title": "CPU Throttling", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percentunit", + "logBase": 1, + "max": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 16 + }, + "id": 19, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "CPU Quota", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "columns": [], + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 1, + "fontSize": "100%", + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 17 + }, + "id": 3, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "showHeader": true, + "sort": { + "col": 0, + "desc": true + }, + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "styles": [ + { + "alias": "Time", + "align": "auto", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "CPU Usage", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Requests", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Requests %", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "CPU Limits", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Limits %", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #E", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Container", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "container", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "string", + "unit": "short" + } + ], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "A" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_requests{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "B" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\", pod=\"$pod\"}) by (container) / sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_requests{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "C" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "D" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\", pod=\"$pod\"}) by (container) / sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "E" + } + ], + "thresholds": [], + "title": "CPU Quota", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "transform": "table", + "type": "table-old", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ] + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 24 + }, + "id": 20, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Memory Usage", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 25 + }, + "hiddenSeries": false, + "id": 4, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "requests", + "color": "#F2495C", + "dashes": true, + "fill": 0, + "hideTooltip": true, + "legend": true, + "linewidth": 2, + "stack": false + }, + { + "alias": "limits", + "color": "#FF9830", + "dashes": true, + "fill": 0, + "hideTooltip": true, + "legend": true, + "linewidth": 2, + "stack": false + } + ], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\", image!=\"\"}) by (container)", + "format": "time_series", + "legendFormat": "{{container}}", + "refId": "A" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", namespace=\"$namespace\", pod=\"$pod\", resource=\"memory\"}\r\n)\r\n", + "format": "time_series", + "legendFormat": "requests", + "refId": "B" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", namespace=\"$namespace\", pod=\"$pod\", resource=\"memory\"}\r\n)\r\n", + "format": "time_series", + "legendFormat": "limits", + "refId": "C" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Memory Usage (WSS)", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 32 + }, + "id": 21, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Memory Quota", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "columns": [], + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 1, + "fontSize": "100%", + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 33 + }, + "id": 5, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "showHeader": true, + "sort": { + "col": 0, + "desc": true + }, + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "styles": [ + { + "alias": "Time", + "align": "auto", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "Memory Usage (WSS)", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Memory Requests", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Memory Requests %", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Memory Limits", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Memory Limits %", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #E", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Memory Usage (RSS)", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #F", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Memory Usage (Cache)", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #G", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Memory Usage (Swap)", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #H", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Container", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "container", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "string", + "unit": "short" + } + ], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\", image!=\"\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "A" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_requests{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "B" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", image!=\"\"}) by (container) / sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_requests{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "C" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_limits{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "D" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\", image!=\"\"}) by (container) / sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_limits{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "E" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(container_memory_rss{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container != \"\", container != \"POD\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "F" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(container_memory_cache{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container != \"\", container != \"POD\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "G" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(container_memory_swap{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container != \"\", container != \"POD\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "H" + } + ], + "thresholds": [], + "title": "Memory Quota", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "transform": "table", + "type": "table-old", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ] + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 40 + }, + "id": 22, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Bandwidth", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 41 + }, + "hiddenSeries": false, + "id": 6, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(irate(container_network_receive_bytes_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])) by (pod)", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Receive Bandwidth", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 41 + }, + "hiddenSeries": false, + "id": 7, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(irate(container_network_transmit_bytes_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])) by (pod)", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Transmit Bandwidth", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 48 + }, + "id": 23, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Rate of Packets", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 49 + }, + "hiddenSeries": false, + "id": 8, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(irate(container_network_receive_packets_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])) by (pod)", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Rate of Received Packets", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "pps", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 49 + }, + "hiddenSeries": false, + "id": 9, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(irate(container_network_transmit_packets_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])) by (pod)", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Rate of Transmitted Packets", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "pps", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 56 + }, + "id": 24, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Rate of Packets Dropped", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 57 + }, + "hiddenSeries": false, + "id": 10, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(irate(container_network_receive_packets_dropped_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])) by (pod)", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Rate of Received Packets Dropped", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "pps", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 57 + }, + "hiddenSeries": false, + "id": 11, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(irate(container_network_transmit_packets_dropped_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])) by (pod)", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Rate of Transmitted Packets Dropped", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "pps", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 64 + }, + "id": 25, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Storage IO - Distribution(Pod - Read & Writes)", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "decimals": -1, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 65 + }, + "hiddenSeries": false, + "id": 12, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "ceil(sum by(pod) (rate(container_fs_reads_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])))", + "format": "time_series", + "legendFormat": "Reads", + "refId": "A" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "ceil(sum by(pod) (rate(container_fs_writes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\",namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])))", + "format": "time_series", + "legendFormat": "Writes", + "refId": "B" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "IOPS", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 65 + }, + "hiddenSeries": false, + "id": 13, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum by(pod) (rate(container_fs_reads_bytes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", + "format": "time_series", + "legendFormat": "Reads", + "refId": "A" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum by(pod) (rate(container_fs_writes_bytes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", + "format": "time_series", + "legendFormat": "Writes", + "refId": "B" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "ThroughPut", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 72 + }, + "id": 26, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Storage IO - Distribution(Containers)", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "decimals": -1, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 73 + }, + "hiddenSeries": false, + "id": 14, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "ceil(sum by(container) (rate(container_fs_reads_total{job=\"kubelet\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]) + rate(container_fs_writes_total{job=\"kubelet\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])))", + "format": "time_series", + "legendFormat": "{{container}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "IOPS(Reads+Writes)", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 73 + }, + "hiddenSeries": false, + "id": 15, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum by(container) (rate(container_fs_reads_bytes_total{job=\"kubelet\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]) + rate(container_fs_writes_bytes_total{job=\"kubelet\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", + "format": "time_series", + "legendFormat": "{{container}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "ThroughPut(Read+Write)", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 80 + }, + "id": 27, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Storage IO - Distribution", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 1, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 81 + }, + "id": 16, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "sort": { + "col": 4, + "desc": true + }, + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "styles": [ + { + "alias": "Time", + "align": "auto", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "IOPS(Reads)", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": -1, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "IOPS(Writes)", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": -1, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "IOPS(Reads + Writes)", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": -1, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "Throughput(Read)", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "Bps" + }, + { + "alias": "Throughput(Write)", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #E", + "thresholds": [], + "type": "number", + "unit": "Bps" + }, + { + "alias": "Throughput(Read + Write)", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #F", + "thresholds": [], + "type": "number", + "unit": "Bps" + }, + { + "alias": "Container", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "container", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "string", + "unit": "short" + } + ], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum by(container) (rate(container_fs_reads_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "A" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum by(container) (rate(container_fs_writes_total{job=\"kubelet\",device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "B" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum by(container) (rate(container_fs_reads_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]) + rate(container_fs_writes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "C" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum by(container) (rate(container_fs_reads_bytes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "D" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum by(container) (rate(container_fs_writes_bytes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "E" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum by(container) (rate(container_fs_reads_bytes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]) + rate(container_fs_writes_bytes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "F" + } + ], + "thresholds": [], + "title": "Current Storage IO", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "transform": "table", + "type": "table-old", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ] + } + ], + "schemaVersion": 39, + "tags": [ + "kubernetes-mixin", + "Microsoft-managed" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "Managed_Prometheus_zmazmon1", + "value": "zmazmon1" + }, + "hide": 0, + "includeAll": false, + "label": "Data Source", + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": { + "selected": false, + "text": "azure-arc", + "value": "azure-arc" + }, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "namespace", + "options": [], + "query": "label_values(kube_namespace_status_phase{job=\"kube-state-metrics\"}, namespace)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": { + "selected": false, + "text": "cluster-metadata-operator-dfb9f4b7f-wvvhj", + "value": "cluster-metadata-operator-dfb9f4b7f-wvvhj" + }, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "pod", + "options": [], + "query": "label_values(kube_pod_info{job=\"kube-state-metrics\", namespace=\"$namespace\"}, pod)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "2024-10-16T17:17:09.316Z", + "to": "2024-10-16T18:17:09.316Z" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "utc", + "title": "Contoso Hypermarket Pods", + "uid": "ac3253a2c4a149d68ccd0a58c7ab6738", + "version": 1, + "weekStart": "" + } \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json new file mode 100644 index 0000000000..b95e00c1b0 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json @@ -0,0 +1,2213 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 39, + "links": [], + "panels": [ + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 14, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "CPU Usage", + "type": "row" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 1 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.7", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "title": "CPU Usage", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 8 + }, + "id": 15, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "CPU Quota", + "type": "row" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "decimals": 2, + "displayName": "", + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "displayName", + "value": "Time" + }, + { + "id": "custom.hidden", + "value": true + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value #A" + }, + "properties": [ + { + "id": "displayName", + "value": "CPU Usage" + }, + { + "id": "unit", + "value": "short" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value #B" + }, + "properties": [ + { + "id": "displayName", + "value": "CPU Requests" + }, + { + "id": "unit", + "value": "short" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value #C" + }, + "properties": [ + { + "id": "displayName", + "value": "CPU Requests %" + }, + { + "id": "unit", + "value": "percentunit" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value #D" + }, + "properties": [ + { + "id": "displayName", + "value": "CPU Limits" + }, + { + "id": "unit", + "value": "short" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value #E" + }, + "properties": [ + { + "id": "displayName", + "value": "CPU Limits %" + }, + { + "id": "unit", + "value": "percentunit" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "pod" + }, + "properties": [ + { + "id": "displayName", + "value": "Pod" + }, + { + "id": "unit", + "value": "short" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "Drill down", + "url": "/d/ac3253a2c4a149d68ccd0a58c7ab6738/k8s-resources-pod?var-datasource=$datasource&var-namespace=$namespace&from=$__from&to=$__to&var-pod=$__value" + } + ] + }, + { + "id": "custom.align" + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 9 + }, + "id": 2, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "11.2.2", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "A" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"cpu\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "B" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n/sum(\r\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"cpu\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "C" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"cpu\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "D" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n/sum(\r\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"cpu\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "E" + } + ], + "title": "CPU Quota", + "transformations": [ + { + "id": "merge", + "options": { + "reducers": [] + } + } + ], + "type": "table" + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 16 + }, + "id": 16, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Memory Usage", + "type": "row" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 17 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.7", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n container_memory_working_set_bytes{namespace=\"$namespace\", container!=\"\", image!=\"\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "title": "Memory Usage", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 24 + }, + "id": 17, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Memory Quota", + "type": "row" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "decimals": 2, + "displayName": "", + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "displayName", + "value": "Time" + }, + { + "id": "custom.hidden", + "value": true + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value #A" + }, + "properties": [ + { + "id": "displayName", + "value": "Memory Usage" + }, + { + "id": "unit", + "value": "bytes" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value #B" + }, + "properties": [ + { + "id": "displayName", + "value": "Memory Requests" + }, + { + "id": "unit", + "value": "bytes" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value #C" + }, + "properties": [ + { + "id": "displayName", + "value": "Memory Requests %" + }, + { + "id": "unit", + "value": "percentunit" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value #D" + }, + "properties": [ + { + "id": "displayName", + "value": "Memory Limits" + }, + { + "id": "unit", + "value": "bytes" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value #E" + }, + "properties": [ + { + "id": "displayName", + "value": "Memory Limits %" + }, + { + "id": "unit", + "value": "percentunit" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "pod" + }, + "properties": [ + { + "id": "displayName", + "value": "Pod" + }, + { + "id": "unit", + "value": "short" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "Drill down", + "url": "/d/ac3253a2c4a149d68ccd0a58c7ab6738/k8s-resources-pod?var-datasource=$datasource&var-namespace=$namespace&from=$__from&to=$__to&var-pod=$__value" + } + ] + }, + { + "id": "custom.align" + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 25 + }, + "id": 4, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "11.2.2", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n container_memory_working_set_bytes{namespace=\"$namespace\", container!=\"\", image!=\"\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "A" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"memory\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "B" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n container_memory_working_set_bytes{namespace=\"$namespace\", container!=\"\", image!=\"\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n/sum(\r\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"memory\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "C" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"memory\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "D" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n container_memory_working_set_bytes{namespace=\"$namespace\", container!=\"\", image!=\"\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n/sum(\r\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"memory\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "E" + } + ], + "title": "Memory Quota", + "transformations": [ + { + "id": "merge", + "options": { + "reducers": [] + } + } + ], + "type": "table" + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 32 + }, + "id": 18, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Current Network Usage", + "type": "row" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "decimals": 2, + "displayName": "", + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "displayName", + "value": "Time" + }, + { + "id": "custom.hidden", + "value": true + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value #A" + }, + "properties": [ + { + "id": "displayName", + "value": "Current Receive Bandwidth" + }, + { + "id": "unit", + "value": "Bps" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value #B" + }, + "properties": [ + { + "id": "displayName", + "value": "Current Transmit Bandwidth" + }, + { + "id": "unit", + "value": "Bps" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value #C" + }, + "properties": [ + { + "id": "displayName", + "value": "Rate of Received Packets" + }, + { + "id": "unit", + "value": "pps" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value #D" + }, + "properties": [ + { + "id": "displayName", + "value": "Rate of Transmitted Packets" + }, + { + "id": "unit", + "value": "pps" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value #E" + }, + "properties": [ + { + "id": "displayName", + "value": "Rate of Received Packets Dropped" + }, + { + "id": "unit", + "value": "pps" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value #F" + }, + "properties": [ + { + "id": "displayName", + "value": "Rate of Transmitted Packets Dropped" + }, + { + "id": "unit", + "value": "pps" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "pod" + }, + "properties": [ + { + "id": "displayName", + "value": "Pod" + }, + { + "id": "unit", + "value": "short" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "Drill down", + "url": "/d/ac3253a2c4a149d68ccd0a58c7ab6738/k8s-resources-pod?var-datasource=$datasource&var-namespace=$namespace&from=$__from&to=$__to&var-pod=$__value" + } + ] + }, + { + "id": "custom.align" + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 33 + }, + "id": 5, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "11.2.2", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(sum(irate(container_network_receive_bytes_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "A" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(sum(irate(container_network_transmit_bytes_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "B" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(sum(irate(container_network_receive_packets_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "C" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(sum(irate(container_network_transmit_packets_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "D" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(sum(irate(container_network_receive_packets_dropped_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "E" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(sum(irate(container_network_transmit_packets_dropped_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "F" + } + ], + "title": "Current Network Usage", + "transformations": [ + { + "id": "merge", + "options": { + "reducers": [] + } + } + ], + "type": "table" + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 40 + }, + "id": 19, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Bandwidth", + "type": "row" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "Bps" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 41 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.7", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(sum(irate(container_network_receive_bytes_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "title": "Receive Bandwidth", + "type": "timeseries" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "Bps" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 41 + }, + "id": 7, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.7", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(sum(irate(container_network_transmit_bytes_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "title": "Transmit Bandwidth", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 48 + }, + "id": 20, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Average Container Bandwidth by Pod", + "type": "row" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "Bps" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 49 + }, + "id": 8, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.7", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(avg(irate(container_network_receive_bytes_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "title": "Average Container Bandwidth by Pod: Received", + "type": "timeseries" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "Bps" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 49 + }, + "id": 9, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.7", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(avg(irate(container_network_transmit_bytes_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "title": "Average Container Bandwidth by Pod: Transmitted", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 56 + }, + "id": 21, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Rate of Packets", + "type": "row" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "pps" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 57 + }, + "id": 10, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.7", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(sum(irate(container_network_receive_packets_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "title": "Rate of Received Packets", + "type": "timeseries" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "pps" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 57 + }, + "id": 11, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.7", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(sum(irate(container_network_transmit_packets_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "title": "Rate of Transmitted Packets", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 64 + }, + "id": 22, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Rate of Packets Dropped", + "type": "row" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "pps" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 65 + }, + "id": 12, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.7", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(sum(irate(container_network_receive_packets_dropped_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "title": "Rate of Received Packets Dropped", + "type": "timeseries" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "pps" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 65 + }, + "id": 13, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.7", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(sum(irate(container_network_transmit_packets_dropped_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "title": "Rate of Transmitted Packets Dropped", + "type": "timeseries" + } + ], + "refresh": "1m", + "schemaVersion": 39, + "tags": [ + "kubernetes-mixin", + "Microsoft-managed" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "chicago", + "value": "fe0ylwo898wlcb" + }, + "hide": 0, + "includeAll": false, + "label": "Data Source", + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": { + "selected": false, + "text": "azure-arc", + "value": "azure-arc" + }, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "namespace", + "options": [], + "query": "label_values(kube_namespace_status_phase{job=\"kube-state-metrics\"}, namespace)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": { + "selected": false, + "text": "deployment", + "value": "deployment" + }, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "type", + "options": [], + "query": "label_values(namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\"}, workload_type)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": { + "selected": false, + "text": "cluster-metadata-operator", + "value": "cluster-metadata-operator" + }, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "workload", + "options": [], + "query": "label_values(namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload_type=\"$type\"}, workload)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "utc", + "title": "Contoso Hypermarket Workloads", + "uid": "3151475894614845ba54456099696738ff", + "version": 1, + "weekStart": "" + } \ No newline at end of file From 0b2522b97f18498358ee8e1d175ffe5828d9370f Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Wed, 16 Oct 2024 21:54:53 -0400 Subject: [PATCH 069/409] add dashboard to bootstrap --- azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 300e258340..6b65c4633f 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -248,6 +248,8 @@ Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-cluster-glob Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/arc-inventory-workbook.bicep") -OutFile "$AgMonitoringDir\arc-inventory-workbook.bicep" Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/arc-osperformance-workbook.bicep") -OutFile "$AgMonitoringDir\arc-osperformance-workbook.bicep" Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/prometheus-additional-scrape-config.yaml") -OutFile "$AgMonitoringDir\prometheus-additional-scrape-config.yaml" +Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-cluster-workloads.json") -OutFile "$AgMonitoringDir\grafana-cluster-workloads.json" +Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-cluster-pods.json") -OutFile "$AgMonitoringDir\grafana-cluster-pods.json" Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/grafana.ico") -OutFile $AgIconsDir\grafana.ico Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso.png") -OutFile $AgIconsDir\contoso.png Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso.svg") -OutFile $AgIconsDir\contoso.svg From a49e0f4a3eb1eb1aa1fcebd25341fe1f32c36160 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 17 Oct 2024 22:08:26 +0300 Subject: [PATCH 070/409] Refactor PowerShell module installation logic and make powershell module dynamic --- .../Modules/contoso_hypermarket.psm1 | 66 ++++++++++++++++++- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 4bd40c5e48..7980728817 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -14,6 +14,68 @@ function Get-K3sConfigFile{ } } +function Merge-K3sConfigFiles{ + [string] + $configFile1, + [string] + $configFile2 + +$mergedKubeconfigPath = "C:\Users\$adminUsername\.kube\config" + +# Extract base file names (without extensions) to use as new names +$suffix1 = [System.IO.Path]::GetFileNameWithoutExtension($configFile1) +$suffix2 = [System.IO.Path]::GetFileNameWithoutExtension($configFile2) + +# Load the kubeconfig files +$kubeconfig1 = [io.file]::ReadAllText($configFile1) | ConvertFrom-Yaml +$kubeconfig2 = [io.file]::ReadAllText($configFile2) | ConvertFrom-Yaml + +# Function to replace cluster, user, and context names with the file name +function Set-NamesWithFileName { + param ( + [hashtable]$kubeconfigData, + [string]$newName + ) + # Replace cluster, user, and context names with the provided file name + foreach ($cluster in $kubeconfigData.clusters) { + $cluster.name = $newName + } + foreach ($user in $kubeconfigData.users) { + $user.name = $newName + } + foreach ($context in $kubeconfigData.contexts) { + $context.name = $newName + $context.context.cluster = $newName + $context.context.user = $newName + } + return $kubeconfigData +} + +# Replace names in the first and second kubeconfig with their respective file names +$kubeconfig1 = Set-NamesWithFileName -kubeconfigData $kubeconfig1 -newName $suffix1 +$kubeconfig2 = Set-NamesWithFileName -kubeconfigData $kubeconfig2 -newName $suffix2 + +# Merge the clusters, users, and contexts from both kubeconfigs +$mergedClusters = $kubeconfig1.clusters + $kubeconfig2.clusters +$mergedUsers = $kubeconfig1.users + $kubeconfig2.users +$mergedContexts = $kubeconfig1.contexts + $kubeconfig2.contexts + +# Prepare the merged kubeconfig +$mergedKubeconfig = @{ + apiVersion = $kubeconfig1.apiVersion + kind = $kubeconfig1.kind + clusters = $mergedClusters + users = $mergedUsers + contexts = $mergedContexts + "current-context" = $kubeconfig1."current-context" # Retain the current context of the first file +} + +# Convert the merged data back to YAML and save to a new file +$mergedKubeconfig | ConvertTo-Yaml | Set-Content -Path $mergedKubeconfigPath +Write-Host "Kubeconfig files successfully merged into $mergedKubeconfigPath" +kubectx +} + function Set-K3sClusters { Write-Host "Configuring kube-vip on K3s clusterS" az login --service-principal --username $Env:spnClientID --password=$Env:spnClientSecret --tenant $Env:spnTenantId @@ -22,8 +84,8 @@ function Set-K3sClusters { if ($cluster.Value.Type -eq "k3s") { $clusterName = $cluster.Value.FriendlyName.ToLower() $vmName = $cluster.Value.ArcClusterName + "-$namingGuid" - $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" - kubectx + #$Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" + kubectx $clusterName $k3sVIP = $(az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``true``].privateIPAddress" -otsv) Write-Host "Assigning kube-vip-role on k3s cluster" $kubeVipRbac = "$($Agconfig.AgDirectories.AgToolsDir)\kubeVipRbac.yml" From 58115039d1f537963973d7f3b895ba73f58c1f64 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 17 Oct 2024 22:13:31 +0300 Subject: [PATCH 071/409] Refactor PowerShell module installation logic and merge K3s config files --- azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 | 1 + .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 7 +++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 289e65dc9a..959660666b 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -141,6 +141,7 @@ if ($scenario -eq "contoso_supermarket") { ##################################################################### if($scenario -eq "contoso_hypermarket"){ Get-K3sConfigFile + Merge-K3sConfigFiles Set-K3sClusters } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 7980728817..56a675a005 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -15,13 +15,12 @@ function Get-K3sConfigFile{ } function Merge-K3sConfigFiles{ - [string] - $configFile1, - [string] - $configFile2 $mergedKubeconfigPath = "C:\Users\$adminUsername\.kube\config" +$configFile1 = "C:\Users\$adminUsername\.kube\ag-k3s-seattle" +$configFile2 = "C:\Users\$adminUsername\.kube\ag-k3s-chicago" + # Extract base file names (without extensions) to use as new names $suffix1 = [System.IO.Path]::GetFileNameWithoutExtension($configFile1) $suffix2 = [System.IO.Path]::GetFileNameWithoutExtension($configFile2) From 3489d4aa15741ad06179b564bf3754e3b8f521cf Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 17 Oct 2024 22:48:09 +0300 Subject: [PATCH 072/409] Refactor PowerShell module installation logic and add powershell-yaml module --- .../AgConfig-contoso-hypermarket.psd1 | 3 +- .../Modules/contoso_hypermarket.psm1 | 55 ++++++++++++------- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index ab413b6903..faba2a6360 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -69,7 +69,8 @@ @{name='Az.Kusto'; version="latest"}, @{name='Az.EventGrid'; version="latest"}, @{name='Az.Storage'; version="latest"}, - @{name='Az.EventHub'; version="latest"} + @{name='Az.EventHub'; version="latest"}, + @{name='powershell-yaml'; version="latest"} ) # Chocolatey packages list diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 56a675a005..431f37042d 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -18,39 +18,55 @@ function Merge-K3sConfigFiles{ $mergedKubeconfigPath = "C:\Users\$adminUsername\.kube\config" -$configFile1 = "C:\Users\$adminUsername\.kube\ag-k3s-seattle" -$configFile2 = "C:\Users\$adminUsername\.kube\ag-k3s-chicago" +$kubeconfig1Path = "C:\Users\$adminUsername\.kube\ag-k3s-seattle" +$kubeconfig2Path = "C:\Users\$adminUsername\.kube\ag-k3s-chicago" + + +Install-Module -Name powershell-yaml -Force -Scope CurrentUser -AllowClobber +Import-Module powershell-yaml # Extract base file names (without extensions) to use as new names -$suffix1 = [System.IO.Path]::GetFileNameWithoutExtension($configFile1) -$suffix2 = [System.IO.Path]::GetFileNameWithoutExtension($configFile2) +$suffix1 = [System.IO.Path]::GetFileNameWithoutExtension($kubeconfig1Path) +$suffix2 = [System.IO.Path]::GetFileNameWithoutExtension($kubeconfig2Path) -# Load the kubeconfig files -$kubeconfig1 = [io.file]::ReadAllText($configFile1) | ConvertFrom-Yaml -$kubeconfig2 = [io.file]::ReadAllText($configFile2) | ConvertFrom-Yaml +# Load the kubeconfig files, ensuring no empty lines or structures +$kubeconfig1 = get-content $kubeconfig1Path | ConvertFrom-Yaml +$kubeconfig2 = get-content $kubeconfig2Path | ConvertFrom-Yaml -# Function to replace cluster, user, and context names with the file name +# Function to replace cluster, user, and context names with the file name, while keeping original server addresses function Set-NamesWithFileName { param ( [hashtable]$kubeconfigData, [string]$newName ) - # Replace cluster, user, and context names with the provided file name + + # Replace cluster names but keep the server addresses foreach ($cluster in $kubeconfigData.clusters) { - $cluster.name = $newName + if ($cluster.name -and $cluster.cluster.server) { + $cluster.name = "$newName" + } } + + # Replace user names foreach ($user in $kubeconfigData.users) { - $user.name = $newName + if ($user.name) { + $user.name = "$newName" + } } + + # Replace context names, but retain the correct mapping to cluster and user foreach ($context in $kubeconfigData.contexts) { - $context.name = $newName - $context.context.cluster = $newName - $context.context.user = $newName + if ($context.name -and $context.context.cluster -and $context.context.user) { + $context.name = "$newName" + $context.context.cluster = "$newName" + $context.context.user = "$newName" + } } + return $kubeconfigData } -# Replace names in the first and second kubeconfig with their respective file names +# Apply renaming using file names $kubeconfig1 = Set-NamesWithFileName -kubeconfigData $kubeconfig1 -newName $suffix1 $kubeconfig2 = Set-NamesWithFileName -kubeconfigData $kubeconfig2 -newName $suffix2 @@ -59,18 +75,19 @@ $mergedClusters = $kubeconfig1.clusters + $kubeconfig2.clusters $mergedUsers = $kubeconfig1.users + $kubeconfig2.users $mergedContexts = $kubeconfig1.contexts + $kubeconfig2.contexts -# Prepare the merged kubeconfig +# Prepare the merged kubeconfig ensuring no empty or null fields $mergedKubeconfig = @{ apiVersion = $kubeconfig1.apiVersion kind = $kubeconfig1.kind - clusters = $mergedClusters - users = $mergedUsers - contexts = $mergedContexts + clusters = $mergedClusters | Where-Object { $_.name -and $_.cluster.server } + users = $mergedUsers | Where-Object { $_.name } + contexts = $mergedContexts | Where-Object { $_.name -and $_.context.cluster -and $_.context.user } "current-context" = $kubeconfig1."current-context" # Retain the current context of the first file } # Convert the merged data back to YAML and save to a new file $mergedKubeconfig | ConvertTo-Yaml | Set-Content -Path $mergedKubeconfigPath + Write-Host "Kubeconfig files successfully merged into $mergedKubeconfigPath" kubectx } From 7090b61eb9f5c4a76758dace096a1050c4c79be6 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 17 Oct 2024 22:48:51 +0300 Subject: [PATCH 073/409] Refactor PowerShell module installation logic and remove powershell-yaml module --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 4 ---- 1 file changed, 4 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 431f37042d..6348a70d52 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -21,10 +21,6 @@ $mergedKubeconfigPath = "C:\Users\$adminUsername\.kube\config" $kubeconfig1Path = "C:\Users\$adminUsername\.kube\ag-k3s-seattle" $kubeconfig2Path = "C:\Users\$adminUsername\.kube\ag-k3s-chicago" - -Install-Module -Name powershell-yaml -Force -Scope CurrentUser -AllowClobber -Import-Module powershell-yaml - # Extract base file names (without extensions) to use as new names $suffix1 = [System.IO.Path]::GetFileNameWithoutExtension($kubeconfig1Path) $suffix2 = [System.IO.Path]::GetFileNameWithoutExtension($kubeconfig2Path) From 77b48fbc025b6c1f6447511152af7301b3b6d37e Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Thu, 17 Oct 2024 19:00:08 -0400 Subject: [PATCH 074/409] upgrade k3s --- .../rancher_k3s/azure/terraform/scripts/installK3s.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_arc_k8s_jumpstart/rancher_k3s/azure/terraform/scripts/installK3s.sh b/azure_arc_k8s_jumpstart/rancher_k3s/azure/terraform/scripts/installK3s.sh index 5c781ac6fd..490b31305e 100644 --- a/azure_arc_k8s_jumpstart/rancher_k3s/azure/terraform/scripts/installK3s.sh +++ b/azure_arc_k8s_jumpstart/rancher_k3s/azure/terraform/scripts/installK3s.sh @@ -28,7 +28,7 @@ sed -i '8s/^/export templateBaseUrl=/' vars.sh chmod +x vars.sh . ./vars.sh -export K3S_VERSION="1.28.5+k3s1" # Do not change! +export K3S_VERSION="1.29.6+k3s2" # Do not change! # Creating login message of the day (motd) sudo curl -v -o /etc/profile.d/welcomeK3s.sh ${templateBaseUrl}scripts/welcomeK3s.sh From 08469657661098023d6d64e9834e9a955e8ec277 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Fri, 18 Oct 2024 07:23:58 -0500 Subject: [PATCH 075/409] bump number of public ips --- .../contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep index acf99818e9..2a2e5a68bc 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep @@ -44,7 +44,7 @@ var networkInterfaceName = '${vmName}-NIC' var osDiskType = 'Premium_LRS' var k3sControlPlane = 'true' // deploy single-node k3s control plane var diskSize = 512 -var numberOfIPAddresses = 8 // The number of IP addresses to create +var numberOfIPAddresses = 14 // The number of IP addresses to create // Create multiple public IP addresses if deployBastion is false resource publicIpAddresses 'Microsoft.Network/publicIpAddresses@2022-01-01' = [for i in range(1, numberOfIPAddresses): { From 0c95b4a135d8cff79edf999ce6d33f3fa51077e9 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Fri, 18 Oct 2024 07:26:10 -0500 Subject: [PATCH 076/409] revert changes to try kubectx --- .../PowerShell/Modules/contoso_hypermarket.psm1 | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 24900979fc..6b0642f9e2 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -2,8 +2,6 @@ function Get-K3sConfigFile{ # Downloading k3s Kubernetes cluster kubeconfig file Write-Host "Downloading k3s Kubeconfigs" $Env:AZCOPY_AUTO_LOGIN_TYPE="PSCRED" - $Env:KUBECONFIG="" - $contexts="" foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { $clusterName = $cluster.Name.ToLower() $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" @@ -12,12 +10,12 @@ function Get-K3sConfigFile{ azcopy copy $sourceFile "C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" --check-length=false $sourceFile = "https://$stagingStorageAccountName.blob.core.windows.net/$containerName/*" azcopy cp --check-md5 FailIfDifferentOrMissing $sourceFile "$AgLogsDir\" --include-pattern "*.log" - $kubeconfigpath = $kubeconfigpath + "$Env:USERPROFILE\.kube\ag-k3s-$clusterName" + ";" + #$kubeconfigpath = $kubeconfigpath + "$Env:USERPROFILE\.kube\ag-k3s-$clusterName" + ";" } - $Env:KUBECONFIG = $kubeconfigpath # Set the KUBECONFIG environment variable to the merged kubeconfig path - kubectl config view --merge --flatten > "$Env:USERPROFILE\.kube\config-raw" - $Env:KUBECONFIG = "$Env:USERPROFILE\.kube\config-raw" - kubectx # display available clusters + #$Env:KUBECONFIG = $kubeconfigpath # Set the KUBECONFIG environment variable to the merged kubeconfig path + #kubectl config view --merge --flatten > "$Env:USERPROFILE\.kube\config-raw" + #$Env:KUBECONFIG = "$Env:USERPROFILE\.kube\config-raw" + #kubectx # display available clusters } function Set-K3sClusters { From c4dd870d4fe9d3a3fd10430485bdc4b54278e782 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Fri, 18 Oct 2024 07:46:32 -0500 Subject: [PATCH 077/409] revert kubectx fix --- azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 | 1 - 1 file changed, 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 4a8c384e71..3e09f5d882 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -240,7 +240,6 @@ if($scenario -eq "contoso_supermarket"){ Deploy-MotorsBookmarks }elseif($scenario -eq "contoso_hypermarket"){ #Deploy-HypermarketBookmarks - $Env:KUBECONFIG = "$Env:USERPROFILE\.kube\config-raw" } ############################################################## From 9819838591a1c62c93da8a762c65f5a163dd13e4 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Fri, 18 Oct 2024 07:55:39 -0500 Subject: [PATCH 078/409] remove public IPs --- .../bicep/kubernetes/ubuntuRancher.bicep | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep index 2a2e5a68bc..9cea181855 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep @@ -39,28 +39,28 @@ param storageContainerName string @description('Random GUID') param namingGuid string -var publicIpAddressName = '${vmName}-PIP' +//var publicIpAddressName = '${vmName}-PIP' var networkInterfaceName = '${vmName}-NIC' var osDiskType = 'Premium_LRS' var k3sControlPlane = 'true' // deploy single-node k3s control plane var diskSize = 512 var numberOfIPAddresses = 14 // The number of IP addresses to create -// Create multiple public IP addresses if deployBastion is false -resource publicIpAddresses 'Microsoft.Network/publicIpAddresses@2022-01-01' = [for i in range(1, numberOfIPAddresses): { - name: '${publicIpAddressName}${i}' - location: azureLocation - properties: { - publicIPAllocationMethod: 'Static' - publicIPAddressVersion: 'IPv4' - idleTimeoutInMinutes: 4 - } - sku: { - name: 'Basic' - } -}] - -// Create multiple NIC IP configurations and assign the public IP to the IP configuration if deployBastion is false +// // Create multiple public IP addresses +// resource publicIpAddresses 'Microsoft.Network/publicIpAddresses@2022-01-01' = [for i in range(1, numberOfIPAddresses): { +// name: '${publicIpAddressName}${i}' +// location: azureLocation +// properties: { +// publicIPAllocationMethod: 'Static' +// publicIPAddressVersion: 'IPv4' +// idleTimeoutInMinutes: 4 +// } +// sku: { +// name: 'Basic' +// } +// }] + +// Create multiple NIC IP configurations and assign the public IP to the IP configuration resource networkInterface 'Microsoft.Network/networkInterfaces@2022-01-01' = { name: networkInterfaceName location: azureLocation @@ -73,7 +73,7 @@ resource networkInterface 'Microsoft.Network/networkInterfaces@2022-01-01' = { } privateIPAllocationMethod: 'Dynamic' publicIPAddress: { - id: publicIpAddresses[i-1].id + id: null } primary: i == 1 ? true : false } From f1f0a171884e13d0bdf4123cf32e2d925e7f487d Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Fri, 18 Oct 2024 08:14:09 -0500 Subject: [PATCH 079/409] pip --- .../contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep | 3 --- 1 file changed, 3 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep index 9cea181855..bc5db877ca 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep @@ -72,9 +72,6 @@ resource networkInterface 'Microsoft.Network/networkInterfaces@2022-01-01' = { id: subnetId } privateIPAllocationMethod: 'Dynamic' - publicIPAddress: { - id: null - } primary: i == 1 ? true : false } }] From e0678d4f7414e02c17f8ddc2dd61839c079c84fc Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Fri, 18 Oct 2024 08:28:51 -0500 Subject: [PATCH 080/409] revert pip changes --- .../bicep/kubernetes/ubuntuRancher.bicep | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep index bc5db877ca..28dbdf432a 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep @@ -39,26 +39,26 @@ param storageContainerName string @description('Random GUID') param namingGuid string -//var publicIpAddressName = '${vmName}-PIP' +var publicIpAddressName = '${vmName}-PIP' var networkInterfaceName = '${vmName}-NIC' var osDiskType = 'Premium_LRS' var k3sControlPlane = 'true' // deploy single-node k3s control plane var diskSize = 512 var numberOfIPAddresses = 14 // The number of IP addresses to create -// // Create multiple public IP addresses -// resource publicIpAddresses 'Microsoft.Network/publicIpAddresses@2022-01-01' = [for i in range(1, numberOfIPAddresses): { -// name: '${publicIpAddressName}${i}' -// location: azureLocation -// properties: { -// publicIPAllocationMethod: 'Static' -// publicIPAddressVersion: 'IPv4' -// idleTimeoutInMinutes: 4 -// } -// sku: { -// name: 'Basic' -// } -// }] +// Create multiple public IP addresses +resource publicIpAddresses 'Microsoft.Network/publicIpAddresses@2022-01-01' = [for i in range(1, numberOfIPAddresses): { + name: '${publicIpAddressName}${i}' + location: azureLocation + properties: { + publicIPAllocationMethod: 'Static' + publicIPAddressVersion: 'IPv4' + idleTimeoutInMinutes: 4 + } + sku: { + name: 'Basic' + } +}] // Create multiple NIC IP configurations and assign the public IP to the IP configuration resource networkInterface 'Microsoft.Network/networkInterfaces@2022-01-01' = { @@ -72,6 +72,9 @@ resource networkInterface 'Microsoft.Network/networkInterfaces@2022-01-01' = { id: subnetId } privateIPAllocationMethod: 'Dynamic' + publicIPAddress: { + id: publicIpAddresses[i-1].id + } primary: i == 1 ? true : false } }] From 99feee4ee0ba2d9f84f5f9496b05373963ed7ba9 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sat, 19 Oct 2024 16:01:08 -0400 Subject: [PATCH 081/409] fix dashboard and add pip --- .../monitoring/grafana-cluster-pods.json | 4632 ++++++++--------- .../monitoring/grafana-cluster-workloads.json | 4182 +++++++-------- .../bicep/kubernetes/ubuntuRancher.bicep | 2 +- 3 files changed, 4408 insertions(+), 4408 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json index 5ccb8f18a5..c7bba19a51 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json @@ -1,2396 +1,2396 @@ { - "annotations": { - "list": [ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 23, + "links": [], + "panels": [ + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 17, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "CPU Usage", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 1 + }, + "hiddenSeries": false, + "id": 1, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "requests", + "color": "#F2495C", + "fill": 0, + "hideTooltip": true, + "legend": true, + "linewidth": 2, + "stack": false + }, + { + "alias": "limits", + "color": "#FF9830", + "fill": 0, + "hideTooltip": true, + "legend": true, + "linewidth": 2, + "stack": false + } + ], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "time_series", + "legendFormat": "{{container}}", + "refId": "A" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", namespace=\"$namespace\", pod=\"$pod\", resource=\"cpu\"}\r\n)\r\n", + "format": "time_series", + "legendFormat": "requests", + "refId": "B" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", namespace=\"$namespace\", pod=\"$pod\", resource=\"cpu\"}\r\n)\r\n", + "format": "time_series", + "legendFormat": "limits", + "refId": "C" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "CPU Usage", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 8 + }, + "id": 18, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "CPU Throttling", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 9 + }, + "hiddenSeries": false, + "id": 2, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(increase(container_cpu_cfs_throttled_periods_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\"}[$__rate_interval])) by (container) /sum(increase(container_cpu_cfs_periods_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\"}[$__rate_interval])) by (container)", + "format": "time_series", + "legendFormat": "{{container}}", + "refId": "A" + } + ], + "thresholds": [ + { + "colorMode": "critical", + "fill": true, + "line": true, + "op": "gt", + "value": 0.25, + "yaxis": "left" + } + ], + "timeRegions": [], + "title": "CPU Throttling", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percentunit", + "logBase": 1, + "max": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 16 + }, + "id": 19, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "CPU Quota", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "columns": [], + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 1, + "fontSize": "100%", + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 17 + }, + "id": 3, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "showHeader": true, + "sort": { + "col": 0, + "desc": true + }, + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "styles": [ + { + "alias": "Time", + "align": "auto", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "CPU Usage", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Requests", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Requests %", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "CPU Limits", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Limits %", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #E", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Container", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "container", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "string", + "unit": "short" + } + ], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "A" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_requests{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "B" + }, { - "builtIn": 1, "datasource": { - "type": "grafana", - "uid": "-- Grafana --" + "uid": "$datasource" }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\", pod=\"$pod\"}) by (container) / sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_requests{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "C" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "D" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\", pod=\"$pod\"}) by (container) / sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "E" + } + ], + "thresholds": [], + "title": "CPU Quota", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "transform": "table", + "type": "table-old", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false } ] }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": 23, - "links": [], - "panels": [ - { - "collapsed": false, - "datasource": { - "uid": "$datasource" + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 24 + }, + "id": 20, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Memory Usage", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 25 + }, + "hiddenSeries": false, + "id": 4, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "requests", + "color": "#F2495C", + "dashes": true, + "fill": 0, + "hideTooltip": true, + "legend": true, + "linewidth": 2, + "stack": false + }, + { + "alias": "limits", + "color": "#FF9830", + "dashes": true, + "fill": 0, + "hideTooltip": true, + "legend": true, + "linewidth": 2, + "stack": false + } + ], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\", image!=\"\"}) by (container)", + "format": "time_series", + "legendFormat": "{{container}}", + "refId": "A" }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 17, - "panels": [], - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "refId": "A" - } - ], - "title": "CPU Usage", - "type": "row" + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", namespace=\"$namespace\", pod=\"$pod\", resource=\"memory\"}\r\n)\r\n", + "format": "time_series", + "legendFormat": "requests", + "refId": "B" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", namespace=\"$namespace\", pod=\"$pod\", resource=\"memory\"}\r\n)\r\n", + "format": "time_series", + "legendFormat": "limits", + "refId": "C" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Memory Usage (WSS)", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "$datasource" + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "logBase": 1, + "min": 0, + "show": true }, - "fill": 10, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 1 - }, - "hiddenSeries": false, - "id": 1, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "nullPointMode": "null as zero", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "10.4.7", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "requests", - "color": "#F2495C", - "fill": 0, - "hideTooltip": true, - "legend": true, - "linewidth": 2, - "stack": false + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 32 + }, + "id": 21, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" }, - { - "alias": "limits", - "color": "#FF9830", - "fill": 0, - "hideTooltip": true, - "legend": true, - "linewidth": 2, - "stack": false - } - ], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", - "format": "time_series", - "legendFormat": "{{container}}", - "refId": "A" + "refId": "A" + } + ], + "title": "Memory Quota", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "columns": [], + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 1, + "fontSize": "100%", + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 33 + }, + "id": 5, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "showHeader": true, + "sort": { + "col": 0, + "desc": true + }, + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "styles": [ + { + "alias": "Time", + "align": "auto", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "Memory Usage (WSS)", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Memory Requests", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Memory Requests %", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Memory Limits", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Memory Limits %", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #E", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Memory Usage (RSS)", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #F", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Memory Usage (Cache)", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #G", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Memory Usage (Swap)", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #H", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Container", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "container", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "string", + "unit": "short" + } + ], + "targets": [ + { + "datasource": { + "uid": "$datasource" }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(\r\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", namespace=\"$namespace\", pod=\"$pod\", resource=\"cpu\"}\r\n)\r\n", - "format": "time_series", - "legendFormat": "requests", - "refId": "B" + "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\", image!=\"\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "A" + }, + { + "datasource": { + "uid": "$datasource" }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(\r\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", namespace=\"$namespace\", pod=\"$pod\", resource=\"cpu\"}\r\n)\r\n", - "format": "time_series", - "legendFormat": "limits", - "refId": "C" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "CPU Usage", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "logBase": 1, - "min": 0, - "show": true + "expr": "sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_requests{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "B" + }, + { + "datasource": { + "uid": "$datasource" }, - { - "format": "short", - "logBase": 1, - "show": false - } - ], - "yaxis": { - "align": false + "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", image!=\"\"}) by (container) / sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_requests{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "C" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_limits{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "D" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\", image!=\"\"}) by (container) / sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_limits{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "E" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(container_memory_rss{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container != \"\", container != \"POD\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "F" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(container_memory_cache{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container != \"\", container != \"POD\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "G" + }, + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(container_memory_swap{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container != \"\", container != \"POD\"}) by (container)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "H" } + ], + "thresholds": [], + "title": "Memory Quota", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" }, - { - "collapsed": false, - "datasource": { - "uid": "$datasource" + "transform": "table", + "type": "table-old", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "logBase": 1, + "min": 0, + "show": true }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 8 - }, - "id": 18, - "panels": [], - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "refId": "A" - } - ], - "title": "CPU Throttling", - "type": "row" + { + "format": "short", + "logBase": 1, + "show": false + } + ] + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "$datasource" + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 40 + }, + "id": 22, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Bandwidth", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 41 + }, + "hiddenSeries": false, + "id": 6, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(irate(container_network_receive_bytes_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])) by (pod)", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Receive Bandwidth", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "logBase": 1, + "min": 0, + "show": true }, - "fill": 10, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 9 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": true, - "max": true, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "nullPointMode": "null as zero", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "10.4.7", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(increase(container_cpu_cfs_throttled_periods_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\"}[$__rate_interval])) by (container) /sum(increase(container_cpu_cfs_periods_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\"}[$__rate_interval])) by (container)", - "format": "time_series", - "legendFormat": "{{container}}", - "refId": "A" - } - ], - "thresholds": [ - { - "colorMode": "critical", - "fill": true, - "line": true, - "op": "gt", - "value": 0.25, - "yaxis": "left" - } - ], - "timeRegions": [], - "title": "CPU Throttling", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "percentunit", - "logBase": 1, - "max": 1, - "min": 0, - "show": true + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 41 + }, + "hiddenSeries": false, + "id": 7, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(irate(container_network_transmit_bytes_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])) by (pod)", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Transmit Bandwidth", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 48 + }, + "id": 23, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Rate of Packets", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 49 + }, + "hiddenSeries": false, + "id": 8, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(irate(container_network_receive_packets_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])) by (pod)", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Rate of Received Packets", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "pps", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 49 + }, + "hiddenSeries": false, + "id": 9, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(irate(container_network_transmit_packets_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])) by (pod)", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Rate of Transmitted Packets", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "pps", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 56 + }, + "id": 24, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Rate of Packets Dropped", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 57 + }, + "hiddenSeries": false, + "id": 10, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(irate(container_network_receive_packets_dropped_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])) by (pod)", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Rate of Received Packets Dropped", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "pps", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 57 + }, + "hiddenSeries": false, + "id": 11, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(irate(container_network_transmit_packets_dropped_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])) by (pod)", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Rate of Transmitted Packets Dropped", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "pps", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 64 + }, + "id": 25, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Storage IO - Distribution(Pod - Read & Writes)", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" + }, + "decimals": -1, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 65 + }, + "hiddenSeries": false, + "id": 12, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "ceil(sum by(pod) (rate(container_fs_reads_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])))", + "format": "time_series", + "legendFormat": "Reads", + "refId": "A" + }, + { + "datasource": { + "uid": "$datasource" }, - { - "format": "short", - "logBase": 1, - "show": false - } - ], - "yaxis": { - "align": false + "expr": "ceil(sum by(pod) (rate(container_fs_writes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\",namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])))", + "format": "time_series", + "legendFormat": "Writes", + "refId": "B" } + ], + "thresholds": [], + "timeRegions": [], + "title": "IOPS", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" }, - { - "collapsed": false, - "datasource": { - "uid": "$datasource" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 16 - }, - "id": 19, - "panels": [], - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "refId": "A" - } - ], - "title": "CPU Quota", - "type": "row" + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] }, - { - "aliasColors": {}, - "bars": false, - "columns": [], - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "$datasource" + "yaxes": [ + { + "format": "short", + "logBase": 1, + "min": 0, + "show": true }, - "fill": 1, - "fontSize": "100%", - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 17 - }, - "id": 3, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "showHeader": true, - "sort": { - "col": 0, - "desc": true - }, - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "align": "auto", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "CPU Usage", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Requests", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Requests %", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "CPU Limits", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Limits %", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "Container", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "container", - "thresholds": [], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "A" - }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_requests{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "B" - }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\", pod=\"$pod\"}) by (container) / sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_requests{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "C" - }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "D" - }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\", pod=\"$pod\"}) by (container) / sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "E" - } - ], - "thresholds": [], - "title": "CPU Quota", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table-old", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "logBase": 1, - "min": 0, - "show": true - }, - { - "format": "short", - "logBase": 1, - "show": false - } - ] + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" }, - { - "collapsed": false, - "datasource": { - "uid": "$datasource" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 24 - }, - "id": 20, - "panels": [], - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "refId": "A" - } - ], - "title": "Memory Usage", - "type": "row" + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 65 }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "$datasource" - }, - "fill": 10, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 25 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "nullPointMode": "null as zero", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "10.4.7", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "requests", - "color": "#F2495C", - "dashes": true, - "fill": 0, - "hideTooltip": true, - "legend": true, - "linewidth": 2, - "stack": false - }, - { - "alias": "limits", - "color": "#FF9830", - "dashes": true, - "fill": 0, - "hideTooltip": true, - "legend": true, - "linewidth": 2, - "stack": false - } - ], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\", image!=\"\"}) by (container)", - "format": "time_series", - "legendFormat": "{{container}}", - "refId": "A" - }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(\r\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", namespace=\"$namespace\", pod=\"$pod\", resource=\"memory\"}\r\n)\r\n", - "format": "time_series", - "legendFormat": "requests", - "refId": "B" + "hiddenSeries": false, + "id": 13, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(\r\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", namespace=\"$namespace\", pod=\"$pod\", resource=\"memory\"}\r\n)\r\n", - "format": "time_series", - "legendFormat": "limits", - "refId": "C" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Memory Usage (WSS)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "logBase": 1, - "min": 0, - "show": true + "expr": "sum by(pod) (rate(container_fs_reads_bytes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", + "format": "time_series", + "legendFormat": "Reads", + "refId": "A" + }, + { + "datasource": { + "uid": "$datasource" }, - { - "format": "short", - "logBase": 1, - "show": false - } - ], - "yaxis": { - "align": false + "expr": "sum by(pod) (rate(container_fs_writes_bytes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", + "format": "time_series", + "legendFormat": "Writes", + "refId": "B" } + ], + "thresholds": [], + "timeRegions": [], + "title": "ThroughPut", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" }, - { - "collapsed": false, - "datasource": { - "uid": "$datasource" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 32 - }, - "id": 21, - "panels": [], - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "refId": "A" - } - ], - "title": "Memory Quota", - "type": "row" + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] }, - { - "aliasColors": {}, - "bars": false, - "columns": [], - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "$datasource" + "yaxes": [ + { + "format": "Bps", + "logBase": 1, + "min": 0, + "show": true }, - "fill": 1, - "fontSize": "100%", - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 33 - }, - "id": 5, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "showHeader": true, - "sort": { - "col": 0, - "desc": true - }, - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "align": "auto", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "Memory Usage (WSS)", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Requests", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Requests %", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "Memory Limits", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Limits %", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [], - "type": "number", - "unit": "percentunit" - }, - { - "alias": "Memory Usage (RSS)", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #F", - "thresholds": [], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Usage (Cache)", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #G", - "thresholds": [], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Memory Usage (Swap)", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #H", - "thresholds": [], - "type": "number", - "unit": "bytes" - }, - { - "alias": "Container", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "container", - "thresholds": [], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\", image!=\"\"}) by (container)", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "A" - }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_requests{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "B" - }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", image!=\"\"}) by (container) / sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_requests{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "C" - }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_limits{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "D" - }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\", image!=\"\"}) by (container) / sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_limits{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "E" - }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(container_memory_rss{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container != \"\", container != \"POD\"}) by (container)", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "F" - }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(container_memory_cache{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container != \"\", container != \"POD\"}) by (container)", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "G" - }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(container_memory_swap{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container != \"\", container != \"POD\"}) by (container)", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "H" - } - ], - "thresholds": [], - "title": "Memory Quota", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table-old", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "logBase": 1, - "min": 0, - "show": true - }, - { - "format": "short", - "logBase": 1, - "show": false - } - ] + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" }, - { - "collapsed": false, - "datasource": { - "uid": "$datasource" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 40 - }, - "id": 22, - "panels": [], - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "refId": "A" - } - ], - "title": "Bandwidth", - "type": "row" + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 72 }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "$datasource" - }, - "fill": 10, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 41 - }, - "hiddenSeries": false, - "id": 6, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "nullPointMode": "null as zero", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "10.4.7", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(irate(container_network_receive_bytes_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])) by (pod)", - "format": "time_series", - "legendFormat": "{{pod}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Receive Bandwidth", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "Bps", - "logBase": 1, - "min": 0, - "show": true + "id": 26, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" }, - { - "format": "short", - "logBase": 1, - "show": false - } - ], - "yaxis": { - "align": false + "refId": "A" } + ], + "title": "Storage IO - Distribution(Containers)", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "$datasource" - }, - "fill": 10, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 41 - }, - "hiddenSeries": false, - "id": 7, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "nullPointMode": "null as zero", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "10.4.7", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(irate(container_network_transmit_bytes_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])) by (pod)", - "format": "time_series", - "legendFormat": "{{pod}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Transmit Bandwidth", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "Bps", - "logBase": 1, - "min": 0, - "show": true + "decimals": -1, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 73 + }, + "hiddenSeries": false, + "id": 14, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" }, - { - "format": "short", - "logBase": 1, - "show": false - } - ], - "yaxis": { - "align": false + "expr": "ceil(sum by(container) (rate(container_fs_reads_total{job=\"kubelet\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]) + rate(container_fs_writes_total{job=\"kubelet\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])))", + "format": "time_series", + "legendFormat": "{{container}}", + "refId": "A" } + ], + "thresholds": [], + "timeRegions": [], + "title": "IOPS(Reads+Writes)", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" }, - { - "collapsed": false, - "datasource": { - "uid": "$datasource" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 48 - }, - "id": 23, - "panels": [], - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "refId": "A" - } - ], - "title": "Rate of Packets", - "type": "row" + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "$datasource" + "yaxes": [ + { + "format": "short", + "logBase": 1, + "min": 0, + "show": true }, - "fill": 10, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 49 - }, - "hiddenSeries": false, - "id": 8, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "nullPointMode": "null as zero", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "10.4.7", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(irate(container_network_receive_packets_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])) by (pod)", - "format": "time_series", - "legendFormat": "{{pod}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Rate of Received Packets", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "pps", - "logBase": 1, - "min": 0, - "show": true - }, - { - "format": "short", - "logBase": 1, - "show": false - } - ], - "yaxis": { - "align": false + { + "format": "short", + "logBase": 1, + "show": false } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "$datasource" - }, - "fill": 10, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 49 - }, - "hiddenSeries": false, - "id": 9, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "nullPointMode": "null as zero", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "10.4.7", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(irate(container_network_transmit_packets_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])) by (pod)", - "format": "time_series", - "legendFormat": "{{pod}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Rate of Transmitted Packets", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "pps", - "logBase": 1, - "min": 0, - "show": true + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 73 + }, + "hiddenSeries": false, + "id": 15, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.7", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$datasource" }, - { - "format": "short", - "logBase": 1, - "show": false - } - ], - "yaxis": { - "align": false + "expr": "sum by(container) (rate(container_fs_reads_bytes_total{job=\"kubelet\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]) + rate(container_fs_writes_bytes_total{job=\"kubelet\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", + "format": "time_series", + "legendFormat": "{{container}}", + "refId": "A" } + ], + "thresholds": [], + "timeRegions": [], + "title": "ThroughPut(Read+Write)", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" }, - { - "collapsed": false, - "datasource": { - "uid": "$datasource" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 56 - }, - "id": 24, - "panels": [], - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "refId": "A" - } - ], - "title": "Rate of Packets Dropped", - "type": "row" + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "$datasource" + "yaxes": [ + { + "format": "Bps", + "logBase": 1, + "min": 0, + "show": true }, - "fill": 10, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 57 - }, - "hiddenSeries": false, - "id": 10, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "nullPointMode": "null as zero", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "10.4.7", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(irate(container_network_receive_packets_dropped_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])) by (pod)", - "format": "time_series", - "legendFormat": "{{pod}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Rate of Received Packets Dropped", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "pps", - "logBase": 1, - "min": 0, - "show": true - }, - { - "format": "short", - "logBase": 1, - "show": false - } - ], - "yaxis": { - "align": false + { + "format": "short", + "logBase": 1, + "show": false } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "$datasource" - }, - "fill": 10, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 57 - }, - "hiddenSeries": false, - "id": 11, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "nullPointMode": "null as zero", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "10.4.7", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(irate(container_network_transmit_packets_dropped_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])) by (pod)", - "format": "time_series", - "legendFormat": "{{pod}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Rate of Transmitted Packets Dropped", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "pps", - "logBase": 1, - "min": 0, - "show": true + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 80 + }, + "id": 27, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" }, - { - "format": "short", - "logBase": 1, - "show": false - } - ], - "yaxis": { - "align": false + "refId": "A" } + ], + "title": "Storage IO - Distribution", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$datasource" }, - { - "collapsed": false, - "datasource": { - "uid": "$datasource" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 64 - }, - "id": 25, - "panels": [], - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "refId": "A" - } - ], - "title": "Storage IO - Distribution(Pod - Read & Writes)", - "type": "row" + "fill": 1, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 81 }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "$datasource" + "id": 16, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "sort": { + "col": 4, + "desc": true + }, + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "styles": [ + { + "alias": "Time", + "align": "auto", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" }, - "decimals": -1, - "fill": 10, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 65 - }, - "hiddenSeries": false, - "id": 12, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "nullPointMode": "null as zero", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "10.4.7", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "ceil(sum by(pod) (rate(container_fs_reads_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])))", - "format": "time_series", - "legendFormat": "Reads", - "refId": "A" + { + "alias": "IOPS(Reads)", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": -1, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "IOPS(Writes)", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": -1, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "IOPS(Reads + Writes)", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": -1, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "Throughput(Read)", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "Bps" + }, + { + "alias": "Throughput(Write)", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #E", + "thresholds": [], + "type": "number", + "unit": "Bps" + }, + { + "alias": "Throughput(Read + Write)", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #F", + "thresholds": [], + "type": "number", + "unit": "Bps" + }, + { + "alias": "Container", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "container", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "align": "auto", + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "string", + "unit": "short" + } + ], + "targets": [ + { + "datasource": { + "uid": "$datasource" }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "ceil(sum by(pod) (rate(container_fs_writes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\",namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])))", - "format": "time_series", - "legendFormat": "Writes", - "refId": "B" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "IOPS", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "logBase": 1, - "min": 0, - "show": true + "expr": "sum by(container) (rate(container_fs_reads_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "A" + }, + { + "datasource": { + "uid": "$datasource" }, - { - "format": "short", - "logBase": 1, - "show": false - } - ], - "yaxis": { - "align": false - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "$datasource" + "expr": "sum by(container) (rate(container_fs_writes_total{job=\"kubelet\",device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "B" }, - "fill": 10, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 65 - }, - "hiddenSeries": false, - "id": 13, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "nullPointMode": "null as zero", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "10.4.7", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum by(pod) (rate(container_fs_reads_bytes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", - "format": "time_series", - "legendFormat": "Reads", - "refId": "A" + { + "datasource": { + "uid": "$datasource" }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum by(pod) (rate(container_fs_writes_bytes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", - "format": "time_series", - "legendFormat": "Writes", - "refId": "B" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "ThroughPut", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "Bps", - "logBase": 1, - "min": 0, - "show": true + "expr": "sum by(container) (rate(container_fs_reads_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]) + rate(container_fs_writes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "C" + }, + { + "datasource": { + "uid": "$datasource" }, - { - "format": "short", - "logBase": 1, - "show": false - } - ], - "yaxis": { - "align": false - } - }, - { - "collapsed": false, - "datasource": { - "uid": "$datasource" + "expr": "sum by(container) (rate(container_fs_reads_bytes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "D" }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 72 - }, - "id": 26, - "panels": [], - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "refId": "A" - } - ], - "title": "Storage IO - Distribution(Containers)", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "$datasource" + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum by(container) (rate(container_fs_writes_bytes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "E" }, - "decimals": -1, - "fill": 10, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 73 - }, - "hiddenSeries": false, - "id": 14, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "nullPointMode": "null as zero", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "10.4.7", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "ceil(sum by(container) (rate(container_fs_reads_total{job=\"kubelet\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]) + rate(container_fs_writes_total{job=\"kubelet\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])))", - "format": "time_series", - "legendFormat": "{{container}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "IOPS(Reads+Writes)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "logBase": 1, - "min": 0, - "show": true + { + "datasource": { + "uid": "$datasource" }, - { - "format": "short", - "logBase": 1, - "show": false - } - ], - "yaxis": { - "align": false + "expr": "sum by(container) (rate(container_fs_reads_bytes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]) + rate(container_fs_writes_bytes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "F" } + ], + "thresholds": [], + "title": "Current Storage IO", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "$datasource" + "transform": "table", + "type": "table-old", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "logBase": 1, + "min": 0, + "show": true }, - "fill": 10, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 73 - }, - "hiddenSeries": false, - "id": 15, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 0, - "nullPointMode": "null as zero", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "10.4.7", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum by(container) (rate(container_fs_reads_bytes_total{job=\"kubelet\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]) + rate(container_fs_writes_bytes_total{job=\"kubelet\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", - "format": "time_series", - "legendFormat": "{{container}}", - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "ThroughPut(Read+Write)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "Bps", - "logBase": 1, - "min": 0, - "show": true - }, - { - "format": "short", - "logBase": 1, - "show": false - } - ], - "yaxis": { - "align": false + { + "format": "short", + "logBase": 1, + "show": false } + ] + } + ], + "schemaVersion": 39, + "tags": [ + "kubernetes-mixin", + "Microsoft-managed" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "Managed_Prometheus_zmazmon1", + "value": "zmazmon1" + }, + "hide": 0, + "includeAll": false, + "label": "Data Source", + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" }, { - "collapsed": false, + "current": { + "selected": false, + "text": "azure-arc", + "value": "azure-arc" + }, "datasource": { + "type": "prometheus", "uid": "$datasource" }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 80 - }, - "id": 27, - "panels": [], - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "refId": "A" - } - ], - "title": "Storage IO - Distribution", - "type": "row" + "definition": "", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "namespace", + "options": [], + "query": "label_values(kube_namespace_status_phase{job=\"kube-state-metrics\"}, namespace)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false }, { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, + "current": { + "selected": false, + "text": "cluster-metadata-operator-dfb9f4b7f-wvvhj", + "value": "cluster-metadata-operator-dfb9f4b7f-wvvhj" + }, "datasource": { + "type": "prometheus", "uid": "$datasource" }, - "fill": 1, - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 81 - }, - "id": 16, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "sort": { - "col": 4, - "desc": true - }, - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "styles": [ - { - "alias": "Time", - "align": "auto", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "hidden" - }, - { - "alias": "IOPS(Reads)", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": -1, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #A", - "thresholds": [], - "type": "number", - "unit": "short" - }, - { - "alias": "IOPS(Writes)", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": -1, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #B", - "thresholds": [], - "type": "number", - "unit": "short" - }, - { - "alias": "IOPS(Reads + Writes)", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": -1, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #C", - "thresholds": [], - "type": "number", - "unit": "short" - }, - { - "alias": "Throughput(Read)", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #D", - "thresholds": [], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Throughput(Write)", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #E", - "thresholds": [], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Throughput(Read + Write)", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "Value #F", - "thresholds": [], - "type": "number", - "unit": "Bps" - }, - { - "alias": "Container", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "linkTargetBlank": false, - "linkTooltip": "Drill down", - "linkUrl": "", - "pattern": "container", - "thresholds": [], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "align": "auto", - "colors": [], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "/.*/", - "thresholds": [], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum by(container) (rate(container_fs_reads_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "A" - }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum by(container) (rate(container_fs_writes_total{job=\"kubelet\",device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "B" - }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum by(container) (rate(container_fs_reads_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]) + rate(container_fs_writes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "C" - }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum by(container) (rate(container_fs_reads_bytes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "D" - }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum by(container) (rate(container_fs_writes_bytes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "E" - }, - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum by(container) (rate(container_fs_reads_bytes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]) + rate(container_fs_writes_bytes_total{job=\"kubelet\", device=~\"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "F" - } - ], - "thresholds": [], - "title": "Current Storage IO", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "transform": "table", - "type": "table-old", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "logBase": 1, - "min": 0, - "show": true - }, - { - "format": "short", - "logBase": 1, - "show": false - } - ] + "definition": "", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "pod", + "options": [], + "query": "label_values(kube_pod_info{job=\"kube-state-metrics\", namespace=\"$namespace\"}, pod)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false } + ] + }, + "time": { + "from": "2024-10-16T17:17:09.316Z", + "to": "2024-10-16T18:17:09.316Z" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" ], - "schemaVersion": 39, - "tags": [ - "kubernetes-mixin", - "Microsoft-managed" - ], - "templating": { - "list": [ - { - "current": { - "selected": false, - "text": "Managed_Prometheus_zmazmon1", - "value": "zmazmon1" - }, - "hide": 0, - "includeAll": false, - "label": "Data Source", - "multi": false, - "name": "datasource", - "options": [], - "query": "prometheus", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" - }, - { - "current": { - "selected": false, - "text": "azure-arc", - "value": "azure-arc" - }, - "datasource": { - "type": "prometheus", - "uid": "$datasource" - }, - "definition": "", - "hide": 0, - "includeAll": false, - "multi": false, - "name": "namespace", - "options": [], - "query": "label_values(kube_namespace_status_phase{job=\"kube-state-metrics\"}, namespace)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "current": { - "selected": false, - "text": "cluster-metadata-operator-dfb9f4b7f-wvvhj", - "value": "cluster-metadata-operator-dfb9f4b7f-wvvhj" - }, - "datasource": { - "type": "prometheus", - "uid": "$datasource" - }, - "definition": "", - "hide": 0, - "includeAll": false, - "multi": false, - "name": "pod", - "options": [], - "query": "label_values(kube_pod_info{job=\"kube-state-metrics\", namespace=\"$namespace\"}, pod)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "2024-10-16T17:17:09.316Z", - "to": "2024-10-16T18:17:09.316Z" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "Contoso Hypermarket Pods", - "uid": "ac3253a2c4a149d68ccd0a58c7ab6738", - "version": 1, - "weekStart": "" - } \ No newline at end of file + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "utc", + "title": "Contoso Hypermarket Pods", + "uid": "ac3253a2c4a149d68ccd0a58c7ab6738", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json index b95e00c1b0..acbbedfb2d 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json @@ -1,2213 +1,2213 @@ { - "annotations": { - "list": [ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 39, + "links": [], + "panels": [ + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 14, + "panels": [], + "targets": [ { - "builtIn": 1, "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" + "uid": "$datasource" + }, + "refId": "A" } - ] + ], + "title": "CPU Usage", + "type": "row" }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": 39, - "links": [], - "panels": [ - { - "collapsed": false, - "datasource": { - "uid": "$datasource" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 14, - "panels": [], - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "refId": "A" - } - ], - "title": "CPU Usage", - "type": "row" + { + "datasource": { + "uid": "$datasource" }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 100, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 0, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" + ] }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 1 + "unit": "short" }, - "id": 1, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "10.4.7", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(\r\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", - "format": "time_series", - "legendFormat": "{{pod}}", - "refId": "A" - } - ], - "title": "CPU Usage", - "type": "timeseries" + "overrides": [] }, - { - "collapsed": false, - "datasource": { - "uid": "$datasource" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 8 - }, - "id": 15, - "panels": [], - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "refId": "A" - } - ], - "title": "CPU Quota", - "type": "row" + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 1 }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "custom": { - "cellOptions": { - "type": "auto" - }, - "inspect": false - }, - "decimals": 2, - "displayName": "", - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Time" - }, - "properties": [ - { - "id": "displayName", - "value": "Time" - }, - { - "id": "custom.hidden", - "value": true - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #A" - }, - "properties": [ - { - "id": "displayName", - "value": "CPU Usage" - }, - { - "id": "unit", - "value": "short" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #B" - }, - "properties": [ - { - "id": "displayName", - "value": "CPU Requests" - }, - { - "id": "unit", - "value": "short" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #C" - }, - "properties": [ - { - "id": "displayName", - "value": "CPU Requests %" - }, - { - "id": "unit", - "value": "percentunit" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #D" - }, - "properties": [ - { - "id": "displayName", - "value": "CPU Limits" - }, - { - "id": "unit", - "value": "short" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #E" - }, - "properties": [ - { - "id": "displayName", - "value": "CPU Limits %" - }, - { - "id": "unit", - "value": "percentunit" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - } - ] + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.7", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "title": "CPU Usage", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 8 + }, + "id": 15, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "CPU Quota", + "type": "row" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "type": "auto" }, - { - "matcher": { - "id": "byName", - "options": "pod" - }, - "properties": [ - { - "id": "displayName", - "value": "Pod" - }, - { - "id": "unit", - "value": "short" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "links", - "value": [ - { - "targetBlank": true, - "title": "Drill down", - "url": "/d/ac3253a2c4a149d68ccd0a58c7ab6738/k8s-resources-pod?var-datasource=$datasource&var-namespace=$namespace&from=$__from&to=$__to&var-pod=$__value" - } - ] - }, - { - "id": "custom.align" - } - ] - } - ] - }, - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 9 - }, - "id": 2, - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true + "inspect": false + }, + "decimals": 2, + "displayName": "", + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" }, - "pluginVersion": "11.2.2", - "targets": [ + "overrides": [ { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(\r\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "A" + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "displayName", + "value": "Time" + }, + { + "id": "custom.hidden", + "value": true + }, + { + "id": "custom.align" + } + ] }, { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(\r\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"cpu\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "B" + "matcher": { + "id": "byName", + "options": "Value #A" + }, + "properties": [ + { + "id": "displayName", + "value": "CPU Usage" + }, + { + "id": "unit", + "value": "short" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] }, { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(\r\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n/sum(\r\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"cpu\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "C" + "matcher": { + "id": "byName", + "options": "Value #B" + }, + "properties": [ + { + "id": "displayName", + "value": "CPU Requests" + }, + { + "id": "unit", + "value": "short" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] }, { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(\r\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"cpu\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "D" + "matcher": { + "id": "byName", + "options": "Value #C" + }, + "properties": [ + { + "id": "displayName", + "value": "CPU Requests %" + }, + { + "id": "unit", + "value": "percentunit" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] }, { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(\r\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n/sum(\r\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"cpu\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "E" - } - ], - "title": "CPU Quota", - "transformations": [ + "matcher": { + "id": "byName", + "options": "Value #D" + }, + "properties": [ + { + "id": "displayName", + "value": "CPU Limits" + }, + { + "id": "unit", + "value": "short" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, { - "id": "merge", - "options": { - "reducers": [] - } - } - ], - "type": "table" - }, - { - "collapsed": false, - "datasource": { - "uid": "$datasource" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 16 - }, - "id": 16, - "panels": [], - "targets": [ + "matcher": { + "id": "byName", + "options": "Value #E" + }, + "properties": [ + { + "id": "displayName", + "value": "CPU Limits %" + }, + { + "id": "unit", + "value": "percentunit" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, { - "datasource": { - "uid": "$datasource" - }, - "refId": "A" + "matcher": { + "id": "byName", + "options": "pod" + }, + "properties": [ + { + "id": "displayName", + "value": "Pod" + }, + { + "id": "unit", + "value": "short" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "Drill down", + "url": "/d/ac3253a2c4a149d68ccd0a58c7ab6738/k8s-resources-pod?var-datasource=$datasource&var-namespace=$namespace&from=$__from&to=$__to&var-pod=$__value" + } + ] + }, + { + "id": "custom.align" + } + ] } - ], - "title": "Memory Usage", - "type": "row" + ] }, - { - "datasource": { - "uid": "$datasource" + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 9 + }, + "id": 2, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "11.2.2", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "A" }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 100, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 0, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" + { + "datasource": { + "uid": "$datasource" }, - "overrides": [] + "expr": "sum(\r\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"cpu\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "B" }, - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 17 + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n/sum(\r\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"cpu\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "C" }, - "id": 3, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"cpu\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "D" }, - "pluginVersion": "10.4.7", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(\r\n container_memory_working_set_bytes{namespace=\"$namespace\", container!=\"\", image!=\"\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", - "format": "time_series", - "legendFormat": "{{pod}}", - "refId": "A" + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n/sum(\r\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"cpu\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "E" + } + ], + "title": "CPU Quota", + "transformations": [ + { + "id": "merge", + "options": { + "reducers": [] } - ], - "title": "Memory Usage", - "type": "timeseries" + } + ], + "type": "table" + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" }, - { - "collapsed": false, - "datasource": { - "uid": "$datasource" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 24 - }, - "id": 17, - "panels": [], - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "refId": "A" - } - ], - "title": "Memory Quota", - "type": "row" + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 16 }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "custom": { - "cellOptions": { - "type": "auto" - }, - "inspect": false - }, - "decimals": 2, - "displayName": "", - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Time" - }, - "properties": [ - { - "id": "displayName", - "value": "Time" - }, - { - "id": "custom.hidden", - "value": true - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #A" - }, - "properties": [ - { - "id": "displayName", - "value": "Memory Usage" - }, - { - "id": "unit", - "value": "bytes" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #B" - }, - "properties": [ - { - "id": "displayName", - "value": "Memory Requests" - }, - { - "id": "unit", - "value": "bytes" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #C" - }, - "properties": [ - { - "id": "displayName", - "value": "Memory Requests %" - }, - { - "id": "unit", - "value": "percentunit" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #D" - }, - "properties": [ - { - "id": "displayName", - "value": "Memory Limits" - }, - { - "id": "unit", - "value": "bytes" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #E" - }, - "properties": [ - { - "id": "displayName", - "value": "Memory Limits %" - }, - { - "id": "unit", - "value": "percentunit" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "pod" - }, - "properties": [ - { - "id": "displayName", - "value": "Pod" - }, - { - "id": "unit", - "value": "short" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "links", - "value": [ - { - "targetBlank": true, - "title": "Drill down", - "url": "/d/ac3253a2c4a149d68ccd0a58c7ab6738/k8s-resources-pod?var-datasource=$datasource&var-namespace=$namespace&from=$__from&to=$__to&var-pod=$__value" - } - ] - }, - { - "id": "custom.align" - } - ] + "id": 16, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Memory Usage", + "type": "row" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" } - ] - }, - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 25 + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" }, - "id": 4, - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 17 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.7", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n container_memory_working_set_bytes{namespace=\"$namespace\", container!=\"\", image!=\"\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "title": "Memory Usage", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 24 + }, + "id": 17, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Memory Quota", + "type": "row" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "decimals": 2, + "displayName": "", + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" }, - "pluginVersion": "11.2.2", - "targets": [ + "overrides": [ { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(\r\n container_memory_working_set_bytes{namespace=\"$namespace\", container!=\"\", image!=\"\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "A" + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "displayName", + "value": "Time" + }, + { + "id": "custom.hidden", + "value": true + }, + { + "id": "custom.align" + } + ] }, { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(\r\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"memory\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "B" + "matcher": { + "id": "byName", + "options": "Value #A" + }, + "properties": [ + { + "id": "displayName", + "value": "Memory Usage" + }, + { + "id": "unit", + "value": "bytes" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] }, { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(\r\n container_memory_working_set_bytes{namespace=\"$namespace\", container!=\"\", image!=\"\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n/sum(\r\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"memory\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "C" + "matcher": { + "id": "byName", + "options": "Value #B" + }, + "properties": [ + { + "id": "displayName", + "value": "Memory Requests" + }, + { + "id": "unit", + "value": "bytes" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] }, { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(\r\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"memory\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "D" + "matcher": { + "id": "byName", + "options": "Value #C" + }, + "properties": [ + { + "id": "displayName", + "value": "Memory Requests %" + }, + { + "id": "unit", + "value": "percentunit" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] }, { - "datasource": { - "uid": "$datasource" - }, - "expr": "sum(\r\n container_memory_working_set_bytes{namespace=\"$namespace\", container!=\"\", image!=\"\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n/sum(\r\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"memory\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "E" - } - ], - "title": "Memory Quota", - "transformations": [ + "matcher": { + "id": "byName", + "options": "Value #D" + }, + "properties": [ + { + "id": "displayName", + "value": "Memory Limits" + }, + { + "id": "unit", + "value": "bytes" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, { - "id": "merge", - "options": { - "reducers": [] - } - } - ], - "type": "table" - }, - { - "collapsed": false, - "datasource": { - "uid": "$datasource" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 32 - }, - "id": 18, - "panels": [], - "targets": [ + "matcher": { + "id": "byName", + "options": "Value #E" + }, + "properties": [ + { + "id": "displayName", + "value": "Memory Limits %" + }, + { + "id": "unit", + "value": "percentunit" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, { - "datasource": { - "uid": "$datasource" - }, - "refId": "A" + "matcher": { + "id": "byName", + "options": "pod" + }, + "properties": [ + { + "id": "displayName", + "value": "Pod" + }, + { + "id": "unit", + "value": "short" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "Drill down", + "url": "/d/ac3253a2c4a149d68ccd0a58c7ab6738/k8s-resources-pod?var-datasource=$datasource&var-namespace=$namespace&from=$__from&to=$__to&var-pod=$__value" + } + ] + }, + { + "id": "custom.align" + } + ] } - ], - "title": "Current Network Usage", - "type": "row" + ] }, - { - "datasource": { - "uid": "$datasource" + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 25 + }, + "id": 4, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "11.2.2", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n container_memory_working_set_bytes{namespace=\"$namespace\", container!=\"\", image!=\"\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "A" }, - "fieldConfig": { - "defaults": { - "custom": { - "cellOptions": { - "type": "auto" - }, - "inspect": false - }, - "decimals": 2, - "displayName": "", - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Time" - }, - "properties": [ - { - "id": "displayName", - "value": "Time" - }, - { - "id": "custom.hidden", - "value": true - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #A" - }, - "properties": [ - { - "id": "displayName", - "value": "Current Receive Bandwidth" - }, - { - "id": "unit", - "value": "Bps" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #B" - }, - "properties": [ - { - "id": "displayName", - "value": "Current Transmit Bandwidth" - }, - { - "id": "unit", - "value": "Bps" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #C" - }, - "properties": [ - { - "id": "displayName", - "value": "Rate of Received Packets" - }, - { - "id": "unit", - "value": "pps" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #D" - }, - "properties": [ - { - "id": "displayName", - "value": "Rate of Transmitted Packets" - }, - { - "id": "unit", - "value": "pps" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #E" - }, - "properties": [ - { - "id": "displayName", - "value": "Rate of Received Packets Dropped" - }, - { - "id": "unit", - "value": "pps" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #F" - }, - "properties": [ - { - "id": "displayName", - "value": "Rate of Transmitted Packets Dropped" - }, - { - "id": "unit", - "value": "pps" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.align" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "pod" - }, - "properties": [ - { - "id": "displayName", - "value": "Pod" - }, - { - "id": "unit", - "value": "short" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "links", - "value": [ - { - "targetBlank": true, - "title": "Drill down", - "url": "/d/ac3253a2c4a149d68ccd0a58c7ab6738/k8s-resources-pod?var-datasource=$datasource&var-namespace=$namespace&from=$__from&to=$__to&var-pod=$__value" - } - ] - }, - { - "id": "custom.align" - } - ] - } - ] + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"memory\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "B" }, - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 33 + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n container_memory_working_set_bytes{namespace=\"$namespace\", container!=\"\", image!=\"\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n/sum(\r\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"memory\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "C" }, - "id": 5, - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true + { + "datasource": { + "uid": "$datasource" + }, + "expr": "sum(\r\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"memory\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "D" }, - "pluginVersion": "11.2.2", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "(sum(irate(container_network_receive_bytes_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "A" + { + "datasource": { + "uid": "$datasource" }, - { - "datasource": { - "uid": "$datasource" + "expr": "sum(\r\n container_memory_working_set_bytes{namespace=\"$namespace\", container!=\"\", image!=\"\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n/sum(\r\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", namespace=\"$namespace\", resource=\"memory\"}\r\n * on(namespace,pod)\r\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=\"$workload\", workload_type=\"$type\"}\r\n) by (pod)\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "E" + } + ], + "title": "Memory Quota", + "transformations": [ + { + "id": "merge", + "options": { + "reducers": [] + } + } + ], + "type": "table" + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 32 + }, + "id": 18, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Current Network Usage", + "type": "row" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "type": "auto" }, - "expr": "(sum(irate(container_network_transmit_bytes_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "B" + "inspect": false }, + "decimals": 2, + "displayName": "", + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ { - "datasource": { - "uid": "$datasource" - }, - "expr": "(sum(irate(container_network_receive_packets_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "C" + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "displayName", + "value": "Time" + }, + { + "id": "custom.hidden", + "value": true + }, + { + "id": "custom.align" + } + ] }, { - "datasource": { - "uid": "$datasource" - }, - "expr": "(sum(irate(container_network_transmit_packets_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "D" + "matcher": { + "id": "byName", + "options": "Value #A" + }, + "properties": [ + { + "id": "displayName", + "value": "Current Receive Bandwidth" + }, + { + "id": "unit", + "value": "Bps" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] }, { - "datasource": { - "uid": "$datasource" - }, - "expr": "(sum(irate(container_network_receive_packets_dropped_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "E" + "matcher": { + "id": "byName", + "options": "Value #B" + }, + "properties": [ + { + "id": "displayName", + "value": "Current Transmit Bandwidth" + }, + { + "id": "unit", + "value": "Bps" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] }, { - "datasource": { - "uid": "$datasource" - }, - "expr": "(sum(irate(container_network_transmit_packets_dropped_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", - "format": "table", - "instant": true, - "legendFormat": "", - "refId": "F" - } - ], - "title": "Current Network Usage", - "transformations": [ + "matcher": { + "id": "byName", + "options": "Value #C" + }, + "properties": [ + { + "id": "displayName", + "value": "Rate of Received Packets" + }, + { + "id": "unit", + "value": "pps" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, { - "id": "merge", - "options": { - "reducers": [] - } - } - ], - "type": "table" - }, - { - "collapsed": false, - "datasource": { - "uid": "$datasource" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 40 - }, - "id": 19, - "panels": [], - "targets": [ + "matcher": { + "id": "byName", + "options": "Value #D" + }, + "properties": [ + { + "id": "displayName", + "value": "Rate of Transmitted Packets" + }, + { + "id": "unit", + "value": "pps" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, { - "datasource": { - "uid": "$datasource" - }, - "refId": "A" - } - ], - "title": "Bandwidth", - "type": "row" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 100, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 0, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" + "matcher": { + "id": "byName", + "options": "Value #E" + }, + "properties": [ + { + "id": "displayName", + "value": "Rate of Received Packets Dropped" + }, + { + "id": "unit", + "value": "pps" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "Bps" + ] }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 41 - }, - "id": 6, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "10.4.7", - "targets": [ { - "datasource": { - "uid": "$datasource" - }, - "expr": "(sum(irate(container_network_receive_bytes_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", - "format": "time_series", - "legendFormat": "{{pod}}", - "refId": "A" - } - ], - "title": "Receive Bandwidth", - "type": "timeseries" - }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 100, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 0, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" + "matcher": { + "id": "byName", + "options": "Value #F" + }, + "properties": [ + { + "id": "displayName", + "value": "Rate of Transmitted Packets Dropped" + }, + { + "id": "unit", + "value": "pps" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "Bps" + ] }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 41 - }, - "id": 7, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "10.4.7", - "targets": [ { - "datasource": { - "uid": "$datasource" - }, - "expr": "(sum(irate(container_network_transmit_bytes_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", - "format": "time_series", - "legendFormat": "{{pod}}", - "refId": "A" + "matcher": { + "id": "byName", + "options": "pod" + }, + "properties": [ + { + "id": "displayName", + "value": "Pod" + }, + { + "id": "unit", + "value": "short" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "Drill down", + "url": "/d/ac3253a2c4a149d68ccd0a58c7ab6738/k8s-resources-pod?var-datasource=$datasource&var-namespace=$namespace&from=$__from&to=$__to&var-pod=$__value" + } + ] + }, + { + "id": "custom.align" + } + ] } - ], - "title": "Transmit Bandwidth", - "type": "timeseries" + ] }, - { - "collapsed": false, - "datasource": { - "uid": "$datasource" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 48 - }, - "id": 20, - "panels": [], - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "refId": "A" - } - ], - "title": "Average Container Bandwidth by Pod", - "type": "row" + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 33 }, - { - "datasource": { - "uid": "$datasource" + "id": 5, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "11.2.2", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(sum(irate(container_network_receive_bytes_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "A" }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 100, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 0, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "Bps" + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(sum(irate(container_network_transmit_bytes_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "B" + }, + { + "datasource": { + "uid": "$datasource" }, - "overrides": [] + "expr": "(sum(irate(container_network_receive_packets_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "C" }, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 49 + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(sum(irate(container_network_transmit_packets_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "D" }, - "id": 8, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(sum(irate(container_network_receive_packets_dropped_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "E" }, - "pluginVersion": "10.4.7", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "(avg(irate(container_network_receive_bytes_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", - "format": "time_series", - "legendFormat": "{{pod}}", - "refId": "A" + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(sum(irate(container_network_transmit_packets_dropped_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "F" + } + ], + "title": "Current Network Usage", + "transformations": [ + { + "id": "merge", + "options": { + "reducers": [] } - ], - "title": "Average Container Bandwidth by Pod: Received", - "type": "timeseries" + } + ], + "type": "table" + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 100, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 0, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 40 + }, + "id": 19, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Bandwidth", + "type": "row" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "Bps" + ] }, - "overrides": [] + "unit": "Bps" }, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 49 - }, - "id": 9, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "10.4.7", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "(avg(irate(container_network_transmit_bytes_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", - "format": "time_series", - "legendFormat": "{{pod}}", - "refId": "A" - } - ], - "title": "Average Container Bandwidth by Pod: Transmitted", - "type": "timeseries" + "overrides": [] }, - { - "collapsed": false, - "datasource": { - "uid": "$datasource" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 56 - }, - "id": 21, - "panels": [], - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "refId": "A" - } - ], - "title": "Rate of Packets", - "type": "row" + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 41 }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 100, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 0, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.7", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(sum(irate(container_network_receive_bytes_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "title": "Receive Bandwidth", + "type": "timeseries" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "pps" + ] }, - "overrides": [] + "unit": "Bps" }, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 57 - }, - "id": 10, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "10.4.7", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "(sum(irate(container_network_receive_packets_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", - "format": "time_series", - "legendFormat": "{{pod}}", - "refId": "A" - } - ], - "title": "Rate of Received Packets", - "type": "timeseries" + "overrides": [] }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 100, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 0, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 41 + }, + "id": 7, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.7", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(sum(irate(container_network_transmit_bytes_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "title": "Transmit Bandwidth", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 48 + }, + "id": 20, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Average Container Bandwidth by Pod", + "type": "row" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "pps" + ] }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 57 - }, - "id": 11, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } + "unit": "Bps" }, - "pluginVersion": "10.4.7", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "(sum(irate(container_network_transmit_packets_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", - "format": "time_series", - "legendFormat": "{{pod}}", - "refId": "A" - } - ], - "title": "Rate of Transmitted Packets", - "type": "timeseries" + "overrides": [] }, - { - "collapsed": false, - "datasource": { - "uid": "$datasource" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 64 - }, - "id": 22, - "panels": [], - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "refId": "A" - } - ], - "title": "Rate of Packets Dropped", - "type": "row" + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 49 }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 100, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 0, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" + "id": 8, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.7", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(avg(irate(container_network_receive_bytes_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "title": "Average Container Bandwidth by Pod: Received", + "type": "timeseries" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "pps" + ] }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 65 - }, - "id": 12, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } + "unit": "Bps" }, - "pluginVersion": "10.4.7", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "(sum(irate(container_network_receive_packets_dropped_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", - "format": "time_series", - "legendFormat": "{{pod}}", - "refId": "A" - } - ], - "title": "Rate of Received Packets Dropped", - "type": "timeseries" + "overrides": [] }, - { - "datasource": { - "uid": "$datasource" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 100, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 0, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 49 + }, + "id": 9, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.7", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "expr": "(avg(irate(container_network_transmit_bytes_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "title": "Average Container Bandwidth by Pod: Transmitted", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 56 + }, + "id": 21, + "panels": [], + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "refId": "A" + } + ], + "title": "Rate of Packets", + "type": "row" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "pps" + ] }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 65 + "unit": "pps" }, - "id": 13, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "10.4.7", - "targets": [ - { - "datasource": { - "uid": "$datasource" - }, - "expr": "(sum(irate(container_network_transmit_packets_dropped_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", - "format": "time_series", - "legendFormat": "{{pod}}", - "refId": "A" - } - ], - "title": "Rate of Transmitted Packets Dropped", - "type": "timeseries" - } - ], - "refresh": "1m", - "schemaVersion": 39, - "tags": [ - "kubernetes-mixin", - "Microsoft-managed" - ], - "templating": { - "list": [ + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 57 + }, + "id": 10, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.7", + "targets": [ { - "current": { - "selected": false, - "text": "chicago", - "value": "fe0ylwo898wlcb" - }, - "hide": 0, - "includeAll": false, - "label": "Data Source", - "multi": false, - "name": "datasource", - "options": [], - "query": "prometheus", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" + "datasource": { + "uid": "$datasource" + }, + "expr": "(sum(irate(container_network_receive_packets_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "title": "Rate of Received Packets", + "type": "timeseries" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "pps" }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 57 + }, + "id": 11, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.7", + "targets": [ { - "current": { - "selected": false, - "text": "azure-arc", - "value": "azure-arc" + "datasource": { + "uid": "$datasource" }, + "expr": "(sum(irate(container_network_transmit_packets_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "title": "Rate of Transmitted Packets", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "uid": "$datasource" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 64 + }, + "id": 22, + "panels": [], + "targets": [ + { "datasource": { - "type": "prometheus", "uid": "$datasource" }, - "definition": "", - "hide": 0, - "includeAll": false, - "multi": false, - "name": "namespace", - "options": [], - "query": "label_values(kube_namespace_status_phase{job=\"kube-state-metrics\"}, namespace)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false + "refId": "A" + } + ], + "title": "Rate of Packets Dropped", + "type": "row" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "pps" }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 65 + }, + "id": 12, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.7", + "targets": [ { - "current": { - "selected": false, - "text": "deployment", - "value": "deployment" - }, "datasource": { - "type": "prometheus", "uid": "$datasource" }, - "definition": "", - "hide": 0, - "includeAll": false, - "multi": false, - "name": "type", - "options": [], - "query": "label_values(namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\"}, workload_type)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false + "expr": "(sum(irate(container_network_receive_packets_dropped_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" + } + ], + "title": "Rate of Received Packets Dropped", + "type": "timeseries" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "pps" }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 65 + }, + "id": 13, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.7", + "targets": [ { - "current": { - "selected": false, - "text": "cluster-metadata-operator", - "value": "cluster-metadata-operator" - }, "datasource": { - "type": "prometheus", "uid": "$datasource" }, - "definition": "", - "hide": 0, - "includeAll": false, - "multi": false, - "name": "workload", - "options": [], - "query": "label_values(namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload_type=\"$type\"}, workload)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false + "expr": "(sum(irate(container_network_transmit_packets_dropped_total{job=\"kubelet\", namespace=\"$namespace\"}[$__rate_interval])\r\n* on (namespace,pod)\r\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload=~\"$workload\", workload_type=\"$type\"}) by (pod))\r\n", + "format": "time_series", + "legendFormat": "{{pod}}", + "refId": "A" } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "Contoso Hypermarket Workloads", - "uid": "3151475894614845ba54456099696738ff", - "version": 1, - "weekStart": "" - } \ No newline at end of file + "title": "Rate of Transmitted Packets Dropped", + "type": "timeseries" + } + ], + "refresh": "1m", + "schemaVersion": 39, + "tags": [ + "kubernetes-mixin", + "Microsoft-managed" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "chicago", + "value": "fe0ylwo898wlcb" + }, + "hide": 0, + "includeAll": false, + "label": "Data Source", + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": { + "selected": false, + "text": "azure-arc", + "value": "azure-arc" + }, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "namespace", + "options": [], + "query": "label_values(kube_namespace_status_phase{job=\"kube-state-metrics\"}, namespace)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": { + "selected": false, + "text": "deployment", + "value": "deployment" + }, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "type", + "options": [], + "query": "label_values(namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\"}, workload_type)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": { + "selected": false, + "text": "cluster-metadata-operator", + "value": "cluster-metadata-operator" + }, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "workload", + "options": [], + "query": "label_values(namespace_workload_pod:kube_pod_owner:relabel{namespace=\"$namespace\", workload_type=\"$type\"}, workload)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "utc", + "title": "Contoso Hypermarket Workloads", + "uid": "3151475894614845ba54456099696738ff", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep index 0e27185ff3..77c0ee8769 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep @@ -44,7 +44,7 @@ var networkInterfaceName = '${vmName}-NIC' var osDiskType = 'Premium_LRS' var k3sControlPlane = 'true' // deploy single-node k3s control plane var diskSize = 512 -var numberOfIPAddresses = 8 // The number of IP addresses to create +var numberOfIPAddresses = 10 // The number of IP addresses to create // Create multiple public IP addresses if deployBastion is false resource publicIpAddresses 'Microsoft.Network/publicIpAddresses@2022-01-01' = [for i in range(1, numberOfIPAddresses): { From 083b7a3a82fac2af7c8914a3460ff5d566611ef7 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sat, 19 Oct 2024 18:26:12 -0400 Subject: [PATCH 082/409] fix dashboard --- .../monitoring/grafana-cluster-pods.json | 8 ++-- .../monitoring/grafana-cluster-workloads.json | 37 +++++++------------ 2 files changed, 18 insertions(+), 27 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json index c7bba19a51..4550101eb6 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json @@ -2290,8 +2290,8 @@ { "current": { "selected": false, - "text": "Managed_Prometheus_zmazmon1", - "value": "zmazmon1" + "text": "chicago", + "value": "fe0ylwo898wlcb" }, "hide": 0, "includeAll": false, @@ -2360,8 +2360,8 @@ ] }, "time": { - "from": "2024-10-16T17:17:09.316Z", - "to": "2024-10-16T18:17:09.316Z" + "from": "now-1h", + "to": "now" }, "timepicker": { "refresh_intervals": [ diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json index acbbedfb2d..7adcdfe0bc 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json @@ -18,7 +18,7 @@ "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 0, - "id": 39, + "id": 10, "links": [], "panels": [ { @@ -171,6 +171,7 @@ "fieldConfig": { "defaults": { "custom": { + "align": "auto", "cellOptions": { "type": "auto" }, @@ -383,7 +384,7 @@ }, "showHeader": true }, - "pluginVersion": "11.2.2", + "pluginVersion": "11.2.2+security-01", "targets": [ { "datasource": { @@ -609,8 +610,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -916,8 +916,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -1285,8 +1284,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -1380,8 +1378,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -1499,8 +1496,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -1594,8 +1590,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -1713,8 +1708,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -1808,8 +1802,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -1927,8 +1920,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -2022,8 +2014,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -2082,7 +2073,7 @@ "current": { "selected": false, "text": "chicago", - "value": "fe0ylwo898wlcb" + "value": "ae1dnyprv0zr4a" }, "hide": 0, "includeAll": false, From 4df4c93a2f39fe233b4ed06e8ff7b73ac49654a2 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sat, 19 Oct 2024 23:00:59 -0400 Subject: [PATCH 083/409] update depth to fix import --- azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index 08d4ea21d9..03eac76843 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -1071,7 +1071,7 @@ function Deploy-Prometheus { $grafanaDBBody = @{ dashboard = $dashboardObject overwrite = $true - } | ConvertTo-Json -Depth 8 + } | ConvertTo-Json -Depth 10 if ($_.Value.IsProduction) { # Set Grafana Dashboard endpoint From 0914f4a2ff8a8bf0b88f650b637076c208e60827 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sun, 20 Oct 2024 09:49:15 +0300 Subject: [PATCH 084/409] Refactor PowerShell module installation logic and remove unused code --- .../artifacts/PowerShell/Modules/common.psm1 | 70 +++++++++---------- .../Modules/contoso_hypermarket.psm1 | 4 +- 2 files changed, 38 insertions(+), 36 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index 08d4ea21d9..153979dfe3 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -536,12 +536,12 @@ function Deploy-AzContainerRegistry { function Deploy-ClusterNamespaces { foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { $clusterName = $cluster.Name.ToLower() - if($cluster.Value.Type -eq "k3s"){ - $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" - kubectx - }else{ + #if($cluster.Value.Type -eq "k3s"){ + # $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" + # kubectx + #}else{ kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\ClusterSecrets.log") - } + #} foreach ($namespace in $AgConfig.Namespaces) { Write-Host "[$(Get-Date -Format t)] INFO: Creating namespace $namespace on $clusterName" -ForegroundColor Gray kubectl create namespace $namespace | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\ClusterSecrets.log") @@ -555,12 +555,12 @@ function Deploy-ClusterSecrets { foreach ($namespace in $AgConfig.Namespaces) { if ($namespace -eq "contoso-supermarket" -or $namespace -eq "images-cache") { Write-Host "[$(Get-Date -Format t)] INFO: Configuring Azure Container registry on $clusterName" - if($cluster.Value.Type -eq "k3s"){ - $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" - kubectx - }else{ + #if($cluster.Value.Type -eq "k3s"){ + # $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" + # kubectx + #}else{ kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\ClusterSecrets.log") - } + #} kubectl create secret docker-registry acr-secret ` --namespace $namespace ` --docker-server="$acrName.azurecr.io" ` @@ -1207,12 +1207,12 @@ function Deploy-AIO { $clusterName = $cluster.Name.ToLower() Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the $clusterName cluster" -ForegroundColor Gray Write-Host "`n" - if($cluster.Value.type -eq "k3s"){ - $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" - kubectx - }else{ + #if($cluster.Value.type -eq "k3s"){ + # $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" + # kubectx + #}else{ kubectx $clusterName - } + #} $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" $keyVaultId = (az keyvault list -g $resourceGroup --resource-type vault --query "[$kvIndex].id" -o tsv) $retryCount = 0 @@ -1223,21 +1223,21 @@ function Deploy-AIO { Write-Host "[$(Get-Date -Format t)] INFO: Enabling custom locations on the Arc-enabled cluster" -ForegroundColor DarkGray Write-Host "`n" az config set extension.use_dynamic_install=yes_without_prompt - if($cluster.Value.Type -eq "k3s"){ + #if($cluster.Value.Type -eq "k3s"){ + # az connectedk8s enable-features --name $arcClusterName ` + # --resource-group $resourceGroup ` + # --features cluster-connect custom-locations ` + # --custom-locations-oid $customLocationRPOID ` + # --kube-config "C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" ` + # --kube-context "ag-k3s-$clusterName" ` + # --only-show-errors + #}else{ az connectedk8s enable-features --name $arcClusterName ` --resource-group $resourceGroup ` --features cluster-connect custom-locations ` --custom-locations-oid $customLocationRPOID ` - --kube-config "C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" ` - --kube-context "ag-k3s-$clusterName" ` --only-show-errors - }else{ - az connectedk8s enable-features --name $arcClusterName ` - --resource-group $resourceGroup ` - --features cluster-connect custom-locations ` - --custom-locations-oid $customLocationRPOID ` - --only-show-errors - } + #} Start-Sleep -Seconds 10 @@ -1262,12 +1262,12 @@ function Deploy-AIO { $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" $retryCount = 0 $maxRetries = 25 - if($cluster.Value.type -eq "k3s"){ - $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" - kubectx - }else{ + #if($cluster.Value.type -eq "k3s"){ + # $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" + # kubectx + #}else{ kubectx $clusterName - } + #} do { $output = az iot ops check --as-object --only-show-errors $output = $output | ConvertFrom-Json @@ -1339,12 +1339,12 @@ function Set-MQTTIpAddress { $clusters = $AgConfig.SiteConfig.GetEnumerator() foreach ($cluster in $clusters) { $clusterName = $cluster.Name.ToLower() - if($cluster.Value.type -eq "k3s"){ - $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" - kubectx - }else{ + #if($cluster.Value.type -eq "k3s"){ + # $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" + # kubectx + #}else{ kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\ClusterSecrets.log") - } + #} Write-Host "[$(Get-Date -Format t)] INFO: Getting MQ IP address" -ForegroundColor DarkGray do { diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 6348a70d52..bbdf288394 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -85,7 +85,9 @@ $mergedKubeconfig = @{ $mergedKubeconfig | ConvertTo-Yaml | Set-Content -Path $mergedKubeconfigPath Write-Host "Kubeconfig files successfully merged into $mergedKubeconfigPath" -kubectx +kubectx seattle="ag-k3s-seattle" +kubectx chicago="ag-k3s-chicago" + } function Set-K3sClusters { From 7c905dd9c08d927f4c467f0827c654112e7fd739 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sun, 20 Oct 2024 11:07:37 +0300 Subject: [PATCH 085/409] Refactor PowerShell module installation logic and remove unused code --- .../artifacts/PowerShell/Modules/common.psm1 | 63 ++++--------------- .../Modules/contoso_hypermarket.psm1 | 1 - 2 files changed, 11 insertions(+), 53 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index 153979dfe3..90d0444cc3 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -536,12 +536,7 @@ function Deploy-AzContainerRegistry { function Deploy-ClusterNamespaces { foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { $clusterName = $cluster.Name.ToLower() - #if($cluster.Value.Type -eq "k3s"){ - # $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" - # kubectx - #}else{ - kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\ClusterSecrets.log") - #} + kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\ClusterSecrets.log") foreach ($namespace in $AgConfig.Namespaces) { Write-Host "[$(Get-Date -Format t)] INFO: Creating namespace $namespace on $clusterName" -ForegroundColor Gray kubectl create namespace $namespace | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\ClusterSecrets.log") @@ -555,12 +550,7 @@ function Deploy-ClusterSecrets { foreach ($namespace in $AgConfig.Namespaces) { if ($namespace -eq "contoso-supermarket" -or $namespace -eq "images-cache") { Write-Host "[$(Get-Date -Format t)] INFO: Configuring Azure Container registry on $clusterName" - #if($cluster.Value.Type -eq "k3s"){ - # $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" - # kubectx - #}else{ - kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\ClusterSecrets.log") - #} + kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\ClusterSecrets.log") kubectl create secret docker-registry acr-secret ` --namespace $namespace ` --docker-server="$acrName.azurecr.io" ` @@ -964,13 +954,7 @@ function Deploy-Prometheus { # Deploying Kube Prometheus Stack for stores $AgConfig.SiteConfig.GetEnumerator() | ForEach-Object { Write-Host "[$(Get-Date -Format t)] INFO: Deploying Kube Prometheus Stack for $($_.Value.FriendlyName) environment" -ForegroundColor Gray - if ($Env:scenario -eq "contoso_hypermarket") { - $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$($_.Value.FriendlyName.ToLower())" - kubectx | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Observability.log") - } - else { - kubectx $_.Value.FriendlyName.ToLower() | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Observability.log") - } + kubectx $_.Value.FriendlyName.ToLower() | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Observability.log") # Wait for Kubernetes API server to become available $apiServer = kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}' $apiServerAddress = $apiServer -replace '.*https://| .*$' @@ -1207,12 +1191,7 @@ function Deploy-AIO { $clusterName = $cluster.Name.ToLower() Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the $clusterName cluster" -ForegroundColor Gray Write-Host "`n" - #if($cluster.Value.type -eq "k3s"){ - # $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" - # kubectx - #}else{ - kubectx $clusterName - #} + kubectx $clusterName $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" $keyVaultId = (az keyvault list -g $resourceGroup --resource-type vault --query "[$kvIndex].id" -o tsv) $retryCount = 0 @@ -1223,21 +1202,11 @@ function Deploy-AIO { Write-Host "[$(Get-Date -Format t)] INFO: Enabling custom locations on the Arc-enabled cluster" -ForegroundColor DarkGray Write-Host "`n" az config set extension.use_dynamic_install=yes_without_prompt - #if($cluster.Value.Type -eq "k3s"){ - # az connectedk8s enable-features --name $arcClusterName ` - # --resource-group $resourceGroup ` - # --features cluster-connect custom-locations ` - # --custom-locations-oid $customLocationRPOID ` - # --kube-config "C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" ` - # --kube-context "ag-k3s-$clusterName" ` - # --only-show-errors - #}else{ - az connectedk8s enable-features --name $arcClusterName ` - --resource-group $resourceGroup ` - --features cluster-connect custom-locations ` - --custom-locations-oid $customLocationRPOID ` - --only-show-errors - #} + az connectedk8s enable-features --name $arcClusterName ` + --resource-group $resourceGroup ` + --features cluster-connect custom-locations ` + --custom-locations-oid $customLocationRPOID ` + --only-show-errors Start-Sleep -Seconds 10 @@ -1262,12 +1231,7 @@ function Deploy-AIO { $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" $retryCount = 0 $maxRetries = 25 - #if($cluster.Value.type -eq "k3s"){ - # $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" - # kubectx - #}else{ - kubectx $clusterName - #} + kubectx $clusterName do { $output = az iot ops check --as-object --only-show-errors $output = $output | ConvertFrom-Json @@ -1339,12 +1303,7 @@ function Set-MQTTIpAddress { $clusters = $AgConfig.SiteConfig.GetEnumerator() foreach ($cluster in $clusters) { $clusterName = $cluster.Name.ToLower() - #if($cluster.Value.type -eq "k3s"){ - # $Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" - # kubectx - #}else{ - kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\ClusterSecrets.log") - #} + kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\ClusterSecrets.log") Write-Host "[$(Get-Date -Format t)] INFO: Getting MQ IP address" -ForegroundColor DarkGray do { diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index bbdf288394..ba327eaf76 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -98,7 +98,6 @@ function Set-K3sClusters { if ($cluster.Value.Type -eq "k3s") { $clusterName = $cluster.Value.FriendlyName.ToLower() $vmName = $cluster.Value.ArcClusterName + "-$namingGuid" - #$Env:KUBECONFIG="C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" kubectx $clusterName $k3sVIP = $(az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``true``].privateIPAddress" -otsv) Write-Host "Assigning kube-vip-role on k3s cluster" From 6653b754a55662f41b7628ed1fe4b94b5623195c Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sun, 20 Oct 2024 11:05:21 -0400 Subject: [PATCH 086/409] update dashboard --- .../monitoring/grafana-cluster-global.json | 2 +- .../monitoring/grafana-cluster-pods.json | 4 +- .../monitoring/grafana-cluster-workloads.json | 4 +- .../grafana-node-exporter-full.json | 718 +++++++++--------- 4 files changed, 364 insertions(+), 364 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-global.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-global.json index 66e4013aa1..e87d1aa95f 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-global.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-global.json @@ -1,7 +1,7 @@ { "__inputs": [ { - "name": "DS_PROMETHEUS", + "name": "datasource", "label": "Prometheus", "description": "", "type": "datasource", diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json index 4550101eb6..aca1724733 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json @@ -2282,8 +2282,8 @@ ], "schemaVersion": 39, "tags": [ - "kubernetes-mixin", - "Microsoft-managed" + "jumpstart-agora", + "contoso" ], "templating": { "list": [ diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json index 7adcdfe0bc..7ea73566aa 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json @@ -2064,8 +2064,8 @@ "refresh": "1m", "schemaVersion": 39, "tags": [ - "kubernetes-mixin", - "Microsoft-managed" + "jumpstart-agora", + "contoso" ], "templating": { "list": [ diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-node-exporter-full.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-node-exporter-full.json index 149b323dd3..182e4d3f0b 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-node-exporter-full.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-node-exporter-full.json @@ -1,7 +1,7 @@ { "__inputs": [ { - "name": "DS_PROMETHEUS", + "name": "datasource", "label": "Prometheus", "description": "", "type": "datasource", @@ -119,7 +119,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "Busy state of all CPU cores together", "fieldConfig": { @@ -186,7 +186,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "editorMode": "code", "expr": "(sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode!=\"idle\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))) * 100", @@ -204,7 +204,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "Busy state of all CPU cores together (5 min average)", "fieldConfig": { @@ -271,7 +271,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "avg(node_load5{instance=\"$node\",job=\"$job\"}) / count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)) * 100", "format": "time_series", @@ -287,7 +287,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "Busy state of all CPU cores together (15 min average)", "fieldConfig": { @@ -354,7 +354,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "avg(node_load15{instance=\"$node\",job=\"$job\"}) / count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)) * 100", "hide": false, @@ -369,7 +369,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "Non available RAM memory", "fieldConfig": { @@ -428,7 +428,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "((node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"}) / (node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"} )) * 100", "format": "time_series", @@ -440,7 +440,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "100 - ((node_memory_MemAvailable_bytes{instance=\"$node\",job=\"$job\"} * 100) / node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"})", "format": "time_series", @@ -456,7 +456,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "Used Swap", "fieldConfig": { @@ -523,7 +523,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "((node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapFree_bytes{instance=\"$node\",job=\"$job\"}) / (node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} )) * 100", "intervalFactor": 1, @@ -537,7 +537,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "Used Root FS", "fieldConfig": { @@ -604,7 +604,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "100 - ((node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",mountpoint=\"/\",fstype!=\"rootfs\"} * 100) / node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",mountpoint=\"/\",fstype!=\"rootfs\"})", "format": "time_series", @@ -619,7 +619,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "Total number of CPU cores", "fieldConfig": { @@ -683,7 +683,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu))", "interval": "", @@ -699,7 +699,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "System uptime", "fieldConfig": { @@ -765,7 +765,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_time_seconds{instance=\"$node\",job=\"$job\"} - node_boot_time_seconds{instance=\"$node\",job=\"$job\"}", "intervalFactor": 1, @@ -779,7 +779,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "Total RootFS", "fieldConfig": { @@ -848,7 +848,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",mountpoint=\"/\",fstype!=\"rootfs\"}", "format": "time_series", @@ -864,7 +864,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "Total RAM", "fieldConfig": { @@ -929,7 +929,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"}", "intervalFactor": 1, @@ -943,7 +943,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "Total SWAP", "fieldConfig": { @@ -1008,7 +1008,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"}", "intervalFactor": 1, @@ -1048,7 +1048,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "Basic CPU info", "fieldConfig": { @@ -1238,7 +1238,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"system\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -1253,7 +1253,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"user\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -1268,7 +1268,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"iowait\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -1282,7 +1282,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=~\".*irq\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -1296,7 +1296,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode!='idle',mode!='user',mode!='system',mode!='iowait',mode!='irq',mode!='softirq'}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -1310,7 +1310,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"idle\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -1328,7 +1328,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "Basic memory usage", "fieldConfig": { @@ -1780,7 +1780,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -1793,7 +1793,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"} - (node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"} + node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"} + node_memory_SReclaimable_bytes{instance=\"$node\",job=\"$job\"})", "format": "time_series", @@ -1806,7 +1806,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"} + node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"} + node_memory_SReclaimable_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -1818,7 +1818,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -1830,7 +1830,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "(node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapFree_bytes{instance=\"$node\",job=\"$job\"})", "format": "time_series", @@ -1846,7 +1846,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "Basic network info per interface", "fieldConfig": { @@ -2286,7 +2286,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_network_receive_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8", "format": "time_series", @@ -2298,7 +2298,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_network_transmit_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8", "format": "time_series", @@ -2314,7 +2314,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "Disk space used of all filesystems mounted", "fieldConfig": { @@ -2398,7 +2398,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "100 - ((node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'} * 100) / node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'})", "format": "time_series", @@ -2440,7 +2440,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "", "fieldConfig": { @@ -2650,7 +2650,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"system\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -2665,7 +2665,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"user\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -2679,7 +2679,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"nice\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -2693,7 +2693,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"iowait\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -2707,7 +2707,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"irq\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -2721,7 +2721,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"softirq\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -2735,7 +2735,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"steal\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -2749,7 +2749,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"idle\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -2768,7 +2768,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "", "fieldConfig": { @@ -3158,7 +3158,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"} - node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"} - node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"} - node_memory_Slab_bytes{instance=\"$node\",job=\"$job\"} - node_memory_PageTables_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapCached_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -3171,7 +3171,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_PageTables_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -3184,7 +3184,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_SwapCached_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -3196,7 +3196,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_Slab_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -3209,7 +3209,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -3222,7 +3222,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -3235,7 +3235,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -3248,7 +3248,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "(node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapFree_bytes{instance=\"$node\",job=\"$job\"})", "format": "time_series", @@ -3261,7 +3261,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_HardwareCorrupted_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -3278,7 +3278,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -3437,7 +3437,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_network_receive_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8", "format": "time_series", @@ -3449,7 +3449,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_network_transmit_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8", "format": "time_series", @@ -3465,7 +3465,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "", "fieldConfig": { @@ -3553,7 +3553,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'} - node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}", "format": "time_series", @@ -3569,7 +3569,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "", "fieldConfig": { @@ -3984,7 +3984,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_disk_reads_completed_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"}[$__rate_interval])", "intervalFactor": 4, @@ -3995,7 +3995,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_disk_writes_completed_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"}[$__rate_interval])", "intervalFactor": 1, @@ -4010,7 +4010,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "", "fieldConfig": { @@ -4212,7 +4212,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_disk_read_bytes_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"}[$__rate_interval])", "format": "time_series", @@ -4225,7 +4225,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_disk_written_bytes_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"}[$__rate_interval])", "format": "time_series", @@ -4242,7 +4242,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "", "fieldConfig": { @@ -4358,7 +4358,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_disk_io_time_seconds_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"} [$__rate_interval])", "format": "time_series", @@ -4376,7 +4376,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -4491,7 +4491,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_guest_seconds_total{instance=\"$node\",job=\"$job\", mode=\"user\"}[1m])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[1m])))", @@ -4503,7 +4503,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_guest_seconds_total{instance=\"$node\",job=\"$job\", mode=\"nice\"}[1m])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[1m])))", @@ -4545,7 +4545,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -4889,7 +4889,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_Inactive_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -4901,7 +4901,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_Active_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -4917,7 +4917,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -5280,7 +5280,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_Committed_AS_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -5292,7 +5292,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_CommitLimit_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -5308,7 +5308,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -5652,7 +5652,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_Inactive_file_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -5665,7 +5665,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_Inactive_anon_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -5678,7 +5678,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_Active_file_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -5691,7 +5691,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_Active_anon_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -5708,7 +5708,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -6081,7 +6081,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_Writeback_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -6093,7 +6093,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_WritebackTmp_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -6105,7 +6105,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_Dirty_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -6121,7 +6121,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -6489,7 +6489,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_Mapped_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -6501,7 +6501,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_Shmem_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -6513,7 +6513,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_ShmemHugePages_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -6526,7 +6526,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_ShmemPmdMapped_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -6543,7 +6543,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -6916,7 +6916,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_SUnreclaim_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -6928,7 +6928,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_SReclaimable_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -6944,7 +6944,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -7302,7 +7302,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_VmallocChunk_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -7315,7 +7315,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_VmallocTotal_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -7328,7 +7328,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_VmallocUsed_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -7345,7 +7345,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -7689,7 +7689,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_Bounce_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -7705,7 +7705,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -8075,7 +8075,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_AnonHugePages_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -8087,7 +8087,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_AnonPages_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -8103,7 +8103,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -8447,7 +8447,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_KernelStack_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -8459,7 +8459,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_Percpu_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -8476,7 +8476,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -8833,7 +8833,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_HugePages_Free{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -8845,7 +8845,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_HugePages_Rsvd{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -8857,7 +8857,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_HugePages_Surp{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -8873,7 +8873,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -9230,7 +9230,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_HugePages_Total{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -9242,7 +9242,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_Hugepagesize_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -9258,7 +9258,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -9615,7 +9615,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_DirectMap1G_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -9627,7 +9627,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_DirectMap2M_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -9640,7 +9640,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_DirectMap4k_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -9657,7 +9657,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -10001,7 +10001,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_Unevictable_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -10013,7 +10013,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_Mlocked_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -10029,7 +10029,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -10402,7 +10402,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_memory_NFS_Unstable_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -10444,7 +10444,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -10543,7 +10543,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_vmstat_pgpgin{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -10555,7 +10555,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_vmstat_pgpgout{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -10571,7 +10571,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -10670,7 +10670,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_vmstat_pswpin{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -10682,7 +10682,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_vmstat_pswpout{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -10698,7 +10698,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -11061,7 +11061,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_vmstat_pgfault{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -11073,7 +11073,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_vmstat_pgmajfault{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -11085,7 +11085,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_vmstat_pgfault{instance=\"$node\",job=\"$job\"}[$__rate_interval]) - irate(node_vmstat_pgmajfault{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -11101,7 +11101,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -11474,7 +11474,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_vmstat_oom_kill{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -11517,7 +11517,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "", "fieldConfig": { @@ -11620,7 +11620,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_timex_estimated_error_seconds{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -11634,7 +11634,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_timex_offset_seconds{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -11648,7 +11648,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_timex_maxerror_seconds{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -11666,7 +11666,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "", "fieldConfig": { @@ -11753,7 +11753,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_timex_loop_time_constant{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -11770,7 +11770,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "", "fieldConfig": { @@ -11873,7 +11873,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_timex_sync_status{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -11886,7 +11886,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_timex_frequency_adjustment_ratio{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -11903,7 +11903,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "", "fieldConfig": { @@ -11990,7 +11990,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_timex_tick_seconds{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -12003,7 +12003,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_timex_tai_offset_seconds{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -12046,7 +12046,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -12133,7 +12133,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_procs_blocked{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -12145,7 +12145,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_procs_running{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -12161,7 +12161,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -12248,7 +12248,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_processes_state{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -12265,7 +12265,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -12352,7 +12352,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_forks_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -12369,7 +12369,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -12469,7 +12469,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(process_virtual_memory_bytes{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "hide": false, @@ -12482,7 +12482,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "process_resident_memory_max_bytes{instance=\"$node\",job=\"$job\"}", "hide": false, @@ -12495,7 +12495,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(process_virtual_memory_bytes{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "hide": false, @@ -12508,7 +12508,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(process_virtual_memory_max_bytes{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "hide": false, @@ -12525,7 +12525,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -12632,7 +12632,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_processes_pids{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -12645,7 +12645,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_processes_max_processes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -12662,7 +12662,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -12761,7 +12761,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_schedstat_running_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -12774,7 +12774,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_schedstat_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -12791,7 +12791,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -12898,7 +12898,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_processes_threads{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -12911,7 +12911,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_processes_max_threads{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -12954,7 +12954,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -13041,7 +13041,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_context_switches_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -13053,7 +13053,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_intr_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -13070,7 +13070,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -13157,7 +13157,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_load1{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -13169,7 +13169,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_load5{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -13181,7 +13181,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_load15{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -13197,7 +13197,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -13323,7 +13323,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_interrupts_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -13340,7 +13340,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -13426,7 +13426,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_schedstat_timeslices_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -13443,7 +13443,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -13530,7 +13530,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_entropy_available_bits{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -13546,7 +13546,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -13632,7 +13632,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(process_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -13649,7 +13649,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -13756,7 +13756,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "process_max_fds{instance=\"$node\",job=\"$job\"}", "interval": "", @@ -13768,7 +13768,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "process_open_fds{instance=\"$node\",job=\"$job\"}", "interval": "", @@ -13810,7 +13810,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -13936,7 +13936,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_hwmon_temp_celsius{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -13949,7 +13949,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_hwmon_temp_crit_alarm_celsius{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -13963,7 +13963,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_hwmon_temp_crit_celsius{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -13976,7 +13976,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_hwmon_temp_crit_hyst_celsius{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -13990,7 +13990,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_hwmon_temp_max_celsius{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -14008,7 +14008,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -14114,7 +14114,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_cooling_device_cur_state{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -14128,7 +14128,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_cooling_device_max_state{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -14145,7 +14145,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -14231,7 +14231,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_power_supply_online{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -14275,7 +14275,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -14362,7 +14362,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_systemd_socket_accepted_connections_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -14379,7 +14379,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -14541,7 +14541,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"activating\"}", "format": "time_series", @@ -14554,7 +14554,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"active\"}", "format": "time_series", @@ -14567,7 +14567,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"deactivating\"}", "format": "time_series", @@ -14580,7 +14580,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"failed\"}", "format": "time_series", @@ -14593,7 +14593,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"inactive\"}", "format": "time_series", @@ -14636,7 +14636,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "The number (after merges) of I/O requests completed per second for the device", "fieldConfig": { @@ -15036,7 +15036,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_disk_reads_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "intervalFactor": 4, @@ -15047,7 +15047,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_disk_writes_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "intervalFactor": 1, @@ -15062,7 +15062,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "The number of bytes read from or written to the device per second", "fieldConfig": { @@ -15462,7 +15462,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_disk_read_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -15474,7 +15474,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_disk_written_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -15490,7 +15490,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "The average time for requests issued to the device to be served. This includes the time spent by the requests in queue and the time spent servicing them.", "fieldConfig": { @@ -15890,7 +15890,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_disk_read_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]) / irate(node_disk_reads_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "hide": false, @@ -15903,7 +15903,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_disk_write_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]) / irate(node_disk_writes_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "hide": false, @@ -15920,7 +15920,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "The average queue length of the requests that were issued to the device", "fieldConfig": { @@ -16309,7 +16309,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_disk_io_time_weighted_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", @@ -16325,7 +16325,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "The number of read and write requests merged per second that were queued to the device", "fieldConfig": { @@ -16725,7 +16725,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_disk_reads_merged_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "intervalFactor": 1, @@ -16736,7 +16736,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_disk_writes_merged_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "intervalFactor": 1, @@ -16751,7 +16751,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "Percentage of elapsed time during which I/O requests were issued to the device (bandwidth utilization for the device). Device saturation occurs when this value is close to 100% for devices serving requests serially. But for devices serving requests in parallel, such as RAID arrays and modern SSDs, this number does not reflect their performance limits.", "fieldConfig": { @@ -17140,7 +17140,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_disk_io_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", @@ -17152,7 +17152,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_disk_discard_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", @@ -17168,7 +17168,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "The number of outstanding requests at the instant the sample was taken. Incremented as requests are given to appropriate struct request_queue and decremented as they finish.", "fieldConfig": { @@ -17557,7 +17557,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_disk_io_now{instance=\"$node\",job=\"$job\"}", "interval": "", @@ -17573,7 +17573,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "", "fieldConfig": { @@ -17961,7 +17961,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_disk_discards_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", @@ -17973,7 +17973,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_disk_discards_merged_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", @@ -18015,7 +18015,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "", "fieldConfig": { @@ -18103,7 +18103,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}", "format": "time_series", @@ -18117,7 +18117,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_filesystem_free_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}", "format": "time_series", @@ -18130,7 +18130,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}", "format": "time_series", @@ -18147,7 +18147,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "", "fieldConfig": { @@ -18235,7 +18235,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_filesystem_files_free{instance=\"$node\",job=\"$job\",device!~'rootfs'}", "format": "time_series", @@ -18252,7 +18252,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "", "fieldConfig": { @@ -18340,7 +18340,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_filefd_maximum{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -18352,7 +18352,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_filefd_allocated{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -18368,7 +18368,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "", "fieldConfig": { @@ -18456,7 +18456,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_filesystem_files{instance=\"$node\",job=\"$job\",device!~'rootfs'}", "format": "time_series", @@ -18473,7 +18473,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "", "fieldConfig": { @@ -18578,7 +18578,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_filesystem_readonly{instance=\"$node\",job=\"$job\",device!~'rootfs'}", "format": "time_series", @@ -18590,7 +18590,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_filesystem_device_error{instance=\"$node\",job=\"$job\",device!~'rootfs',fstype!~'tmpfs'}", "format": "time_series", @@ -18633,7 +18633,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -18793,7 +18793,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_network_receive_packets_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -18806,7 +18806,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_network_transmit_packets_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -18823,7 +18823,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -18923,7 +18923,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_network_receive_errs_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -18935,7 +18935,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_network_transmit_errs_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -18951,7 +18951,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -19051,7 +19051,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_network_receive_drop_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -19063,7 +19063,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_network_transmit_drop_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -19079,7 +19079,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -19179,7 +19179,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_network_receive_compressed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -19191,7 +19191,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_network_transmit_compressed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -19207,7 +19207,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -19307,7 +19307,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_network_receive_multicast_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -19323,7 +19323,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -19423,7 +19423,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_network_receive_fifo_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -19435,7 +19435,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_network_transmit_fifo_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -19451,7 +19451,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -19551,7 +19551,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_network_receive_frame_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -19568,7 +19568,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -19655,7 +19655,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_network_transmit_carrier_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -19671,7 +19671,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -19771,7 +19771,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_network_transmit_colls_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -19787,7 +19787,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -19894,7 +19894,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_nf_conntrack_entries{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -19906,7 +19906,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_nf_conntrack_entries_limit{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -19922,7 +19922,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -20009,7 +20009,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_arp_entries{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20025,7 +20025,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -20113,7 +20113,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_network_mtu_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20129,7 +20129,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -20217,7 +20217,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_network_speed_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20233,7 +20233,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -20321,7 +20321,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_network_transmit_queue_length{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20337,7 +20337,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -20437,7 +20437,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_softnet_processed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -20450,7 +20450,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_softnet_dropped_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -20467,7 +20467,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -20554,7 +20554,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_softnet_times_squeezed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -20571,7 +20571,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -20658,7 +20658,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_network_up{operstate=\"up\",instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20670,7 +20670,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_network_carrier{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20711,7 +20711,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -20799,7 +20799,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_sockstat_TCP_alloc{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20812,7 +20812,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_sockstat_TCP_inuse{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20825,7 +20825,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_sockstat_TCP_mem{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20839,7 +20839,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_sockstat_TCP_orphan{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20852,7 +20852,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_sockstat_TCP_tw{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20869,7 +20869,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -20957,7 +20957,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_sockstat_UDPLITE_inuse{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20970,7 +20970,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_sockstat_UDP_inuse{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20983,7 +20983,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_sockstat_UDP_mem{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -21000,7 +21000,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -21088,7 +21088,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_sockstat_FRAG_inuse{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -21101,7 +21101,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_sockstat_RAW_inuse{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -21118,7 +21118,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -21206,7 +21206,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_sockstat_TCP_mem_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -21219,7 +21219,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_sockstat_UDP_mem_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -21232,7 +21232,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_sockstat_FRAG_memory{instance=\"$node\",job=\"$job\"}", "interval": "", @@ -21247,7 +21247,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -21335,7 +21335,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_sockstat_sockets_used{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -21378,7 +21378,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -21478,7 +21478,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_IpExt_InOctets{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -21491,7 +21491,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_IpExt_OutOctets{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -21507,7 +21507,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -21595,7 +21595,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_Ip_Forwarding{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -21612,7 +21612,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -21711,7 +21711,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_Icmp_InMsgs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -21724,7 +21724,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_Icmp_OutMsgs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -21741,7 +21741,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -21840,7 +21840,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_Icmp_InErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -21857,7 +21857,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -21968,7 +21968,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_Udp_InDatagrams{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -21981,7 +21981,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_Udp_OutDatagrams{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -21998,7 +21998,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -22084,7 +22084,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_Udp_InErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22097,7 +22097,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_Udp_NoPorts{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22110,7 +22110,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_UdpLite_InErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", @@ -22120,7 +22120,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_Udp_RcvbufErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22133,7 +22133,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_Udp_SndbufErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22150,7 +22150,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -22261,7 +22261,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_Tcp_InSegs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22275,7 +22275,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_Tcp_OutSegs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22292,7 +22292,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "", "fieldConfig": { @@ -22380,7 +22380,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_TcpExt_ListenOverflows{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22394,7 +22394,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_TcpExt_ListenDrops{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22408,7 +22408,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_TcpExt_TCPSynRetrans{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22421,7 +22421,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_Tcp_RetransSegs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", @@ -22431,7 +22431,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_Tcp_InErrs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", @@ -22441,7 +22441,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_Tcp_OutRsts{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", @@ -22455,7 +22455,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -22562,7 +22562,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_netstat_Tcp_CurrEstab{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -22576,7 +22576,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_netstat_Tcp_MaxConn{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -22594,7 +22594,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "", "fieldConfig": { @@ -22694,7 +22694,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_TcpExt_SyncookiesFailed{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22708,7 +22708,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_TcpExt_SyncookiesRecv{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22722,7 +22722,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_TcpExt_SyncookiesSent{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22740,7 +22740,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "fieldConfig": { "defaults": { @@ -22827,7 +22827,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_Tcp_ActiveOpens{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22840,7 +22840,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "irate(node_netstat_Tcp_PassiveOpens{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22857,7 +22857,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "Enable with --collector.tcpstat argument on node-exporter", "fieldConfig": { @@ -22941,7 +22941,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "editorMode": "code", "expr": "node_tcp_connection_states{state=\"established\",instance=\"$node\",job=\"$job\"}", @@ -22956,7 +22956,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "editorMode": "code", "expr": "node_tcp_connection_states{state=\"fin_wait2\",instance=\"$node\",job=\"$job\"}", @@ -22972,7 +22972,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "editorMode": "code", "expr": "node_tcp_connection_states{state=\"listen\",instance=\"$node\",job=\"$job\"}", @@ -22988,7 +22988,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "editorMode": "code", "expr": "node_tcp_connection_states{state=\"time_wait\",instance=\"$node\",job=\"$job\"}", @@ -23034,7 +23034,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "", "fieldConfig": { @@ -23121,7 +23121,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_scrape_collector_duration_seconds{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -23139,7 +23139,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "description": "", "fieldConfig": { @@ -23249,7 +23249,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_scrape_collector_success{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -23263,7 +23263,7 @@ { "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "expr": "node_textfile_scrape_error{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -23298,7 +23298,7 @@ "includeAll": false, "label": "datasource", "multi": false, - "name": "DS_PROMETHEUS", + "name": "datasource", "options": [], "query": "prometheus", "refresh": 1, @@ -23310,7 +23310,7 @@ "current": {}, "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "definition": "", "hide": 0, @@ -23336,7 +23336,7 @@ "current": {}, "datasource": { "type": "prometheus", - "uid": "${DS_PROMETHEUS}" + "uid": "$datasource" }, "definition": "label_values(node_uname_info{job=\"$job\"}, instance)", "hide": 0, From 107f5064bf59e527d9946c3637ade3a0e9873874 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Sun, 20 Oct 2024 10:10:39 -0500 Subject: [PATCH 087/409] remove code --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 5 ----- 1 file changed, 5 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 565f613a10..764a1af11a 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -10,12 +10,7 @@ function Get-K3sConfigFile{ azcopy copy $sourceFile "C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" --check-length=false $sourceFile = "https://$stagingStorageAccountName.blob.core.windows.net/$containerName/*" azcopy cp --check-md5 FailIfDifferentOrMissing $sourceFile "$AgLogsDir\" --include-pattern "*.log" - #$kubeconfigpath = $kubeconfigpath + "$Env:USERPROFILE\.kube\ag-k3s-$clusterName" + ";" } - #$Env:KUBECONFIG = $kubeconfigpath # Set the KUBECONFIG environment variable to the merged kubeconfig path - #kubectl config view --merge --flatten > "$Env:USERPROFILE\.kube\config-raw" - #$Env:KUBECONFIG = "$Env:USERPROFILE\.kube\config-raw" - #kubectx # display available clusters } function Merge-K3sConfigFiles{ From 596725a28402204aafbf4210626f610b508f804a Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sun, 20 Oct 2024 11:18:20 -0400 Subject: [PATCH 088/409] update dashboard --- .../AgConfig-contoso-hypermarket.psd1 | 2 +- .../artifacts/PowerShell/Bootstrap.ps1 | 1 + .../artifacts/PowerShell/Modules/common.psm1 | 121 +- .../monitoring/grafana-cluster-global.json | 2 +- .../monitoring/grafana-cluster-pods.json | 4 +- .../monitoring/grafana-cluster-workloads.json | 4 +- .../grafana-node-exporter-full-v2.json | 23418 ++++++++++++++++ 7 files changed, 23508 insertions(+), 44 deletions(-) create mode 100644 azure_jumpstart_ag/artifacts/monitoring/grafana-node-exporter-full-v2.json diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index ec160e8b64..66fa67f463 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -184,7 +184,7 @@ ProdURL = "http://localhost:3000" Dashboards = @{ "grafana.com" = @() # Dashboards from https://grafana.com/grafana/dashboards - "custom" = @('node-exporter-full','cluster-global', 'cluster-workloads', 'cluster-pods') # Dashboards from https://github.com/microsoft/azure_arc/tree/main/azure_jumpstart_ag/artifacts/monitoring + "custom" = @('node-exporter-full-v2','cluster-global', 'cluster-workloads', 'cluster-pods') # Dashboards from https://github.com/microsoft/azure_arc/tree/main/azure_jumpstart_ag/artifacts/monitoring } } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 6b65c4633f..1f0bb7be37 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -250,6 +250,7 @@ Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/arc-osperformance-wo Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/prometheus-additional-scrape-config.yaml") -OutFile "$AgMonitoringDir\prometheus-additional-scrape-config.yaml" Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-cluster-workloads.json") -OutFile "$AgMonitoringDir\grafana-cluster-workloads.json" Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-cluster-pods.json") -OutFile "$AgMonitoringDir\grafana-cluster-pods.json" +Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-node-exporter-full-v2.json") -OutFile "$AgMonitoringDir\grafana-node-exporter-full-v2.json" Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/grafana.ico") -OutFile $AgIconsDir\grafana.ico Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso.png") -OutFile $AgIconsDir\contoso.png Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso.svg") -OutFile $AgIconsDir\contoso.svg diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index 03eac76843..56cc92f4ab 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -1048,49 +1048,94 @@ function Deploy-Prometheus { Write-Host "[$(Get-Date -Format t)] INFO: Importing dashboards for $($_.Value.FriendlyName) environment" -ForegroundColor Gray # Add dashboards - foreach ($dashboard in $observabilityDashboardstoImport) { - $grafanaDBPath = "$AgMonitoringDir\grafana-$dashboard.json" - # Replace the datasource - $replacementParams = @{ - "\$\{DS_PROMETHEUS}" = $_.Value.GrafanaDataSource - } - $content = Get-Content $grafanaDBPath - foreach ($key in $replacementParams.Keys) { - $content = $content -replace $key, $replacementParams[$key] - } - # Set dashboard JSON - $dashboardObject = $content | ConvertFrom-Json - # Best practice is to generate a random UID, such as a GUID - $dashboardObject.uid = [guid]::NewGuid().ToString() - - # Need to set this to null to let Grafana generate a new ID - $dashboardObject.id = $null - # Set dashboard title - $dashboardObject.title = $_.Value.FriendlyName + ' - ' + $dashboardObject.title - # Request body with dashboard to add - $grafanaDBBody = @{ - dashboard = $dashboardObject - overwrite = $true - } | ConvertTo-Json -Depth 10 - - if ($_.Value.IsProduction) { - # Set Grafana Dashboard endpoint - $grafanaDBURI = $AgConfig.Monitoring["ProdURL"] + "/api/dashboards/db" - $grafanaDBStarURI = $AgConfig.Monitoring["ProdURL"] + "/api/user/stars/dashboard" - } - else { - # Set Grafana Dashboard endpoint - $grafanaDBURI = "http://$monitorLBIP/api/dashboards/db" - $grafanaDBStarURI = "http://$monitorLBIP/api/user/stars/dashboard" - } + if ($Env:scenario -eq "contoso_hypermarket") { + foreach ($dashboard in $observabilityDashboardstoImport) { + $grafanaDBPath = "$AgMonitoringDir\grafana-$dashboard.json" + # Replace the datasource + $replacementParams = @{ + "\$\{DS_PROMETHEUS}" = $_.Value.GrafanaDataSource + } + $content = Get-Content $grafanaDBPath + foreach ($key in $replacementParams.Keys) { + $content = $content -replace $key, $replacementParams[$key] + } + # Set dashboard JSON + $dashboardObject = $content | ConvertFrom-Json + # Best practice is to generate a random UID, such as a GUID + $dashboardObject.uid = [guid]::NewGuid().ToString() + + # Need to set this to null to let Grafana generate a new ID + $dashboardObject.id = $null + # # Set dashboard title + # $dashboardObject.title = $_.Value.FriendlyName + ' - ' + $dashboardObject.title + # Request body with dashboard to add + $grafanaDBBody = @{ + dashboard = $dashboardObject + overwrite = $true + } | ConvertTo-Json -Depth 10 + + if ($_.Value.IsProduction) { + # Set Grafana Dashboard endpoint + $grafanaDBURI = $AgConfig.Monitoring["ProdURL"] + "/api/dashboards/db" + $grafanaDBStarURI = $AgConfig.Monitoring["ProdURL"] + "/api/user/stars/dashboard" + } + else { + # Set Grafana Dashboard endpoint + $grafanaDBURI = "http://$monitorLBIP/api/dashboards/db" + $grafanaDBStarURI = "http://$monitorLBIP/api/user/stars/dashboard" + } - # Make HTTP request to the API - $dashboardID = (Invoke-RestMethod -Method Post -Uri $grafanaDBURI -Headers $adminHeaders -Body $grafanaDBBody).id + # Make HTTP request to the API + $dashboardID = (Invoke-RestMethod -Method Post -Uri $grafanaDBURI -Headers $adminHeaders -Body $grafanaDBBody).id - Invoke-RestMethod -Method Post -Uri "$grafanaDBStarURI/$dashboardID" -Headers $userHeaders | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Observability.log") + Invoke-RestMethod -Method Post -Uri "$grafanaDBStarURI/$dashboardID" -Headers $userHeaders | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Observability.log") + } } + else { + foreach ($dashboard in $observabilityDashboardstoImport) { + $grafanaDBPath = "$AgMonitoringDir\grafana-$dashboard.json" + # Replace the datasource + $replacementParams = @{ + "\$\{DS_PROMETHEUS}" = $_.Value.GrafanaDataSource + } + $content = Get-Content $grafanaDBPath + foreach ($key in $replacementParams.Keys) { + $content = $content -replace $key, $replacementParams[$key] + } + # Set dashboard JSON + $dashboardObject = $content | ConvertFrom-Json + # Best practice is to generate a random UID, such as a GUID + $dashboardObject.uid = [guid]::NewGuid().ToString() + + # Need to set this to null to let Grafana generate a new ID + $dashboardObject.id = $null + # Set dashboard title + $dashboardObject.title = $_.Value.FriendlyName + ' - ' + $dashboardObject.title + # Request body with dashboard to add + $grafanaDBBody = @{ + dashboard = $dashboardObject + overwrite = $true + } | ConvertTo-Json -Depth 10 + + if ($_.Value.IsProduction) { + # Set Grafana Dashboard endpoint + $grafanaDBURI = $AgConfig.Monitoring["ProdURL"] + "/api/dashboards/db" + $grafanaDBStarURI = $AgConfig.Monitoring["ProdURL"] + "/api/user/stars/dashboard" + } + else { + # Set Grafana Dashboard endpoint + $grafanaDBURI = "http://$monitorLBIP/api/dashboards/db" + $grafanaDBStarURI = "http://$monitorLBIP/api/user/stars/dashboard" + } + + # Make HTTP request to the API + $dashboardID = (Invoke-RestMethod -Method Post -Uri $grafanaDBURI -Headers $adminHeaders -Body $grafanaDBBody).id + + Invoke-RestMethod -Method Post -Uri "$grafanaDBStarURI/$dashboardID" -Headers $userHeaders | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Observability.log") + } + } } Write-Host } diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-global.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-global.json index 66e4013aa1..e87d1aa95f 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-global.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-global.json @@ -1,7 +1,7 @@ { "__inputs": [ { - "name": "DS_PROMETHEUS", + "name": "datasource", "label": "Prometheus", "description": "", "type": "datasource", diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json index 4550101eb6..aca1724733 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json @@ -2282,8 +2282,8 @@ ], "schemaVersion": 39, "tags": [ - "kubernetes-mixin", - "Microsoft-managed" + "jumpstart-agora", + "contoso" ], "templating": { "list": [ diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json index 7adcdfe0bc..7ea73566aa 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json @@ -2064,8 +2064,8 @@ "refresh": "1m", "schemaVersion": 39, "tags": [ - "kubernetes-mixin", - "Microsoft-managed" + "jumpstart-agora", + "contoso" ], "templating": { "list": [ diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-node-exporter-full-v2.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-node-exporter-full-v2.json new file mode 100644 index 0000000000..182e4d3f0b --- /dev/null +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-node-exporter-full-v2.json @@ -0,0 +1,23418 @@ +{ + "__inputs": [ + { + "name": "datasource", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": {}, + "__requires": [ + { + "type": "panel", + "id": "gauge", + "name": "Gauge", + "version": "" + }, + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "9.5.2" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "stat", + "name": "Stat", + "version": "" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "annotations": { + "list": [ + { + "$$hashKey": "object:1058", + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "gnetId": 1860, + "graphTooltip": 1, + "id": null, + "links": [ + { + "icon": "external link", + "tags": [], + "targetBlank": true, + "title": "GitHub", + "type": "link", + "url": "https://github.com/rfmoz/grafana-dashboards" + }, + { + "icon": "external link", + "tags": [], + "targetBlank": true, + "title": "Grafana", + "type": "link", + "url": "https://grafana.com/grafana/dashboards/1860" + } + ], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 261, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "refId": "A" + } + ], + "title": "Quick CPU / Mem / Disk", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Busy state of all CPU cores together", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(50, 172, 45, 0.97)", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 85 + }, + { + "color": "rgba(245, 54, 54, 0.9)", + "value": 95 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 0, + "y": 1 + }, + "id": 20, + "links": [], + "options": { + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "9.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "(sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode!=\"idle\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))) * 100", + "hide": false, + "intervalFactor": 1, + "legendFormat": "", + "range": true, + "refId": "A", + "step": 240 + } + ], + "title": "CPU Busy", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Busy state of all CPU cores together (5 min average)", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(50, 172, 45, 0.97)", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 85 + }, + { + "color": "rgba(245, 54, 54, 0.9)", + "value": 95 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 3, + "y": 1 + }, + "id": 155, + "links": [], + "options": { + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "9.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "avg(node_load5{instance=\"$node\",job=\"$job\"}) / count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)) * 100", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "refId": "A", + "step": 240 + } + ], + "title": "Sys Load (5m avg)", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Busy state of all CPU cores together (15 min average)", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(50, 172, 45, 0.97)", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 85 + }, + { + "color": "rgba(245, 54, 54, 0.9)", + "value": 95 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 6, + "y": 1 + }, + "id": 19, + "links": [], + "options": { + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "9.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "avg(node_load15{instance=\"$node\",job=\"$job\"}) / count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)) * 100", + "hide": false, + "intervalFactor": 1, + "refId": "A", + "step": 240 + } + ], + "title": "Sys Load (15m avg)", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Non available RAM memory", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 0, + "mappings": [], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(50, 172, 45, 0.97)", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 80 + }, + { + "color": "rgba(245, 54, 54, 0.9)", + "value": 90 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 9, + "y": 1 + }, + "hideTimeOverride": false, + "id": 16, + "links": [], + "options": { + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "9.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "((node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"}) / (node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"} )) * 100", + "format": "time_series", + "hide": true, + "intervalFactor": 1, + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "100 - ((node_memory_MemAvailable_bytes{instance=\"$node\",job=\"$job\"} * 100) / node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"})", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "refId": "B", + "step": 240 + } + ], + "title": "RAM Used", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Used Swap", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(50, 172, 45, 0.97)", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 10 + }, + { + "color": "rgba(245, 54, 54, 0.9)", + "value": 25 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 12, + "y": 1 + }, + "id": 21, + "links": [], + "options": { + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "9.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "((node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapFree_bytes{instance=\"$node\",job=\"$job\"}) / (node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} )) * 100", + "intervalFactor": 1, + "refId": "A", + "step": 240 + } + ], + "title": "SWAP Used", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Used Root FS", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(50, 172, 45, 0.97)", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 80 + }, + { + "color": "rgba(245, 54, 54, 0.9)", + "value": 90 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 15, + "y": 1 + }, + "id": 154, + "links": [], + "options": { + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "9.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "100 - ((node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",mountpoint=\"/\",fstype!=\"rootfs\"} * 100) / node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",mountpoint=\"/\",fstype!=\"rootfs\"})", + "format": "time_series", + "intervalFactor": 1, + "refId": "A", + "step": 240 + } + ], + "title": "Root FS Used", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Total number of CPU cores", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 2, + "x": 18, + "y": 1 + }, + "id": 14, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu))", + "interval": "", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 240 + } + ], + "title": "CPU Cores", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "System uptime", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 1, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 4, + "x": 20, + "y": 1 + }, + "hideTimeOverride": true, + "id": 15, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_time_seconds{instance=\"$node\",job=\"$job\"} - node_boot_time_seconds{instance=\"$node\",job=\"$job\"}", + "intervalFactor": 1, + "refId": "A", + "step": 240 + } + ], + "title": "Uptime", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Total RootFS", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 0, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(50, 172, 45, 0.97)", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 70 + }, + { + "color": "rgba(245, 54, 54, 0.9)", + "value": 90 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 2, + "x": 18, + "y": 3 + }, + "id": 23, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",mountpoint=\"/\",fstype!=\"rootfs\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "refId": "A", + "step": 240 + } + ], + "title": "RootFS Total", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Total RAM", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 0, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 2, + "x": 20, + "y": 3 + }, + "id": 75, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"}", + "intervalFactor": 1, + "refId": "A", + "step": 240 + } + ], + "title": "RAM Total", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Total SWAP", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 0, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 2, + "x": 22, + "y": 3 + }, + "id": 18, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"}", + "intervalFactor": 1, + "refId": "A", + "step": 240 + } + ], + "title": "SWAP Total", + "type": "stat" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 5 + }, + "id": 263, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "refId": "A" + } + ], + "title": "Basic CPU / Mem / Net / Disk", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Basic CPU info", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 40, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "percent" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Busy Iowait" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#890F02", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Idle" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Busy Iowait" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#890F02", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Idle" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Busy System" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Busy User" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A437C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Busy Other" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 6 + }, + "id": 77, + "links": [], + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true, + "width": 250 + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"system\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Busy System", + "range": true, + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"user\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Busy User", + "range": true, + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"iowait\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Busy Iowait", + "range": true, + "refId": "C", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=~\".*irq\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Busy IRQs", + "range": true, + "refId": "D", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode!='idle',mode!='user',mode!='system',mode!='iowait',mode!='irq',mode!='softirq'}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Busy Other", + "range": true, + "refId": "E", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"idle\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Idle", + "range": true, + "refId": "F", + "step": 240 + } + ], + "title": "CPU Basic", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Basic memory usage", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 40, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Apps" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#629E51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A437C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#CFFAFF", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "SWAP Used" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#806EB7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap Used" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#2F575E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Unused" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM Total" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.stacking", + "value": { + "group": false, + "mode": "normal" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM Cache + Buffer" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Available" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#DEDAF7", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.stacking", + "value": { + "group": false, + "mode": "normal" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 6 + }, + "id": 78, + "links": [], + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true, + "width": 350 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "RAM Total", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"} - (node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"} + node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"} + node_memory_SReclaimable_bytes{instance=\"$node\",job=\"$job\"})", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "RAM Used", + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"} + node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"} + node_memory_SReclaimable_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "RAM Cache + Buffer", + "refId": "C", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "RAM Free", + "refId": "D", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "(node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapFree_bytes{instance=\"$node\",job=\"$job\"})", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "SWAP Used", + "refId": "E", + "step": 240 + } + ], + "title": "Memory Basic", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Basic network info per interface", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 40, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bps" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Recv_bytes_eth2" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Recv_bytes_lo" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Recv_drop_eth2" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6ED0E0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Recv_drop_lo" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Recv_errs_eth2" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Recv_errs_lo" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#CCA300", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Trans_bytes_eth2" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Trans_bytes_lo" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Trans_drop_eth2" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6ED0E0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Trans_drop_lo" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Trans_errs_eth2" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Trans_errs_lo" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#CCA300", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "recv_bytes_lo" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "recv_drop_eth0" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#99440A", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "recv_drop_lo" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#967302", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "recv_errs_eth0" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "recv_errs_lo" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#890F02", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "trans_bytes_eth0" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "trans_bytes_lo" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "trans_drop_eth0" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#99440A", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "trans_drop_lo" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#967302", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "trans_errs_eth0" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "trans_errs_lo" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#890F02", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*trans.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 13 + }, + "id": 74, + "links": [], + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_network_receive_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "recv {{device}}", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_network_transmit_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "trans {{device}} ", + "refId": "B", + "step": 240 + } + ], + "title": "Network Traffic Basic", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Disk space used of all filesystems mounted", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 40, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 13 + }, + "id": 152, + "links": [], + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "100 - ((node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'} * 100) / node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'})", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{mountpoint}}", + "refId": "A", + "step": 240 + } + ], + "title": "Disk Space Used Basic", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 20 + }, + "id": 265, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "refId": "A" + } + ], + "title": "CPU / Memory / Net / Disk", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "percentage", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 70, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "percent" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Idle - Waiting for something to happen" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Iowait - Waiting for I/O to complete" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Irq - Servicing interrupts" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Nice - Niced processes executing in user mode" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Softirq - Servicing softirqs" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E24D42", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Steal - Time spent in other operating systems when running in a virtualized environment" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#FCE2DE", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "System - Processes executing in kernel mode" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "User - Normal processes executing in user mode" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#5195CE", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 12, + "w": 12, + "x": 0, + "y": 21 + }, + "id": 3, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 250 + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"system\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "System - Processes executing in kernel mode", + "range": true, + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"user\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "User - Normal processes executing in user mode", + "range": true, + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"nice\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Nice - Niced processes executing in user mode", + "range": true, + "refId": "C", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"iowait\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Iowait - Waiting for I/O to complete", + "range": true, + "refId": "E", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"irq\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Irq - Servicing interrupts", + "range": true, + "refId": "F", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"softirq\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Softirq - Servicing softirqs", + "range": true, + "refId": "G", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"steal\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Steal - Time spent in other operating systems when running in a virtualized environment", + "range": true, + "refId": "H", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"idle\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Idle - Waiting for something to happen", + "range": true, + "refId": "J", + "step": 240 + } + ], + "title": "CPU", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 40, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Apps" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#629E51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A437C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#CFFAFF", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#806EB7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap - Swap memory usage" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#2F575E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Unused" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Unused - Free memory unassigned" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*Hardware Corrupted - *./" + }, + "properties": [ + { + "id": "custom.stacking", + "value": { + "group": false, + "mode": "normal" + } + } + ] + } + ] + }, + "gridPos": { + "h": 12, + "w": 12, + "x": 12, + "y": 21 + }, + "id": 24, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 350 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"} - node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"} - node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"} - node_memory_Slab_bytes{instance=\"$node\",job=\"$job\"} - node_memory_PageTables_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapCached_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Apps - Memory used by user-space applications", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_PageTables_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "PageTables - Memory used to map between virtual and physical memory addresses", + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_SwapCached_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "SwapCache - Memory that keeps track of pages that have been fetched from swap but not yet been modified", + "refId": "C", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_Slab_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Slab - Memory used by the kernel to cache data structures for its own use (caches like inode, dentry, etc)", + "refId": "D", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Cache - Parked file data (file content) cache", + "refId": "E", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Buffers - Block device (e.g. harddisk) cache", + "refId": "F", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Unused - Free memory unassigned", + "refId": "G", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "(node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapFree_bytes{instance=\"$node\",job=\"$job\"})", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Swap - Swap space used", + "refId": "H", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_HardwareCorrupted_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working", + "refId": "I", + "step": 240 + } + ], + "title": "Memory Stack", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bits out (-) / in (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 40, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bps" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "receive_packets_eth0" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "receive_packets_lo" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E24D42", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "transmit_packets_eth0" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "transmit_packets_lo" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E24D42", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*Trans.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 12, + "w": 12, + "x": 0, + "y": 33 + }, + "id": 84, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_network_receive_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{device}} - Receive", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_network_transmit_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{device}} - Transmit", + "refId": "B", + "step": 240 + } + ], + "title": "Network Traffic", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 40, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 12, + "w": 12, + "x": 12, + "y": 33 + }, + "id": 156, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'} - node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{mountpoint}}", + "refId": "A", + "step": 240 + } + ], + "title": "Disk Space Used", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "IO read (-) / write (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "iops" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Read.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6ED0E0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EF843C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E24D42", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda2_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BA43A9", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda3_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F4D598", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#962D82", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#9AC48A", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#65C5DB", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F9934E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#FCEACA", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F9E2D2", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 12, + "w": 12, + "x": 0, + "y": 45 + }, + "id": 229, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_disk_reads_completed_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"}[$__rate_interval])", + "intervalFactor": 4, + "legendFormat": "{{device}} - Reads completed", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_disk_writes_completed_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"}[$__rate_interval])", + "intervalFactor": 1, + "legendFormat": "{{device}} - Writes completed", + "refId": "B", + "step": 240 + } + ], + "title": "Disk IOps", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes read (-) / write (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 40, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "Bps" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "io time" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#890F02", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*read*./" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6ED0E0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EF843C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E24D42", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byType", + "options": "time" + }, + "properties": [ + { + "id": "custom.axisPlacement", + "value": "hidden" + } + ] + } + ] + }, + "gridPos": { + "h": 12, + "w": 12, + "x": 12, + "y": 45 + }, + "id": 42, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_disk_read_bytes_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"}[$__rate_interval])", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "{{device}} - Successfully read bytes", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_disk_written_bytes_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"}[$__rate_interval])", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "{{device}} - Successfully written bytes", + "refId": "B", + "step": 240 + } + ], + "title": "I/O Usage Read / Write", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "%util", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 40, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "io time" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#890F02", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byType", + "options": "time" + }, + "properties": [ + { + "id": "custom.axisPlacement", + "value": "hidden" + } + ] + } + ] + }, + "gridPos": { + "h": 12, + "w": 12, + "x": 0, + "y": 57 + }, + "id": 127, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_disk_io_time_seconds_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{device}}", + "refId": "A", + "step": 240 + } + ], + "title": "I/O Utilization", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "percentage", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 70, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 3, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "max": 1, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/^Guest - /" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#5195ce", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/^GuestNice - /" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#c15c17", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 12, + "w": 12, + "x": 12, + "y": 57 + }, + "id": 319, + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum by(instance) (irate(node_cpu_guest_seconds_total{instance=\"$node\",job=\"$job\", mode=\"user\"}[1m])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[1m])))", + "hide": false, + "legendFormat": "Guest - Time spent running a virtual CPU for a guest operating system", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum by(instance) (irate(node_cpu_guest_seconds_total{instance=\"$node\",job=\"$job\", mode=\"nice\"}[1m])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[1m])))", + "hide": false, + "legendFormat": "GuestNice - Time spent running a niced guest (virtual CPU for guest operating system)", + "range": true, + "refId": "B" + } + ], + "title": "CPU spent seconds in guests (VMs)", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 69 + }, + "id": 266, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "refId": "A" + } + ], + "title": "Memory Meminfo", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Apps" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#629E51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A437C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#CFFAFF", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#806EB7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#2F575E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Unused" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 70 + }, + "id": 136, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 350 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_Inactive_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Inactive - Memory which has been less recently used. It is more eligible to be reclaimed for other purposes", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_Active_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Active - Memory that has been used more recently and usually not reclaimed unless absolutely necessary", + "refId": "B", + "step": 240 + } + ], + "title": "Memory Active / Inactive", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Apps" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#629E51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A437C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#CFFAFF", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#806EB7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#2F575E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Unused" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*CommitLimit - *./" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 70 + }, + "id": 135, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 350 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_Committed_AS_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Committed_AS - Amount of memory presently allocated on the system", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_CommitLimit_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "CommitLimit - Amount of memory currently available to be allocated on the system", + "refId": "B", + "step": 240 + } + ], + "title": "Memory Committed", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Apps" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#629E51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A437C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#CFFAFF", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#806EB7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#2F575E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Unused" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 80 + }, + "id": 191, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 350 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_Inactive_file_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Inactive_file - File-backed memory on inactive LRU list", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_Inactive_anon_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Inactive_anon - Anonymous and swap cache on inactive LRU list, including tmpfs (shmem)", + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_Active_file_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Active_file - File-backed memory on active LRU list", + "refId": "C", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_Active_anon_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Active_anon - Anonymous and swap cache on active least-recently-used (LRU) list, including tmpfs", + "refId": "D", + "step": 240 + } + ], + "title": "Memory Active / Inactive Detail", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Active" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#99440A", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#58140C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Dirty" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6ED0E0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#B7DBAB", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Mapped" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total RAM" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total RAM + Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "VmallocUsed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 80 + }, + "id": 130, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_Writeback_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Writeback - Memory which is actively being written back to disk", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_WritebackTmp_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "WritebackTmp - Memory used by FUSE for temporary writeback buffers", + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_Dirty_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Dirty - Memory which is waiting to get written back to the disk", + "refId": "C", + "step": 240 + } + ], + "title": "Memory Writeback and Dirty", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Apps" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#629E51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A437C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#CFFAFF", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#806EB7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#2F575E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Unused" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "ShmemHugePages - Memory used by shared memory (shmem) and tmpfs allocated with huge pages" + }, + "properties": [ + { + "id": "custom.fillOpacity", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "ShmemHugePages - Memory used by shared memory (shmem) and tmpfs allocated with huge pages" + }, + "properties": [ + { + "id": "custom.fillOpacity", + "value": 0 + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 90 + }, + "id": 138, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 350 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_Mapped_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Mapped - Used memory in mapped pages files which have been mapped, such as libraries", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_Shmem_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Shmem - Used shared memory (shared between several processes, thus including RAM disks)", + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_ShmemHugePages_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "ShmemHugePages - Memory used by shared memory (shmem) and tmpfs allocated with huge pages", + "refId": "C", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_ShmemPmdMapped_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "ShmemPmdMapped - Amount of shared (shmem/tmpfs) memory backed by huge pages", + "refId": "D", + "step": 240 + } + ], + "title": "Memory Shared and Mapped", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Active" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#99440A", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#58140C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Dirty" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6ED0E0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#B7DBAB", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Mapped" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total RAM" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total RAM + Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "VmallocUsed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 90 + }, + "id": 131, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_SUnreclaim_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "SUnreclaim - Part of Slab, that cannot be reclaimed on memory pressure", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_SReclaimable_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "SReclaimable - Part of Slab, that might be reclaimed, such as caches", + "refId": "B", + "step": 240 + } + ], + "title": "Memory Slab", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Active" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#99440A", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#58140C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Dirty" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6ED0E0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#B7DBAB", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Mapped" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total RAM" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total RAM + Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "VmallocUsed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 100 + }, + "id": 70, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_VmallocChunk_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "VmallocChunk - Largest contiguous block of vmalloc area which is free", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_VmallocTotal_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "VmallocTotal - Total size of vmalloc memory area", + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_VmallocUsed_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "VmallocUsed - Amount of vmalloc area which is used", + "refId": "C", + "step": 240 + } + ], + "title": "Memory Vmalloc", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Apps" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#629E51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A437C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#CFFAFF", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#806EB7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#2F575E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Unused" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 100 + }, + "id": 159, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 350 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_Bounce_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Bounce - Memory used for block device bounce buffers", + "refId": "A", + "step": 240 + } + ], + "title": "Memory Bounce", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Active" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#99440A", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#58140C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Dirty" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6ED0E0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#B7DBAB", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Mapped" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total RAM" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total RAM + Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "VmallocUsed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*Inactive *./" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 110 + }, + "id": 129, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_AnonHugePages_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "AnonHugePages - Memory in anonymous huge pages", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_AnonPages_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "AnonPages - Memory in user pages not backed by files", + "refId": "B", + "step": 240 + } + ], + "title": "Memory Anonymous", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Apps" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#629E51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A437C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#CFFAFF", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#806EB7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#2F575E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Unused" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 110 + }, + "id": 160, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 350 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_KernelStack_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "KernelStack - Kernel memory stack. This is not reclaimable", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_Percpu_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "PerCPU - Per CPU memory allocated dynamically by loadable modules", + "refId": "B", + "step": 240 + } + ], + "title": "Memory Kernel / CPU", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "pages", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Active" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#99440A", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#58140C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Dirty" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6ED0E0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#B7DBAB", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Mapped" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total RAM" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#806EB7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total RAM + Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#806EB7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "VmallocUsed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 120 + }, + "id": 140, + "links": [], + "options": { + "legend": { + "calcs": [ + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_HugePages_Free{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "HugePages_Free - Huge pages in the pool that are not yet allocated", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_HugePages_Rsvd{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "HugePages_Rsvd - Huge pages for which a commitment to allocate from the pool has been made, but no allocation has yet been made", + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_HugePages_Surp{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "HugePages_Surp - Huge pages in the pool above the value in /proc/sys/vm/nr_hugepages", + "refId": "C", + "step": 240 + } + ], + "title": "Memory HugePages Counter", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Active" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#99440A", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#58140C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Dirty" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6ED0E0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#B7DBAB", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Mapped" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total RAM" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#806EB7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total RAM + Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#806EB7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "VmallocUsed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 120 + }, + "id": 71, + "links": [], + "options": { + "legend": { + "calcs": [ + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_HugePages_Total{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "HugePages - Total size of the pool of huge pages", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_Hugepagesize_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Hugepagesize - Huge Page size", + "refId": "B", + "step": 240 + } + ], + "title": "Memory HugePages Size", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Active" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#99440A", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#58140C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Dirty" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6ED0E0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#B7DBAB", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Mapped" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total RAM" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total RAM + Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "VmallocUsed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 130 + }, + "id": 128, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_DirectMap1G_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "DirectMap1G - Amount of pages mapped as this size", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_DirectMap2M_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "DirectMap2M - Amount of pages mapped as this size", + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_DirectMap4k_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "DirectMap4K - Amount of pages mapped as this size", + "refId": "C", + "step": 240 + } + ], + "title": "Memory DirectMap", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Apps" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#629E51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A437C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#CFFAFF", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#806EB7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#2F575E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Unused" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 130 + }, + "id": 137, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 350 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_Unevictable_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Unevictable - Amount of unevictable memory that can't be swapped out for a variety of reasons", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_Mlocked_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "MLocked - Size of pages locked to memory using the mlock() system call", + "refId": "B", + "step": 240 + } + ], + "title": "Memory Unevictable and MLocked", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Active" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#99440A", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#58140C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Dirty" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6ED0E0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#B7DBAB", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Mapped" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total RAM" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total RAM + Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "VmallocUsed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 140 + }, + "id": 132, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_memory_NFS_Unstable_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "NFS Unstable - Memory in NFS pages sent to the server, but not yet committed to the storage", + "refId": "A", + "step": 240 + } + ], + "title": "Memory NFS", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 150 + }, + "id": 267, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "refId": "A" + } + ], + "title": "Memory Vmstat", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "pages out (-) / in (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*out/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 151 + }, + "id": 176, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_vmstat_pgpgin{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Pagesin - Page in operations", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_vmstat_pgpgout{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Pagesout - Page out operations", + "refId": "B", + "step": 240 + } + ], + "title": "Memory Pages In / Out", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "pages out (-) / in (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*out/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 151 + }, + "id": 22, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_vmstat_pswpin{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Pswpin - Pages swapped in", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_vmstat_pswpout{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Pswpout - Pages swapped out", + "refId": "B", + "step": 240 + } + ], + "title": "Memory Pages Swap In / Out", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "faults", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Apps" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#629E51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A437C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#CFFAFF", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#806EB7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#2F575E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Unused" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Pgfault - Page major and minor fault operations" + }, + "properties": [ + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.stacking", + "value": { + "group": false, + "mode": "normal" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 161 + }, + "id": 175, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 350 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_vmstat_pgfault{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Pgfault - Page major and minor fault operations", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_vmstat_pgmajfault{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Pgmajfault - Major page fault operations", + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_vmstat_pgfault{instance=\"$node\",job=\"$job\"}[$__rate_interval]) - irate(node_vmstat_pgmajfault{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Pgminfault - Minor page fault operations", + "refId": "C", + "step": 240 + } + ], + "title": "Memory Page Faults", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Active" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#99440A", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#58140C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Dirty" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6ED0E0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#B7DBAB", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Mapped" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total RAM" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total RAM + Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "VmallocUsed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 161 + }, + "id": 307, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_vmstat_oom_kill{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "oom killer invocations ", + "refId": "A", + "step": 240 + } + ], + "title": "OOM Killer", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 171 + }, + "id": 293, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "refId": "A" + } + ], + "title": "System Timesync", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "seconds", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Variation*./" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#890F02", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 172 + }, + "id": 260, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_timex_estimated_error_seconds{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "Estimated error in seconds", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_timex_offset_seconds{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "Time offset in between local system and reference clock", + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_timex_maxerror_seconds{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "Maximum error in seconds", + "refId": "C", + "step": 240 + } + ], + "title": "Time Synchronized Drift", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 172 + }, + "id": 291, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_timex_loop_time_constant{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Phase-locked loop time adjust", + "refId": "A", + "step": 240 + } + ], + "title": "Time PLL Adjust", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Variation*./" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#890F02", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 182 + }, + "id": 168, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_timex_sync_status{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Is clock synchronized to a reliable server (1 = yes, 0 = no)", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_timex_frequency_adjustment_ratio{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Local clock frequency adjustment", + "refId": "B", + "step": 240 + } + ], + "title": "Time Synchronized Status", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "seconds", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 182 + }, + "id": 294, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_timex_tick_seconds{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Seconds between clock ticks", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_timex_tai_offset_seconds{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "International Atomic Time (TAI) offset", + "refId": "B", + "step": 240 + } + ], + "title": "Time Misc", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 192 + }, + "id": 312, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "refId": "A" + } + ], + "title": "System Processes", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 193 + }, + "id": 62, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_procs_blocked{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Processes blocked waiting for I/O to complete", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_procs_running{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Processes in runnable state", + "refId": "B", + "step": 240 + } + ], + "title": "Processes Status", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 193 + }, + "id": 315, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_processes_state{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{ state }}", + "refId": "A", + "step": 240 + } + ], + "title": "Processes State", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "forks / sec", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 203 + }, + "id": 148, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_forks_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Processes forks second", + "refId": "A", + "step": 240 + } + ], + "title": "Processes Forks", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "decbytes" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Max.*/" + }, + "properties": [ + { + "id": "custom.fillOpacity", + "value": 0 + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 203 + }, + "id": 149, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(process_virtual_memory_bytes{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "Processes virtual memory size in bytes", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "process_resident_memory_max_bytes{instance=\"$node\",job=\"$job\"}", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "Maximum amount of virtual memory available in bytes", + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(process_virtual_memory_bytes{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "Processes virtual memory size in bytes", + "refId": "C", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(process_virtual_memory_max_bytes{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "Maximum amount of virtual memory available in bytes", + "refId": "D", + "step": 240 + } + ], + "title": "Processes Memory", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "PIDs limit" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F2495C", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 213 + }, + "id": 313, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_processes_pids{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Number of PIDs", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_processes_max_processes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "PIDs limit", + "refId": "B", + "step": 240 + } + ], + "title": "PIDs Number and Limit", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "seconds", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*waiting.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 213 + }, + "id": 305, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_schedstat_running_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "CPU {{ cpu }} - seconds spent running a process", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_schedstat_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "CPU {{ cpu }} - seconds spent by processing waiting for this CPU", + "refId": "B", + "step": 240 + } + ], + "title": "Process schedule stats Running / Waiting", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Threads limit" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F2495C", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 223 + }, + "id": 314, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_processes_threads{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Allocated threads", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_processes_max_threads{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Threads limit", + "refId": "B", + "step": 240 + } + ], + "title": "Threads Number and Limit", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 233 + }, + "id": 269, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "refId": "A" + } + ], + "title": "System Misc", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 234 + }, + "id": 8, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_context_switches_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Context switches", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_intr_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Interrupts", + "refId": "B", + "step": 240 + } + ], + "title": "Context Switches / Interrupts", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 234 + }, + "id": 7, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_load1{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 4, + "legendFormat": "Load 1m", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_load5{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 4, + "legendFormat": "Load 5m", + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_load15{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 4, + "legendFormat": "Load 15m", + "refId": "C", + "step": 240 + } + ], + "title": "System Load", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Critical*./" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E24D42", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*Max*./" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EF843C", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 244 + }, + "id": 259, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_interrupts_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{ type }} - {{ info }}", + "refId": "A", + "step": 240 + } + ], + "title": "Interrupts Detail", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 244 + }, + "id": 306, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_schedstat_timeslices_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "CPU {{ cpu }}", + "refId": "A", + "step": 240 + } + ], + "title": "Schedule timeslices executed by each cpu", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 254 + }, + "id": 151, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_entropy_available_bits{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Entropy available to random number generators", + "refId": "A", + "step": 240 + } + ], + "title": "Entropy", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "seconds", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 254 + }, + "id": 308, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(process_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Time spent", + "refId": "A", + "step": 240 + } + ], + "title": "CPU time spent in user and system contexts", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Max*./" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#890F02", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 264 + }, + "id": 64, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "process_max_fds{instance=\"$node\",job=\"$job\"}", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Maximum open file descriptors", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "process_open_fds{instance=\"$node\",job=\"$job\"}", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Open file descriptors", + "refId": "B", + "step": 240 + } + ], + "title": "File Descriptors", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 274 + }, + "id": 304, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "refId": "A" + } + ], + "title": "Hardware Misc", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "temperature", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "celsius" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Critical*./" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E24D42", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*Max*./" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EF843C", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 275 + }, + "id": 158, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_hwmon_temp_celsius{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{ chip }} {{ sensor }} temp", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_hwmon_temp_crit_alarm_celsius{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{ chip }} {{ sensor }} Critical Alarm", + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_hwmon_temp_crit_celsius{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{ chip }} {{ sensor }} Critical", + "refId": "C", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_hwmon_temp_crit_hyst_celsius{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{ chip }} {{ sensor }} Critical Historical", + "refId": "D", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_hwmon_temp_max_celsius{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{ chip }} {{ sensor }} Max", + "refId": "E", + "step": 240 + } + ], + "title": "Hardware temperature monitor", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Max*./" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EF843C", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 275 + }, + "id": 300, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_cooling_device_cur_state{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "Current {{ name }} in {{ type }}", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_cooling_device_max_state{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Max {{ name }} in {{ type }}", + "refId": "B", + "step": 240 + } + ], + "title": "Throttle cooling device", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 285 + }, + "id": 302, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_power_supply_online{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{ power_supply }} online", + "refId": "A", + "step": 240 + } + ], + "title": "Power supply", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 295 + }, + "id": 296, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "refId": "A" + } + ], + "title": "Systemd", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 296 + }, + "id": 297, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_systemd_socket_accepted_connections_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{ name }} Connections", + "refId": "A", + "step": 240 + } + ], + "title": "Systemd Sockets", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Failed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F2495C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#FF9830", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Active" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#73BF69", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Deactivating" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#FFCB7D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Activating" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C8F2C2", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 296 + }, + "id": 298, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"activating\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Activating", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"active\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Active", + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"deactivating\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Deactivating", + "refId": "C", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"failed\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Failed", + "refId": "D", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"inactive\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Inactive", + "refId": "E", + "step": 240 + } + ], + "title": "Systemd Units State", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 306 + }, + "id": 270, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "refId": "A" + } + ], + "title": "Storage Disk", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "The number (after merges) of I/O requests completed per second for the device", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "IO read (-) / write (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "iops" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Read.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6ED0E0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EF843C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E24D42", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda2_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BA43A9", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda3_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F4D598", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#962D82", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#9AC48A", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#65C5DB", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F9934E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#FCEACA", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F9E2D2", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 307 + }, + "id": 9, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_disk_reads_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "intervalFactor": 4, + "legendFormat": "{{device}} - Reads completed", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_disk_writes_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "intervalFactor": 1, + "legendFormat": "{{device}} - Writes completed", + "refId": "B", + "step": 240 + } + ], + "title": "Disk IOps Completed", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "The number of bytes read from or written to the device per second", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes read (-) / write (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "Bps" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Read.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6ED0E0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EF843C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E24D42", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda2_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BA43A9", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda3_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F4D598", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#962D82", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#9AC48A", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#65C5DB", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F9934E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#FCEACA", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F9E2D2", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 307 + }, + "id": 33, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_disk_read_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 4, + "legendFormat": "{{device}} - Read bytes", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_disk_written_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{device}} - Written bytes", + "refId": "B", + "step": 240 + } + ], + "title": "Disk R/W Data", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "The average time for requests issued to the device to be served. This includes the time spent by the requests in queue and the time spent servicing them.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "time. read (-) / write (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 30, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Read.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6ED0E0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EF843C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E24D42", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda2_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BA43A9", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda3_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F4D598", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#962D82", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#9AC48A", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#65C5DB", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F9934E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#FCEACA", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F9E2D2", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 317 + }, + "id": 37, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_disk_read_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]) / irate(node_disk_reads_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "hide": false, + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{device}} - Read wait time avg", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_disk_write_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]) / irate(node_disk_writes_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{device}} - Write wait time avg", + "refId": "B", + "step": 240 + } + ], + "title": "Disk Average Wait Time", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "The average queue length of the requests that were issued to the device", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "aqu-sz", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6ED0E0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EF843C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E24D42", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda2_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BA43A9", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda3_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F4D598", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#962D82", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#9AC48A", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#65C5DB", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F9934E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#FCEACA", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F9E2D2", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 317 + }, + "id": 35, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_disk_io_time_weighted_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{device}}", + "refId": "A", + "step": 240 + } + ], + "title": "Average Queue Size", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "The number of read and write requests merged per second that were queued to the device", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "I/Os", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "iops" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Read.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6ED0E0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EF843C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E24D42", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda2_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BA43A9", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda3_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F4D598", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#962D82", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#9AC48A", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#65C5DB", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F9934E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#FCEACA", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F9E2D2", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 327 + }, + "id": 133, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_disk_reads_merged_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "intervalFactor": 1, + "legendFormat": "{{device}} - Read merged", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_disk_writes_merged_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "intervalFactor": 1, + "legendFormat": "{{device}} - Write merged", + "refId": "B", + "step": 240 + } + ], + "title": "Disk R/W Merged", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Percentage of elapsed time during which I/O requests were issued to the device (bandwidth utilization for the device). Device saturation occurs when this value is close to 100% for devices serving requests serially. But for devices serving requests in parallel, such as RAID arrays and modern SSDs, this number does not reflect their performance limits.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "%util", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 30, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6ED0E0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EF843C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E24D42", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda2_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BA43A9", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda3_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F4D598", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#962D82", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#9AC48A", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#65C5DB", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F9934E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#FCEACA", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F9E2D2", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 327 + }, + "id": 36, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_disk_io_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{device}} - IO", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_disk_discard_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{device}} - discard", + "refId": "B", + "step": 240 + } + ], + "title": "Time Spent Doing I/Os", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "The number of outstanding requests at the instant the sample was taken. Incremented as requests are given to appropriate struct request_queue and decremented as they finish.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Outstanding req.", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6ED0E0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EF843C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E24D42", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda2_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BA43A9", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda3_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F4D598", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#962D82", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#9AC48A", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#65C5DB", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F9934E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#FCEACA", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F9E2D2", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 337 + }, + "id": 34, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_disk_io_now{instance=\"$node\",job=\"$job\"}", + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{device}} - IO now", + "refId": "A", + "step": 240 + } + ], + "title": "Instantaneous Queue Size", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "IOs", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "iops" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6ED0E0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EF843C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E24D42", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda2_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BA43A9", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sda3_.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F4D598", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdb3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#962D82", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdc3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#9AC48A", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#65C5DB", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F9934E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EA6460", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde1.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sdd2.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#FCEACA", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*sde3.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F9E2D2", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 337 + }, + "id": 301, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_disk_discards_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{device}} - Discards completed", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_disk_discards_merged_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{device}} - Discards merged", + "refId": "B", + "step": 240 + } + ], + "title": "Disk IOps Discards completed / merged", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 347 + }, + "id": 271, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "refId": "A" + } + ], + "title": "Storage Filesystem", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 348 + }, + "id": 43, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "{{mountpoint}} - Available", + "metric": "", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_filesystem_free_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}", + "format": "time_series", + "hide": true, + "intervalFactor": 1, + "legendFormat": "{{mountpoint}} - Free", + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}", + "format": "time_series", + "hide": true, + "intervalFactor": 1, + "legendFormat": "{{mountpoint}} - Size", + "refId": "C", + "step": 240 + } + ], + "title": "Filesystem space available", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "file nodes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 348 + }, + "id": 41, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_filesystem_files_free{instance=\"$node\",job=\"$job\",device!~'rootfs'}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "{{mountpoint}} - Free file nodes", + "refId": "A", + "step": 240 + } + ], + "title": "File Nodes Free", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "files", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 358 + }, + "id": 28, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_filefd_maximum{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 4, + "legendFormat": "Max open files", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_filefd_allocated{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Open files", + "refId": "B", + "step": 240 + } + ], + "title": "File Descriptor", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "file Nodes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 358 + }, + "id": 219, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_filesystem_files{instance=\"$node\",job=\"$job\",device!~'rootfs'}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "{{mountpoint}} - File nodes total", + "refId": "A", + "step": 240 + } + ], + "title": "File Nodes Size", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "/ ReadOnly" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#890F02", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 368 + }, + "id": 44, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_filesystem_readonly{instance=\"$node\",job=\"$job\",device!~'rootfs'}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{mountpoint}} - ReadOnly", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_filesystem_device_error{instance=\"$node\",job=\"$job\",device!~'rootfs',fstype!~'tmpfs'}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{mountpoint}} - Device error", + "refId": "B", + "step": 240 + } + ], + "title": "Filesystem in ReadOnly / Error", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 378 + }, + "id": 272, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "refId": "A" + } + ], + "title": "Network Traffic", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "packets out (-) / in (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "pps" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "receive_packets_eth0" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "receive_packets_lo" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E24D42", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "transmit_packets_eth0" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "transmit_packets_lo" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E24D42", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*Trans.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 379 + }, + "id": 60, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 300 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_network_receive_packets_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{device}} - Receive", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_network_transmit_packets_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{device}} - Transmit", + "refId": "B", + "step": 240 + } + ], + "title": "Network Traffic by Packets", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "packets out (-) / in (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "pps" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Trans.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 379 + }, + "id": 142, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 300 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_network_receive_errs_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{device}} - Receive errors", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_network_transmit_errs_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{device}} - Rransmit errors", + "refId": "B", + "step": 240 + } + ], + "title": "Network Traffic Errors", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "packets out (-) / in (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "pps" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Trans.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 389 + }, + "id": 143, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 300 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_network_receive_drop_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{device}} - Receive drop", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_network_transmit_drop_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{device}} - Transmit drop", + "refId": "B", + "step": 240 + } + ], + "title": "Network Traffic Drop", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "packets out (-) / in (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "pps" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Trans.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 389 + }, + "id": 141, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 300 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_network_receive_compressed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{device}} - Receive compressed", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_network_transmit_compressed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{device}} - Transmit compressed", + "refId": "B", + "step": 240 + } + ], + "title": "Network Traffic Compressed", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "packets out (-) / in (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "pps" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Trans.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 399 + }, + "id": 146, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 300 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_network_receive_multicast_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{device}} - Receive multicast", + "refId": "A", + "step": 240 + } + ], + "title": "Network Traffic Multicast", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "packets out (-) / in (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "pps" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Trans.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 399 + }, + "id": 144, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 300 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_network_receive_fifo_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{device}} - Receive fifo", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_network_transmit_fifo_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{device}} - Transmit fifo", + "refId": "B", + "step": 240 + } + ], + "title": "Network Traffic Fifo", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "packets out (-) / in (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "pps" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Trans.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 409 + }, + "id": 145, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 300 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_network_receive_frame_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "{{device}} - Receive frame", + "refId": "A", + "step": 240 + } + ], + "title": "Network Traffic Frame", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 409 + }, + "id": 231, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 300 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_network_transmit_carrier_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{device}} - Statistic transmit_carrier", + "refId": "A", + "step": 240 + } + ], + "title": "Network Traffic Carrier", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Trans.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 419 + }, + "id": 232, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 300 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_network_transmit_colls_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{device}} - Transmit colls", + "refId": "A", + "step": 240 + } + ], + "title": "Network Traffic Colls", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "entries", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "NF conntrack limit" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#890F02", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 419 + }, + "id": 61, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_nf_conntrack_entries{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "NF conntrack entries", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_nf_conntrack_entries_limit{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "NF conntrack limit", + "refId": "B", + "step": 240 + } + ], + "title": "NF Contrack", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Entries", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 429 + }, + "id": 230, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_arp_entries{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{ device }} - ARP entries", + "refId": "A", + "step": 240 + } + ], + "title": "ARP Entries", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 429 + }, + "id": 288, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_network_mtu_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{ device }} - Bytes", + "refId": "A", + "step": 240 + } + ], + "title": "MTU", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 439 + }, + "id": 280, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_network_speed_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{ device }} - Speed", + "refId": "A", + "step": 240 + } + ], + "title": "Speed", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "packets", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 439 + }, + "id": 289, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_network_transmit_queue_length{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{ device }} - Interface transmit queue length", + "refId": "A", + "step": 240 + } + ], + "title": "Queue Length", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "packetes drop (-) / process (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Dropped.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 449 + }, + "id": 290, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 300 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_softnet_processed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "CPU {{cpu}} - Processed", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_softnet_dropped_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "CPU {{cpu}} - Dropped", + "refId": "B", + "step": 240 + } + ], + "title": "Softnet Packets", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 449 + }, + "id": 310, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 300 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_softnet_times_squeezed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "CPU {{cpu}} - Squeezed", + "refId": "A", + "step": 240 + } + ], + "title": "Softnet Out of Quota", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 459 + }, + "id": 309, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 300 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_network_up{operstate=\"up\",instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{interface}} - Operational state UP", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_network_carrier{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "instant": false, + "legendFormat": "{{device}} - Physical link state", + "refId": "B" + } + ], + "title": "Network Operational Status", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 469 + }, + "id": 273, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "refId": "A" + } + ], + "title": "Network Sockstat", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 470 + }, + "id": 63, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 300 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_sockstat_TCP_alloc{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "TCP_alloc - Allocated sockets", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_sockstat_TCP_inuse{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "TCP_inuse - Tcp sockets currently in use", + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_sockstat_TCP_mem{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": "TCP_mem - Used memory for tcp", + "refId": "C", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_sockstat_TCP_orphan{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "TCP_orphan - Orphan sockets", + "refId": "D", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_sockstat_TCP_tw{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "TCP_tw - Sockets waiting close", + "refId": "E", + "step": 240 + } + ], + "title": "Sockstat TCP", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 470 + }, + "id": 124, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 300 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_sockstat_UDPLITE_inuse{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "UDPLITE_inuse - Udplite sockets currently in use", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_sockstat_UDP_inuse{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "UDP_inuse - Udp sockets currently in use", + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_sockstat_UDP_mem{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "UDP_mem - Used memory for udp", + "refId": "C", + "step": 240 + } + ], + "title": "Sockstat UDP", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 480 + }, + "id": 125, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 300 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_sockstat_FRAG_inuse{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "FRAG_inuse - Frag sockets currently in use", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_sockstat_RAW_inuse{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "RAW_inuse - Raw sockets currently in use", + "refId": "C", + "step": 240 + } + ], + "title": "Sockstat FRAG / RAW", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 480 + }, + "id": 220, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 300 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_sockstat_TCP_mem_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "mem_bytes - TCP sockets in that state", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_sockstat_UDP_mem_bytes{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "mem_bytes - UDP sockets in that state", + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_sockstat_FRAG_memory{instance=\"$node\",job=\"$job\"}", + "interval": "", + "intervalFactor": 1, + "legendFormat": "FRAG_memory - Used memory for frag", + "refId": "C" + } + ], + "title": "Sockstat Memory Size", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "sockets", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 490 + }, + "id": 126, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 300 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_sockstat_sockets_used{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Sockets_used - Sockets currently in use", + "refId": "A", + "step": 240 + } + ], + "title": "Sockstat Used", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 500 + }, + "id": 274, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "refId": "A" + } + ], + "title": "Network Netstat", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "octets out (-) / in (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Out.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 501 + }, + "id": 221, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 300 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_IpExt_InOctets{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "InOctets - Received octets", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_IpExt_OutOctets{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "OutOctets - Sent octets", + "refId": "B", + "step": 240 + } + ], + "title": "Netstat IP In / Out Octets", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "datagrams", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 501 + }, + "id": 81, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true, + "width": 300 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_Ip_Forwarding{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Forwarding - IP forwarding", + "refId": "A", + "step": 240 + } + ], + "title": "Netstat IP Forwarding", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "messages out (-) / in (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Out.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 511 + }, + "id": 115, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_Icmp_InMsgs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "InMsgs - Messages which the entity received. Note that this counter includes all those counted by icmpInErrors", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_Icmp_OutMsgs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "OutMsgs - Messages which this entity attempted to send. Note that this counter includes all those counted by icmpOutErrors", + "refId": "B", + "step": 240 + } + ], + "title": "ICMP In / Out", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "messages out (-) / in (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Out.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 511 + }, + "id": 50, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_Icmp_InErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "InErrors - Messages which the entity received but determined as having ICMP-specific errors (bad ICMP checksums, bad length, etc.)", + "refId": "A", + "step": 240 + } + ], + "title": "ICMP Errors", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "datagrams out (-) / in (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Out.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*Snd.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 521 + }, + "id": 55, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_Udp_InDatagrams{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "InDatagrams - Datagrams received", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_Udp_OutDatagrams{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "OutDatagrams - Datagrams sent", + "refId": "B", + "step": 240 + } + ], + "title": "UDP In / Out", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "datagrams", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 521 + }, + "id": 109, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_Udp_InErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "InErrors - UDP Datagrams that could not be delivered to an application", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_Udp_NoPorts{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "NoPorts - UDP Datagrams received on a port with no listener", + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_UdpLite_InErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "interval": "", + "legendFormat": "InErrors Lite - UDPLite Datagrams that could not be delivered to an application", + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_Udp_RcvbufErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "RcvbufErrors - UDP buffer errors received", + "refId": "D", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_Udp_SndbufErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "SndbufErrors - UDP buffer errors send", + "refId": "E", + "step": 240 + } + ], + "title": "UDP Errors", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "datagrams out (-) / in (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Out.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*Snd.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 531 + }, + "id": 299, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_Tcp_InSegs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "InSegs - Segments received, including those received in error. This count includes segments received on currently established connections", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_Tcp_OutSegs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "OutSegs - Segments sent, including those on current connections but excluding those containing only retransmitted octets", + "refId": "B", + "step": 240 + } + ], + "title": "TCP In / Out", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 531 + }, + "id": 104, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_TcpExt_ListenOverflows{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "ListenOverflows - Times the listen queue of a socket overflowed", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_TcpExt_ListenDrops{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "ListenDrops - SYNs to LISTEN sockets ignored", + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_TcpExt_TCPSynRetrans{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "TCPSynRetrans - SYN-SYN/ACK retransmits to break down retransmissions in SYN, fast/timeout retransmits", + "refId": "C", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_Tcp_RetransSegs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "interval": "", + "legendFormat": "RetransSegs - Segments retransmitted - that is, the number of TCP segments transmitted containing one or more previously transmitted octets", + "refId": "D" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_Tcp_InErrs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "interval": "", + "legendFormat": "InErrs - Segments received in error (e.g., bad TCP checksums)", + "refId": "E" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_Tcp_OutRsts{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "interval": "", + "legendFormat": "OutRsts - Segments sent with RST flag", + "refId": "F" + } + ], + "title": "TCP Errors", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "connections", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*MaxConn *./" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#890F02", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 541 + }, + "id": 85, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_netstat_Tcp_CurrEstab{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "CurrEstab - TCP connections for which the current state is either ESTABLISHED or CLOSE- WAIT", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_netstat_Tcp_MaxConn{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "MaxConn - Limit on the total number of TCP connections the entity can support (Dynamic is \"-1\")", + "refId": "B", + "step": 240 + } + ], + "title": "TCP Connections", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter out (-) / in (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Sent.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 541 + }, + "id": 91, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_TcpExt_SyncookiesFailed{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "SyncookiesFailed - Invalid SYN cookies received", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_TcpExt_SyncookiesRecv{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "SyncookiesRecv - SYN cookies received", + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_TcpExt_SyncookiesSent{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "SyncookiesSent - SYN cookies sent", + "refId": "C", + "step": 240 + } + ], + "title": "TCP SynCookie", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "connections", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 551 + }, + "id": 82, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_Tcp_ActiveOpens{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "ActiveOpens - TCP connections that have made a direct transition to the SYN-SENT state from the CLOSED state", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "irate(node_netstat_Tcp_PassiveOpens{instance=\"$node\",job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "PassiveOpens - TCP connections that have made a direct transition to the SYN-RCVD state from the LISTEN state", + "refId": "B", + "step": 240 + } + ], + "title": "TCP Direct Transition", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Enable with --collector.tcpstat argument on node-exporter", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "connections", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 551 + }, + "id": 320, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "node_tcp_connection_states{state=\"established\",instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "established - TCP sockets in established state", + "range": true, + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "node_tcp_connection_states{state=\"fin_wait2\",instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "fin_wait2 - TCP sockets in fin_wait2 state", + "range": true, + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "node_tcp_connection_states{state=\"listen\",instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "listen - TCP sockets in listen state", + "range": true, + "refId": "C", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "node_tcp_connection_states{state=\"time_wait\",instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "time_wait - TCP sockets in time_wait state", + "range": true, + "refId": "D", + "step": 240 + } + ], + "title": "TCP Stat", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 561 + }, + "id": 279, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "refId": "A" + } + ], + "title": "Node Exporter", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "seconds", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 562 + }, + "id": 40, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_scrape_collector_duration_seconds{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{collector}} - Scrape duration", + "refId": "A", + "step": 240 + } + ], + "title": "Node Exporter Scrape Time", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "counter", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*error.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F2495C", + "mode": "fixed" + } + }, + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 562 + }, + "id": 157, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_scrape_collector_success{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{collector}} - Scrape success", + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "expr": "node_textfile_scrape_error{instance=\"$node\",job=\"$job\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{collector}} - Scrape textfile error (1 = true)", + "refId": "B", + "step": 240 + } + ], + "title": "Node Exporter Scrape", + "type": "timeseries" + } + ], + "refresh": "", + "revision": 1, + "schemaVersion": 38, + "style": "dark", + "tags": [ + "linux" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "default", + "value": "default" + }, + "hide": 0, + "includeAll": false, + "label": "datasource", + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "", + "hide": 0, + "includeAll": false, + "label": "Job", + "multi": false, + "name": "job", + "options": [], + "query": { + "query": "label_values(node_uname_info, job)", + "refId": "Prometheus-job-Variable-Query" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "label_values(node_uname_info{job=\"$job\"}, instance)", + "hide": 0, + "includeAll": false, + "label": "Host:", + "multi": false, + "name": "node", + "options": [], + "query": { + "query": "label_values(node_uname_info{job=\"$job\"}, instance)", + "refId": "Prometheus-node-Variable-Query" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": { + "selected": false, + "text": "[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+", + "value": "[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+" + }, + "hide": 2, + "includeAll": false, + "multi": false, + "name": "diskdevices", + "options": [ + { + "selected": true, + "text": "[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+", + "value": "[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+" + } + ], + "query": "[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-24h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "browser", + "title": "Node Exporter Full", + "uid": "rYdddlPWk", + "version": 1, + "weekStart": "" +} \ No newline at end of file From 50e0a47ba7420f7f90fe82b73c0e97b0979c514b Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sun, 20 Oct 2024 13:13:59 -0400 Subject: [PATCH 089/409] optimize dashboards --- .../artifacts/PowerShell/Modules/common.psm1 | 86 ++++++++++--------- .../monitoring/grafana-cluster-pods.json | 2 +- .../monitoring/grafana-cluster-workloads.json | 6 +- 3 files changed, 50 insertions(+), 44 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index 8ceaa90191..358984d4b4 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -1031,8 +1031,8 @@ function Deploy-Prometheus { } Write-Host "[$(Get-Date -Format t)] INFO: Importing dashboards for $($_.Value.FriendlyName) environment" -ForegroundColor Gray - # Add dashboards - if ($Env:scenario -eq "contoso_hypermarket") { + # Deploying dashboards (one dashboard for each store) + if ($Env:scenario -ne "contoso_hypermarket") { foreach ($dashboard in $observabilityDashboardstoImport) { $grafanaDBPath = "$AgMonitoringDir\grafana-$dashboard.json" # Replace the datasource @@ -1051,7 +1051,7 @@ function Deploy-Prometheus { # Need to set this to null to let Grafana generate a new ID $dashboardObject.id = $null # # Set dashboard title - # $dashboardObject.title = $_.Value.FriendlyName + ' - ' + $dashboardObject.title + $dashboardObject.title = $_.Value.FriendlyName + ' - ' + $dashboardObject.title # Request body with dashboard to add $grafanaDBBody = @{ dashboard = $dashboardObject @@ -1076,49 +1076,55 @@ function Deploy-Prometheus { } } - else { - foreach ($dashboard in $observabilityDashboardstoImport) { - $grafanaDBPath = "$AgMonitoringDir\grafana-$dashboard.json" - # Replace the datasource - $replacementParams = @{ - "\$\{DS_PROMETHEUS}" = $_.Value.GrafanaDataSource - } - $content = Get-Content $grafanaDBPath - foreach ($key in $replacementParams.Keys) { - $content = $content -replace $key, $replacementParams[$key] - } - # Set dashboard JSON - $dashboardObject = $content | ConvertFrom-Json + } + + # Deploying dashboard for Contoso Hypermarket (One dashboard for all stores) + if ($Env:scenario -eq "contoso_hypermarket") { + foreach ($dashboard in $observabilityDashboardstoImport) { + $grafanaDBPath = "$AgMonitoringDir\grafana-$dashboard.json" + # Replace the datasource + $replacementParams = @{ + "\$\{DS_PROMETHEUS}" = $_.Value.GrafanaDataSource + } + $content = Get-Content $grafanaDBPath + foreach ($key in $replacementParams.Keys) { + $content = $content -replace $key, $replacementParams[$key] + } + # Set dashboard JSON + $dashboardObject = $content | ConvertFrom-Json + + # Set Dashboard UID for parent dashboards + if ($dashboard -notlike '*cluster-pods*') { # Best practice is to generate a random UID, such as a GUID $dashboardObject.uid = [guid]::NewGuid().ToString() + } - # Need to set this to null to let Grafana generate a new ID - $dashboardObject.id = $null - # Set dashboard title - $dashboardObject.title = $_.Value.FriendlyName + ' - ' + $dashboardObject.title - # Request body with dashboard to add - $grafanaDBBody = @{ - dashboard = $dashboardObject - overwrite = $true - } | ConvertTo-Json -Depth 10 - - if ($_.Value.IsProduction) { - # Set Grafana Dashboard endpoint - $grafanaDBURI = $AgConfig.Monitoring["ProdURL"] + "/api/dashboards/db" - $grafanaDBStarURI = $AgConfig.Monitoring["ProdURL"] + "/api/user/stars/dashboard" - } - else { - # Set Grafana Dashboard endpoint - $grafanaDBURI = "http://$monitorLBIP/api/dashboards/db" - $grafanaDBStarURI = "http://$monitorLBIP/api/user/stars/dashboard" - } + # Need to set this to null to let Grafana generate a new ID + $dashboardObject.id = $null + # Set dashboard title + $dashboardObject.title = $_.Value.FriendlyName + ' - ' + $dashboardObject.title + # Request body with dashboard to add + $grafanaDBBody = @{ + dashboard = $dashboardObject + overwrite = $true + } | ConvertTo-Json -Depth 10 + + if ($_.Value.IsProduction) { + # Set Grafana Dashboard endpoint + $grafanaDBURI = $AgConfig.Monitoring["ProdURL"] + "/api/dashboards/db" + $grafanaDBStarURI = $AgConfig.Monitoring["ProdURL"] + "/api/user/stars/dashboard" + } + else { + # Set Grafana Dashboard endpoint + $grafanaDBURI = "http://$monitorLBIP/api/dashboards/db" + $grafanaDBStarURI = "http://$monitorLBIP/api/user/stars/dashboard" + } - # Make HTTP request to the API - $dashboardID = (Invoke-RestMethod -Method Post -Uri $grafanaDBURI -Headers $adminHeaders -Body $grafanaDBBody).id + # Make HTTP request to the API + $dashboardID = (Invoke-RestMethod -Method Post -Uri $grafanaDBURI -Headers $adminHeaders -Body $grafanaDBBody).id - Invoke-RestMethod -Method Post -Uri "$grafanaDBStarURI/$dashboardID" -Headers $userHeaders | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Observability.log") + Invoke-RestMethod -Method Post -Uri "$grafanaDBStarURI/$dashboardID" -Headers $userHeaders | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Observability.log") - } } } Write-Host diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json index aca1724733..026c08b1af 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json @@ -2390,7 +2390,7 @@ }, "timezone": "utc", "title": "Contoso Hypermarket Pods", - "uid": "ac3253a2c4a149d68ccd0a58c7ab6738", + "uid": "9701f5d6-af2d-442b-a2a4-d4d05f9b79b1", "version": 1, "weekStart": "" } \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json index 7ea73566aa..55d0ee4092 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json @@ -354,7 +354,7 @@ { "targetBlank": true, "title": "Drill down", - "url": "/d/ac3253a2c4a149d68ccd0a58c7ab6738/k8s-resources-pod?var-datasource=$datasource&var-namespace=$namespace&from=$__from&to=$__to&var-pod=$__value" + "url": "/d/9701f5d6-af2d-442b-a2a4-d4d05f9b79b1/k8s-resources-pod?var-datasource=$datasource&var-namespace=$namespace&from=$__from&to=$__to&var-pod=$__value" } ] }, @@ -779,7 +779,7 @@ { "targetBlank": true, "title": "Drill down", - "url": "/d/ac3253a2c4a149d68ccd0a58c7ab6738/k8s-resources-pod?var-datasource=$datasource&var-namespace=$namespace&from=$__from&to=$__to&var-pod=$__value" + "url": "/d/9701f5d6-af2d-442b-a2a4-d4d05f9b79b1/k8s-resources-pod?var-datasource=$datasource&var-namespace=$namespace&from=$__from&to=$__to&var-pod=$__value" } ] }, @@ -1108,7 +1108,7 @@ { "targetBlank": true, "title": "Drill down", - "url": "/d/ac3253a2c4a149d68ccd0a58c7ab6738/k8s-resources-pod?var-datasource=$datasource&var-namespace=$namespace&from=$__from&to=$__to&var-pod=$__value" + "url": "/d/9701f5d6-af2d-442b-a2a4-d4d05f9b79b1/k8s-resources-pod?var-datasource=$datasource&var-namespace=$namespace&from=$__from&to=$__to&var-pod=$__value" } ] }, From 1c8b305fc3bd3057bc75c32e7d7dc247c20fa081 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sun, 20 Oct 2024 15:14:01 -0400 Subject: [PATCH 090/409] update dashboard for CHM --- .../artifacts/PowerShell/Modules/common.psm1 | 17 ++++------------- .../monitoring/grafana-cluster-workloads.json | 2 +- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index 358984d4b4..26c7c8ae5c 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -1084,7 +1084,7 @@ function Deploy-Prometheus { $grafanaDBPath = "$AgMonitoringDir\grafana-$dashboard.json" # Replace the datasource $replacementParams = @{ - "\$\{DS_PROMETHEUS}" = $_.Value.GrafanaDataSource + "\$\{DS_PROMETHEUS}" = "prometheus" } $content = Get-Content $grafanaDBPath foreach ($key in $replacementParams.Keys) { @@ -1101,24 +1101,15 @@ function Deploy-Prometheus { # Need to set this to null to let Grafana generate a new ID $dashboardObject.id = $null - # Set dashboard title - $dashboardObject.title = $_.Value.FriendlyName + ' - ' + $dashboardObject.title # Request body with dashboard to add $grafanaDBBody = @{ dashboard = $dashboardObject overwrite = $true } | ConvertTo-Json -Depth 10 - if ($_.Value.IsProduction) { - # Set Grafana Dashboard endpoint - $grafanaDBURI = $AgConfig.Monitoring["ProdURL"] + "/api/dashboards/db" - $grafanaDBStarURI = $AgConfig.Monitoring["ProdURL"] + "/api/user/stars/dashboard" - } - else { - # Set Grafana Dashboard endpoint - $grafanaDBURI = "http://$monitorLBIP/api/dashboards/db" - $grafanaDBStarURI = "http://$monitorLBIP/api/user/stars/dashboard" - } + # Set Grafana Dashboard endpoint + $grafanaDBURI = $AgConfig.Monitoring["ProdURL"] + "/api/dashboards/db" + $grafanaDBStarURI = $AgConfig.Monitoring["ProdURL"] + "/api/user/stars/dashboard" # Make HTTP request to the API $dashboardID = (Invoke-RestMethod -Method Post -Uri $grafanaDBURI -Headers $adminHeaders -Body $grafanaDBBody).id diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json index 55d0ee4092..06ebc4d6f1 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json @@ -2103,7 +2103,7 @@ "multi": false, "name": "namespace", "options": [], - "query": "label_values(kube_namespace_status_phase{job=\"kube-state-metrics\"}, namespace)", + "query": "label_values(kube_namespace_status_phase{job=\"kube-state-metrics\", namespace=~\".*contoso.*\"}, namespace)", "refresh": 2, "regex": "", "skipUrlSync": false, From c1b4c1d25b59fd1cb5818155c0abed2b2edb6802 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sun, 20 Oct 2024 18:26:32 -0400 Subject: [PATCH 091/409] update pods --- .../artifacts/monitoring/grafana-cluster-pods.json | 4 ++-- .../artifacts/monitoring/grafana-cluster-workloads.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json index 026c08b1af..81927dabf3 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json @@ -2321,7 +2321,7 @@ "multi": false, "name": "namespace", "options": [], - "query": "label_values(kube_namespace_status_phase{job=\"kube-state-metrics\"}, namespace)", + "query": "label_values(kube_namespace_status_phase{job=\"kube-state-metrics\", namespace=~\".*contoso.*\"}, namespace)", "refresh": 2, "regex": "", "skipUrlSync": false, @@ -2389,7 +2389,7 @@ ] }, "timezone": "utc", - "title": "Contoso Hypermarket Pods", + "title": "Kubernetes / Workloads / Pods", "uid": "9701f5d6-af2d-442b-a2a4-d4d05f9b79b1", "version": 1, "weekStart": "" diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json index 06ebc4d6f1..6b64aa4448 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json @@ -2197,7 +2197,7 @@ ] }, "timezone": "utc", - "title": "Contoso Hypermarket Workloads", + "title": "Kubernetes / Workloads", "uid": "3151475894614845ba54456099696738ff", "version": 1, "weekStart": "" From 5b23475fcd741a4ead9576e211f1b38bcbb1479a Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sun, 20 Oct 2024 23:07:41 -0400 Subject: [PATCH 092/409] add app dashboard --- .../AgConfig-contoso-hypermarket.psd1 | 2 +- .../artifacts/PowerShell/Bootstrap.ps1 | 5 +- ...luster-pods.json => grafana-app-pods.json} | 0 .../monitoring/grafana-app-stores.json | 1008 +++++++++++++++++ ...kloads.json => grafana-app-workloads.json} | 0 5 files changed, 1012 insertions(+), 3 deletions(-) rename azure_jumpstart_ag/artifacts/monitoring/{grafana-cluster-pods.json => grafana-app-pods.json} (100%) create mode 100644 azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json rename azure_jumpstart_ag/artifacts/monitoring/{grafana-cluster-workloads.json => grafana-app-workloads.json} (100%) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index e569e9f515..358a6bb3df 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -185,7 +185,7 @@ ProdURL = "http://localhost:3000" Dashboards = @{ "grafana.com" = @() # Dashboards from https://grafana.com/grafana/dashboards - "custom" = @('node-exporter-full-v2','cluster-global', 'cluster-workloads', 'cluster-pods') # Dashboards from https://github.com/microsoft/azure_arc/tree/main/azure_jumpstart_ag/artifacts/monitoring + "custom" = @('node-exporter-full-v2','cluster-global', 'app-workloads', 'app-pods', 'app-stores') # Dashboards from https://github.com/microsoft/azure_arc/tree/main/azure_jumpstart_ag/artifacts/monitoring } } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 1f0bb7be37..2ed8df8ca7 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -248,9 +248,10 @@ Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-cluster-glob Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/arc-inventory-workbook.bicep") -OutFile "$AgMonitoringDir\arc-inventory-workbook.bicep" Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/arc-osperformance-workbook.bicep") -OutFile "$AgMonitoringDir\arc-osperformance-workbook.bicep" Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/prometheus-additional-scrape-config.yaml") -OutFile "$AgMonitoringDir\prometheus-additional-scrape-config.yaml" -Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-cluster-workloads.json") -OutFile "$AgMonitoringDir\grafana-cluster-workloads.json" -Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-cluster-pods.json") -OutFile "$AgMonitoringDir\grafana-cluster-pods.json" +Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-workloads.json") -OutFile "$AgMonitoringDir\grafana-app-workloads.json" +Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-pods.json") -OutFile "$AgMonitoringDir\grafana-app-pods.json" Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-node-exporter-full-v2.json") -OutFile "$AgMonitoringDir\grafana-node-exporter-full-v2.json" +Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-stores.json") -OutFile "$AgMonitoringDir\grafana-app-stores.json" Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/grafana.ico") -OutFile $AgIconsDir\grafana.ico Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso.png") -OutFile $AgIconsDir\contoso.png Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso.svg") -OutFile $AgIconsDir\contoso.svg diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-pods.json similarity index 100% rename from azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-pods.json rename to azure_jumpstart_ag/artifacts/monitoring/grafana-app-pods.json diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json new file mode 100644 index 0000000000..7d34310c26 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json @@ -0,0 +1,1008 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 6, + "links": [], + "panels": [ + { + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 10, + "title": "Lighting", + "type": "row" + }, + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "de1higv54pog0f" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 8, + "x": 0, + "y": 1 + }, + "id": 11, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "de1higv54pog0f" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "lighting_power_usage_kwh", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Lighting Power Usage", + "type": "timeseries" + }, + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "de1higv54pog0f" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "1": { + "index": 1, + "text": "On" + }, + "O": { + "index": 0, + "text": "Off" + } + }, + "type": "value" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 8, + "x": 8, + "y": 1 + }, + "id": 12, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.2.2+security-01", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "de1higv54pog0f" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "lighting_status", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Lighting Status", + "type": "stat" + }, + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "de1higv54pog0f" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 8, + "x": 16, + "y": 1 + }, + "id": 13, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "de1higv54pog0f" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "lighting_brightness_level", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Lighting Brightness Level", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 6 + }, + "id": 5, + "panels": [], + "title": "Refrigerator", + "type": "row" + }, + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "de1higv54pog0f" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 5 + }, + { + "color": "red", + "value": 10 + } + ] + }, + "unit": "kwatth" + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "refrigerator_power_usage_kwh {__name__=\"refrigerator_power_usage_kwh\", endpoint=\"genie-metrics\", instance=\"10.42.1.25:8001\", job=\"genie-simulator-service\", namespace=\"contoso-hypermarket\", pod=\"genie-simulator-96b57b6ff-g2fp2\", service=\"genie-simulator-service\"}" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 5, + "w": 8, + "x": 0, + "y": 7 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.2.2+security-01", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "de1higv54pog0f" + }, + "disableTextWrap": false, + "editorMode": "builder", + "exemplar": false, + "expr": "refrigerator_power_usage_kwh", + "format": "time_series", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{label_name}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Refrigerator Power Usage", + "type": "timeseries" + }, + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "de1higv54pog0f" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "0": { + "color": "dark-green", + "index": 1, + "text": "Closed" + }, + "1": { + "color": "dark-red", + "index": 0, + "text": "Open" + } + }, + "type": "value" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 8, + "x": 8, + "y": 7 + }, + "id": 1, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.2.2+security-01", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "de1higv54pog0f" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "refrigerator_door_open", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{service}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Refrigerator Door", + "type": "stat" + }, + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "de1higv54pog0f" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "celsius" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 8, + "x": 16, + "y": 7 + }, + "id": 4, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "11.2.2+security-01", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "de1higv54pog0f" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "refrigerator_temperature_celsius", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Refrigerator Temperature", + "type": "gauge" + }, + { + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 12 + }, + "id": 2, + "title": "HVAC", + "type": "row" + }, + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "de1higv54pog0f" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-RdYlGr", + "seriesBy": "last" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 2.5 + }, + { + "color": "red", + "value": 4 + } + ] + }, + "unit": "kwatth" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 0, + "y": 13 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "de1higv54pog0f" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "hvac_power_usage_kwh", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "HVAC Power Usage", + "type": "timeseries" + }, + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "de1higv54pog0f" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "0": { + "color": "blue", + "index": 0, + "text": "Cooling" + }, + "1": { + "color": "orange", + "index": 1, + "text": "Heating" + } + }, + "type": "value" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 6, + "y": 13 + }, + "id": 7, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.2.2+security-01", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "de1higv54pog0f" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "hvac_mode", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "HVAC Mode", + "type": "stat" + }, + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "de1higv54pog0f" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "yellow", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "humidity" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 12, + "y": 13 + }, + "id": 8, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "11.2.2+security-01", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "de1higv54pog0f" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "hvac_humidity_percent", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "HVAC Humidity", + "type": "gauge" + }, + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "de1higv54pog0f" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + }, + { + "color": "orange", + "value": 80 + } + ] + }, + "unit": "celsius" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 18, + "y": 13 + }, + "id": 9, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "11.2.2+security-01", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "de1higv54pog0f" + }, + "disableTextWrap": false, + "editorMode": "builder", + "exemplar": false, + "expr": "hvac_temperature_celsius", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{label_name}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "HVAC Temperature", + "type": "gauge" + } + ], + "refresh": "", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "2024-10-21T02:18:54.942Z", + "to": "2024-10-21T02:26:12.630Z" + }, + "timepicker": {}, + "timezone": "browser", + "title": "Hypermarket / Stores", + "uid": "be1hvn2vct0jkev", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-workloads.json similarity index 100% rename from azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-workloads.json rename to azure_jumpstart_ag/artifacts/monitoring/grafana-app-workloads.json From 9ad0ae6d3b06bce5ff31df07f71e13b980820446 Mon Sep 17 00:00:00 2001 From: Dale Kirby <32211549+dkirby-ms@users.noreply.github.com> Date: Mon, 21 Oct 2024 10:28:49 -0500 Subject: [PATCH 093/409] Update ubuntuRancher.bicep --- .../contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep index 28dbdf432a..a3f084e75b 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep @@ -44,7 +44,7 @@ var networkInterfaceName = '${vmName}-NIC' var osDiskType = 'Premium_LRS' var k3sControlPlane = 'true' // deploy single-node k3s control plane var diskSize = 512 -var numberOfIPAddresses = 14 // The number of IP addresses to create +var numberOfIPAddresses = 15 // The number of IP addresses to create // Create multiple public IP addresses resource publicIpAddresses 'Microsoft.Network/publicIpAddresses@2022-01-01' = [for i in range(1, numberOfIPAddresses): { From 2fd032bfea176bb5a046e21a03049702022cb0ee Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Mon, 21 Oct 2024 12:34:58 -0400 Subject: [PATCH 094/409] add stores --- .../monitoring/grafana-app-stores.json | 233 +++++++++--------- 1 file changed, 119 insertions(+), 114 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json index 7d34310c26..7f2cbcacef 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json @@ -18,7 +18,7 @@ "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 0, - "id": 6, + "id": 5, "links": [], "panels": [ { @@ -34,14 +34,14 @@ }, { "datasource": { - "default": true, + "default": false, "type": "prometheus", - "uid": "de1higv54pog0f" + "uid": "${datasource}" }, "fieldConfig": { "defaults": { "color": { - "mode": "palette-classic" + "mode": "continuous-GrYlRd" }, "custom": { "axisBorderShow": false, @@ -52,21 +52,21 @@ "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", + "fillOpacity": 10, + "gradientMode": "scheme", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, + "lineInterpolation": "smooth", + "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, - "showPoints": "never", + "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", @@ -84,17 +84,22 @@ "color": "green", "value": null }, + { + "color": "#EAB839", + "value": 5 + }, { "color": "red", - "value": 80 + "value": 10 } ] - } + }, + "unit": "kwatth" }, "overrides": [] }, "gridPos": { - "h": 5, + "h": 6, "w": 8, "x": 0, "y": 1 @@ -105,7 +110,7 @@ "calcs": [], "displayMode": "list", "placement": "bottom", - "showLegend": false + "showLegend": true }, "tooltip": { "mode": "single", @@ -116,7 +121,7 @@ { "datasource": { "type": "prometheus", - "uid": "de1higv54pog0f" + "uid": "${datasource}" }, "disableTextWrap": false, "editorMode": "builder", @@ -124,7 +129,7 @@ "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "__auto", + "legendFormat": "{{device_id}}", "range": true, "refId": "A", "useBackend": false @@ -135,9 +140,9 @@ }, { "datasource": { - "default": true, + "default": false, "type": "prometheus", - "uid": "de1higv54pog0f" + "uid": "${datasource}" }, "fieldConfig": { "defaults": { @@ -147,13 +152,15 @@ "mappings": [ { "options": { + "0": { + "color": "red", + "index": 0, + "text": "Off" + }, "1": { + "color": "green", "index": 1, "text": "On" - }, - "O": { - "index": 0, - "text": "Off" } }, "type": "value" @@ -176,7 +183,7 @@ "overrides": [] }, "gridPos": { - "h": 5, + "h": 6, "w": 8, "x": 8, "y": 1 @@ -204,7 +211,7 @@ { "datasource": { "type": "prometheus", - "uid": "de1higv54pog0f" + "uid": "${datasource}" }, "disableTextWrap": false, "editorMode": "builder", @@ -212,7 +219,7 @@ "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "__auto", + "legendFormat": "{{device_id}}", "range": true, "refId": "A", "useBackend": false @@ -223,9 +230,9 @@ }, { "datasource": { - "default": true, + "name": "${datasource}", "type": "prometheus", - "uid": "de1higv54pog0f" + "uid": "${datasource}" }, "fieldConfig": { "defaults": { @@ -283,7 +290,7 @@ "overrides": [] }, "gridPos": { - "h": 5, + "h": 6, "w": 8, "x": 16, "y": 1 @@ -294,7 +301,7 @@ "calcs": [], "displayMode": "list", "placement": "bottom", - "showLegend": false + "showLegend": true }, "tooltip": { "mode": "single", @@ -305,7 +312,7 @@ { "datasource": { "type": "prometheus", - "uid": "de1higv54pog0f" + "uid": "${datasource}" }, "disableTextWrap": false, "editorMode": "builder", @@ -313,7 +320,7 @@ "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "__auto", + "legendFormat": "{{device_id}}", "range": true, "refId": "A", "useBackend": false @@ -328,7 +335,7 @@ "h": 1, "w": 24, "x": 0, - "y": 6 + "y": 7 }, "id": 5, "panels": [], @@ -337,9 +344,9 @@ }, { "datasource": { - "default": true, + "name": "${datasource}", "type": "prometheus", - "uid": "de1higv54pog0f" + "uid": "${datasource}" }, "fieldConfig": { "defaults": { @@ -356,7 +363,7 @@ "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 10, - "gradientMode": "none", + "gradientMode": "scheme", "hideFrom": { "legend": false, "tooltip": false, @@ -364,12 +371,15 @@ }, "insertNulls": false, "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, - "showPoints": "never", + "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", @@ -400,38 +410,13 @@ }, "unit": "kwatth" }, - "overrides": [ - { - "__systemRef": "hideSeriesFrom", - "matcher": { - "id": "byNames", - "options": { - "mode": "exclude", - "names": [ - "refrigerator_power_usage_kwh {__name__=\"refrigerator_power_usage_kwh\", endpoint=\"genie-metrics\", instance=\"10.42.1.25:8001\", job=\"genie-simulator-service\", namespace=\"contoso-hypermarket\", pod=\"genie-simulator-96b57b6ff-g2fp2\", service=\"genie-simulator-service\"}" - ], - "prefix": "All except:", - "readOnly": true - } - }, - "properties": [ - { - "id": "custom.hideFrom", - "value": { - "legend": false, - "tooltip": false, - "viz": true - } - } - ] - } - ] + "overrides": [] }, "gridPos": { - "h": 5, + "h": 6, "w": 8, "x": 0, - "y": 7 + "y": 8 }, "id": 3, "options": { @@ -439,7 +424,7 @@ "calcs": [], "displayMode": "list", "placement": "bottom", - "showLegend": false + "showLegend": true }, "tooltip": { "mode": "single", @@ -451,7 +436,7 @@ { "datasource": { "type": "prometheus", - "uid": "de1higv54pog0f" + "uid": "${datasource}" }, "disableTextWrap": false, "editorMode": "builder", @@ -461,7 +446,7 @@ "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "{{label_name}}", + "legendFormat": "{{device_id}}", "range": true, "refId": "A", "useBackend": false @@ -472,9 +457,9 @@ }, { "datasource": { - "default": true, + "name": "${datasource}", "type": "prometheus", - "uid": "de1higv54pog0f" + "uid": "${datasource}" }, "fieldConfig": { "defaults": { @@ -515,10 +500,10 @@ "overrides": [] }, "gridPos": { - "h": 5, + "h": 6, "w": 8, "x": 8, - "y": 7 + "y": 8 }, "id": 1, "options": { @@ -543,7 +528,7 @@ { "datasource": { "type": "prometheus", - "uid": "de1higv54pog0f" + "uid": "${datasource}" }, "disableTextWrap": false, "editorMode": "builder", @@ -551,7 +536,7 @@ "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "{{service}}", + "legendFormat": "{{device_id}}", "range": true, "refId": "A", "useBackend": false @@ -562,9 +547,9 @@ }, { "datasource": { - "default": true, + "name": "${datasource}", "type": "prometheus", - "uid": "de1higv54pog0f" + "uid": "${datasource}" }, "fieldConfig": { "defaults": { @@ -590,10 +575,10 @@ "overrides": [] }, "gridPos": { - "h": 5, + "h": 6, "w": 8, "x": 16, - "y": 7 + "y": 8 }, "id": 4, "options": { @@ -616,7 +601,7 @@ { "datasource": { "type": "prometheus", - "uid": "de1higv54pog0f" + "uid": "${datasource}" }, "disableTextWrap": false, "editorMode": "builder", @@ -624,7 +609,7 @@ "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "__auto", + "legendFormat": "{{device_id}}", "range": true, "refId": "A", "useBackend": false @@ -638,7 +623,7 @@ "h": 1, "w": 24, "x": 0, - "y": 12 + "y": 14 }, "id": 2, "title": "HVAC", @@ -646,14 +631,14 @@ }, { "datasource": { - "default": true, + "name": "${datasource}", "type": "prometheus", - "uid": "de1higv54pog0f" + "uid": "${datasource}" }, "fieldConfig": { "defaults": { "color": { - "mode": "continuous-RdYlGr", + "mode": "continuous-GrYlRd", "seriesBy": "last" }, "custom": { @@ -665,16 +650,16 @@ "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", + "fillOpacity": 10, + "gradientMode": "scheme", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, + "lineInterpolation": "smooth", + "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" @@ -712,10 +697,10 @@ "overrides": [] }, "gridPos": { - "h": 5, + "h": 6, "w": 6, "x": 0, - "y": 13 + "y": 15 }, "id": 6, "options": { @@ -723,7 +708,7 @@ "calcs": [], "displayMode": "list", "placement": "bottom", - "showLegend": false + "showLegend": true }, "tooltip": { "mode": "single", @@ -734,7 +719,7 @@ { "datasource": { "type": "prometheus", - "uid": "de1higv54pog0f" + "uid": "${datasource}" }, "disableTextWrap": false, "editorMode": "builder", @@ -742,7 +727,7 @@ "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "__auto", + "legendFormat": "{{device_id}}", "range": true, "refId": "A", "useBackend": false @@ -753,9 +738,9 @@ }, { "datasource": { - "default": true, + "name": "${datasource}", "type": "prometheus", - "uid": "de1higv54pog0f" + "uid": "${datasource}" }, "fieldConfig": { "defaults": { @@ -796,10 +781,10 @@ "overrides": [] }, "gridPos": { - "h": 5, + "h": 6, "w": 6, "x": 6, - "y": 13 + "y": 15 }, "id": 7, "options": { @@ -824,7 +809,7 @@ { "datasource": { "type": "prometheus", - "uid": "de1higv54pog0f" + "uid": "${datasource}" }, "disableTextWrap": false, "editorMode": "builder", @@ -832,7 +817,7 @@ "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "__auto", + "legendFormat": "{{device_id}}", "range": true, "refId": "A", "useBackend": false @@ -843,9 +828,9 @@ }, { "datasource": { - "default": true, + "name": "${datasource}", "type": "prometheus", - "uid": "de1higv54pog0f" + "uid": "${datasource}" }, "fieldConfig": { "defaults": { @@ -871,10 +856,10 @@ "overrides": [] }, "gridPos": { - "h": 5, + "h": 6, "w": 6, "x": 12, - "y": 13 + "y": 15 }, "id": 8, "options": { @@ -897,7 +882,7 @@ { "datasource": { "type": "prometheus", - "uid": "de1higv54pog0f" + "uid": "${datasource}" }, "disableTextWrap": false, "editorMode": "builder", @@ -905,7 +890,7 @@ "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "__auto", + "legendFormat": "{{device_id}}", "range": true, "refId": "A", "useBackend": false @@ -916,9 +901,9 @@ }, { "datasource": { - "default": true, + "name": "${datasource}", "type": "prometheus", - "uid": "de1higv54pog0f" + "uid": "${datasource}" }, "fieldConfig": { "defaults": { @@ -944,10 +929,10 @@ "overrides": [] }, "gridPos": { - "h": 5, + "h": 6, "w": 6, "x": 18, - "y": 13 + "y": 15 }, "id": 9, "options": { @@ -970,7 +955,7 @@ { "datasource": { "type": "prometheus", - "uid": "de1higv54pog0f" + "uid": "${datasource}" }, "disableTextWrap": false, "editorMode": "builder", @@ -979,7 +964,7 @@ "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "{{label_name}}", + "legendFormat": "{{device_id}}", "range": true, "refId": "A", "useBackend": false @@ -993,16 +978,36 @@ "schemaVersion": 39, "tags": [], "templating": { - "list": [] + "list": [ + { + "current": { + "selected": true, + "text": "chicago", + "value": "de1higv54pog0f" + }, + "hide": 0, + "includeAll": false, + "label": "Store", + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + } + ] }, "time": { - "from": "2024-10-21T02:18:54.942Z", - "to": "2024-10-21T02:26:12.630Z" + "from": "now-15m", + "to": "now" }, "timepicker": {}, "timezone": "browser", "title": "Hypermarket / Stores", - "uid": "be1hvn2vct0jkev", - "version": 1, + "uid": "be1hvn2vct0jke", + "version": 65, "weekStart": "" } \ No newline at end of file From e7952f9ac31581dfe8bc9f7ee31eff7e92933ea3 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 22 Oct 2024 09:24:09 +0300 Subject: [PATCH 095/409] Refactor installK3s.sh script to download azcopy using curl instead of wget --- .../artifacts/kubernetes/K3s/installK3s.sh | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index 5a0a026f5e..2c6e5502e2 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -50,22 +50,6 @@ curl -v -o /etc/profile.d/welcomeK3s.sh ${templateBaseUrl}artifacts/welcomeK3s.s sudo -u $adminUsername mkdir -p /home/${adminUsername}/jumpstart_logs while sleep 1; do sudo -s rsync -a /var/lib/waagent/custom-script/download/0/installK3s-$vmName.log /home/${adminUsername}/jumpstart_logs/installK3s-$vmName.log; done & -# Downloading azcopy -echo "" -echo "Downloading azcopy" -echo "" -wget -O azcopy.tar.gz https://aka.ms/downloadazcopy-v10-linux -if [[ $? -ne 0 ]]; then - echo "ERROR: Failed to download azcopy" - exit 1 -fi - -tar -xf azcopy.tar.gz -sudo mv azcopy_linux_amd64_*/azcopy /usr/local/bin/azcopy -sudo chmod +x /usr/local/bin/azcopy -# Authorize azcopy by using a system-wide managed identity -export AZCOPY_AUTO_LOGIN_TYPE=MSI - # Function to check if dpkg lock is in place check_dpkg_lock() { while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1; do @@ -73,6 +57,25 @@ check_dpkg_lock() { sleep 5 done } +# Run the lock check before attempting the installation +check_dpkg_lock + +# Downloading azcopy +echo "" +echo "Downloading azcopy" +echo "" +curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash +##wget -O azcopy.tar.gz https://aka.ms/downloadazcopy-v10-linux +##if [[ $? -ne 0 ]]; then +## echo "ERROR: Failed to download azcopy" +## exit 1 +##fi + +##tar -xf azcopy.tar.gz +##sudo mv azcopy_linux_amd64_*/azcopy /usr/local/bin/azcopy +##sudo chmod +x /usr/local/bin/azcopy +# Authorize azcopy by using a system-wide managed identity +export AZCOPY_AUTO_LOGIN_TYPE=MSI # Run the lock check before attempting the installation check_dpkg_lock From cfca9737edabb2411f48673724a83fc868287cc9 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 22 Oct 2024 09:42:37 +0300 Subject: [PATCH 096/409] Refactor installK3s.sh script to use curl instead of wget for downloading azcopy --- .../artifacts/kubernetes/K3s/installK3s.sh | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index 2c6e5502e2..e4bdd8bb9c 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -64,16 +64,16 @@ check_dpkg_lock echo "" echo "Downloading azcopy" echo "" -curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash -##wget -O azcopy.tar.gz https://aka.ms/downloadazcopy-v10-linux -##if [[ $? -ne 0 ]]; then -## echo "ERROR: Failed to download azcopy" -## exit 1 -##fi - -##tar -xf azcopy.tar.gz -##sudo mv azcopy_linux_amd64_*/azcopy /usr/local/bin/azcopy -##sudo chmod +x /usr/local/bin/azcopy +wget -O azcopy.tar.gz https://aka.ms/downloadazcopy-v10-linux +if [[ $? -ne 0 ]]; then + echo "ERROR: Failed to download azcopy" + exit 1 +fi + +tar -xf azcopy.tar.gz +sudo mv azcopy_linux_amd64_*/azcopy /usr/local/bin/azcopy +sudo chmod +x /usr/local/bin/azcopy + # Authorize azcopy by using a system-wide managed identity export AZCOPY_AUTO_LOGIN_TYPE=MSI From d01d2ed76f554dc939e86229d6f6fe5c3f2c59ba Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Tue, 22 Oct 2024 12:43:49 -0400 Subject: [PATCH 097/409] update dashboard --- azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 | 2 +- .../artifacts/monitoring/grafana-app-pods.json | 6 +++--- .../artifacts/monitoring/grafana-app-stores.json | 6 ++++-- .../artifacts/monitoring/grafana-app-workloads.json | 5 ++--- .../artifacts/monitoring/grafana-cluster-global.json | 5 ++--- .../artifacts/monitoring/grafana-node-exporter-full-v2.json | 4 ++-- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index 26c7c8ae5c..b1f29c7349 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -1094,7 +1094,7 @@ function Deploy-Prometheus { $dashboardObject = $content | ConvertFrom-Json # Set Dashboard UID for parent dashboards - if ($dashboard -notlike '*cluster-pods*') { + if ($dashboard -notlike '*app-pods*') { # Best practice is to generate a random UID, such as a GUID $dashboardObject.uid = [guid]::NewGuid().ToString() } diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-pods.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-pods.json index 81927dabf3..81bd7783c3 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-pods.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-pods.json @@ -2282,8 +2282,8 @@ ], "schemaVersion": 39, "tags": [ - "jumpstart-agora", - "contoso" + "workloads", + "pods" ], "templating": { "list": [ @@ -2389,7 +2389,7 @@ ] }, "timezone": "utc", - "title": "Kubernetes / Workloads / Pods", + "title": "Kubernetes / Workload / Pod", "uid": "9701f5d6-af2d-442b-a2a4-d4d05f9b79b1", "version": 1, "weekStart": "" diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json index 7f2cbcacef..0c51b2e067 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json @@ -976,7 +976,9 @@ ], "refresh": "", "schemaVersion": 39, - "tags": [], + "tags": [ + "stores" + ], "templating": { "list": [ { @@ -1006,7 +1008,7 @@ }, "timepicker": {}, "timezone": "browser", - "title": "Hypermarket / Stores", + "title": "Store / Asset", "uid": "be1hvn2vct0jke", "version": 65, "weekStart": "" diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-workloads.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-workloads.json index 6b64aa4448..7981d5456c 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-workloads.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-workloads.json @@ -2064,8 +2064,7 @@ "refresh": "1m", "schemaVersion": 39, "tags": [ - "jumpstart-agora", - "contoso" + "workloads" ], "templating": { "list": [ @@ -2197,7 +2196,7 @@ ] }, "timezone": "utc", - "title": "Kubernetes / Workloads", + "title": "Kubernetes / Workload", "uid": "3151475894614845ba54456099696738ff", "version": 1, "weekStart": "" diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-global.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-global.json index e87d1aa95f..2a624cea8e 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-global.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-global.json @@ -2638,8 +2638,7 @@ "schemaVersion": 37, "style": "dark", "tags": [ - "Kubernetes", - "Prometheus" + "Kubernetes" ], "templating": { "list": [ @@ -2716,7 +2715,7 @@ }, "timepicker": {}, "timezone": "", - "title": "Kubernetes / Views / Global", + "title": "Kubernetes / Cluster / Global", "uid": "k8s_views_global", "version": 28, "weekStart": "" diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-node-exporter-full-v2.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-node-exporter-full-v2.json index 182e4d3f0b..4826f910ac 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-node-exporter-full-v2.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-node-exporter-full-v2.json @@ -23284,7 +23284,7 @@ "schemaVersion": 38, "style": "dark", "tags": [ - "linux" + "Kubernetes" ], "templating": { "list": [ @@ -23411,7 +23411,7 @@ ] }, "timezone": "browser", - "title": "Node Exporter Full", + "title": "Kubernetes / Cluster / Node Exporter", "uid": "rYdddlPWk", "version": 1, "weekStart": "" From fd5d876603c67859832f68c1b6ac59a2b39d2e32 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Tue, 22 Oct 2024 12:45:11 -0400 Subject: [PATCH 098/409] update store dashaboard --- .../monitoring/grafana-app-pods.json | 2 +- .../monitoring/grafana-app-stores.json | 377 ++++++++---------- .../monitoring/grafana-app-workloads.json | 2 +- .../monitoring/grafana-cluster-global.json | 2 +- 4 files changed, 169 insertions(+), 214 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-pods.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-pods.json index 81bd7783c3..f6c9139d65 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-pods.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-pods.json @@ -2388,7 +2388,7 @@ "30d" ] }, - "timezone": "utc", + "timezone": "browser", "title": "Kubernetes / Workload / Pod", "uid": "9701f5d6-af2d-442b-a2a4-d4d05f9b79b1", "version": 1, diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json index 0c51b2e067..67c3778931 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json @@ -18,7 +18,7 @@ "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 0, - "id": 5, + "id": 6, "links": [], "panels": [ { @@ -43,39 +43,6 @@ "color": { "mode": "continuous-GrYlRd" }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "scheme", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, "mappings": [], "thresholds": { "mode": "absolute", @@ -83,14 +50,6 @@ { "color": "green", "value": null - }, - { - "color": "#EAB839", - "value": 5 - }, - { - "color": "red", - "value": 10 } ] }, @@ -106,17 +65,23 @@ }, "id": 11, "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false }, - "tooltip": { - "mode": "single", - "sort": "none" - } + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true }, + "pluginVersion": "11.2.2+security-01", "targets": [ { "datasource": { @@ -125,6 +90,7 @@ }, "disableTextWrap": false, "editorMode": "builder", + "exemplar": false, "expr": "lighting_power_usage_kwh", "fullMetaSearch": false, "includeNullMetadata": true, @@ -136,7 +102,7 @@ } ], "title": "Lighting Power Usage", - "type": "timeseries" + "type": "stat" }, { "datasource": { @@ -149,6 +115,16 @@ "color": { "mode": "thresholds" }, + "custom": { + "align": "center", + "cellOptions": { + "applyToRow": false, + "mode": "gradient", + "type": "color-background", + "wrapText": false + }, + "inspect": false + }, "mappings": [ { "options": { @@ -172,15 +148,24 @@ { "color": "green", "value": null - }, - { - "color": "red", - "value": 80 } ] } }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + } + ] }, "gridPos": { "h": 6, @@ -190,21 +175,17 @@ }, "id": 12, "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], + "cellHeight": "lg", + "footer": { + "countRows": false, "fields": "", - "values": false + "reducer": [ + "sum" + ], + "show": false }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true + "frameIndex": 0, + "showHeader": true }, "pluginVersion": "11.2.2+security-01", "targets": [ @@ -215,18 +196,19 @@ }, "disableTextWrap": false, "editorMode": "builder", + "exemplar": false, "expr": "lighting_status", "fullMetaSearch": false, "includeNullMetadata": true, - "instant": false, + "instant": true, "legendFormat": "{{device_id}}", - "range": true, + "range": false, "refId": "A", "useBackend": false } ], "title": "Lighting Status", - "type": "stat" + "type": "table" }, { "datasource": { @@ -344,7 +326,7 @@ }, { "datasource": { - "name": "${datasource}", + "default": false, "type": "prometheus", "uid": "${datasource}" }, @@ -353,42 +335,6 @@ "color": { "mode": "continuous-GrYlRd" }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "scheme", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineStyle": { - "fill": "solid" - }, - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, "fieldMinMax": false, "mappings": [], "thresholds": { @@ -420,16 +366,21 @@ }, "id": 3, "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false }, - "tooltip": { - "mode": "single", - "sort": "none" - } + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true }, "pluginVersion": "11.2.2+security-01", "targets": [ @@ -453,11 +404,11 @@ } ], "title": "Refrigerator Power Usage", - "type": "timeseries" + "type": "stat" }, { "datasource": { - "name": "${datasource}", + "default": false, "type": "prometheus", "uid": "${datasource}" }, @@ -466,6 +417,16 @@ "color": { "mode": "thresholds" }, + "custom": { + "align": "center", + "cellOptions": { + "applyToRow": false, + "mode": "gradient", + "type": "color-background", + "wrapText": false + }, + "inspect": false + }, "mappings": [ { "options": { @@ -489,15 +450,24 @@ { "color": "green", "value": null - }, - { - "color": "red", - "value": 80 } ] } }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + } + ] }, "gridPos": { "h": 6, @@ -507,21 +477,17 @@ }, "id": 1, "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], + "cellHeight": "lg", + "footer": { + "countRows": false, "fields": "", - "values": false + "reducer": [ + "sum" + ], + "show": false }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true + "frameIndex": 1, + "showHeader": true }, "pluginVersion": "11.2.2+security-01", "targets": [ @@ -532,18 +498,19 @@ }, "disableTextWrap": false, "editorMode": "builder", + "exemplar": false, "expr": "refrigerator_door_open", "fullMetaSearch": false, "includeNullMetadata": true, - "instant": false, + "instant": true, "legendFormat": "{{device_id}}", - "range": true, + "range": false, "refId": "A", "useBackend": false } ], "title": "Refrigerator Door", - "type": "stat" + "type": "table" }, { "datasource": { @@ -641,39 +608,6 @@ "mode": "continuous-GrYlRd", "seriesBy": "last" }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "scheme", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, "mappings": [], "thresholds": { "mode": "absolute", @@ -704,17 +638,23 @@ }, "id": 6, "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false }, - "tooltip": { - "mode": "single", - "sort": "none" - } + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true }, + "pluginVersion": "11.2.2+security-01", "targets": [ { "datasource": { @@ -734,11 +674,11 @@ } ], "title": "HVAC Power Usage", - "type": "timeseries" + "type": "stat" }, { "datasource": { - "name": "${datasource}", + "default": false, "type": "prometheus", "uid": "${datasource}" }, @@ -747,6 +687,16 @@ "color": { "mode": "thresholds" }, + "custom": { + "align": "center", + "cellOptions": { + "applyToRow": false, + "mode": "gradient", + "type": "color-background", + "wrapText": false + }, + "inspect": false + }, "mappings": [ { "options": { @@ -770,15 +720,24 @@ { "color": "green", "value": null - }, - { - "color": "red", - "value": 80 } ] } }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + } + ] }, "gridPos": { "h": 6, @@ -788,21 +747,16 @@ }, "id": 7, "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], + "cellHeight": "lg", + "footer": { + "countRows": false, "fields": "", - "values": false + "reducer": [ + "sum" + ], + "show": false }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true + "showHeader": true }, "pluginVersion": "11.2.2+security-01", "targets": [ @@ -813,18 +767,19 @@ }, "disableTextWrap": false, "editorMode": "builder", + "exemplar": false, "expr": "hvac_mode", "fullMetaSearch": false, "includeNullMetadata": true, - "instant": false, + "instant": true, "legendFormat": "{{device_id}}", - "range": true, + "range": false, "refId": "A", "useBackend": false } ], "title": "HVAC Mode", - "type": "stat" + "type": "table" }, { "datasource": { @@ -983,9 +938,9 @@ "list": [ { "current": { - "selected": true, + "selected": false, "text": "chicago", - "value": "de1higv54pog0f" + "value": "de1k92ntokqo0c" }, "hide": 0, "includeAll": false, @@ -1009,7 +964,7 @@ "timepicker": {}, "timezone": "browser", "title": "Store / Asset", - "uid": "be1hvn2vct0jke", - "version": 65, + "uid": "ce1ncz4edo7b4a", + "version": 16, "weekStart": "" } \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-workloads.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-workloads.json index 7981d5456c..6f1b6d7a0d 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-workloads.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-workloads.json @@ -2195,7 +2195,7 @@ "30d" ] }, - "timezone": "utc", + "timezone": "browser", "title": "Kubernetes / Workload", "uid": "3151475894614845ba54456099696738ff", "version": 1, diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-global.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-global.json index 2a624cea8e..7dd8161f2b 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-global.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-global.json @@ -2714,7 +2714,7 @@ "to": "now" }, "timepicker": {}, - "timezone": "", + "timezone": "browser", "title": "Kubernetes / Cluster / Global", "uid": "k8s_views_global", "version": 28, From 36ee0fb67e1d51e171453e807f21e2372ca53b3d Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Tue, 22 Oct 2024 12:51:01 -0400 Subject: [PATCH 099/409] revert changes --- .../azure/terraform/scripts/installK3s.sh | 2 +- .../artifacts/PowerShell/AgLogonScript.ps1 | 24 +++++++++---------- .../artifacts/PowerShell/Bootstrap.ps1 | 8 +++---- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/azure_arc_k8s_jumpstart/rancher_k3s/azure/terraform/scripts/installK3s.sh b/azure_arc_k8s_jumpstart/rancher_k3s/azure/terraform/scripts/installK3s.sh index 490b31305e..5c781ac6fd 100644 --- a/azure_arc_k8s_jumpstart/rancher_k3s/azure/terraform/scripts/installK3s.sh +++ b/azure_arc_k8s_jumpstart/rancher_k3s/azure/terraform/scripts/installK3s.sh @@ -28,7 +28,7 @@ sed -i '8s/^/export templateBaseUrl=/' vars.sh chmod +x vars.sh . ./vars.sh -export K3S_VERSION="1.29.6+k3s2" # Do not change! +export K3S_VERSION="1.28.5+k3s1" # Do not change! # Creating login message of the day (motd) sudo curl -v -o /etc/profile.d/welcomeK3s.sh ${templateBaseUrl}scripts/welcomeK3s.sh diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 387fcf2967..e8d46970e6 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -200,19 +200,19 @@ if ($scenario -eq "contoso_supermarket") { Deploy-SupermarketConfigs } -# if ($scenario -eq "contoso_motors" -or $scenario -eq "contoso_hypermarket") { -# Update-AzureIoTOpsExtension -# Deploy-AIO -# if($scenario -eq "contoso_motors"){ -# Deploy-MotorsConfigs -# } -# $mqttIpArray=Set-MQTTIpAddress -# Deploy-MQTTExplorer -mqttIpArray $mqttIpArray -# } +if ($scenario -eq "contoso_motors" -or $scenario -eq "contoso_hypermarket") { + Update-AzureIoTOpsExtension + Deploy-AIO + if($scenario -eq "contoso_motors"){ + Deploy-MotorsConfigs + } + $mqttIpArray=Set-MQTTIpAddress + Deploy-MQTTExplorer -mqttIpArray $mqttIpArray +} -# ############################################################## -# # Deploy Kubernetes Prometheus Stack for Observability -# ############################################################## +############################################################## +# Deploy Kubernetes Prometheus Stack for Observability +############################################################## Deploy-Prometheus -AgConfig $AgConfig ##################################################################### diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 2ed8df8ca7..2ef13daf75 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -248,10 +248,6 @@ Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-cluster-glob Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/arc-inventory-workbook.bicep") -OutFile "$AgMonitoringDir\arc-inventory-workbook.bicep" Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/arc-osperformance-workbook.bicep") -OutFile "$AgMonitoringDir\arc-osperformance-workbook.bicep" Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/prometheus-additional-scrape-config.yaml") -OutFile "$AgMonitoringDir\prometheus-additional-scrape-config.yaml" -Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-workloads.json") -OutFile "$AgMonitoringDir\grafana-app-workloads.json" -Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-pods.json") -OutFile "$AgMonitoringDir\grafana-app-pods.json" -Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-node-exporter-full-v2.json") -OutFile "$AgMonitoringDir\grafana-node-exporter-full-v2.json" -Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-stores.json") -OutFile "$AgMonitoringDir\grafana-app-stores.json" Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/grafana.ico") -OutFile $AgIconsDir\grafana.ico Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso.png") -OutFile $AgIconsDir\contoso.png Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso.svg") -OutFile $AgIconsDir\contoso.svg @@ -275,6 +271,10 @@ elseif ($scenario -eq "contoso_hypermarket") { Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/Bookmarks-contoso-hypermarket") -OutFile "$AgToolsDir\Bookmarks" Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/mq_cloudConnector.yml") -OutFile "$AgToolsDir\mq_cloudConnector.yml" Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/mqtt_explorer_settings.json") -OutFile "$AgToolsDir\mqtt_explorer_settings.json" + Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-workloads.json") -OutFile "$AgMonitoringDir\grafana-app-workloads.json" + Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-pods.json") -OutFile "$AgMonitoringDir\grafana-app-pods.json" + Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-node-exporter-full-v2.json") -OutFile "$AgMonitoringDir\grafana-node-exporter-full-v2.json" + Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-stores.json") -OutFile "$AgMonitoringDir\grafana-app-stores.json" } BITSRequest -Params @{'Uri' = 'https://aka.ms/wslubuntu'; 'Filename' = "$AgToolsDir\Ubuntu.appx" } From 2b8e8f4c17c7b99ed30cda25c81f8d52d72a0993 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Tue, 22 Oct 2024 12:57:55 -0400 Subject: [PATCH 100/409] revert the change --- .../grafana-node-exporter-full.json | 716 +++++++++--------- 1 file changed, 358 insertions(+), 358 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-node-exporter-full.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-node-exporter-full.json index 182e4d3f0b..68c7680abc 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-node-exporter-full.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-node-exporter-full.json @@ -1,7 +1,7 @@ { "__inputs": [ { - "name": "datasource", + "name": "DS_PROMETHEUS", "label": "Prometheus", "description": "", "type": "datasource", @@ -119,7 +119,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "Busy state of all CPU cores together", "fieldConfig": { @@ -186,7 +186,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", "expr": "(sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode!=\"idle\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))) * 100", @@ -204,7 +204,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "Busy state of all CPU cores together (5 min average)", "fieldConfig": { @@ -271,7 +271,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "avg(node_load5{instance=\"$node\",job=\"$job\"}) / count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)) * 100", "format": "time_series", @@ -287,7 +287,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "Busy state of all CPU cores together (15 min average)", "fieldConfig": { @@ -354,7 +354,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "avg(node_load15{instance=\"$node\",job=\"$job\"}) / count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)) * 100", "hide": false, @@ -369,7 +369,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "Non available RAM memory", "fieldConfig": { @@ -428,7 +428,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "((node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"}) / (node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"} )) * 100", "format": "time_series", @@ -440,7 +440,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "100 - ((node_memory_MemAvailable_bytes{instance=\"$node\",job=\"$job\"} * 100) / node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"})", "format": "time_series", @@ -456,7 +456,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "Used Swap", "fieldConfig": { @@ -523,7 +523,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "((node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapFree_bytes{instance=\"$node\",job=\"$job\"}) / (node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} )) * 100", "intervalFactor": 1, @@ -537,7 +537,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "Used Root FS", "fieldConfig": { @@ -604,7 +604,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "100 - ((node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",mountpoint=\"/\",fstype!=\"rootfs\"} * 100) / node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",mountpoint=\"/\",fstype!=\"rootfs\"})", "format": "time_series", @@ -619,7 +619,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "Total number of CPU cores", "fieldConfig": { @@ -683,7 +683,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu))", "interval": "", @@ -699,7 +699,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "System uptime", "fieldConfig": { @@ -765,7 +765,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_time_seconds{instance=\"$node\",job=\"$job\"} - node_boot_time_seconds{instance=\"$node\",job=\"$job\"}", "intervalFactor": 1, @@ -779,7 +779,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "Total RootFS", "fieldConfig": { @@ -848,7 +848,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",mountpoint=\"/\",fstype!=\"rootfs\"}", "format": "time_series", @@ -864,7 +864,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "Total RAM", "fieldConfig": { @@ -929,7 +929,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"}", "intervalFactor": 1, @@ -943,7 +943,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "Total SWAP", "fieldConfig": { @@ -1008,7 +1008,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"}", "intervalFactor": 1, @@ -1048,7 +1048,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "Basic CPU info", "fieldConfig": { @@ -1238,7 +1238,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"system\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -1253,7 +1253,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"user\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -1268,7 +1268,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"iowait\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -1282,7 +1282,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=~\".*irq\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -1296,7 +1296,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode!='idle',mode!='user',mode!='system',mode!='iowait',mode!='irq',mode!='softirq'}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -1310,7 +1310,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"idle\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -1328,7 +1328,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "Basic memory usage", "fieldConfig": { @@ -1780,7 +1780,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -1793,7 +1793,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"} - (node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"} + node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"} + node_memory_SReclaimable_bytes{instance=\"$node\",job=\"$job\"})", "format": "time_series", @@ -1806,7 +1806,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"} + node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"} + node_memory_SReclaimable_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -1818,7 +1818,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -1830,7 +1830,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "(node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapFree_bytes{instance=\"$node\",job=\"$job\"})", "format": "time_series", @@ -1846,7 +1846,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "Basic network info per interface", "fieldConfig": { @@ -2286,7 +2286,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_network_receive_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8", "format": "time_series", @@ -2298,7 +2298,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_network_transmit_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8", "format": "time_series", @@ -2314,7 +2314,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "Disk space used of all filesystems mounted", "fieldConfig": { @@ -2398,7 +2398,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "100 - ((node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'} * 100) / node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'})", "format": "time_series", @@ -2440,7 +2440,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "", "fieldConfig": { @@ -2650,7 +2650,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"system\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -2665,7 +2665,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"user\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -2679,7 +2679,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"nice\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -2693,7 +2693,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"iowait\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -2707,7 +2707,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"irq\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -2721,7 +2721,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"softirq\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -2735,7 +2735,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"steal\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -2749,7 +2749,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"idle\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))", @@ -2768,7 +2768,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "", "fieldConfig": { @@ -3158,7 +3158,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"} - node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"} - node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"} - node_memory_Slab_bytes{instance=\"$node\",job=\"$job\"} - node_memory_PageTables_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapCached_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -3171,7 +3171,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_PageTables_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -3184,7 +3184,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_SwapCached_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -3196,7 +3196,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_Slab_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -3209,7 +3209,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -3222,7 +3222,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -3235,7 +3235,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -3248,7 +3248,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "(node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapFree_bytes{instance=\"$node\",job=\"$job\"})", "format": "time_series", @@ -3261,7 +3261,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_HardwareCorrupted_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -3278,7 +3278,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -3437,7 +3437,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_network_receive_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8", "format": "time_series", @@ -3449,7 +3449,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_network_transmit_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8", "format": "time_series", @@ -3465,7 +3465,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "", "fieldConfig": { @@ -3553,7 +3553,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'} - node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}", "format": "time_series", @@ -3569,7 +3569,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "", "fieldConfig": { @@ -3984,7 +3984,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_disk_reads_completed_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"}[$__rate_interval])", "intervalFactor": 4, @@ -3995,7 +3995,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_disk_writes_completed_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"}[$__rate_interval])", "intervalFactor": 1, @@ -4010,7 +4010,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "", "fieldConfig": { @@ -4212,7 +4212,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_disk_read_bytes_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"}[$__rate_interval])", "format": "time_series", @@ -4225,7 +4225,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_disk_written_bytes_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"}[$__rate_interval])", "format": "time_series", @@ -4242,7 +4242,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "", "fieldConfig": { @@ -4358,7 +4358,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_disk_io_time_seconds_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"} [$__rate_interval])", "format": "time_series", @@ -4376,7 +4376,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -4491,7 +4491,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_guest_seconds_total{instance=\"$node\",job=\"$job\", mode=\"user\"}[1m])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[1m])))", @@ -4503,7 +4503,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_guest_seconds_total{instance=\"$node\",job=\"$job\", mode=\"nice\"}[1m])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[1m])))", @@ -4545,7 +4545,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -4889,7 +4889,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_Inactive_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -4901,7 +4901,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_Active_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -4917,7 +4917,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -5280,7 +5280,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_Committed_AS_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -5292,7 +5292,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_CommitLimit_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -5308,7 +5308,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -5652,7 +5652,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_Inactive_file_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -5665,7 +5665,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_Inactive_anon_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -5678,7 +5678,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_Active_file_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -5691,7 +5691,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_Active_anon_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -5708,7 +5708,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -6081,7 +6081,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_Writeback_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -6093,7 +6093,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_WritebackTmp_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -6105,7 +6105,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_Dirty_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -6121,7 +6121,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -6489,7 +6489,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_Mapped_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -6501,7 +6501,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_Shmem_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -6513,7 +6513,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_ShmemHugePages_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -6526,7 +6526,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_ShmemPmdMapped_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -6543,7 +6543,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -6916,7 +6916,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_SUnreclaim_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -6928,7 +6928,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_SReclaimable_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -6944,7 +6944,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -7302,7 +7302,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_VmallocChunk_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -7315,7 +7315,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_VmallocTotal_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -7328,7 +7328,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_VmallocUsed_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -7345,7 +7345,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -7689,7 +7689,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_Bounce_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -7705,7 +7705,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -8075,7 +8075,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_AnonHugePages_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -8087,7 +8087,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_AnonPages_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -8103,7 +8103,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -8447,7 +8447,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_KernelStack_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -8459,7 +8459,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_Percpu_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -8476,7 +8476,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -8833,7 +8833,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_HugePages_Free{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -8845,7 +8845,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_HugePages_Rsvd{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -8857,7 +8857,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_HugePages_Surp{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -8873,7 +8873,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -9230,7 +9230,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_HugePages_Total{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -9242,7 +9242,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_Hugepagesize_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -9258,7 +9258,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -9615,7 +9615,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_DirectMap1G_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -9627,7 +9627,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_DirectMap2M_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -9640,7 +9640,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_DirectMap4k_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -9657,7 +9657,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -10001,7 +10001,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_Unevictable_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -10013,7 +10013,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_Mlocked_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -10029,7 +10029,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -10402,7 +10402,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_memory_NFS_Unstable_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -10444,7 +10444,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -10543,7 +10543,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_vmstat_pgpgin{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -10555,7 +10555,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_vmstat_pgpgout{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -10571,7 +10571,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -10670,7 +10670,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_vmstat_pswpin{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -10682,7 +10682,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_vmstat_pswpout{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -10698,7 +10698,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -11061,7 +11061,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_vmstat_pgfault{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -11073,7 +11073,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_vmstat_pgmajfault{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -11085,7 +11085,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_vmstat_pgfault{instance=\"$node\",job=\"$job\"}[$__rate_interval]) - irate(node_vmstat_pgmajfault{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -11101,7 +11101,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -11474,7 +11474,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_vmstat_oom_kill{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -11517,7 +11517,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "", "fieldConfig": { @@ -11620,7 +11620,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_timex_estimated_error_seconds{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -11634,7 +11634,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_timex_offset_seconds{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -11648,7 +11648,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_timex_maxerror_seconds{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -11666,7 +11666,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "", "fieldConfig": { @@ -11753,7 +11753,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_timex_loop_time_constant{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -11770,7 +11770,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "", "fieldConfig": { @@ -11873,7 +11873,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_timex_sync_status{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -11886,7 +11886,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_timex_frequency_adjustment_ratio{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -11903,7 +11903,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "", "fieldConfig": { @@ -11990,7 +11990,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_timex_tick_seconds{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -12003,7 +12003,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_timex_tai_offset_seconds{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -12046,7 +12046,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -12133,7 +12133,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_procs_blocked{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -12145,7 +12145,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_procs_running{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -12161,7 +12161,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -12248,7 +12248,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_processes_state{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -12265,7 +12265,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -12352,7 +12352,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_forks_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -12369,7 +12369,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -12469,7 +12469,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(process_virtual_memory_bytes{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "hide": false, @@ -12482,7 +12482,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "process_resident_memory_max_bytes{instance=\"$node\",job=\"$job\"}", "hide": false, @@ -12495,7 +12495,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(process_virtual_memory_bytes{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "hide": false, @@ -12508,7 +12508,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(process_virtual_memory_max_bytes{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "hide": false, @@ -12525,7 +12525,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -12632,7 +12632,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_processes_pids{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -12645,7 +12645,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_processes_max_processes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -12662,7 +12662,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -12761,7 +12761,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_schedstat_running_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -12774,7 +12774,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_schedstat_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -12791,7 +12791,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -12898,7 +12898,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_processes_threads{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -12911,7 +12911,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_processes_max_threads{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -12954,7 +12954,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -13041,7 +13041,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_context_switches_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -13053,7 +13053,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_intr_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -13070,7 +13070,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -13157,7 +13157,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_load1{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -13169,7 +13169,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_load5{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -13181,7 +13181,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_load15{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -13197,7 +13197,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -13323,7 +13323,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_interrupts_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -13340,7 +13340,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -13426,7 +13426,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_schedstat_timeslices_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -13443,7 +13443,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -13530,7 +13530,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_entropy_available_bits{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -13546,7 +13546,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -13632,7 +13632,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(process_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -13649,7 +13649,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -13756,7 +13756,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "process_max_fds{instance=\"$node\",job=\"$job\"}", "interval": "", @@ -13768,7 +13768,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "process_open_fds{instance=\"$node\",job=\"$job\"}", "interval": "", @@ -13810,7 +13810,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -13936,7 +13936,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_hwmon_temp_celsius{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -13949,7 +13949,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_hwmon_temp_crit_alarm_celsius{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -13963,7 +13963,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_hwmon_temp_crit_celsius{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -13976,7 +13976,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_hwmon_temp_crit_hyst_celsius{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -13990,7 +13990,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_hwmon_temp_max_celsius{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -14008,7 +14008,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -14114,7 +14114,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_cooling_device_cur_state{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -14128,7 +14128,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_cooling_device_max_state{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -14145,7 +14145,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -14231,7 +14231,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_power_supply_online{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -14275,7 +14275,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -14362,7 +14362,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_systemd_socket_accepted_connections_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -14379,7 +14379,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -14541,7 +14541,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"activating\"}", "format": "time_series", @@ -14554,7 +14554,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"active\"}", "format": "time_series", @@ -14567,7 +14567,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"deactivating\"}", "format": "time_series", @@ -14580,7 +14580,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"failed\"}", "format": "time_series", @@ -14593,7 +14593,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"inactive\"}", "format": "time_series", @@ -14636,7 +14636,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "The number (after merges) of I/O requests completed per second for the device", "fieldConfig": { @@ -15036,7 +15036,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_disk_reads_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "intervalFactor": 4, @@ -15047,7 +15047,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_disk_writes_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "intervalFactor": 1, @@ -15062,7 +15062,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "The number of bytes read from or written to the device per second", "fieldConfig": { @@ -15462,7 +15462,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_disk_read_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -15474,7 +15474,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_disk_written_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -15490,7 +15490,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "The average time for requests issued to the device to be served. This includes the time spent by the requests in queue and the time spent servicing them.", "fieldConfig": { @@ -15890,7 +15890,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_disk_read_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]) / irate(node_disk_reads_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "hide": false, @@ -15903,7 +15903,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_disk_write_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]) / irate(node_disk_writes_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "hide": false, @@ -15920,7 +15920,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "The average queue length of the requests that were issued to the device", "fieldConfig": { @@ -16309,7 +16309,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_disk_io_time_weighted_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", @@ -16325,7 +16325,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "The number of read and write requests merged per second that were queued to the device", "fieldConfig": { @@ -16725,7 +16725,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_disk_reads_merged_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "intervalFactor": 1, @@ -16736,7 +16736,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_disk_writes_merged_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "intervalFactor": 1, @@ -16751,7 +16751,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "Percentage of elapsed time during which I/O requests were issued to the device (bandwidth utilization for the device). Device saturation occurs when this value is close to 100% for devices serving requests serially. But for devices serving requests in parallel, such as RAID arrays and modern SSDs, this number does not reflect their performance limits.", "fieldConfig": { @@ -17140,7 +17140,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_disk_io_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", @@ -17152,7 +17152,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_disk_discard_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", @@ -17168,7 +17168,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "The number of outstanding requests at the instant the sample was taken. Incremented as requests are given to appropriate struct request_queue and decremented as they finish.", "fieldConfig": { @@ -17557,7 +17557,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_disk_io_now{instance=\"$node\",job=\"$job\"}", "interval": "", @@ -17573,7 +17573,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "", "fieldConfig": { @@ -17961,7 +17961,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_disk_discards_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", @@ -17973,7 +17973,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_disk_discards_merged_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", @@ -18015,7 +18015,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "", "fieldConfig": { @@ -18103,7 +18103,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}", "format": "time_series", @@ -18117,7 +18117,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_filesystem_free_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}", "format": "time_series", @@ -18130,7 +18130,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}", "format": "time_series", @@ -18147,7 +18147,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "", "fieldConfig": { @@ -18235,7 +18235,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_filesystem_files_free{instance=\"$node\",job=\"$job\",device!~'rootfs'}", "format": "time_series", @@ -18252,7 +18252,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "", "fieldConfig": { @@ -18340,7 +18340,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_filefd_maximum{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -18352,7 +18352,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_filefd_allocated{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -18368,7 +18368,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "", "fieldConfig": { @@ -18456,7 +18456,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_filesystem_files{instance=\"$node\",job=\"$job\",device!~'rootfs'}", "format": "time_series", @@ -18473,7 +18473,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "", "fieldConfig": { @@ -18578,7 +18578,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_filesystem_readonly{instance=\"$node\",job=\"$job\",device!~'rootfs'}", "format": "time_series", @@ -18590,7 +18590,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_filesystem_device_error{instance=\"$node\",job=\"$job\",device!~'rootfs',fstype!~'tmpfs'}", "format": "time_series", @@ -18633,7 +18633,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -18793,7 +18793,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_network_receive_packets_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -18806,7 +18806,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_network_transmit_packets_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -18823,7 +18823,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -18923,7 +18923,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_network_receive_errs_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -18935,7 +18935,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_network_transmit_errs_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -18951,7 +18951,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -19051,7 +19051,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_network_receive_drop_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -19063,7 +19063,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_network_transmit_drop_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -19079,7 +19079,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -19179,7 +19179,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_network_receive_compressed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -19191,7 +19191,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_network_transmit_compressed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -19207,7 +19207,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -19307,7 +19307,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_network_receive_multicast_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -19323,7 +19323,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -19423,7 +19423,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_network_receive_fifo_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -19435,7 +19435,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_network_transmit_fifo_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -19451,7 +19451,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -19551,7 +19551,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_network_receive_frame_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -19568,7 +19568,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -19655,7 +19655,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_network_transmit_carrier_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -19671,7 +19671,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -19771,7 +19771,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_network_transmit_colls_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -19787,7 +19787,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -19894,7 +19894,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_nf_conntrack_entries{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -19906,7 +19906,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_nf_conntrack_entries_limit{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -19922,7 +19922,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -20009,7 +20009,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_arp_entries{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20025,7 +20025,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -20113,7 +20113,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_network_mtu_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20129,7 +20129,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -20217,7 +20217,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_network_speed_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20233,7 +20233,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -20321,7 +20321,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_network_transmit_queue_length{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20337,7 +20337,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -20437,7 +20437,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_softnet_processed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -20450,7 +20450,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_softnet_dropped_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -20467,7 +20467,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -20554,7 +20554,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_softnet_times_squeezed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -20571,7 +20571,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -20658,7 +20658,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_network_up{operstate=\"up\",instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20670,7 +20670,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_network_carrier{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20711,7 +20711,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -20799,7 +20799,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_sockstat_TCP_alloc{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20812,7 +20812,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_sockstat_TCP_inuse{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20825,7 +20825,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_sockstat_TCP_mem{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20839,7 +20839,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_sockstat_TCP_orphan{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20852,7 +20852,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_sockstat_TCP_tw{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20869,7 +20869,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -20957,7 +20957,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_sockstat_UDPLITE_inuse{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20970,7 +20970,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_sockstat_UDP_inuse{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -20983,7 +20983,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_sockstat_UDP_mem{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -21000,7 +21000,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -21088,7 +21088,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_sockstat_FRAG_inuse{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -21101,7 +21101,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_sockstat_RAW_inuse{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -21118,7 +21118,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -21206,7 +21206,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_sockstat_TCP_mem_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -21219,7 +21219,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_sockstat_UDP_mem_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -21232,7 +21232,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_sockstat_FRAG_memory{instance=\"$node\",job=\"$job\"}", "interval": "", @@ -21247,7 +21247,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -21335,7 +21335,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_sockstat_sockets_used{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -21378,7 +21378,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -21478,7 +21478,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_IpExt_InOctets{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -21491,7 +21491,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_IpExt_OutOctets{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -21507,7 +21507,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -21595,7 +21595,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_Ip_Forwarding{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -21612,7 +21612,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -21711,7 +21711,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_Icmp_InMsgs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -21724,7 +21724,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_Icmp_OutMsgs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -21741,7 +21741,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -21840,7 +21840,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_Icmp_InErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -21857,7 +21857,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -21968,7 +21968,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_Udp_InDatagrams{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -21981,7 +21981,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_Udp_OutDatagrams{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -21998,7 +21998,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -22084,7 +22084,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_Udp_InErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22097,7 +22097,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_Udp_NoPorts{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22110,7 +22110,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_UdpLite_InErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", @@ -22120,7 +22120,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_Udp_RcvbufErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22133,7 +22133,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_Udp_SndbufErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22150,7 +22150,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -22261,7 +22261,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_Tcp_InSegs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22275,7 +22275,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_Tcp_OutSegs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22292,7 +22292,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "", "fieldConfig": { @@ -22380,7 +22380,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_TcpExt_ListenOverflows{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22394,7 +22394,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_TcpExt_ListenDrops{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22408,7 +22408,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_TcpExt_TCPSynRetrans{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22421,7 +22421,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_Tcp_RetransSegs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", @@ -22431,7 +22431,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_Tcp_InErrs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", @@ -22441,7 +22441,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_Tcp_OutRsts{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", @@ -22455,7 +22455,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -22562,7 +22562,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_netstat_Tcp_CurrEstab{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -22576,7 +22576,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_netstat_Tcp_MaxConn{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -22594,7 +22594,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "", "fieldConfig": { @@ -22694,7 +22694,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_TcpExt_SyncookiesFailed{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22708,7 +22708,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_TcpExt_SyncookiesRecv{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22722,7 +22722,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_TcpExt_SyncookiesSent{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22740,7 +22740,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { @@ -22827,7 +22827,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_Tcp_ActiveOpens{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22840,7 +22840,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "irate(node_netstat_Tcp_PassiveOpens{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", @@ -22857,7 +22857,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "Enable with --collector.tcpstat argument on node-exporter", "fieldConfig": { @@ -22941,7 +22941,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", "expr": "node_tcp_connection_states{state=\"established\",instance=\"$node\",job=\"$job\"}", @@ -22956,7 +22956,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", "expr": "node_tcp_connection_states{state=\"fin_wait2\",instance=\"$node\",job=\"$job\"}", @@ -22972,7 +22972,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", "expr": "node_tcp_connection_states{state=\"listen\",instance=\"$node\",job=\"$job\"}", @@ -22988,7 +22988,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", "expr": "node_tcp_connection_states{state=\"time_wait\",instance=\"$node\",job=\"$job\"}", @@ -23034,7 +23034,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "", "fieldConfig": { @@ -23121,7 +23121,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_scrape_collector_duration_seconds{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -23139,7 +23139,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "description": "", "fieldConfig": { @@ -23249,7 +23249,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_scrape_collector_success{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -23263,7 +23263,7 @@ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "expr": "node_textfile_scrape_error{instance=\"$node\",job=\"$job\"}", "format": "time_series", @@ -23310,7 +23310,7 @@ "current": {}, "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "definition": "", "hide": 0, @@ -23336,7 +23336,7 @@ "current": {}, "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${DS_PROMETHEUS}" }, "definition": "label_values(node_uname_info{job=\"$job\"}, instance)", "hide": 0, From 46df1f05c20a244019f5e5fd280d6f34c12d1a58 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Tue, 22 Oct 2024 13:00:17 -0400 Subject: [PATCH 101/409] revert the change data source --- .../artifacts/monitoring/grafana-node-exporter-full.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-node-exporter-full.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-node-exporter-full.json index 68c7680abc..149b323dd3 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-node-exporter-full.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-node-exporter-full.json @@ -23298,7 +23298,7 @@ "includeAll": false, "label": "datasource", "multi": false, - "name": "datasource", + "name": "DS_PROMETHEUS", "options": [], "query": "prometheus", "refresh": 1, From 701087adc311bfcad036bf0f4b1cc73474ae8c80 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Tue, 22 Oct 2024 13:01:48 -0400 Subject: [PATCH 102/409] revert cluster global change --- .../artifacts/monitoring/grafana-cluster-global.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-global.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-global.json index 7dd8161f2b..2369c958b1 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-global.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-cluster-global.json @@ -1,7 +1,7 @@ { "__inputs": [ { - "name": "datasource", + "name": "DS_PROMETHEUS", "label": "Prometheus", "description": "", "type": "datasource", @@ -2715,7 +2715,7 @@ }, "timepicker": {}, "timezone": "browser", - "title": "Kubernetes / Cluster / Global", + "title": "Kubernetes / Views / Global", "uid": "k8s_views_global", "version": 28, "weekStart": "" From 6fe0960e6a25e0f24fdd2528a10e149f0166d40a Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Tue, 22 Oct 2024 13:12:49 -0400 Subject: [PATCH 103/409] enable container insights --- .../artifacts/kubernetes/K3s/installK3s.sh | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index ee8d7705db..5a0a026f5e 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -208,18 +208,18 @@ is_extension_installed() { fi } -# # Enabling Container Insights and Microsoft Defender for Containers cluster extensions -# echo "" -# echo "Enabling Container Insights and Microsoft Defender for Containers cluster extensions" -# echo "" - -# # Check and install azuremonitor-containers extension -# if is_extension_installed "azuremonitor-containers"; then -# echo "Extension 'azuremonitor-containers' is already installed." -# else -# echo "Extension 'azuremonitor-containers' is not installed - triggering installation" -# sudo -u $adminUsername az k8s-extension create -n "azuremonitor-containers" --cluster-name $vmName --resource-group $resourceGroup --cluster-type connectedClusters --extension-type Microsoft.AzureMonitor.Containers --configuration-settings logAnalyticsWorkspaceResourceID=$workspaceResourceId --only-show-errors -# fi +# Enabling Container Insights and Microsoft Defender for Containers cluster extensions +echo "" +echo "Enabling Container Insights and Microsoft Defender for Containers cluster extensions" +echo "" + +# Check and install azuremonitor-containers extension +if is_extension_installed "azuremonitor-containers"; then + echo "Extension 'azuremonitor-containers' is already installed." +else + echo "Extension 'azuremonitor-containers' is not installed - triggering installation" + sudo -u $adminUsername az k8s-extension create -n "azuremonitor-containers" --cluster-name $vmName --resource-group $resourceGroup --cluster-type connectedClusters --extension-type Microsoft.AzureMonitor.Containers --configuration-settings logAnalyticsWorkspaceResourceID=$workspaceResourceId --only-show-errors +fi # Check and install microsoft.azuredefender.kubernetes extension if is_extension_installed "microsoft.azuredefender.kubernetes"; then From ab4ca49ac4486e70c7ee687ab9b52d776d055e41 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Tue, 22 Oct 2024 20:21:27 -0400 Subject: [PATCH 104/409] comment AIO --- .../artifacts/PowerShell/AgLogonScript.ps1 | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index e8d46970e6..9e376a1aa7 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -200,15 +200,15 @@ if ($scenario -eq "contoso_supermarket") { Deploy-SupermarketConfigs } -if ($scenario -eq "contoso_motors" -or $scenario -eq "contoso_hypermarket") { - Update-AzureIoTOpsExtension - Deploy-AIO - if($scenario -eq "contoso_motors"){ - Deploy-MotorsConfigs - } - $mqttIpArray=Set-MQTTIpAddress - Deploy-MQTTExplorer -mqttIpArray $mqttIpArray -} +# if ($scenario -eq "contoso_motors" -or $scenario -eq "contoso_hypermarket") { +# Update-AzureIoTOpsExtension +# Deploy-AIO +# if($scenario -eq "contoso_motors"){ +# Deploy-MotorsConfigs +# } +# $mqttIpArray=Set-MQTTIpAddress +# Deploy-MQTTExplorer -mqttIpArray $mqttIpArray +# } ############################################################## # Deploy Kubernetes Prometheus Stack for Observability From 13a000171716c0f4ae7d69da8dc08ff5c50911be Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Tue, 22 Oct 2024 20:26:10 -0400 Subject: [PATCH 105/409] Updates for Fabric and EventHub deployment --- .../bicep/clientVm/clientVm.bicep | 5 +- .../bicep/data/dataExplorer.bicep | 75 ------- .../bicep/data/eventGrid.bicep | 184 ------------------ .../bicep/data/eventHub.bicep | 19 +- .../bicep/data/fabric.bicep | 22 +++ .../contoso_hypermarket/bicep/main.bicep | 45 ++--- .../bicep/main.parameters.json | 3 + 7 files changed, 50 insertions(+), 303 deletions(-) delete mode 100644 azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataExplorer.bicep delete mode 100644 azure_jumpstart_ag/contoso_hypermarket/bicep/data/eventGrid.bicep create mode 100644 azure_jumpstart_ag/contoso_hypermarket/bicep/data/fabric.bicep diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep index 5f9ea6e5bf..bcb4ccbd76 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep @@ -60,9 +60,6 @@ param stcontainerName string @description('The login server name of the Azure Container Registry') param acrName string -@description('The name of the Azure Data Explorer cluster') -param adxClusterName string - @description('Override default RDP port using this parameter. Default is 3389. No changes will be made to the client VM.') param rdpPort string = '3389' @@ -201,7 +198,7 @@ resource vmBootstrap 'Microsoft.Compute/virtualMachines/extensions@2022-11-01' = fileUris: [ uri(templateBaseUrl, 'artifacts/PowerShell/Bootstrap.ps1') ] - commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnObjectId ${spnObjectId} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -acrName ${acrName} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -adxClusterName ${adxClusterName} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName} -stcontainerName ${stcontainerName} -k3sArcClusterName ${k3sArcClusterName} -k3sArcDataClusterName ${k3sArcDataClusterName}' + commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnObjectId ${spnObjectId} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -acrName ${acrName} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName} -stcontainerName ${stcontainerName} -k3sArcClusterName ${k3sArcClusterName} -k3sArcDataClusterName ${k3sArcDataClusterName}' } } } diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataExplorer.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataExplorer.bicep deleted file mode 100644 index 8701a4e517..0000000000 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataExplorer.bicep +++ /dev/null @@ -1,75 +0,0 @@ -@description('The name of the Azure Data Explorer cluster') -param adxClusterName string - -@description('The location of the Azure Data Explorer cluster') -param location string = resourceGroup().location - -@description('Resource tag for Jumpstart Agora') -param resourceTags object = { - Project: 'Jumpstart_azure_aio' -} - -@description('The name of the Azure Data Explorer cluster Sku') -param skuName string = 'Dev(No SLA)_Standard_E2a_v4' - -@description('The name of the Azure Data Explorer cluster Sku tier') -param skuTier string = 'Basic' - -@description('The name of the Event Hub') -param eventHubName string - -@description('The name of the Event Hub Namespace') -param eventHubNamespaceName string - -@description('The resource id of the Event Hub') -param eventHubResourceId string - -@description('The name of the Azure Data Explorer database') -param adxDBName string = 'manufacturing' - -@description('# of nodes') -@minValue(1) -@maxValue(2) -param skuCapacity int = 1 - - -resource adxCluster 'Microsoft.Kusto/clusters@2023-05-02' = { - name: adxClusterName - location: location - tags: resourceTags - sku: { - name: skuName - tier: skuTier - capacity: skuCapacity - } - identity: { - type: 'SystemAssigned' - } -} - -resource manufacturingAdxDB 'Microsoft.Kusto/clusters/databases@2023-05-02' = { - parent: adxCluster - name: adxDBName - location: location - kind: 'ReadWrite' -} - -resource azureEventHubsDataReceiverRole 'Microsoft.Authorization/roleDefinitions@2022-04-01' existing = { - name: 'a638d3c7-ab3a-418d-83e6-5f17a39d4fde' - scope: tenant() -} - -resource eventHub 'Microsoft.EventHub/namespaces/eventhubs@2023-01-01-preview' existing = { - name: '${eventHubNamespaceName}/${eventHubName}' -} - -resource eventHubRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { - name: guid('AzureEventHubsDataReceiverRole', adxCluster.id, eventHubResourceId) - scope: eventHub - properties: { - roleDefinitionId: azureEventHubsDataReceiverRole.id - principalId: adxCluster.identity.principalId - } -} - -output adxEndpoint string = adxCluster.properties.uri diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/eventGrid.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/eventGrid.bicep deleted file mode 100644 index d5d7e8b994..0000000000 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/eventGrid.bicep +++ /dev/null @@ -1,184 +0,0 @@ -@description('The name of the EventGrid namespace') -param eventGridNamespaceName string = 'aioNamespace' - -@description('The location of the Azure Data Explorer cluster') -param location string = resourceGroup().location - -@maxLength(5) -@description('Random GUID') -param namingGuid string - -@description('EventGrid Sku') -param eventGridSku string = 'Standard' - -@description('EventGrid capacity') -param eventGridCapacity int = 1 - -@description('The name of the EventGrid client group') -param eventGridClientGroupName string = '$all' - -@description('The name of the EventGrid namespace') -param eventGridTopicSpaceName string = 'aiotopicSpace${namingGuid}' - -@description('The name of the EventGrid topic templates') -param eventGridTopicTemplates array = [ - '#' -] - -@description('Resource tag for Jumpstart Agora') -param resourceTags object = { - Project: 'Jumpstart_azure_aio' -} - -@description('The name of the EventGrid publisher binding name') -param publisherBindingName string = 'publisherBinding' - -@description('The name of the EventGrid subscription binding name') -param subscriberBindingName string = 'subscriberBindingName' - -@description('The name of the EventHub topic subscription') -param eventGridTopicSubscriptionName string = 'aioEventHubSubscription' - -@description('The name of the storage topic subscription') -param storageTopicSubscriptionName string = 'aioStorageSubscription' - -@description('The name of the EventGrid topic') -param eventGridTopicName string = 'aiotopic${namingGuid}' - -@description('The name of the EventGrid topic sku') -param eventGridTopicSku string = 'Basic' - -@description('The resource Id of the event hub') -param eventHubResourceId string - -@description('The resource Id of the storage account queue') -param storageAccountResourceId string - -@description('The name of the storage account queue') -param queueName string - -@description('The time to live of the storage account queue') -param queueTTL int = 604800 - -@description('The maximum number of client sessions per authentication name') -param maximumClientSessionsPerAuthenticationName int = 100 - -resource eventGrid 'Microsoft.EventGrid/namespaces@2023-12-15-preview' = { - name: eventGridNamespaceName - tags: resourceTags - location: location - sku: { - name: eventGridSku - capacity: eventGridCapacity - } - identity: { - type: 'SystemAssigned' - } - properties: { - topicSpacesConfiguration: { - state: 'Enabled' - maximumClientSessionsPerAuthenticationName: maximumClientSessionsPerAuthenticationName - clientAuthentication: { - alternativeAuthenticationNameSources: [ - 'ClientCertificateSubject' - ] - } - routeTopicResourceId: eventGridTopic.id - } - } -} - -resource eventGridTopicSpace 'Microsoft.EventGrid/namespaces/topicSpaces@2023-06-01-preview' = { - name: eventGridTopicSpaceName - parent: eventGrid - properties: { - topicTemplates: eventGridTopicTemplates - } -} - -resource eventGridPubisherBinding 'Microsoft.EventGrid/namespaces/permissionBindings@2023-06-01-preview' = { - name: publisherBindingName - parent: eventGrid - properties: { - clientGroupName: eventGridClientGroupName - permission: 'Publisher' - topicSpaceName: eventGridTopicSpace.name - } -} - -resource eventGridsubscriberBindingName 'Microsoft.EventGrid/namespaces/permissionBindings@2023-06-01-preview' = { - name: subscriberBindingName - parent: eventGrid - properties: { - clientGroupName: eventGridClientGroupName - permission: 'Subscriber' - topicSpaceName: eventGridTopicSpace.name - } -} - -resource eventGridTopic 'Microsoft.EventGrid/topics@2023-06-01-preview' = { - name: eventGridTopicName - location: location - tags: resourceTags - sku: { - name: eventGridTopicSku - } - identity: { - type: 'SystemAssigned' - } - properties: { - inputSchema: 'CloudEventSchemaV1_0' - } -} - - -resource eventHubTopicSubscription 'Microsoft.EventGrid/topics/eventSubscriptions@2023-06-01-preview' = { - name: eventGridTopicSubscriptionName - parent:eventGridTopic - properties: { - destination: { - endpointType: 'EventHub' - properties: { - resourceId: eventHubResourceId - } - } - filter: { - enableAdvancedFilteringOnArrays: true - } - eventDeliverySchema: 'CloudEventSchemaV1_0' - } -} - -resource storageTopicSubscription 'Microsoft.EventGrid/topics/eventSubscriptions@2023-06-01-preview' = { - name: storageTopicSubscriptionName - parent:eventGridTopic - properties: { - destination: { - endpointType: 'StorageQueue' - properties: { - resourceId: storageAccountResourceId - queueName: queueName - queueMessageTimeToLiveInSeconds: queueTTL - } - } - filter: { - enableAdvancedFilteringOnArrays: true - } - eventDeliverySchema: 'CloudEventSchemaV1_0' - } -} - -resource azureEventGridDataSenderRole 'Microsoft.Authorization/roleDefinitions@2022-04-01' existing = { - name: 'd5a91429-5739-47e2-a06b-3470a27159e7' - scope: tenant() -} - -resource eventGridTopicRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { - name: guid('azureEventGridDataSenderRole', eventGrid.id, eventGridTopic.id) - scope: eventGridTopic - properties: { - roleDefinitionId: azureEventGridDataSenderRole.id - principalId: eventGrid.identity.principalId - } -} - diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/eventHub.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/eventHub.bicep index 9492b09cc4..9cde005b67 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/eventHub.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/eventHub.bicep @@ -1,8 +1,8 @@ @description('The name of the EventHub namespace') param eventHubNamespaceName string = 'aiohubns${uniqueString(resourceGroup().id)}' -@description('The name of the EventHub') -param eventHubName string = 'aioEventHub' +@description('The name of the Orders EventHub') +param eventHubName string @description('EventHub Sku') param eventHubSku string = 'Standard' @@ -21,9 +21,6 @@ param resourceTags object = { @description('The location of the Azure Data Explorer cluster') param location string = resourceGroup().location -@description('The name of the Azure Data Explorer Event Hub consumer group for mqttdataemulator') -param stagingDataCGName string = 'mqttdataemulator' - resource eventHubNamespace 'Microsoft.EventHub/namespaces@2023-01-01-preview' = { name: eventHubNamespaceName tags: resourceTags @@ -44,17 +41,23 @@ resource eventHub 'Microsoft.EventHub/namespaces/eventhubs@2023-01-01-preview' = } resource eventHubAuthRule 'Microsoft.EventHub/namespaces/authorizationRules@2023-01-01-preview' = { - name: 'eventHubAuthRule' + name: 'FabricSharedAccessKey' parent: eventHubNamespace properties: { rights: [ 'Listen' + 'Send' ] } } -resource weldingrobotCG 'Microsoft.EventHub/namespaces/eventhubs/consumergroups@2023-01-01-preview' = { - name: stagingDataCGName +resource ordersCS 'Microsoft.EventHub/namespaces/eventhubs/consumergroups@2023-01-01-preview' = { + name: 'orderscg' + parent: eventHub +} + +resource inventoryCG 'Microsoft.EventHub/namespaces/eventhubs/consumergroups@2023-01-01-preview' = { + name: 'inventorycg' parent: eventHub } diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/fabric.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/fabric.bicep new file mode 100644 index 0000000000..b5fa76a130 --- /dev/null +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/fabric.bicep @@ -0,0 +1,22 @@ +@description('Microsoft Fabric capacity name') +param fabricCapacityName string = 'agorafabric' + +@description('The location of the Microsoft Fabric capacity ') +param location string = resourceGroup().location + +@description('Microsoft Fabric capacity admin email address') +param fabricCapacityAdmin string + +resource fabricCapacity 'Microsoft.Fabric/capacities@2023-11-01' = { + name: fabricCapacityName + location: location + sku: { + name: 'F2' + tier: 'Fabric' + } + properties: { + administration: { + members: [fabricCapacityAdmin] + } + } +} diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index 20b1470c65..43236c5787 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -51,9 +51,6 @@ param subnetNameCloudK3s string = 'Ag-Subnet-K3s' @description('Name of the inner-loop AKS subnet in the cloud virtual network') param subnetNameCloud string = 'Ag-Subnet-Cloud' -@description('The name of the Azure Data Explorer cluster') -param adxClusterName string = 'agadx${namingGuid}' - @description('Name of the storage queue') param storageQueueName string = 'aioqueue' @@ -63,15 +60,15 @@ param eventHubName string = 'aiohub${namingGuid}' @description('Name of the event hub namespace') param eventHubNamespaceName string = 'aiohubns${namingGuid}' -@description('Name of the event grid namespace') -param eventGridNamespaceName string = 'aioeventgridns${namingGuid}' +@description('Name of the Fabric Capacity') +param fabricCapacityName string = 'agfabric${namingGuid}' + +@description('The administrator for the Microsoft Fabric capacity') +param fabricCapacityAdmin string @description('Name of the storage account') param aioStorageAccountName string = 'aiostg${namingGuid}' -@description('The name of the Azure Data Explorer Event Hub consumer group for assemblybatteries') -param stagingDataCGName string = 'mqttdataemulator' - @description('The name of ESA container in Storage Account') param stcontainerName string = 'esacontainer' @@ -215,7 +212,6 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { subnetId: networkDeployment.outputs.cloudSubnetId acrName: acrName rdpPort: rdpPort - adxClusterName: adxClusterName namingGuid: namingGuid scenario: scenario customLocationRPOID: customLocationRPOID @@ -225,16 +221,6 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { k3sArcDataClusterName: k3sArcDataClusterName } } -module adx 'data/dataExplorer.bicep' = { - name: 'adxDeployment' - params: { - adxClusterName: adxClusterName - location: location - eventHubResourceId: eventHub.outputs.eventHubResourceId - eventHubName: eventHubName - eventHubNamespaceName: eventHubNamespaceName - } -} module acr 'kubernetes/acr.bicep' = { name: 'acrDeployment' @@ -254,18 +240,6 @@ module keyVault 'data/keyVault.bicep' = { } } -module eventGrid 'data/eventGrid.bicep' = { - name: 'eventGridDeployment' - params: { - eventGridNamespaceName: eventGridNamespaceName - eventHubResourceId: eventHub.outputs.eventHubResourceId - queueName: storageQueueName - storageAccountResourceId: storageAccount.outputs.storageAccountResourceId - namingGuid: namingGuid - location: location - } -} - module storageAccount 'storage/storageAccount.bicep' = { name: 'aioStorageAccountDeployment' params: { @@ -282,6 +256,13 @@ module eventHub 'data/eventHub.bicep' = { eventHubName: eventHubName eventHubNamespaceName: eventHubNamespaceName location: location - stagingDataCGName: stagingDataCGName + } +} + +module fabricCapacity 'data/fabric.bicep' = { + name: 'fabricCapacity' + params: { + fabricCapacityName: fabricCapacityName + fabricCapacityAdmin: fabricCapacityAdmin } } diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.parameters.json b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.parameters.json index 14c9728505..07cd247fe2 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.parameters.json +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.parameters.json @@ -28,6 +28,9 @@ }, "sshRSAPublicKey": { "value": "" + }, + "fabricCapacityAdmin": { + "value": "" } } } From a7fa59e95b29e1f19313081a388a3c64c30ddbd3 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:53:36 -0400 Subject: [PATCH 106/409] Create script.kql --- .../contoso_hypermarket/bicep/data/script.kql | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql new file mode 100644 index 0000000000..f004833f76 --- /dev/null +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql @@ -0,0 +1,69 @@ +// Check if the table exists +.drop table staging ifexists + +// Create new staging table +.create table staging (source: string, subject: string, event_data: dynamic) + +// Create staging ingestion mapping +.create table staging ingestion json mapping "staging_mapping" +``` +[ +{"column":"source","path":"$['source']","datatype":"string"}, +{"column":"subject","path":"$['subject']","datatype":"string"}, +{"column":"event_data","path":"$['event_data']","datatype":""} +] +``` + +// Modify the ingestion batching policy to ingest data frequently +// THIS CONFIGURATION SHOULDN'T BE USED IN PRODUCTION: MaximumBatchingTimeSpan SHOULD BE AT LEAST 1 MINUTE +.alter table staging policy ingestionbatching "{'MaximumBatchingTimeSpan': '0:01:00', 'MaximumNumberOfItems': 10000}" + +// Delete existing table +.drop table sales ifexists + +// Create sales table +.create table sales (sale_date:datetime, store_id:string, sale_id:string, sale_line_items:dynamic, sale_total:real, payment_method: string, customer_id:string, register_id: string) + +// Create function to expand sales data +.create-or-alter function expand_sales_data() +{ + staging + | where subject == "topic/sales" + | extend data = parse_json(event_data) + | project + sale_date = todatetime(data.sale_date), + store_id = tostring(data.store_id), + sale_id = tostring(data.sale_id), + sale_line_items = data.sale_line_items, + sale_total = toreal(data.sale_total), + payment_method = tostring(data.payment_method), + customer_id = tostring(data.customer_id), + register_id = tostring(data.register_id) +} + +// Create policy to update sales table +.alter table sales policy update @'[{"Source": "staging", "Query": "expand_sales_data()", "IsEnabled": "True"}]' + +// Delete existing table +.drop table inventory ifexists + +// Create inventory table +.create table inventory (updated_on:datetime, store_id:string, product_id:string, stock_level:int, reorder_threshold:int, last_restocked: datetime) + +// Create function to expand inventory data +.create-or-alter function expand_inventory_data() +{ + staging + | where subject == "topic/inventory" + | extend data = parse_json(event_data) + | project + updated_on = todatetime(data.updated_on), + store_id = tostring(data.store_id), + product_id = tostring(data.product_id), + stock_level = toint(data.stock_level), + reorder_threshold = toint(data.reorder_threshold), + last_restocked = todatetime(data.last_restocked) +} + +// Create policy +.alter table inventory policy update @'[{"Source": "staging", "Query": "expand_inventory_data()", "IsEnabled": "True"}]' \ No newline at end of file From 6bf32505f680b8087dd9f4da2e5486279b2c7967 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 24 Oct 2024 15:28:43 +0300 Subject: [PATCH 107/409] Add OpenAI Cognitive Services deployment --- .../contoso_hypermarket/bicep/ai/aoai.bicep | 54 +++++++++++++++++++ .../contoso_hypermarket/bicep/main.bicep | 20 ++++++- 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep new file mode 100644 index 0000000000..f6eaee1ee8 --- /dev/null +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep @@ -0,0 +1,54 @@ +@description('The name of the OpenAI Cognitive Services account') +param openAIAccountName string = 'openai${uniqueString(resourceGroup().id,location)}' + +@description('The location of the OpenAI Cognitive Services account') +param location string + +@description('The name of the OpenAI Cognitive Services SKU') +param openAISkuName string = 'S0' + +@description('The type of Cognitive Services account to create') +param cognitiveSvcType string = 'AIServices' + +param openAIModels array = [ + { + name: 'gpt-4o-mini' + version: '2024-07-18' + } + { + name: 'gpt-35-turbo' + version: '0125' + } +] + + +resource openAIAccount 'Microsoft.CognitiveServices/accounts@2024-06-01-preview' = { + name: openAIAccountName + location: location + sku: { + name: openAISkuName + } + kind: cognitiveSvcType + properties: { + publicNetworkAccess: 'Enabled' + } +} + +resource modelDeployments 'Microsoft.CognitiveServices/accounts/deployments@2024-06-01-preview' = [for model in openAIModels: { + parent: openAIAccount + name: '${openAIAccountName}${model.name}' + sku: { + name: 'Standard' + capacity: 10 + } + properties: { + model: { + format: 'OpenAI' + name: model.name + version: model.version + } + versionUpgradeOption: 'NoAutoUpgrade' + currentCapacity: 10 + raiPolicyName: 'Microsoft.Default' + } +}] \ No newline at end of file diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index 43236c5787..05ad66b254 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -34,7 +34,7 @@ param sshRSAPublicKey string param logAnalyticsWorkspaceName string = 'Ag-Workspace-${namingGuid}' @description('Target GitHub account') -param githubAccount string = 'microsoft' +param githubAccount string = 'sebassem' @description('Target GitHub branch') param githubBranch string = 'agora_2.0' @@ -266,3 +266,21 @@ module fabricCapacity 'data/fabric.bicep' = { fabricCapacityAdmin: fabricCapacityAdmin } } + +module azureOpenAI 'ai/aoai.bicep' = { + name: 'azureOpenAIDeployment' + params: { + location: location + openAIAccountName: 'openai${namingGuid}' + openAIModels: [ + { + name: 'gpt-4o-mini' + version: '2024-07-18' + } + { + name: 'gpt-35-turbo' + version: '0125' + } + ] + } +} From 9f44435b9ff3a17a5cd4df92591db6acfcd13c79 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 24 Oct 2024 15:42:11 +0300 Subject: [PATCH 108/409] Refactor OpenAI model deployments in aoai.bicep --- .../contoso_hypermarket/bicep/ai/aoai.bicep | 66 ++++++++++++++----- .../contoso_hypermarket/bicep/main.bicep | 12 +--- 2 files changed, 50 insertions(+), 28 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep index f6eaee1ee8..58fb86aa38 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep @@ -10,18 +10,6 @@ param openAISkuName string = 'S0' @description('The type of Cognitive Services account to create') param cognitiveSvcType string = 'AIServices' -param openAIModels array = [ - { - name: 'gpt-4o-mini' - version: '2024-07-18' - } - { - name: 'gpt-35-turbo' - version: '0125' - } -] - - resource openAIAccount 'Microsoft.CognitiveServices/accounts@2024-06-01-preview' = { name: openAIAccountName location: location @@ -34,9 +22,9 @@ resource openAIAccount 'Microsoft.CognitiveServices/accounts@2024-06-01-preview' } } -resource modelDeployments 'Microsoft.CognitiveServices/accounts/deployments@2024-06-01-preview' = [for model in openAIModels: { +resource gpt35ModelDeployment 'Microsoft.CognitiveServices/accounts/deployments@2024-06-01-preview' = { parent: openAIAccount - name: '${openAIAccountName}${model.name}' + name: '${openAIAccountName}-gpt-35-deployment' sku: { name: 'Standard' capacity: 10 @@ -44,11 +32,55 @@ resource modelDeployments 'Microsoft.CognitiveServices/accounts/deployments@2024 properties: { model: { format: 'OpenAI' - name: model.name - version: model.version + name: 'gpt-35-turbo' + version: '0125' + } + versionUpgradeOption: 'NoAutoUpgrade' + currentCapacity: 10 + raiPolicyName: 'Microsoft.Default' + } +} + +resource gpt4oModelDeployment 'Microsoft.CognitiveServices/accounts/deployments@2024-06-01-preview' = { + parent: openAIAccount + name: '${openAIAccountName}-gpt-40-deployment' + dependsOn: [ + gpt35ModelDeployment + ] + sku: { + name: 'Standard' + capacity: 10 + } + properties: { + model: { + format: 'OpenAI' + name: 'gpt-4o-mini' + version: '2024-07-18' + } + versionUpgradeOption: 'NoAutoUpgrade' + currentCapacity: 10 + raiPolicyName: 'Microsoft.Default' + } +} + +/*resource speechDeployment 'Microsoft.CognitiveServices/accounts/deployments@2024-06-01-preview' = { + parent: openAIAccount + name: '${openAIAccountName}-speech-deployment' + dependsOn: [ + gpt35ModelDeployment + ] + sku: { + name: 'Standard' + capacity: 10 + } + properties: { + model: { + format: 'speech' + name: 'gpt-4o-mini' + version: '2024-07-18' } versionUpgradeOption: 'NoAutoUpgrade' currentCapacity: 10 raiPolicyName: 'Microsoft.Default' } -}] \ No newline at end of file +}*/ \ No newline at end of file diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index 05ad66b254..d22754da83 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -37,7 +37,7 @@ param logAnalyticsWorkspaceName string = 'Ag-Workspace-${namingGuid}' param githubAccount string = 'sebassem' @description('Target GitHub branch') -param githubBranch string = 'agora_2.0' +param githubBranch string = 'agora_hypermarket' @description('Choice to deploy Bastion to connect to the client VM') param deployBastion bool = false @@ -272,15 +272,5 @@ module azureOpenAI 'ai/aoai.bicep' = { params: { location: location openAIAccountName: 'openai${namingGuid}' - openAIModels: [ - { - name: 'gpt-4o-mini' - version: '2024-07-18' - } - { - name: 'gpt-35-turbo' - version: '0125' - } - ] } } From 3b2aa0cbc9e7b1214b3d6e2cf4bd7d68511958f6 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Thu, 24 Oct 2024 11:48:37 -0400 Subject: [PATCH 109/409] update arc cluster name --- .../PowerShell/AgConfig-contoso-motors.psd1 | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 index 0cf7e1283e..956e6e8cdd 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 @@ -144,7 +144,7 @@ # AKS Edge Essentials variables SiteConfig = @{ Detroit = @{ - ArcClusterName = "Ag-ArcK8s-Detroit" + ArcClusterName = "twt-arck8s-aksee" NetIPAddress = "172.20.1.2" DefaultGateway = "172.20.1.1" PrefixLength = "24" @@ -165,28 +165,28 @@ clusterLogSize = "1024" AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used } - Monterrey = @{ - ArcClusterName = "Ag-ArcK8s-Monterrey" - NetIPAddress = "172.20.1.3" - DefaultGateway = "172.20.1.1" - PrefixLength = "24" - DNSClientServerAddress = "168.63.129.16" - ServiceIPRangeStart = "172.20.1.71" - ServiceIPRangeSize = "10" - ControlPlaneEndpointIp = "172.20.1.61" - LinuxNodeIp4Address = "172.20.1.51" - Subnet = "172.20.1.0/24" - FriendlyName = "Monterrey" - IsProduction = $true - Type = "AKSEE" - Branch = "main" - HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" - HelmService = "service/prometheus-kube-prometheus-prometheus" - GrafanaDataSource = "monterrey" - HelmValuesFile = "prometheus-additional-scrape-config.yaml" - clusterLogSize = "1024" - AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used - } + # Monterrey = @{ + # ArcClusterName = "Ag-ArcK8s-Monterrey" + # NetIPAddress = "172.20.1.3" + # DefaultGateway = "172.20.1.1" + # PrefixLength = "24" + # DNSClientServerAddress = "168.63.129.16" + # ServiceIPRangeStart = "172.20.1.71" + # ServiceIPRangeSize = "10" + # ControlPlaneEndpointIp = "172.20.1.61" + # LinuxNodeIp4Address = "172.20.1.51" + # Subnet = "172.20.1.0/24" + # FriendlyName = "Monterrey" + # IsProduction = $true + # Type = "AKSEE" + # Branch = "main" + # HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" + # HelmService = "service/prometheus-kube-prometheus-prometheus" + # GrafanaDataSource = "monterrey" + # HelmValuesFile = "prometheus-additional-scrape-config.yaml" + # clusterLogSize = "1024" + # AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used + # } } # Universal resource tag and resource types From b69d0e9fec9ee9ec99b1ba2ca534fddf47c97707 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Thu, 24 Oct 2024 14:42:47 -0400 Subject: [PATCH 110/409] only seattle --- .../PowerShell/AgConfig-contoso-motors.psd1 | 46 +++---- .../AgConfig-contoso-supermarket.psd1 | 120 +++++++++--------- 2 files changed, 83 insertions(+), 83 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 index 956e6e8cdd..0cf7e1283e 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 @@ -144,7 +144,7 @@ # AKS Edge Essentials variables SiteConfig = @{ Detroit = @{ - ArcClusterName = "twt-arck8s-aksee" + ArcClusterName = "Ag-ArcK8s-Detroit" NetIPAddress = "172.20.1.2" DefaultGateway = "172.20.1.1" PrefixLength = "24" @@ -165,28 +165,28 @@ clusterLogSize = "1024" AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used } - # Monterrey = @{ - # ArcClusterName = "Ag-ArcK8s-Monterrey" - # NetIPAddress = "172.20.1.3" - # DefaultGateway = "172.20.1.1" - # PrefixLength = "24" - # DNSClientServerAddress = "168.63.129.16" - # ServiceIPRangeStart = "172.20.1.71" - # ServiceIPRangeSize = "10" - # ControlPlaneEndpointIp = "172.20.1.61" - # LinuxNodeIp4Address = "172.20.1.51" - # Subnet = "172.20.1.0/24" - # FriendlyName = "Monterrey" - # IsProduction = $true - # Type = "AKSEE" - # Branch = "main" - # HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" - # HelmService = "service/prometheus-kube-prometheus-prometheus" - # GrafanaDataSource = "monterrey" - # HelmValuesFile = "prometheus-additional-scrape-config.yaml" - # clusterLogSize = "1024" - # AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used - # } + Monterrey = @{ + ArcClusterName = "Ag-ArcK8s-Monterrey" + NetIPAddress = "172.20.1.3" + DefaultGateway = "172.20.1.1" + PrefixLength = "24" + DNSClientServerAddress = "168.63.129.16" + ServiceIPRangeStart = "172.20.1.71" + ServiceIPRangeSize = "10" + ControlPlaneEndpointIp = "172.20.1.61" + LinuxNodeIp4Address = "172.20.1.51" + Subnet = "172.20.1.0/24" + FriendlyName = "Monterrey" + IsProduction = $true + Type = "AKSEE" + Branch = "main" + HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" + HelmService = "service/prometheus-kube-prometheus-prometheus" + GrafanaDataSource = "monterrey" + HelmValuesFile = "prometheus-additional-scrape-config.yaml" + clusterLogSize = "1024" + AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used + } } # Universal resource tag and resource types diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 index ee254513d0..567dfd49b3 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 @@ -126,7 +126,7 @@ # AKS Edge Essentials variables SiteConfig = @{ Seattle = @{ - ArcClusterName = "Ag-ArcK8s-Seattle" + ArcClusterName = "twt-arck8s-aksee" NetIPAddress = "172.20.1.2" DefaultGateway = "172.20.1.1" PrefixLength = "24" @@ -148,65 +148,65 @@ IoTDevices = @("Freezer-1", "Freezer-2") AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used } - Chicago = @{ - ArcClusterName = "Ag-ArcK8s-Chicago" - NetIPAddress = "172.20.1.3" - DefaultGateway = "172.20.1.1" - PrefixLength = "24" - DNSClientServerAddress = "168.63.129.16" - ServiceIPRangeStart = "172.20.1.71" - ServiceIPRangeSize = "10" - ControlPlaneEndpointIp = "172.20.1.61" - LinuxNodeIp4Address = "172.20.1.51" - Subnet = "172.20.1.0/24" - FriendlyName = "Chicago" - IsProduction = $true - Type = "AKSEE" - posNamespace = "contoso-supermarket" - Branch = "canary" - HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" - HelmService = "service/prometheus-kube-prometheus-prometheus" - GrafanaDataSource = "chicago" - HelmValuesFile = "prometheus-additional-scrape-config.yaml" - IoTDevices = @("Freezer-1", "Freezer-2") - AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used - } - Dev = @{ - ArcClusterName = "Ag-ArcK8s-Dev" - NetIPAddress = "172.20.1.4" - DefaultGateway = "172.20.1.1" - PrefixLength = "24" - DNSClientServerAddress = "168.63.129.16" - ServiceIPRangeStart = "172.20.1.101" - ServiceIPRangeSize = "10" - ControlPlaneEndpointIp = "172.20.1.91" - LinuxNodeIp4Address = "172.20.1.81" - Subnet = "172.20.1.0/24" - FriendlyName = "Dev" - IsProduction = $false - Type = "AKSEE" - posNamespace = "contoso-supermarket" - Branch = "main" - HelmSetValue = "alertmanager.enabled=false,grafana.ingress.enabled=true,grafana.service.type=LoadBalancer,prometheus.service.type=LoadBalancer,grafana.adminPassword=adminPasswordPlaceholder" - HelmService = "service/prometheus-grafana" - GrafanaDataSource = "prometheus" - HelmValuesFile = "prometheus-additional-scrape-config.yaml" - IoTDevices = @("Freezer-1", "Freezer-2") - AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used - } - Staging = @{ - ArcClusterName = "Ag-AKS-Staging" - FriendlyName = "Staging" - IsProduction = $false - Type = "AKS" - posNamespace = "contoso-supermarket" - Branch = "staging" - HelmSetValue = "alertmanager.enabled=false,grafana.ingress.enabled=true,grafana.service.type=LoadBalancer,prometheus.service.type=LoadBalancer,grafana.adminPassword=adminPasswordPlaceholder" - HelmService = "service/prometheus-grafana" - GrafanaDataSource = "prometheus" - HelmValuesFile = "prometheus-additional-scrape-config.yaml" - IoTDevices = @("Freezer-1", "Freezer-2") - } + # Chicago = @{ + # ArcClusterName = "Ag-ArcK8s-Chicago" + # NetIPAddress = "172.20.1.3" + # DefaultGateway = "172.20.1.1" + # PrefixLength = "24" + # DNSClientServerAddress = "168.63.129.16" + # ServiceIPRangeStart = "172.20.1.71" + # ServiceIPRangeSize = "10" + # ControlPlaneEndpointIp = "172.20.1.61" + # LinuxNodeIp4Address = "172.20.1.51" + # Subnet = "172.20.1.0/24" + # FriendlyName = "Chicago" + # IsProduction = $true + # Type = "AKSEE" + # posNamespace = "contoso-supermarket" + # Branch = "canary" + # HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" + # HelmService = "service/prometheus-kube-prometheus-prometheus" + # GrafanaDataSource = "chicago" + # HelmValuesFile = "prometheus-additional-scrape-config.yaml" + # IoTDevices = @("Freezer-1", "Freezer-2") + # AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used + # } + # Dev = @{ + # ArcClusterName = "Ag-ArcK8s-Dev" + # NetIPAddress = "172.20.1.4" + # DefaultGateway = "172.20.1.1" + # PrefixLength = "24" + # DNSClientServerAddress = "168.63.129.16" + # ServiceIPRangeStart = "172.20.1.101" + # ServiceIPRangeSize = "10" + # ControlPlaneEndpointIp = "172.20.1.91" + # LinuxNodeIp4Address = "172.20.1.81" + # Subnet = "172.20.1.0/24" + # FriendlyName = "Dev" + # IsProduction = $false + # Type = "AKSEE" + # posNamespace = "contoso-supermarket" + # Branch = "main" + # HelmSetValue = "alertmanager.enabled=false,grafana.ingress.enabled=true,grafana.service.type=LoadBalancer,prometheus.service.type=LoadBalancer,grafana.adminPassword=adminPasswordPlaceholder" + # HelmService = "service/prometheus-grafana" + # GrafanaDataSource = "prometheus" + # HelmValuesFile = "prometheus-additional-scrape-config.yaml" + # IoTDevices = @("Freezer-1", "Freezer-2") + # AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used + # } + # Staging = @{ + # ArcClusterName = "Ag-AKS-Staging" + # FriendlyName = "Staging" + # IsProduction = $false + # Type = "AKS" + # posNamespace = "contoso-supermarket" + # Branch = "staging" + # HelmSetValue = "alertmanager.enabled=false,grafana.ingress.enabled=true,grafana.service.type=LoadBalancer,prometheus.service.type=LoadBalancer,grafana.adminPassword=adminPasswordPlaceholder" + # HelmService = "service/prometheus-grafana" + # GrafanaDataSource = "prometheus" + # HelmValuesFile = "prometheus-additional-scrape-config.yaml" + # IoTDevices = @("Freezer-1", "Freezer-2") + # } } # Universal resource tag and resource types From 11bbe4af0c7e0e494d1aed45ad390fba784b2ead Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Thu, 24 Oct 2024 21:44:49 -0400 Subject: [PATCH 111/409] Integrated fabric automation --- .../AgConfig-contoso-hypermarket.psd1 | 17 +++++++--- .../artifacts/PowerShell/AgLogonScript.ps1 | 7 +++++ .../Modules/contoso_hypermarket.psm1 | 31 +++++++++++++++++++ .../PowerShell/SetupFabricWorkspace.ps1 | 4 +-- .../bicep/data/eventHub.bicep | 9 ++---- 5 files changed, 55 insertions(+), 13 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 358a6bb3df..9a44507727 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -15,8 +15,7 @@ AgL1Files = "C:\Ag\L1Files" AgAppsRepo = "C:\Ag\AppsRepo" AgMonitoringDir = "C:\Ag\Monitoring" - AgAdxDashboards = "C:\Ag\AdxDashboards" - AgDataEmulator = "C:\Ag\DataEmulator" + AgFabric = "C:\Ag\Fabric" } # Required URLs @@ -48,7 +47,8 @@ "Microsoft.DeviceRegistry", "Microsoft.EventGrid", "Microsoft.IoTOperationsOrchestrator", - "Microsoft.IoTOperations" + "Microsoft.IoTOperations", + "Microsoft.Fabric" ) # Az CLI required extensions @@ -59,7 +59,8 @@ @{name="customlocation"; version="latest"}, @{name="kusto"; version="latest"}, @{name="storage-preview"; version="latest"}, - @{name="azure-iot-ops"; version="0.5.1b1"} + @{name="azure-iot-ops"; version="0.5.1b1"}, + @{name="microsoft-fabric"; version="latest"} ) # PowerShell modules @@ -205,6 +206,14 @@ } } + FabricConfig = @{ + WorkspacePrefix = "contoso-hypermarket" + EventHubSharedAccessKeyName = "FabricSharedAccessKey" + EventHubName = "contoso-hypermarket" + EventHubCG = "fabriccg" + RunFabricSetupAs = "user" + } + # Microsoft Edge startup settings variables EdgeSettingRegistryPath = 'HKLM:\SOFTWARE\Policies\Microsoft\Edge' EdgeSettingValueTrue = '00000001' diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index e8d46970e6..9ffde93753 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -231,6 +231,13 @@ if($scenario -eq "contoso_motors"){ Deploy-ADXDashboardReports } +##################################################################### +# Deploy Microsoft Fabric +##################################################################### +if($scenario -eq "contoso_hypermarket"){ + Set-MicrosoftFabric +} + ############################################################## # Creating bookmarks and setting merged kubeconfigs ############################################################## diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 764a1af11a..4a355d1653 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -124,4 +124,35 @@ function Set-K3sClusters { Write-Host "`n" } } +} + +function Set-MicrosoftFabric { + # Load Agconfi + $fabricWorkspacePrefix = $AgConfig.FabricConfig["WorkspacePrefix"] + $fabricWorkspaceName = "$fabricWorkspacePrefix-$namingGuid" + $fabricFolder = $AgConfig.AgDirectories["AgFabric"] + $runFabricSetupAs = $AgConfig.FabricConfig["RunFabricSetupAs"] + $fabricConfigFile = "$fabricFolder\fabric-config.json" + + # Get Fabric capacity name from the resource group + $fabricCapacityName = (az fabric capacity list --resource-group $Env:resourceGroup --query "[0].name" -o tsv) + if (-not $fabricCapacityName) { + Write-Error "Fabric capacity not found in the resource group $Env:resourceGroup" + return + } + + $configJson = @" + { + "tenantID": "$Env:spnTenantId", + "runAs": "$runFabricSetupAs", + "azureLocation": "$Env:location", + "resourceGroup": "$Env:resourceGroup", + "fabricCapacityName": "$fabricCapacityName", + "templateBaseUrl": "$Env:templateBaseUrl", + "fabricWorkspaceName": "$fabricWorkspaceName" + } +"@ + + $configJson | Set-Content -Path $fabricConfigFile + Write-Host "Fabric config file created at $fabricConfigFile" } \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 index 5a29eb18e6..59689be1ab 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 @@ -1,5 +1,5 @@ param ( - [string]$fabricConfigFile = "C:\Temp\fabric\FabricConfig.json" # Used to run the script locally + [string]$fabricConfigFile = "fabric-config.json" # Used to run the script locally ) #################################################################################################### @@ -10,7 +10,7 @@ param ( # Make sure Create Workpace is enabled in Frabric for service principals. #Access settings using https://app.fabric.microsoft.com/admin-portal/tenantSettings?experience=power-bi -# NOTE: To run locally create a file named FabricConfig.json with the following content +# NOTE: To run locally create a file named fabric-config.json with the following content # # { # "tenantID": "", # Azure AD tenant ID where Agora Retail 2.0 is deployed diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/eventHub.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/eventHub.bicep index 9cde005b67..759731bc08 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/eventHub.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/eventHub.bicep @@ -51,13 +51,8 @@ resource eventHubAuthRule 'Microsoft.EventHub/namespaces/authorizationRules@2023 } } -resource ordersCS 'Microsoft.EventHub/namespaces/eventhubs/consumergroups@2023-01-01-preview' = { - name: 'orderscg' - parent: eventHub -} - -resource inventoryCG 'Microsoft.EventHub/namespaces/eventhubs/consumergroups@2023-01-01-preview' = { - name: 'inventorycg' +resource fabricCG 'Microsoft.EventHub/namespaces/eventhubs/consumergroups@2023-01-01-preview' = { + name: 'fabriccg' parent: eventHub } From c5ae982c6d04679dc66c6943cb3b926248ab737d Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Thu, 24 Oct 2024 22:14:43 -0400 Subject: [PATCH 112/409] update cluster name --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 358a6bb3df..a1160916ea 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -147,7 +147,7 @@ # Site Kubernetes cluster configurations SiteConfig = @{ Seattle = @{ - ArcClusterName = "Ag-K3s-Seattle" + ArcClusterName = "twt-k3s" FriendlyName = "Seattle" GrafanaDataSource = "seattle" Type = "k3s" @@ -157,7 +157,7 @@ IsProduction = $true } Chicago = @{ - ArcClusterName = "Ag-K3s-Chicago" + ArcClusterName = "twt-k3s-chicago" FriendlyName = "Chicago" GrafanaDataSource = "chicago" Type = "k3s" From d51346d77c6a8b9911d4fadd8d6757410c11ed9c Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Fri, 25 Oct 2024 22:10:15 +0200 Subject: [PATCH 113/409] Added Pester tests --- .../PowerShell/AgConfig-contoso-motors.psd1 | 1 + .../AgConfig-contoso-supermarket.psd1 | 1 + .../artifacts/PowerShell/AgLogonScript.ps1 | 48 +++++++----------- .../artifacts/PowerShell/Bootstrap.ps1 | 13 +++++ .../PowerShell/tests/Invoke-Test.ps1 | 22 ++++++++ .../artifacts/PowerShell/tests/ag-bginfo.bgi | Bin 0 -> 1078 bytes .../PowerShell/tests/common.tests.ps1 | 14 +++++ .../artifacts/PowerShell/tests/k8s.tests.ps1 | 24 +++++++++ 8 files changed, 92 insertions(+), 31 deletions(-) create mode 100644 azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 create mode 100644 azure_jumpstart_ag/artifacts/PowerShell/tests/ag-bginfo.bgi create mode 100644 azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 create mode 100644 azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 index 5ec699d23a..b5a2219fc7 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 @@ -8,6 +8,7 @@ AgLogsDir = "C:\Ag\Logs" AgVMDir = "C:\Ag\Virtual Machines" AgIconDir = "C:\Ag\Icons" + AgTestsDir = "C:\Ag\Tests" AgToolsDir = "C:\Tools" AgTempDir = "C:\Temp" AgVHDXDir = "V:\VMs" diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 index b4e0c302ca..3fbe74791c 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 @@ -8,6 +8,7 @@ AgLogsDir = "C:\Ag\Logs" AgVMDir = "C:\Ag\Virtual Machines" AgIconDir = "C:\Ag\Icons" + AgTestsDir = "C:\Ag\Tests" AgToolsDir = "C:\Tools" AgTempDir = "C:\Temp" AgVHDXDir = "V:\VMs" diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 289e65dc9a..9ba354b4da 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -14,6 +14,7 @@ $global:configMapDir = $agConfig.AgDirectories["AgConfigMapDir"] $global:AgDeploymentFolder = $AgConfig.AgDirectories["AgL1Files"] $global:AgPowerShellDir = $AgConfig.AgDirectories["AgPowerShellDir"] $global:AgLogsDir = $AgConfig.AgDirectories["AgLogsDir"] +$global:AgTestsDir = $AgConfig.AgDirectories["AgTestsDir"] $global:scenario = $Env:scenario $global:websiteUrls = $AgConfig.URLs $global:githubAccount = $Env:githubAccount @@ -265,43 +266,28 @@ if($scenario -eq "contoso_supermarket"){ Write-Host "[$(Get-Date -Format t)] INFO: Removing scheduled logon task so it won't run on next login." -ForegroundColor Gray Unregister-ScheduledTask -TaskName "AgLogonScript" -Confirm:$false -# Executing the deployment logs bundle PowerShell script in a new window -Write-Host "[$(Get-Date -Format t)] INFO: Uploading Log Bundle." -ForegroundColor Gray -$Env:AgLogsDir = $AgConfig.AgDirectories["AgLogsDir"] -Invoke-Expression 'cmd /c start Powershell -Command { -$RandomString = -join ((48..57) + (97..122) | Get-Random -Count 6 | % {[char]$_}) -Write-Host "Sleeping for 5 seconds before creating deployment logs bundle..." -Start-Sleep -Seconds 5 -Write-Host "`n" Write-Host "Creating deployment logs bundle" -7z a $Env:AgLogsDir\LogsBundle-"$RandomString".zip $Env:AgLogsDir\*.log -}' + +$RandomString = -join ((48..57) + (97..122) | Get-Random -Count 6 | % {[char]$_}) +$LogsBundleTempDirectory = "$Env:windir\TEMP\LogsBundle-$RandomString" +$null = New-Item -Path $LogsBundleTempDirectory -ItemType Directory -Force + +#required to avoid "file is being used by another process" error when compressing the logs +Copy-Item -Path "$($AgConfig.AgDirectories["LogsDir"])\*.log" -Destination $LogsBundleTempDirectory -Force -PassThru +Compress-Archive -Path "$LogsBundleTempDirectory\*.log" -DestinationPath "$($AgConfig.AgDirectories["LogsDir"])\LogsBundle-$RandomString.zip" -PassThru Write-Host "[$(Get-Date -Format t)] INFO: Changing Wallpaper" -ForegroundColor Gray + +# bmp file is required for BGInfo $imgPath = $AgConfig.AgDirectories["AgDir"] + "\wallpaper.png" -$code = @' -using System.Runtime.InteropServices; -namespace Win32{ +$targetImgPath = $($imgPath -replace 'png','bmp') +Convert-JSImageToBitMap -SourceFilePath $imgPath -DestinationFilePath $targetImgPath - public class Wallpaper{ - [DllImport("user32.dll", CharSet=CharSet.Auto)] - static extern int SystemParametersInfo (int uAction , int uParam , string lpvParam , int fuWinIni) ; +Set-JSDesktopBackground -ImagePath $targetImgPath - public static void SetWallpaper(string thePath){ - SystemParametersInfo(20,0,thePath,3); - } - } -} -'@ -Add-Type $code -[Win32.Wallpaper]::SetWallpaper($imgPath) - -# Kill the open PowerShell monitoring kubectl get pods -# if ($scenario -eq "contoso_motors") { -# foreach ($shell in $kubectlMonShells) { -# Stop-Process -Id $shell.Id -# } -# } +Write-Host "Running tests to verify infrastructure" + +& "$AgoraTestsDir\Invoke-Test.ps1" $endTime = Get-Date $timeSpan = New-TimeSpan -Start $starttime -End $endtime diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 474c3a1c57..07593c7af1 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -238,6 +238,16 @@ Remove-Item .\PowerShell7.msi Copy-Item $PsHome\Profile.ps1 -Destination "C:\Program Files\PowerShell\7\" +# Installing PowerShell Modules +Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force + +Install-Module -Name Microsoft.PowerShell.PSResourceGet -Force +$modules = @("Azure.Arc.Jumpstart.Common", "Microsoft.PowerShell.SecretManagement", "Pester") + +foreach ($module in $modules) { + Install-PSResource -Name $module -Scope AllUsers -Quiet -AcceptLicense -TrustRepository +} + ############################################################## # Get latest Grafana OSS release ############################################################## @@ -268,6 +278,9 @@ Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso-motors.png") -Out Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso-motors.svg") -OutFile $AgIconsDir\contoso-motors.svg Invoke-WebRequest ($templateBaseUrl + "artifacts/L1Files/config.json") -OutFile $AgDeploymentFolder\config.json Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/Winget.ps1") -OutFile "$AgPowerShellDir\Winget.ps1" +Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/tests/common.tests.ps1") -OutFile "$AgPowerShellDir\tests\common.tests.ps1" +Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/tests/k8s.tests.ps1") -OutFile "$AgPowerShellDir\tests\k8s.tests.ps1" +Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/tests/Invoke-Test.ps1") -OutFile "$AgPowerShellDir\tests\Invoke-Test.ps1" if($scenario -eq "contoso_supermarket"){ Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/Bookmarks-contoso-supermarket") -OutFile "$AgToolsDir\Bookmarks" diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 new file mode 100644 index 0000000000..fd462b6946 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 @@ -0,0 +1,22 @@ +#Requires -Modules @{ ModuleName="Pester"; ModuleVersion="5.6.0"} + + +Invoke-Pester -Path "$AgTestsDir\common.tests.ps1" -Output Detailed -PassThru -OutVariable tests_common +$tests_passed = $tests_common.Passed.Count +$tests_failed = $tests_common.Failed.Count + + +Invoke-Pester -Path "$AgoraTestsDir\k8s.tests.ps1" -Output Detailed -PassThru -OutVariable tests_k8s +$tests_passed = $tests_passed + $tests_k8s.Passed.Count +$tests_failed = $tests_failed + $tests_k8s.Failed.Count + + +Write-Output "Tests succeeded: $tests_passed" +Write-Output "Tests failed: $tests_failed" + +Write-Header "Adding deployment test results to wallpaper using BGInfo" + +Set-Content "$Env:windir\TEMP\agora-tests-succeeded.txt" $tests_passed +Set-Content "$Env:windir\TEMP\agora-tests-failed.txt" $tests_failed + +bginfo.exe $AgoraTestsDir\agora-bginfo.bgi /timer:0 /NOLICPROMPT \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/ag-bginfo.bgi b/azure_jumpstart_ag/artifacts/PowerShell/tests/ag-bginfo.bgi new file mode 100644 index 0000000000000000000000000000000000000000..27447b5509eedd2c9966a98c9f855d175253a4b5 GIT binary patch literal 1078 zcmah||7+7g6wlNjw6h8d{+wS1qO7FZDrFU6-JA%{N$uz_2jh}l(p#^0@$SWSl!E_) z|B?Tg;CmOBbz^A4%O&sgCGWjlHiIA-@^n^MQ|T;tfR7Y(Ji_>5oCIlf1N^=p1P>87 zHd=zQO`f6Z3FgP#%@S_+v-8S9gKi+QNvK%BL}oCJ8|c@vhE6IdD>#x$1jK%Zu{9R+ za*GW=eAKz=B=gdjbjX1x+|@Lq29GhWvd5!SufIn?(88E-rAl53>+@dFUQc6-O);dQ zE*j0LL*3O-NK4XVzBn+-*r9}*QYz%VwZ?unAoI&ch-u$GxqVHo5ZCi0Pm+Byh0(V# zl0C&33pNZDnt92A5{m1h8|~~YS#C5yqVOhSxt5CM>6BY1APV=bf{EQ{+ZrH|j*4_)Ry8R_wbJ7c;4|T~?*tu-#%M zw;9XjcHHkrOi91M!Y?Vdld#;y{qRtf%3RKchR^|r%8{;C;}t2p;aE6up{vqVh)iUA z40jSMtpSlj_?8#O@-raLS;KjEg-7dlwNcJ-xBkneCfsd-v$)$hGSU~XNmQB-?cY6Ilr-ts${ExHox4=J( C9~86z literal 0 HcmV?d00001 diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 new file mode 100644 index 0000000000..809393983a --- /dev/null +++ b/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 @@ -0,0 +1,14 @@ +BeforeDiscovery { + + $null = Connect-AzAccount -Identity -Tenant $env:tenantId -Subscription $env:subscriptionId + +} + +Describe "ArcBox resource group" { + BeforeAll { + $ResourceGroupName = $env:resourceGroup + } + It "should have 30 resources or more" { + (Get-AzResource -ResourceGroupName $ResourceGroupName).count | Should -BeGreaterOrEqual 30 + } +} diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 new file mode 100644 index 0000000000..94448aa245 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 @@ -0,0 +1,24 @@ +BeforeDiscovery { + + $clusters = @("Ag-K3s-Chicago","Ag-K3s-Seattle") + + # Login to Azure PowerShell with service principal provided by user + $spnpassword = ConvertTo-SecureString $env:spnClientSecret -AsPlainText -Force + $spncredential = New-Object System.Management.Automation.PSCredential ($env:spnClientId, $spnpassword) + Connect-AzAccount -ServicePrincipal -Credential $spncredential -Tenant $env:spntenantId -Subscription $env:subscriptionId + +} + +Describe "" -ForEach $clusters { + BeforeAll { + $cluster = $_ + } + It "Cluster exists" { + $clusterObject = Get-AzConnectedKubernetes -ClusterName $cluster -ResourceGroupName $env:resourceGroup -SubscriptionId $env:subscriptionId + $clusterObject | Should -Not -BeNullOrEmpty + } + It "Azure Arc Connected cluster is connected" { + $connectedCluster = Get-AzConnectedKubernetes -Name $cluster -ResourceGroupName $env:resourceGroup -SubscriptionId $env:subscriptionId + $connectedCluster.ConnectivityStatus | Should -Be "Connected" + } +} \ No newline at end of file From 6b5cc42921e5c00174da0a9c7471a6465ccc3fc3 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Fri, 25 Oct 2024 22:31:06 +0200 Subject: [PATCH 114/409] Added VM Autologon --- .../artifacts/PowerShell/AgLogonScript.ps1 | 14 ++++++++++++++ .../artifacts/PowerShell/Bootstrap.ps1 | 18 +++++++++++++++++- .../bicep/clientVm/clientVm.bicep | 4 +++- .../contoso_hypermarket/bicep/main.bicep | 4 ++++ .../bicep/clientVm/clientVm.bicep | 4 +++- .../contoso_motors/bicep/main.bicep | 4 ++++ .../bicep/clientVm/clientVm.bicep | 5 ++++- .../contoso_supermarket/bicep/main.bicep | 4 ++++ 8 files changed, 53 insertions(+), 4 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 9ba354b4da..51a7375edb 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -74,6 +74,20 @@ Start-Transcript -Path ($AgLogsDir + "\AgLogonScript.log") Write-Host "Executing Jumpstart Agora automation scripts" $startTime = Get-Date +# Remove registry keys that are used to automatically logon the user (only used for first-time setup) +$registryPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" +$keys = @("AutoAdminLogon", "DefaultUserName", "DefaultPassword") + +foreach ($key in $keys) { + try { + $property = Get-ItemProperty -Path $registryPath -Name $key -ErrorAction Stop + Remove-ItemProperty -Path $registryPath -Name $key + Write-Host "Removed registry key that are used to automatically logon the user: $key" + } catch { + Write-Verbose "Key $key does not exist." + } +} + # Disable Windows firewall Set-NetFirewallProfile -Profile Domain, Public, Private -Enabled False diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 07593c7af1..dee04558ea 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -29,7 +29,8 @@ param ( [string]$aioStorageAccountName, [string]$stcontainerName, [string]$k3sArcClusterName, - [string]$k3sArcDataClusterName + [string]$k3sArcDataClusterName, + [string]$vmAutologon ) ############################################################## @@ -104,6 +105,21 @@ if (($rdpPort -ne $null) -and ($rdpPort -ne "") -and ($rdpPort -ne "3389")) { Write-Host "RDP port configuration complete." } +if ($vmAutologon -eq "true") { + + Write-Host "Configuring VM Autologon" + + Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" "AutoAdminLogon" "1" + Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" "DefaultUserName" $adminUsername + Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" "DefaultPassword" $adminPassword + if($flavor -eq "DataOps"){ + Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" "DefaultDomainName" "jumpstart.local" + } +} else { + + Write-Host "Not configuring VM Autologon" + +} ############################################################## # Download configuration data file and declaring directories diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep index 5f9ea6e5bf..9d683584a3 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep @@ -16,6 +16,8 @@ param windowsOSVersion string = '2022-datacenter-g2' @description('Location for all resources') param location string = resourceGroup().location +@description('Enable automatic logon into Virtual Machine') +param vmAutologon bool = false @description('Name of the storage account') param aioStorageAccountName string = 'aiostg${namingGuid}' @@ -201,7 +203,7 @@ resource vmBootstrap 'Microsoft.Compute/virtualMachines/extensions@2022-11-01' = fileUris: [ uri(templateBaseUrl, 'artifacts/PowerShell/Bootstrap.ps1') ] - commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnObjectId ${spnObjectId} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -acrName ${acrName} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -adxClusterName ${adxClusterName} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName} -stcontainerName ${stcontainerName} -k3sArcClusterName ${k3sArcClusterName} -k3sArcDataClusterName ${k3sArcDataClusterName}' + commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnObjectId ${spnObjectId} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -acrName ${acrName} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -adxClusterName ${adxClusterName} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName} -stcontainerName ${stcontainerName} -k3sArcClusterName ${k3sArcClusterName} -k3sArcDataClusterName ${k3sArcDataClusterName} -vmAutologon ${vmAutologon}' } } } diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index 20b1470c65..45fe1c62bc 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -86,6 +86,9 @@ param acrName string = 'agacr${namingGuid}' @description('Override default RDP port using this parameter. Default is 3389. No changes will be made to the client VM.') param rdpPort string = '3389' +@description('Enable automatic logon into Virtual Machine') +param vmAutologon bool = true + @description('The agora scenario to be deployed') param scenario string = 'contoso_hypermarket' @@ -223,6 +226,7 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { stcontainerName: stcontainerName k3sArcClusterName: k3sArcClusterName k3sArcDataClusterName: k3sArcDataClusterName + vmAutologon: vmAutologon } } module adx 'data/dataExplorer.bicep' = { diff --git a/azure_jumpstart_ag/contoso_motors/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_motors/bicep/clientVm/clientVm.bicep index 3e9be93c56..f244a65e0e 100644 --- a/azure_jumpstart_ag/contoso_motors/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_motors/bicep/clientVm/clientVm.bicep @@ -16,6 +16,8 @@ param windowsOSVersion string = '2022-datacenter-g2' @description('Location for all resources') param location string = resourceGroup().location +@description('Enable automatic logon into Virtual Machine') +param vmAutologon bool = false @description('Name of the storage account') param aioStorageAccountName string = 'aiostg${namingGuid}' @@ -199,7 +201,7 @@ resource vmBootstrap 'Microsoft.Compute/virtualMachines/extensions@2022-11-01' = fileUris: [ uri(templateBaseUrl, 'artifacts/PowerShell/Bootstrap.ps1') ] - commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnObjectId ${spnObjectId} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -acrName ${acrName} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -adxClusterName ${adxClusterName} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName} -stcontainerName ${stcontainerName}' + commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnObjectId ${spnObjectId} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -acrName ${acrName} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -adxClusterName ${adxClusterName} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName} -stcontainerName ${stcontainerName} -vmAutologon ${vmAutologon}' } } } diff --git a/azure_jumpstart_ag/contoso_motors/bicep/main.bicep b/azure_jumpstart_ag/contoso_motors/bicep/main.bicep index dc593e32dc..87ee3fb3c1 100644 --- a/azure_jumpstart_ag/contoso_motors/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_motors/bicep/main.bicep @@ -89,6 +89,9 @@ param acrName string = 'agacr${namingGuid}' @description('Override default RDP port using this parameter. Default is 3389. No changes will be made to the client VM.') param rdpPort string = '3389' +@description('Enable automatic logon into Virtual Machine') +param vmAutologon bool = true + @description('The agora scenario to be deployed') param scenario string = 'contoso_motors' @@ -146,6 +149,7 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { scenario: scenario aioStorageAccountName: aioStorageAccountName stcontainerName: stcontainerName + vmAutologon: vmAutologon } } diff --git a/azure_jumpstart_ag/contoso_supermarket/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_supermarket/bicep/clientVm/clientVm.bicep index e3e3b55568..8a6df0b996 100644 --- a/azure_jumpstart_ag/contoso_supermarket/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_supermarket/bicep/clientVm/clientVm.bicep @@ -16,6 +16,9 @@ param windowsOSVersion string = '2022-datacenter-g2' @description('Location for all resources') param location string = resourceGroup().location +@description('Enable automatic logon into Virtual Machine') +param vmAutologon bool = false + @description('Resource tag for Jumpstart Agora') param resourceTags object = { Project: 'Jumpstart_Agora' @@ -201,7 +204,7 @@ resource vmBootstrap 'Microsoft.Compute/virtualMachines/extensions@2022-11-01' = fileUris: [ uri(templateBaseUrl, 'artifacts/PowerShell/Bootstrap.ps1') ] - commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -githubUser ${githubUser} -aksStagingClusterName ${aksStagingClusterName} -iotHubHostName ${iotHubHostName} -acrName ${acrName} -cosmosDBName ${cosmosDBName} -cosmosDBEndpoint ${cosmosDBEndpoint} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -githubPAT ${githubPAT} -adxClusterName ${adxClusterName} -namingGuid ${namingGuid} -scenario ${scenario}' + commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -githubUser ${githubUser} -aksStagingClusterName ${aksStagingClusterName} -iotHubHostName ${iotHubHostName} -acrName ${acrName} -cosmosDBName ${cosmosDBName} -cosmosDBEndpoint ${cosmosDBEndpoint} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -githubPAT ${githubPAT} -adxClusterName ${adxClusterName} -namingGuid ${namingGuid} -scenario ${scenario} -vmAutologon ${vmAutologon}' } } } diff --git a/azure_jumpstart_ag/contoso_supermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_supermarket/bicep/main.bicep index 50def3206e..268003a7c8 100644 --- a/azure_jumpstart_ag/contoso_supermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_supermarket/bicep/main.bicep @@ -80,6 +80,9 @@ param acrName string = 'agacr${namingGuid}' @description('Override default RDP port using this parameter. Default is 3389. No changes will be made to the client VM.') param rdpPort string = '3389' +@description('Enable automatic logon into Virtual Machine') +param vmAutologon bool = true + @description('The agora scenario to be deployed') param scenario string = 'contoso_supermarket' @@ -152,6 +155,7 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { adxClusterName: adxClusterName namingGuid: namingGuid scenario: scenario + vmAutologon: vmAutologon } } From 054eff235073818c8a0a5845468593ef460ed08f Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Fri, 25 Oct 2024 22:31:56 +0200 Subject: [PATCH 115/409] Added tests-dir --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 1 + 1 file changed, 1 insertion(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index bc3cdc19b2..7b256c2941 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -8,6 +8,7 @@ AgLogsDir = "C:\Ag\Logs" AgVMDir = "C:\Ag\Virtual Machines" AgIconDir = "C:\Ag\Icons" + AgTestsDir = "C:\Ag\Tests" AgToolsDir = "C:\Tools" AgTempDir = "C:\Temp" AgVHDXDir = "V:\VMs" From dba34201575ef64a67901896d6b834b8dd2748ab Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Fri, 25 Oct 2024 23:10:15 +0200 Subject: [PATCH 116/409] Updated artifact paths --- azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 | 7 ++++--- .../artifacts/PowerShell/tests/Invoke-Test.ps1 | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index dee04558ea..3aa9aaea21 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -294,9 +294,10 @@ Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso-motors.png") -Out Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso-motors.svg") -OutFile $AgIconsDir\contoso-motors.svg Invoke-WebRequest ($templateBaseUrl + "artifacts/L1Files/config.json") -OutFile $AgDeploymentFolder\config.json Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/Winget.ps1") -OutFile "$AgPowerShellDir\Winget.ps1" -Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/tests/common.tests.ps1") -OutFile "$AgPowerShellDir\tests\common.tests.ps1" -Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/tests/k8s.tests.ps1") -OutFile "$AgPowerShellDir\tests\k8s.tests.ps1" -Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/tests/Invoke-Test.ps1") -OutFile "$AgPowerShellDir\tests\Invoke-Test.ps1" +Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/tests/common.tests.ps1") -OutFile "$AgDirectory\tests\common.tests.ps1" +Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/tests/k8s.tests.ps1") -OutFile "$AgDirectory\tests\k8s.tests.ps1" +Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/tests/Invoke-Test.ps1") -OutFile "$AgDirectory\tests\Invoke-Test.ps1" +Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/tests/ag-bginfo.bgi") -OutFile "$AgDirectory\tests\ag-bginfo.bgi" if($scenario -eq "contoso_supermarket"){ Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/Bookmarks-contoso-supermarket") -OutFile "$AgToolsDir\Bookmarks" diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 index fd462b6946..26c1670f40 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 @@ -19,4 +19,4 @@ Write-Header "Adding deployment test results to wallpaper using BGInfo" Set-Content "$Env:windir\TEMP\agora-tests-succeeded.txt" $tests_passed Set-Content "$Env:windir\TEMP\agora-tests-failed.txt" $tests_failed -bginfo.exe $AgoraTestsDir\agora-bginfo.bgi /timer:0 /NOLICPROMPT \ No newline at end of file +bginfo.exe $AgoraTestsDir\ag-bginfo.bgi /timer:0 /NOLICPROMPT \ No newline at end of file From b54745aa97d241b3a8437e68bf44330c23bfea49 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Fri, 25 Oct 2024 23:14:19 +0200 Subject: [PATCH 117/409] Added Az-modules --- .../artifacts/PowerShell/Bootstrap.ps1 | 22 +------------------ 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 3aa9aaea21..1b0c75c548 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -258,7 +258,7 @@ Copy-Item $PsHome\Profile.ps1 -Destination "C:\Program Files\PowerShell\7\" Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force Install-Module -Name Microsoft.PowerShell.PSResourceGet -Force -$modules = @("Azure.Arc.Jumpstart.Common", "Microsoft.PowerShell.SecretManagement", "Pester") +$modules = @("Az", "Az.ConnectedMachine", "Az.ConnectedKubernetes", "Az.CustomLocation", "Azure.Arc.Jumpstart.Common", "Microsoft.PowerShell.SecretManagement", "Pester") foreach ($module in $modules) { Install-PSResource -Name $module -Scope AllUsers -Quiet -AcceptLicense -TrustRepository @@ -322,31 +322,12 @@ BITSRequest -Params @{'Uri' = $websiteUrls["wslStoreStorage"]; 'Filename' = "$Ag BITSRequest -Params @{'Uri' = $websiteUrls["docker"]; 'Filename' = "$AgToolsDir\DockerDesktopInstaller.exe" } BITSRequest -Params @{'Uri' = "https://dl.grafana.com/oss/release/grafana-$latestRelease.windows-amd64.msi"; 'Filename' = "$AgToolsDir\grafana-$latestRelease.windows-amd64.msi" } - -############################################################## -# Install Winget -############################################################## -# Installing PowerShell Modules -Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force -Install-Module -Name Microsoft.PowerShell.PSResourceGet -Force -Install-Module -Name Az -Force - -############################################################## -# Install Azure CLI (64-bit not available via Chocolatey) -############################################################## -$ProgressPreference = 'SilentlyContinue' -Invoke-WebRequest -Uri https://aka.ms/installazurecliwindowsx64 -OutFile .\AzureCLI.msi -Start-Process msiexec.exe -Wait -ArgumentList '/I AzureCLI.msi /quiet' -Remove-Item .\AzureCLI.msi - ############################################################## # Create Docker Desktop group ############################################################## New-LocalGroup -Name "docker-users" -Description "docker Users Group" Add-LocalGroupMember -Group "docker-users" -Member $adminUsername -New-Item -path alias:kubectl -value 'C:\ProgramData\chocolatey\lib\kubernetes-cli\tools\kubernetes\client\bin\kubectl.exe' - ############################################################## # Disable Network Profile prompt ############################################################## @@ -393,7 +374,6 @@ New-ItemProperty -Path $AgConfig.EdgeSettingRegistryPath -Name $Name -Value $AgC ############################################################## # Installing Posh-SSH PowerShell Module ############################################################## -Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force Install-Module -Name Posh-SSH -Force $ScheduledTaskExecutable = "C:\Program Files\PowerShell\7\pwsh.exe" From 46da98a59280b9c219ce804c7e1610cb72ca26d0 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Fri, 25 Oct 2024 23:16:22 +0200 Subject: [PATCH 118/409] Remove chocolatey url --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 1 - .../artifacts/PowerShell/AgConfig-contoso-motors.psd1 | 1 - .../artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 | 1 - 3 files changed, 3 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 7b256c2941..b3692f19e3 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -22,7 +22,6 @@ # Required URLs URLs = @{ - chocoInstallScript = 'https://chocolatey.org/install.ps1' wslUbuntu = 'https://aka.ms/wslubuntu' wslStoreStorage = 'https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi' docker = 'https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe' diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 index b5a2219fc7..3a0ef0ab4d 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 @@ -22,7 +22,6 @@ # Required URLs URLs = @{ - chocoInstallScript = 'https://chocolatey.org/install.ps1' wslUbuntu = 'https://aka.ms/wslubuntu' wslStoreStorage = 'https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi' docker = 'https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe' diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 index 3fbe74791c..ef26b08cf6 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 @@ -22,7 +22,6 @@ # Required URLs URLs = @{ - chocoInstallScript = 'https://chocolatey.org/install.ps1' wslUbuntu = 'https://aka.ms/wslubuntu' wslStoreStorage = 'https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi' docker = 'https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe' From d963c5d5863871b7968611c1bda5e431726856ba Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Fri, 25 Oct 2024 23:51:32 +0200 Subject: [PATCH 119/409] Added Microsoft.AzureCLI and Microsoft.Sysinternals.BGInfo --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 2 ++ .../artifacts/PowerShell/AgConfig-contoso-motors.psd1 | 2 ++ .../artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 | 2 ++ 3 files changed, 6 insertions(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index b3692f19e3..2d7a854600 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -74,6 +74,7 @@ # Winget packages list WingetPackagesList = @( + 'Microsoft.AzureCLI', 'Microsoft.PowerShell', 'Microsoft.Bicep', 'Kubernetes.kubectl', @@ -88,6 +89,7 @@ 'Helm.Helm', 'Microsoft.DotNet.SDK.8', 'Microsoft.Sysinternals.ZoomIt', + 'Microsoft.Sysinternals.BGInfo', 'FireDaemon.OpenSSL', 'thomasnordquist.MQTT-Explorer', 'GitHub.cli', diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 index 3a0ef0ab4d..afbc914fba 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 @@ -72,6 +72,7 @@ # Winget packages list WingetPackagesList = @( + 'Microsoft.AzureCLI', 'Microsoft.PowerShell', 'Microsoft.Bicep', 'Kubernetes.kubectl', @@ -86,6 +87,7 @@ 'Helm.Helm', 'Microsoft.DotNet.SDK.8', 'Microsoft.Sysinternals.ZoomIt', + 'Microsoft.Sysinternals.BGInfo', 'FireDaemon.OpenSSL', 'thomasnordquist.MQTT-Explorer', 'GitHub.cli', diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 index ef26b08cf6..818610c348 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 @@ -59,6 +59,7 @@ # Winget packages list WingetPackagesList = @( + 'Microsoft.AzureCLI', 'Microsoft.PowerShell', 'Microsoft.Bicep', 'Kubernetes.kubectl', @@ -73,6 +74,7 @@ 'Helm.Helm', 'Microsoft.DotNet.SDK.8', 'Microsoft.Sysinternals.ZoomIt', + 'Microsoft.Sysinternals.BGInfo', 'FireDaemon.OpenSSL', 'thomasnordquist.MQTT-Explorer', 'GitHub.cli', From daf2c2c30cd9fb71f946619d5ca0f850fbca1083 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Fri, 25 Oct 2024 23:51:53 +0200 Subject: [PATCH 120/409] Bugfixes - paths and variables --- azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 51a7375edb..f82bcc0965 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -287,8 +287,8 @@ $LogsBundleTempDirectory = "$Env:windir\TEMP\LogsBundle-$RandomString" $null = New-Item -Path $LogsBundleTempDirectory -ItemType Directory -Force #required to avoid "file is being used by another process" error when compressing the logs -Copy-Item -Path "$($AgConfig.AgDirectories["LogsDir"])\*.log" -Destination $LogsBundleTempDirectory -Force -PassThru -Compress-Archive -Path "$LogsBundleTempDirectory\*.log" -DestinationPath "$($AgConfig.AgDirectories["LogsDir"])\LogsBundle-$RandomString.zip" -PassThru +Copy-Item -Path "$($AgConfig.AgDirectories["AgDir"])\Logs\*.log" -Destination $LogsBundleTempDirectory -Force -PassThru +Compress-Archive -Path "$LogsBundleTempDirectory\*.log" -DestinationPath "$($AgConfig.AgDirectories["AgDir"])\Logs\LogsBundle-$RandomString.zip" -PassThru Write-Host "[$(Get-Date -Format t)] INFO: Changing Wallpaper" -ForegroundColor Gray @@ -301,7 +301,7 @@ Set-JSDesktopBackground -ImagePath $targetImgPath Write-Host "Running tests to verify infrastructure" -& "$AgoraTestsDir\Invoke-Test.ps1" +& "$AgTestsDir\Invoke-Test.ps1" $endTime = Get-Date $timeSpan = New-TimeSpan -Start $starttime -End $endtime From d7c11907e9c52ae3b3692a6023b3eb305e23153d Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Fri, 25 Oct 2024 23:52:12 +0200 Subject: [PATCH 121/409] Bugfix - variables --- azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 index 26c1670f40..8c9ca48499 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 @@ -6,7 +6,7 @@ $tests_passed = $tests_common.Passed.Count $tests_failed = $tests_common.Failed.Count -Invoke-Pester -Path "$AgoraTestsDir\k8s.tests.ps1" -Output Detailed -PassThru -OutVariable tests_k8s +Invoke-Pester -Path "$AgTestsDir\k8s.tests.ps1" -Output Detailed -PassThru -OutVariable tests_k8s $tests_passed = $tests_passed + $tests_k8s.Passed.Count $tests_failed = $tests_failed + $tests_k8s.Failed.Count @@ -19,4 +19,4 @@ Write-Header "Adding deployment test results to wallpaper using BGInfo" Set-Content "$Env:windir\TEMP\agora-tests-succeeded.txt" $tests_passed Set-Content "$Env:windir\TEMP\agora-tests-failed.txt" $tests_failed -bginfo.exe $AgoraTestsDir\ag-bginfo.bgi /timer:0 /NOLICPROMPT \ No newline at end of file +bginfo.exe $AgTestsDir\ag-bginfo.bgi /timer:0 /NOLICPROMPT \ No newline at end of file From 80207086a1e3fa8c5575612569840d96db1ef373 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Fri, 25 Oct 2024 19:00:15 -0400 Subject: [PATCH 122/409] revert changes --- .../AgConfig-contoso-hypermarket.psd1 | 4 +- .../AgConfig-contoso-supermarket.psd1 | 120 +++++++++--------- .../contoso_hypermarket/bicep/main.bicep | 14 +- 3 files changed, 69 insertions(+), 69 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index a1160916ea..358a6bb3df 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -147,7 +147,7 @@ # Site Kubernetes cluster configurations SiteConfig = @{ Seattle = @{ - ArcClusterName = "twt-k3s" + ArcClusterName = "Ag-K3s-Seattle" FriendlyName = "Seattle" GrafanaDataSource = "seattle" Type = "k3s" @@ -157,7 +157,7 @@ IsProduction = $true } Chicago = @{ - ArcClusterName = "twt-k3s-chicago" + ArcClusterName = "Ag-K3s-Chicago" FriendlyName = "Chicago" GrafanaDataSource = "chicago" Type = "k3s" diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 index 567dfd49b3..ee254513d0 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 @@ -126,7 +126,7 @@ # AKS Edge Essentials variables SiteConfig = @{ Seattle = @{ - ArcClusterName = "twt-arck8s-aksee" + ArcClusterName = "Ag-ArcK8s-Seattle" NetIPAddress = "172.20.1.2" DefaultGateway = "172.20.1.1" PrefixLength = "24" @@ -148,65 +148,65 @@ IoTDevices = @("Freezer-1", "Freezer-2") AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used } - # Chicago = @{ - # ArcClusterName = "Ag-ArcK8s-Chicago" - # NetIPAddress = "172.20.1.3" - # DefaultGateway = "172.20.1.1" - # PrefixLength = "24" - # DNSClientServerAddress = "168.63.129.16" - # ServiceIPRangeStart = "172.20.1.71" - # ServiceIPRangeSize = "10" - # ControlPlaneEndpointIp = "172.20.1.61" - # LinuxNodeIp4Address = "172.20.1.51" - # Subnet = "172.20.1.0/24" - # FriendlyName = "Chicago" - # IsProduction = $true - # Type = "AKSEE" - # posNamespace = "contoso-supermarket" - # Branch = "canary" - # HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" - # HelmService = "service/prometheus-kube-prometheus-prometheus" - # GrafanaDataSource = "chicago" - # HelmValuesFile = "prometheus-additional-scrape-config.yaml" - # IoTDevices = @("Freezer-1", "Freezer-2") - # AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used - # } - # Dev = @{ - # ArcClusterName = "Ag-ArcK8s-Dev" - # NetIPAddress = "172.20.1.4" - # DefaultGateway = "172.20.1.1" - # PrefixLength = "24" - # DNSClientServerAddress = "168.63.129.16" - # ServiceIPRangeStart = "172.20.1.101" - # ServiceIPRangeSize = "10" - # ControlPlaneEndpointIp = "172.20.1.91" - # LinuxNodeIp4Address = "172.20.1.81" - # Subnet = "172.20.1.0/24" - # FriendlyName = "Dev" - # IsProduction = $false - # Type = "AKSEE" - # posNamespace = "contoso-supermarket" - # Branch = "main" - # HelmSetValue = "alertmanager.enabled=false,grafana.ingress.enabled=true,grafana.service.type=LoadBalancer,prometheus.service.type=LoadBalancer,grafana.adminPassword=adminPasswordPlaceholder" - # HelmService = "service/prometheus-grafana" - # GrafanaDataSource = "prometheus" - # HelmValuesFile = "prometheus-additional-scrape-config.yaml" - # IoTDevices = @("Freezer-1", "Freezer-2") - # AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used - # } - # Staging = @{ - # ArcClusterName = "Ag-AKS-Staging" - # FriendlyName = "Staging" - # IsProduction = $false - # Type = "AKS" - # posNamespace = "contoso-supermarket" - # Branch = "staging" - # HelmSetValue = "alertmanager.enabled=false,grafana.ingress.enabled=true,grafana.service.type=LoadBalancer,prometheus.service.type=LoadBalancer,grafana.adminPassword=adminPasswordPlaceholder" - # HelmService = "service/prometheus-grafana" - # GrafanaDataSource = "prometheus" - # HelmValuesFile = "prometheus-additional-scrape-config.yaml" - # IoTDevices = @("Freezer-1", "Freezer-2") - # } + Chicago = @{ + ArcClusterName = "Ag-ArcK8s-Chicago" + NetIPAddress = "172.20.1.3" + DefaultGateway = "172.20.1.1" + PrefixLength = "24" + DNSClientServerAddress = "168.63.129.16" + ServiceIPRangeStart = "172.20.1.71" + ServiceIPRangeSize = "10" + ControlPlaneEndpointIp = "172.20.1.61" + LinuxNodeIp4Address = "172.20.1.51" + Subnet = "172.20.1.0/24" + FriendlyName = "Chicago" + IsProduction = $true + Type = "AKSEE" + posNamespace = "contoso-supermarket" + Branch = "canary" + HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" + HelmService = "service/prometheus-kube-prometheus-prometheus" + GrafanaDataSource = "chicago" + HelmValuesFile = "prometheus-additional-scrape-config.yaml" + IoTDevices = @("Freezer-1", "Freezer-2") + AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used + } + Dev = @{ + ArcClusterName = "Ag-ArcK8s-Dev" + NetIPAddress = "172.20.1.4" + DefaultGateway = "172.20.1.1" + PrefixLength = "24" + DNSClientServerAddress = "168.63.129.16" + ServiceIPRangeStart = "172.20.1.101" + ServiceIPRangeSize = "10" + ControlPlaneEndpointIp = "172.20.1.91" + LinuxNodeIp4Address = "172.20.1.81" + Subnet = "172.20.1.0/24" + FriendlyName = "Dev" + IsProduction = $false + Type = "AKSEE" + posNamespace = "contoso-supermarket" + Branch = "main" + HelmSetValue = "alertmanager.enabled=false,grafana.ingress.enabled=true,grafana.service.type=LoadBalancer,prometheus.service.type=LoadBalancer,grafana.adminPassword=adminPasswordPlaceholder" + HelmService = "service/prometheus-grafana" + GrafanaDataSource = "prometheus" + HelmValuesFile = "prometheus-additional-scrape-config.yaml" + IoTDevices = @("Freezer-1", "Freezer-2") + AKSEEReleaseUseLatest = $true # If set to true, the latest AKSEE release will be used. If set to false, the n-1 version will be used + } + Staging = @{ + ArcClusterName = "Ag-AKS-Staging" + FriendlyName = "Staging" + IsProduction = $false + Type = "AKS" + posNamespace = "contoso-supermarket" + Branch = "staging" + HelmSetValue = "alertmanager.enabled=false,grafana.ingress.enabled=true,grafana.service.type=LoadBalancer,prometheus.service.type=LoadBalancer,grafana.adminPassword=adminPasswordPlaceholder" + HelmService = "service/prometheus-grafana" + GrafanaDataSource = "prometheus" + HelmValuesFile = "prometheus-additional-scrape-config.yaml" + IoTDevices = @("Freezer-1", "Freezer-2") + } } # Universal resource tag and resource types diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index 43236c5787..3c2a9ac783 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -259,10 +259,10 @@ module eventHub 'data/eventHub.bicep' = { } } -module fabricCapacity 'data/fabric.bicep' = { - name: 'fabricCapacity' - params: { - fabricCapacityName: fabricCapacityName - fabricCapacityAdmin: fabricCapacityAdmin - } -} +// module fabricCapacity 'data/fabric.bicep' = { +// name: 'fabricCapacity' +// params: { +// fabricCapacityName: fabricCapacityName +// fabricCapacityAdmin: fabricCapacityAdmin +// } +// } From d8d17db6061b6f0614eb3aa2e575c88dcb33f851 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Fri, 25 Oct 2024 20:52:02 -0400 Subject: [PATCH 123/409] update the icons --- .../artifacts/PowerShell/Modules/common.psm1 | 6 ++--- .../artifacts/icons/contoso-hypermarket.png | Bin 0 -> 21451 bytes .../artifacts/icons/contoso-hypermarket.svg | 22 ++++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.png create mode 100644 azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.svg diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index b1f29c7349..0e67f15a23 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -864,11 +864,11 @@ function Deploy-Prometheus { } elseif ($Env:scenario -eq "contoso_hypermarket") { # Update Grafana Icons - Copy-Item -Path $AgIconsDir\contoso-motors.png -Destination "C:\Program Files\GrafanaLabs\grafana\public\img" - Copy-Item -Path $AgIconsDir\contoso-motors.svg -Destination "C:\Program Files\GrafanaLabs\grafana\public\img\grafana_icon.svg" + Copy-Item -Path $AgIconsDir\contoso-hypermarket.png -Destination "C:\Program Files\GrafanaLabs\grafana\public\img" + Copy-Item -Path $AgIconsDir\contoso-hypermarket.svg -Destination "C:\Program Files\GrafanaLabs\grafana\public\img\grafana_icon.svg" Get-ChildItem -Path 'C:\Program Files\GrafanaLabs\grafana\public\build\*.js' -Recurse -File | ForEach-Object { - (Get-Content $_.FullName) -replace 'className:u,src:"public/img/grafana_icon.svg"', 'className:u,src:"public/img/contoso-motors.png"' | Set-Content $_.FullName + (Get-Content $_.FullName) -replace 'className:u,src:"public/img/grafana_icon.svg"', 'className:u,src:"public/img/contoso-hypermarket.png"' | Set-Content $_.FullName } # Reset Grafana UI diff --git a/azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.png b/azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.png new file mode 100644 index 0000000000000000000000000000000000000000..cdd805675c19b8e3348b256ee1076f05aa331b5a GIT binary patch literal 21451 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 literal 0 HcmV?d00001 diff --git a/azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.svg b/azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.svg new file mode 100644 index 0000000000..1c8f3efc19 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + From 22fa1009244cf4e033d7c24d2db5b0617cc5a4ac Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Sat, 26 Oct 2024 06:44:06 +0200 Subject: [PATCH 124/409] Add restart of machine to initiate VM autologon --- .../artifacts/PowerShell/Bootstrap.ps1 | 17 +++++++++++++++++ .../artifacts/PowerShell/Winget.ps1 | 2 ++ 2 files changed, 19 insertions(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 1b0c75c548..71d6a75119 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -317,10 +317,12 @@ elseif ($scenario -eq "contoso_hypermarket") { Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/mqtt_explorer_settings.json") -OutFile "$AgToolsDir\mqtt_explorer_settings.json" } +<# BITSRequest -Params @{'Uri' = 'https://aka.ms/wslubuntu'; 'Filename' = "$AgToolsDir\Ubuntu.appx" } BITSRequest -Params @{'Uri' = $websiteUrls["wslStoreStorage"]; 'Filename' = "$AgToolsDir\wsl_update_x64.msi" } BITSRequest -Params @{'Uri' = $websiteUrls["docker"]; 'Filename' = "$AgToolsDir\DockerDesktopInstaller.exe" } BITSRequest -Params @{'Uri' = "https://dl.grafana.com/oss/release/grafana-$latestRelease.windows-amd64.msi"; 'Filename' = "$AgToolsDir\grafana-$latestRelease.windows-amd64.msi" } +#> ############################################################## # Create Docker Desktop group @@ -400,6 +402,21 @@ if($scenario -eq "contoso_supermarket" -or $scenario -eq "contoso_motors"){ Install-WindowsFeature -Name Hyper-V -IncludeAllSubFeature -IncludeManagementTools -Restart } +# Restart machine to initiate VM autologon +$action = New-ScheduledTaskAction -Execute 'PowerShell.exe' -Argument '-Command "Restart-Computer -Force"' +$trigger = New-ScheduledTaskTrigger -Once -At ((Get-Date).AddSeconds(10)) +$taskName = "Restart-Computer-Delayed" + +# Define the restart action and schedule it to run after 10 seconds +$action = New-ScheduledTaskAction -Execute 'PowerShell.exe' -Argument '-Command "Restart-Computer -Force"' +$trigger = New-ScheduledTaskTrigger -Once -At ((Get-Date).AddSeconds(10)) + +# Configure the task to run with highest privileges and use the current user's credentials +$principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel Highest + +Register-ScheduledTask -Action $action -Trigger $trigger -TaskName $taskName -Principal $principal -Description "Restart computer after script exits" + + Stop-Transcript ############################################################## diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 index a1c7c7d930..c79b2ec5a4 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 @@ -68,4 +68,6 @@ Get-ScheduledTask *LogonScript* | Start-ScheduledTask #Cleanup Unregister-ScheduledTask -TaskName 'WinGetLogonScript' -Confirm:$false +Unregister-ScheduledTask -TaskName "Restart-Computer-Delayed" -Confirm:$false + Stop-Transcript \ No newline at end of file From 5e2c1a7e821d6f06612b81d877a38322f5a8a7ba Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Sat, 26 Oct 2024 06:45:39 +0200 Subject: [PATCH 125/409] Remove comment-block committed by mistake --- azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 71d6a75119..b197630c6a 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -317,12 +317,12 @@ elseif ($scenario -eq "contoso_hypermarket") { Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/mqtt_explorer_settings.json") -OutFile "$AgToolsDir\mqtt_explorer_settings.json" } -<# + BITSRequest -Params @{'Uri' = 'https://aka.ms/wslubuntu'; 'Filename' = "$AgToolsDir\Ubuntu.appx" } BITSRequest -Params @{'Uri' = $websiteUrls["wslStoreStorage"]; 'Filename' = "$AgToolsDir\wsl_update_x64.msi" } BITSRequest -Params @{'Uri' = $websiteUrls["docker"]; 'Filename' = "$AgToolsDir\DockerDesktopInstaller.exe" } BITSRequest -Params @{'Uri' = "https://dl.grafana.com/oss/release/grafana-$latestRelease.windows-amd64.msi"; 'Filename' = "$AgToolsDir\grafana-$latestRelease.windows-amd64.msi" } -#> + ############################################################## # Create Docker Desktop group From 01f89786a8445d375ceef849f687196aae0f23f7 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Sat, 26 Oct 2024 07:20:07 +0200 Subject: [PATCH 126/409] Decode admin-password --- azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index b197630c6a..c10e4a516c 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -105,6 +105,8 @@ if (($rdpPort -ne $null) -and ($rdpPort -ne "") -and ($rdpPort -ne "3389")) { Write-Host "RDP port configuration complete." } +$adminPassword = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($adminPassword)) + if ($vmAutologon -eq "true") { Write-Host "Configuring VM Autologon" From 7f7456b7e1cd25458b30f47130e9bd6b75a39938 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Sat, 26 Oct 2024 08:04:10 +0200 Subject: [PATCH 127/409] Added latest changes to installk3s script --- .../artifacts/kubernetes/K3s/installK3s.sh | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index d2f18c9555..5a0a026f5e 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -16,6 +16,7 @@ echo $logAnalyticsWorkspace:$6 | awk '{print substr($1,2); }' >> vars.sh echo $templateBaseUrl:$7 | awk '{print substr($1,2); }' >> vars.sh echo $storageContainerName:$8 | awk '{print substr($1,2); }' >> vars.sh echo $k3sControlPlane:$9 | awk '{print substr($1,2); }' >> vars.sh +echo $resourceGroup:${10}| awk '{print substr($1,2); }' >> vars.sh sed -i '2s/^/export adminUsername=/' vars.sh sed -i '3s/^/export subscriptionId=/' vars.sh @@ -26,6 +27,7 @@ sed -i '7s/^/export logAnalyticsWorkspace=/' vars.sh sed -i '8s/^/export templateBaseUrl=/' vars.sh sed -i '9s/^/export storageContainerName=/' vars.sh sed -i '10s/^/export k3sControlPlane=/' vars.sh +sed -i '11s/^/export resourceGroup=/' vars.sh export vmName=$3 @@ -42,7 +44,7 @@ chmod +x vars.sh . ./vars.sh # Creating login message of the day (motd) -sudo curl -v -o /etc/profile.d/welcomeK3s.sh ${templateBaseUrl}artifacts/welcomeK3s.sh +curl -v -o /etc/profile.d/welcomeK3s.sh ${templateBaseUrl}artifacts/welcomeK3s.sh # Syncing this script log to 'jumpstart_logs' directory for ease of troubleshooting sudo -u $adminUsername mkdir -p /home/${adminUsername}/jumpstart_logs @@ -96,13 +98,15 @@ done sudo -u $adminUsername az account set --subscription $subscriptionId az -v +check_dpkg_lock + if [[ "$k3sControlPlane" == "true" ]]; then # Installing Azure Arc extensions echo "" echo "Installing Azure Arc extensions" echo "" - sudo -u $adminUsername az extension add --name connectedk8s + sudo -u $adminUsername az extension add --name connectedk8s --version 1.9.3 sudo -u $adminUsername az extension add --name k8s-configuration sudo -u $adminUsername az extension add --name k8s-extension @@ -176,7 +180,7 @@ if [[ "$k3sControlPlane" == "true" ]]; then else echo "Failed to onboard cluster to Azure Arc. Retrying (Attempt $((retry_count+1)))..." retry_count=$((retry_count+1)) - sleep 5 + sleep 10 fi done From 43e58ad9370c7afe92e1fecba357c2e63a4182c3 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Sat, 26 Oct 2024 08:30:23 +0200 Subject: [PATCH 128/409] Dynamically retrieve k8s cluster names --- .../artifacts/PowerShell/tests/k8s.tests.ps1 | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 index 94448aa245..aa3698af77 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 @@ -1,6 +1,16 @@ BeforeDiscovery { - $clusters = @("Ag-K3s-Chicago","Ag-K3s-Seattle") + $ConfigurationDataFile = "C:\Temp\AgConfig.psd1" + $AgConfig = Import-PowerShellDataFile -Path $ConfigurationDataFile + + + # Initialize an array to hold the ArcClusterName values + $clusters = @() + + # Loop through each SiteConfig and extract the ArcClusterName + foreach ($site in $AgConfig.SiteConfig.Values) { + $clusters += $site.ArcClusterName + } # Login to Azure PowerShell with service principal provided by user $spnpassword = ConvertTo-SecureString $env:spnClientSecret -AsPlainText -Force From 22d2c1902c1bc721d76f0789ed231ed806484270 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Sat, 26 Oct 2024 09:00:51 +0200 Subject: [PATCH 129/409] Test optimizations and bug fixes --- .../PowerShell/tests/common.tests.ps1 | 5 ++--- .../artifacts/PowerShell/tests/k8s.tests.ps1 | 19 ++++--------------- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 index 809393983a..0eef8e65ba 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 @@ -1,9 +1,8 @@ BeforeDiscovery { - $null = Connect-AzAccount -Identity -Tenant $env:tenantId -Subscription $env:subscriptionId + $null = Connect-AzAccount -Identity -Tenant $env:spnTenantId -Subscription $env:subscriptionId } - Describe "ArcBox resource group" { BeforeAll { $ResourceGroupName = $env:resourceGroup @@ -11,4 +10,4 @@ Describe "ArcBox resource group" { It "should have 30 resources or more" { (Get-AzResource -ResourceGroupName $ResourceGroupName).count | Should -BeGreaterOrEqual 30 } -} +} \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 index aa3698af77..cade013441 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 @@ -1,34 +1,23 @@ BeforeDiscovery { - $ConfigurationDataFile = "C:\Temp\AgConfig.psd1" - $AgConfig = Import-PowerShellDataFile -Path $ConfigurationDataFile - - - # Initialize an array to hold the ArcClusterName values - $clusters = @() - - # Loop through each SiteConfig and extract the ArcClusterName - foreach ($site in $AgConfig.SiteConfig.Values) { - $clusters += $site.ArcClusterName - } + $clusters = @("Ag-K3s-Chicago","Ag-K3s-Seattle") # Login to Azure PowerShell with service principal provided by user $spnpassword = ConvertTo-SecureString $env:spnClientSecret -AsPlainText -Force $spncredential = New-Object System.Management.Automation.PSCredential ($env:spnClientId, $spnpassword) - Connect-AzAccount -ServicePrincipal -Credential $spncredential -Tenant $env:spntenantId -Subscription $env:subscriptionId + Connect-AzAccount -ServicePrincipal -Credential $spncredential -Tenant $env:spnTenantId -Subscription $env:subscriptionId } Describe "" -ForEach $clusters { BeforeAll { $cluster = $_ + $connectedCluster = Get-AzConnectedKubernetes -ResourceGroupName $env:resourceGroup -SubscriptionId $env:subscriptionId | Where-Object Name -like $cluster* } It "Cluster exists" { - $clusterObject = Get-AzConnectedKubernetes -ClusterName $cluster -ResourceGroupName $env:resourceGroup -SubscriptionId $env:subscriptionId - $clusterObject | Should -Not -BeNullOrEmpty + $connectedCluster | Should -Not -BeNullOrEmpty } It "Azure Arc Connected cluster is connected" { - $connectedCluster = Get-AzConnectedKubernetes -Name $cluster -ResourceGroupName $env:resourceGroup -SubscriptionId $env:subscriptionId $connectedCluster.ConnectivityStatus | Should -Be "Connected" } } \ No newline at end of file From 6d63b4587ab7b4a16ac52f27d42e0389e5a19522 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Sat, 26 Oct 2024 09:02:29 +0200 Subject: [PATCH 130/409] Adjusted to number of resources provisioned --- azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 index 0eef8e65ba..2dfc2a962f 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 @@ -8,6 +8,6 @@ Describe "ArcBox resource group" { $ResourceGroupName = $env:resourceGroup } It "should have 30 resources or more" { - (Get-AzResource -ResourceGroupName $ResourceGroupName).count | Should -BeGreaterOrEqual 30 + (Get-AzResource -ResourceGroupName $ResourceGroupName).count | Should -BeGreaterOrEqual 27 } } \ No newline at end of file From 613b3e050c08ce51b6d09823d0bf2a23efd4c102 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Sat, 26 Oct 2024 09:09:37 -0400 Subject: [PATCH 131/409] Update script.kql --- azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql | 3 +++ 1 file changed, 3 insertions(+) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql index f004833f76..eb4b15e25e 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql @@ -1,3 +1,6 @@ +.execute database script with (ContinueOnErrors=true) +<| + // Check if the table exists .drop table staging ifexists From 1bd0d11c65155bef6b3eaa5fc515af388795bbe6 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Sat, 26 Oct 2024 09:24:52 -0400 Subject: [PATCH 132/409] Updated Fabric automation scripts --- .../Modules/contoso_hypermarket.psm1 | 28 ++++- .../PowerShell/SetupFabricWorkspace.ps1 | 114 ++++-------------- 2 files changed, 48 insertions(+), 94 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 4a355d1653..0e0b198b4f 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -140,19 +140,41 @@ function Set-MicrosoftFabric { Write-Error "Fabric capacity not found in the resource group $Env:resourceGroup" return } - + + # Get EventHub namespace created in the resource group + $eventHubNS = (az eventhubs namespace list --resource-group $Env:resourceGroup --query "[0].name" -o tsv) + if (-not $eventHubNS) { + Write-Error "EventHub namespaces not found in the resource group $Env:resourceGroup" + return + } + + # Get EventHub name from the eventhub namespace created in the resource group + $eventHubName = (az eventhubs eventhub list --namespace $eventHubNS --resource-group $Env:resourceGroup --query "[0].name" -o tsv) + if (-not $eventHubName) { + Write-Error "No Event Hub created in the EventHub namespace $eventHubNS" + return + } + $configJson = @" { "tenantID": "$Env:spnTenantId", "runAs": "$runFabricSetupAs", - "azureLocation": "$Env:location", + "azureLocation": "$Env:azureLocation", "resourceGroup": "$Env:resourceGroup", "fabricCapacityName": "$fabricCapacityName", "templateBaseUrl": "$Env:templateBaseUrl", - "fabricWorkspaceName": "$fabricWorkspaceName" + "fabricWorkspaceName": "$fabricWorkspaceName", + "eventHubKeyName": "$AgConfig.FabricConfig["EventHubSharedAccessKeyName"]" } "@ $configJson | Set-Content -Path $fabricConfigFile Write-Host "Fabric config file created at $fabricConfigFile" + + # Download Fabric workspace setup script from GitHuB + $scriptFilePath = "$fabricFolder\SetupFabricWorkspace.ps1" + Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/SetupFabricWorkspace.ps1") -OutFile $scriptFilePath + if (-not (Test-Path -Path $scriptFilePath)) { + Write-Error "Unable to download script file: 'SetupFabricWorkspace.ps1' from GitHub" + } } \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 index 59689be1ab..910143e1f3 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 @@ -13,9 +13,7 @@ param ( # NOTE: To run locally create a file named fabric-config.json with the following content # # { -# "tenantID": "", # Azure AD tenant ID where Agora Retail 2.0 is deployed # "runAs": "user", # Indicates whether to run under regular user account or managed identity -# "azureLocation": "eastus", # Region where Agora Retail 2.0 is deployed # "resourceGroup": "rg-fabric", # Resource group where Agora Retail 2.0 is deployed # "templateBaseUrl": "https://raw.githubusercontent.com/main/azure_arc/main/azure_arc_data/azure_jumpstart_ag/artifacts" # } @@ -30,22 +28,16 @@ Set-PSDebug -Strict if ([System.IO.File]::Exists($fabricConfigFile)){ $fabricConfig = Get-Content $fabricConfigFile | ConvertFrom-Json $runAs = $fabricConfig.runAs - $tenantID= $fabricConfig.tenantID $resourceGroup = $fabricConfig.resourceGroup - $azureLocation = $fabricConfig.azureLocation $templateBaseUrl = $fabricConfig.templateBaseUrl - $namingGuid = (New-Guid).ToString().Substring(31, 5) + $fabricWorkspaceName = $fabricConfig.fabricWorkspaceName $fabricCapacityName = $fabricConfig.fabricCapacityName + $eventHubKeyName = $fabricConfig.eventHubKeyName $AgLogsDir = "." } else { - $AgConfig = Import-PowerShellDataFile -Path $Env:AgConfigPath - $AgLogsDir = $AgConfig.AgDirectories["AgLogsDir"] - $tenantID = $Env:tenantId - $resourceGroup = $Env:resourceGroup - $azureLocation = $Env:azureLocation - $templateBaseUrl = $env:templateBaseUrl - $namingGuid = $Env:namingGuid + Write-Host "ERROR: Fabric configuration file '$fabricConfigFile' not found." + Exit } Start-Transcript -Path ($AgLogsDir + "\SetupFabricWorkspace.log") @@ -55,12 +47,11 @@ Write-Host "[$(Get-Date -Format t)] INFO: Configuring Fabric Wrokspace" -Foregro $fabricResource = "https://api.fabric.microsoft.com" # Fabric API resource to get access tokens for authorization to Fabric $kustoResource = "https://api.kusto.windows.net" # Kusto API resource to get access tokens for authorization KQL database $powerbiResource = "https://analysis.windows.net/powerbi/api" # Power BI API resource to get access token for authorization to Power BI -$AgScenarioPrefix = "JSAgoraHyperMarket" # Prefix to use for Fabric workspace and other items created in Fabric # Login to Azure as end user or managed identity to get access tokens for different API endpoints if ($runAs -eq "user") { - # login using interactive logon - az login --tenant $tenantID --allow-no-subscriptions + # login using device code + az login --use-device-code --allow-no-subscriptions } else { # Login using managed identity @@ -74,12 +65,6 @@ if ($fabricAccessToken -eq '') { Exit } -# Create Fabric workspace. Generate new guid or use guid prefix in agora deployment -$fabricWorkspaceName = "$AgScenarioPrefix-$namingGuid".ToLower() -if ($fabricCapacityName -eq "") { - $fabricCapacityName = $fabricWorkspaceName -} - # List Fabric capacities to assign to Fabric workspace to avoid Powrer BI Premium license write-host "INFO: Checking if there is a Fabric capacity created with specified name." $fabricCapacityApi = "https://api.fabric.microsoft.com/v1/capacities" @@ -93,18 +78,14 @@ if (!($httpResp.StatusCode -eq 200)){ # Display current Fabric capacities $fabricCapacities = (ConvertFrom-Json($httpResp.Content)).value foreach ($fabricCapacity in $fabricCapacities){ - Write-Host "INFO: Fabric capacity name: $($fabricCapacity.displayName), id: $($fabricCapacity.id), state: $($fabricCapacity.state)" + Write-Host "INFO: Fabric capacity name: $($fabricCapacity.displayName), id: $($fabricCapacity.Id), state: $($fabricCapacity.state)" } # Verify if Fabric capacity exists with specific name $fabricCapacity = $fabricCapacities | Where-Object { $_.displayName -eq $fabriccapacityName } -if ($fabricCapacity.id -eq '' -or $null -eq $fabricCapacity.id){ +if (-not $fabricCapacity.Id){ Write-Host "ERROR: Fabric capacity not found with capacity name '$fabriccapacityName'" - - # Create new fabric capactiy - Write-Host "INFO: Creating Fabric capacity with capacity name '$fabriccapacityName'" - az fabric capacity create --resource-group $resourceGroup --capacity-name $fabriccapacityName --sku "{name:F2,tier:Fabric}" --location $azureLocation - Write-Host "INFO: Created Fabric capacity. with capacity name '$fabriccapacityName'" + Exit } else { Write-Host "INFO: Found Fabric capacity with capacity name '$fabriccapacityName'" @@ -132,7 +113,7 @@ Write-Host "INFO: Fabric workspace id is $fabricWorkspaceId" # Create Eventhouse to store retail data $eventhouseApi = "https://api.fabric.microsoft.com/v1/workspaces/$fabricWorkspaceId/eventhouses" -$eventhouseName = "$AgScenarioPrefix-KQL".ToLower() +$eventhouseName = "$fabriccapacityName-KQL".ToLower() $apiPayload = "{'displayName': '$eventhouseName', 'description': 'Eventhouse to host KQL database for Agora Hypermarket data.'}" $headers = @{"Authorization" = "Bearer $fabricAccessToken"; "Content-Type" = "application/json" } @@ -159,10 +140,18 @@ $kqlDatabaseName = $kqlDatabaseInfo[0].displayName # Create KQL database tables to store retail data $databaseName = $eventhouseName +# Download KQL script from GitHub +$kqlScriptUrl = $templateBaseUrl + "contoso_hypermarket/bicep/data/script.kql" +$kqlScript = (Invoke-WebRequest $kqlScriptUrl).Content +if (-not $kqlScript) { + write-host "ERROR: Failed to download KQL script to create database schema." + Exit +} + # Get access token to authorize with the Kusto query endpoint Write-Host "INFO: Get access token to authorize access to Kusto API endpoint $kustoResource" $kustoAccessToken = (az account get-access-token --resource $kustoResource --query accessToken --output tsv) -if ($kustoAccessToken -eq '') { +if (-not $kustoAccessToken) { write-host "ERROR: Failed to get access token to access Kusto endpoint $kustoResource." Exit } @@ -172,11 +161,11 @@ $headers = @{ "Content-Type" = "application/json" } -# Create payload to create tables in the KQL database -Write-Host "INFO: Creating products table." +# Create payload to create KQL database schema and functions +Write-Host "INFO: Creating KQL script." $body = @{ db = $databaseName - csl = ".create table products (product_id:int, name:string, stock:int, price_range:dynamic, photo_path:string, category:string)" + csl = "$kqlScript" } | ConvertTo-Json $httpResp = Invoke-RestMethod -Method Post -Uri "$kqlQueryServiceUri/v1/rest/mgmt" -Headers $headers -Body $body @@ -188,58 +177,6 @@ else { Exit } -# Create payload -Write-Host "INFO: Creating orders table." -$body = @{ - db = $databaseName - csl = ".create table orders (store_id:string, order_id:string, order_date:datetime, line_items:dynamic, order_total:real)" -} | ConvertTo-Json - -# Create Inventory table -$httpResp = Invoke-RestMethod -Method Post -Uri "$kqlQueryServiceUri/v1/rest/mgmt" -Headers $headers -Body $body -if (($httpResp.StatusCode -ge 200) -or ($httpResp.StatusCode -le 204)){ - Write-Host "INFO: orders table created." -} -else { - Write-Host "ERROR: Failed to create orders table." - Exit -} - -# Create payload -Write-Host "INFO: Creating inventory table." -$body = @{ - db = $databaseName - csl = ".create table inventory (date_time:datetime,store_id:string,product_id:int,retail_price:real,in_stock:int)" -} | ConvertTo-Json - -# Create inventory table -$httpResp = Invoke-RestMethod -Method Post -Uri "$kqlQueryServiceUri/v1/rest/mgmt" -Headers $headers -Body $body -if (($httpResp.StatusCode -ge 200) -or ($httpResp.StatusCode -le 204)){ - Write-Host "INFO: inventory table created." -} -else { - Write-Host "ERROR: Failed to create inventory table." - Exit -} - -# Create ingestion mapping -$mappingQuery = @" -{ - "db": "$kqlDatabaseId", - "csl": ".create table ['orders'] ingestion json mapping 'orders_mapping' '[{\"column\":\"store_id\", \"Properties\":{\"Path\":\"$[\\'store_id\\']\"}},{\"column\":\"order_id\", \"Properties\":{\"Path\":\"$[\\'order_id\\']\"}},{\"column\":\"order_date\", \"Properties\":{\"Path\":\"$[\\'order_date\\']\"}},{\"column\":\"line_items\", \"Properties\":{\"Path\":\"$[\\'line_items\\']\"}},{\"column\":\"order_total\", \"Properties\":{\"Path\":\"$[\\'order_total\\']\"}}]'", - "properties": null -} -"@ - -$httpResp = Invoke-RestMethod -Method Post -Uri "$kqlQueryServiceUri/v1/rest/mgmt" -Headers $headers -Body $mappingQuery -if (($httpResp.StatusCode -ge 200) -or ($httpResp.StatusCode -le 204)){ - Write-Host "INFO: orders mapping created." -} -else { - Write-Host "ERROR: Failed to create orders mapping." - Exit -} - # Download dashboard report and Update to use KQL database $hyperMarketDashboardReport = "fabric-hypermarket-dashboard.json" Write-Host "INFO: Downloading and preparing dashboard report to import into Fabric workspace." @@ -296,7 +233,6 @@ if ($eventHubInfo.Count -ne 1) { } $eventHubNamespace = $eventHubInfo[0].name -$eventHubName = "orders" # Make sure Eventhub with name 'orders' exists $eventHubs = az eventhubs eventhub list --namespace-name $eventHubInfo[0].name --resource-group $resourceGroup | ConvertFrom-Json @@ -306,13 +242,9 @@ if ($null -eq $eventHubOrders) { Exit } -# Get authorization key -$authRuleName = "FabricAutomation" -az eventhubs eventhub authorization-rule create --resource-group $resourceGroup --namespace-name $eventHubNamespace --eventhub-name $eventHubName --name $authRuleName --rights [Listen, Send] - # Get Event Hub credentials Write-Host "INFO: Retrieving Event Hub key for '$authRuleName' Shared Acess Policy." -$eventHubKey = az eventhubs eventhub authorization-rule keys list --resource-group $resourceGroup --namespace-name $eventHubNamespace --eventhub-name $eventHubName --name $authRuleName --query primaryKey --output tsv +$eventHubKey = az eventhubs eventhub authorization-rule keys list --resource-group $resourceGroup --namespace-name $eventHubNamespace --eventhub-name $eventHubName --name $eventHubKeyName --query primaryKey --output tsv if ($eventHubKey -eq '') { Write-Host "ERROR: Failed to retrieve Event Hub key." Exit From cb6797755012ca1dc13c36e7bc09ceadf00cf13b Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Sat, 26 Oct 2024 10:29:19 -0400 Subject: [PATCH 133/409] Update SetupFabricWorkspace.ps1 --- .../PowerShell/SetupFabricWorkspace.ps1 | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 index 910143e1f3..bbb31f4572 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 @@ -178,9 +178,10 @@ else { } # Download dashboard report and Update to use KQL database -$hyperMarketDashboardReport = "fabric-hypermarket-dashboard.json" +# Download dashboard report and Update to use KQL database +$hyperMarketDashboardReport = $templateBaseUrl + "artifacts/adx_dashboards/fabric-hypermarket-dashboard.json" Write-Host "INFO: Downloading and preparing dashboard report to import into Fabric workspace." -$ordersDashboardBody = (Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/adx_dashboards/$hyperMarketDashboardReport").Content -replace '{{KQL_CLUSTER_URI}}', $kqlQueryServiceUri -replace '{{KQL_DATABASE_ID}}', $kqlDatabaseId -replace '{{FABRIC_WORKSPACE_ID}}', $fabricWorkspaceId +$ordersDashboardBody = (Invoke-WebRequest -Method Get -Uri $hyperMarketDashboardReport).Content -replace '{{KQL_CLUSTER_URI}}', $kqlQueryServiceUri -replace '{{KQL_DATABASE_ID}}', $kqlDatabaseId -replace '{{FABRIC_WORKSPACE_ID}}', $fabricWorkspaceId # Convert the KQL dashboard report payload to base64 Write-Host "INFO: Conerting report content into base64 encoded format." @@ -236,15 +237,15 @@ $eventHubNamespace = $eventHubInfo[0].name # Make sure Eventhub with name 'orders' exists $eventHubs = az eventhubs eventhub list --namespace-name $eventHubInfo[0].name --resource-group $resourceGroup | ConvertFrom-Json -$eventHubOrders = $eventHubs | Where-Object { $_.name -eq "orders" } -if ($null -eq $eventHubOrders) { - Write-Host "ERROR: Event Hub with name 'orders' not found." +$eventHubName = $eventHubs[0].name +if (-not $eventHubName) { + Write-Host "ERROR: Event Hubs not found in the EventHub namespace $eventHubInfo[0].name." Exit } # Get Event Hub credentials -Write-Host "INFO: Retrieving Event Hub key for '$authRuleName' Shared Acess Policy." -$eventHubKey = az eventhubs eventhub authorization-rule keys list --resource-group $resourceGroup --namespace-name $eventHubNamespace --eventhub-name $eventHubName --name $eventHubKeyName --query primaryKey --output tsv +Write-Host "INFO: Retrieving Event Hub key for '$eventHubKeyName' Shared Acess Policy." +$eventHubKey = az eventhubs namespace authorization-rule keys list --resource-group $resourceGroup --namespace-name $eventHubNamespace --name $eventHubKeyName --query primaryKey --output tsv if ($eventHubKey -eq '') { Write-Host "ERROR: Failed to retrieve Event Hub key." Exit @@ -256,7 +257,7 @@ Write-Host "INFO: Received Event Hub key." $eventHubEndpoint = "$eventHubNamespace.servicebus.windows.net" $connectionBody = @" { - "datasourceName": "Agora_Retail_2_0_EventHub_Connection", + "datasourceName": "$fabricWorkspaceName-$eventHubName", "datasourceType": "Extension", "connectionDetails": "{\"endpoint\":\"$eventHubEndpoint\",\"entityPath\":\"$eventHubName\"}", "singleSignOnType": "None", @@ -275,14 +276,14 @@ $connectionBody = @" "name": "entityPath", "type": "text", "isRequired": true, - "value": "orders" + "value": "$eventHubName" } ] }, "referenceDatasource": false, "credentialDetails": { "credentialType": "Basic", - "credentials": "{\"credentialData\":[{\"name\":\"username\",\"value\":\"$authRuleName\"},{\"name\":\"password\",\"value\":\"$eventHubKey\"}]}", + "credentials": "{\"credentialData\":[{\"name\":\"username\",\"value\":\"$eventHubKeyName\"},{\"name\":\"password\",\"value\":\"$eventHubKey\"}]}", "encryptedConnection": "Any", "privacyLevel": "Organizational", "skipTestConnection": false, @@ -346,15 +347,15 @@ $streamBody = @" "DataConnectionType": "EventHubDataConnection", "DataConnectionProperties": { "DatabaseArtifactId": "$kqlDatabaseId", - "TableName": "orders", - "MappingRuleName": "orders_mapping", + "TableName": "staging", + "MappingRuleName": "staging_mapping", "EventSystemProperties": [], - "ConsumerGroup": "fabric", + "ConsumerGroup": "fabriccg", "Compression": "None", "DataFormat": "multijson", "DataSourceConnectionId": "$DataSourceConnectionId", "DataConnectionType": "EventHubDataConnection", - "DataConnectionName": "Contoso-Hypermarket-EventHub-Connection" + "DataConnectionName": "$fabricWorkspaceName-$eventHubName" } } "@ @@ -374,7 +375,7 @@ else { # Download dashboard report and Update to use KQL database $ordersSalesForecastNotebook = "orders-sales-forecast.ipynb" Write-Host "INFO: Downloading and preparing nootebook to import into Fabric workspace." -$ordersNotebookBody = (Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/notebooks/$ordersSalesForecastNotebook").Content -replace '{{KQL_CLUSTER_URI}}', $kqlQueryServiceUri -replace '{{KQL_DATABASE_NAME}}', $kqlDatabaseName +$ordersNotebookBody = (Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/artifacts/notebooks/$ordersSalesForecastNotebook").Content -replace '{{KQL_CLUSTER_URI}}', $kqlQueryServiceUri -replace '{{KQL_DATABASE_NAME}}', $kqlDatabaseName # Convert the KQL dashboard report payload to base64 Write-Host "INFO: Conerting report content into base64 encoded format." From 8899bf109a4ddd6f7983d2d88de8dcf9f2c0503d Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sat, 26 Oct 2024 21:48:35 +0300 Subject: [PATCH 134/409] Refactor OpenAI model deployments in aoai.bicep --- .../artifacts/PowerShell/AgLogonScript.ps1 | 2 + .../artifacts/PowerShell/Bootstrap.ps1 | 6 +- .../contoso_hypermarket/bicep/ai/aoai.bicep | 80 ++++++++----------- .../bicep/clientVm/clientVm.bicep | 11 ++- .../contoso_hypermarket/bicep/main.bicep | 16 ++++ 5 files changed, 68 insertions(+), 47 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index e8d46970e6..94e7efbc37 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -59,6 +59,8 @@ if ($scenario -eq "contoso_supermarket") { $global:k3sArcClusterName = $Env:k3sArcClusterName $global:spnObjectId = $Env:spnObjectId $global:stcontainerName = $Env:stcontainerName + $global:openAIEndpoint = $Env:openAIEndpoint + $global:speachToTextEndpoint = $Env:speachToTextEndpoint } ##################################################################### diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 2ef13daf75..b9f84bcda7 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -29,7 +29,9 @@ param ( [string]$aioStorageAccountName, [string]$stcontainerName, [string]$k3sArcClusterName, - [string]$k3sArcDataClusterName + [string]$k3sArcDataClusterName, + [string]$openAIEndpoint, + [string]$speachToTextEndpoint ) ############################################################## @@ -70,6 +72,8 @@ param ( [System.Environment]::SetEnvironmentVariable('stcontainerName', $stcontainerName, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('k3sArcClusterName', $k3sArcClusterName, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('k3sArcDataClusterName', $k3sArcDataClusterName, [System.EnvironmentVariableTarget]::Machine) +[System.Environment]::SetEnvironmentVariable('openAIEndpoint', $openAIEndpoint, [System.EnvironmentVariableTarget]::Machine) +[System.Environment]::SetEnvironmentVariable('speachToTextEndpoint', $speachToTextEndpoint, [System.EnvironmentVariableTarget]::Machine) $ErrorActionPreference = 'Continue' diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep index 58fb86aa38..20272e6beb 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep @@ -2,7 +2,7 @@ param openAIAccountName string = 'openai${uniqueString(resourceGroup().id,location)}' @description('The location of the OpenAI Cognitive Services account') -param location string +param location string = resourceGroup().location @description('The name of the OpenAI Cognitive Services SKU') param openAISkuName string = 'S0' @@ -10,6 +10,21 @@ param openAISkuName string = 'S0' @description('The type of Cognitive Services account to create') param cognitiveSvcType string = 'AIServices' +@description('Azure service principal object id') +param spnObjectId string + +@description('The array of OpenAI models to deploy') +param azureOpenAIModels array = [ + { + name: 'gpt-35-turbo' + version: '0125' + } + { + name: 'gpt-4o-mini' + version: '2024-07-18' + } +] + resource openAIAccount 'Microsoft.CognitiveServices/accounts@2024-06-01-preview' = { name: openAIAccountName location: location @@ -22,9 +37,10 @@ resource openAIAccount 'Microsoft.CognitiveServices/accounts@2024-06-01-preview' } } -resource gpt35ModelDeployment 'Microsoft.CognitiveServices/accounts/deployments@2024-06-01-preview' = { +@batchSize(1) +resource openAIModelsDeployment 'Microsoft.CognitiveServices/accounts/deployments@2024-06-01-preview' = [for model in azureOpenAIModels: { parent: openAIAccount - name: '${openAIAccountName}-gpt-35-deployment' + name: '${openAIAccountName}-${model.name}-deployment' sku: { name: 'Standard' capacity: 10 @@ -32,55 +48,29 @@ resource gpt35ModelDeployment 'Microsoft.CognitiveServices/accounts/deployments@ properties: { model: { format: 'OpenAI' - name: 'gpt-35-turbo' - version: '0125' + name: model.name + version: model.version } versionUpgradeOption: 'NoAutoUpgrade' currentCapacity: 10 raiPolicyName: 'Microsoft.Default' } -} +}] -resource gpt4oModelDeployment 'Microsoft.CognitiveServices/accounts/deployments@2024-06-01-preview' = { - parent: openAIAccount - name: '${openAIAccountName}-gpt-40-deployment' - dependsOn: [ - gpt35ModelDeployment - ] - sku: { - name: 'Standard' - capacity: 10 - } +// Add role assignment for the SPN: Cognitive Services OpenAI Contributor +resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid(spnObjectId, resourceGroup().id, 'a001fd3d-188f-4b5d-821b-7da978bf7442') + scope: resourceGroup() properties: { - model: { - format: 'OpenAI' - name: 'gpt-4o-mini' - version: '2024-07-18' - } - versionUpgradeOption: 'NoAutoUpgrade' - currentCapacity: 10 - raiPolicyName: 'Microsoft.Default' + principalId: spnObjectId + roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', 'a001fd3d-188f-4b5d-821b-7da978bf7442') + principalType: 'ServicePrincipal' + description: 'Cognitive Services OpenAI Contributor' + } } -/*resource speechDeployment 'Microsoft.CognitiveServices/accounts/deployments@2024-06-01-preview' = { - parent: openAIAccount - name: '${openAIAccountName}-speech-deployment' - dependsOn: [ - gpt35ModelDeployment - ] - sku: { - name: 'Standard' - capacity: 10 - } - properties: { - model: { - format: 'speech' - name: 'gpt-4o-mini' - version: '2024-07-18' - } - versionUpgradeOption: 'NoAutoUpgrade' - currentCapacity: 10 - raiPolicyName: 'Microsoft.Default' - } -}*/ \ No newline at end of file +output openAIEndpoint string = filter(items(openAIAccount.properties.endpoints), endpoint => endpoint.key == 'OpenAI Language Model Instance API')[0].value +output speechToTextEndpoint string = filter(items(openAIAccount.properties.endpoints), endpoint => endpoint.key == 'Speech Services Speech to Text')[0].value + + diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep index bcb4ccbd76..24587afc66 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep @@ -84,6 +84,12 @@ param k3sArcDataClusterName string = 'Ag-K3s-Seattle-${namingGuid}' @description('The name of the Azure Arc K3s data cluster') param k3sArcClusterName string = 'Ag-K3s-Chicago-${namingGuid}' +@description('The URL of the Azure OpenAI endpoint.') +param openAIEndpoint string + +@description('The URL of the Speech-to-text endpoint.') +param speachToTextEndpoint string + var encodedPassword = base64(windowsAdminPassword) var bastionName = 'Ag-Bastion' var publicIpAddressName = deployBastion == false ? '${vmName}-PIP' : '${bastionName}-PIP' @@ -131,6 +137,9 @@ resource vm 'Microsoft.Compute/virtualMachines@2022-11-01' = { name: vmName location: location tags: resourceTags + identity: { + type: 'SystemAssigned' + } properties: { hardwareProfile: { vmSize: 'Standard_D32s_v5' @@ -198,7 +207,7 @@ resource vmBootstrap 'Microsoft.Compute/virtualMachines/extensions@2022-11-01' = fileUris: [ uri(templateBaseUrl, 'artifacts/PowerShell/Bootstrap.ps1') ] - commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnObjectId ${spnObjectId} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -acrName ${acrName} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName} -stcontainerName ${stcontainerName} -k3sArcClusterName ${k3sArcClusterName} -k3sArcDataClusterName ${k3sArcDataClusterName}' + commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnObjectId ${spnObjectId} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -acrName ${acrName} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName} -stcontainerName ${stcontainerName} -k3sArcClusterName ${k3sArcClusterName} -k3sArcDataClusterName ${k3sArcDataClusterName} -openAIEndpoint ${openAIEndpoint} -speachToTextEndpoint ${speachToTextEndpoint}' } } } diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index d22754da83..abd4505866 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -98,6 +98,18 @@ param akvNameSite1 string = 'agakv1${namingGuid}' @description('The name of the Key Vault for site 2') param akvNameSite2 string = 'agakv2${namingGuid}' +@description('The array of OpenAI models to deploy') +param azureOpenAIModels array = [ + { + name: 'gpt-35-turbo' + version: '0125' + } + { + name: 'gpt-4o-mini' + version: '2024-07-18' + } +] + var templateBaseUrl = 'https://raw.githubusercontent.com/${githubAccount}/azure_arc/${githubBranch}/azure_jumpstart_ag/' var k3sClusterNodesCount = 2 // Number of nodes to deploy in the K3s cluster @@ -219,6 +231,8 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { stcontainerName: stcontainerName k3sArcClusterName: k3sArcClusterName k3sArcDataClusterName: k3sArcDataClusterName + openAIEndpoint: azureOpenAI.outputs.openAIEndpoint + speachToTextEndpoint: azureOpenAI.outputs.speechToTextEndpoint } } @@ -272,5 +286,7 @@ module azureOpenAI 'ai/aoai.bicep' = { params: { location: location openAIAccountName: 'openai${namingGuid}' + azureOpenAIModels: azureOpenAIModels + spnObjectId: spnObjectId } } From f68805308510a0ff1acadb6fab9788dbf782c7d3 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sat, 26 Oct 2024 22:00:44 +0300 Subject: [PATCH 135/409] Refactor OpenAI model deployments in aoai.bicep --- .../bicep/storage/storageAccount.bicep | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep index 0f767fe74f..2573095910 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep @@ -15,6 +15,9 @@ param storageQueueName string = 'aioQueue' @description('The name of ESA container in Storage Account') param stcontainerName string +@description('Azure service principal object id') +param spnObjectId string + resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = { name: storageAccountName location: location @@ -24,6 +27,7 @@ resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = { } properties: { supportsHttpsTrafficOnly: true + isHnsEnabled: true } } @@ -44,5 +48,18 @@ resource storageAccountName_default_container 'Microsoft.Storage/storageAccounts ] } +// Add role assignment for the SPN: Storage Blob Data Contributor +resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid(spnObjectId, resourceGroup().id, 'ba92f5b4-2d11-453d-a403-e96b0029c9fe') + scope: resourceGroup() + properties: { + principalId: spnObjectId + roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe') + principalType: 'ServicePrincipal' + description: 'Storage Blob Data Contributor' + + } +} + output queueName string = storageQueueName output storageAccountResourceId string = storageAccount.id From c1ae52e78b3f716694680cf9a67c6f19c016f8f0 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sat, 26 Oct 2024 22:01:11 +0300 Subject: [PATCH 136/409] Refactor OpenAI model deployments in aoai.bicep: Add spnObjectId to storageAccount module --- azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep | 1 + 1 file changed, 1 insertion(+) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index abd4505866..307618556d 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -261,6 +261,7 @@ module storageAccount 'storage/storageAccount.bicep' = { location: location storageQueueName: storageQueueName stcontainerName: stcontainerName + spnObjectId: spnObjectId } } From bdc2f42a54ec45cbf36052e2d6302e8441c50af0 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sat, 26 Oct 2024 22:32:17 +0300 Subject: [PATCH 137/409] Refactor OpenAI model deployments in aoai.bicep: Update azure-iot-ops version to 0.7.0b2 --- .../AgConfig-contoso-hypermarket.psd1 | 2 +- .../Modules/contoso_hypermarket.psm1 | 79 +++++++++++++++++++ .../bicep/data/keyVault.bicep | 56 ++++++++++++- .../contoso_hypermarket/bicep/main.bicep | 1 + 4 files changed, 135 insertions(+), 3 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 358a6bb3df..60e0debe15 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -59,7 +59,7 @@ @{name="customlocation"; version="latest"}, @{name="kusto"; version="latest"}, @{name="storage-preview"; version="latest"}, - @{name="azure-iot-ops"; version="0.5.1b1"} + @{name="azure-iot-ops"; version="0.7.0b2"} ) # PowerShell modules diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 764a1af11a..d1b5f533db 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -124,4 +124,83 @@ function Set-K3sClusters { Write-Host "`n" } } +} + +function Deploy-AIO-Hypermarket { + Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the clusters" -ForegroundColor DarkGray + Write-Host "`n" + $kvIndex = 0 + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + $clusterName = $cluster.Name.ToLower() + Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the $clusterName cluster" -ForegroundColor Gray + Write-Host "`n" + kubectx $clusterName + $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" + $keyVaultId = (az keyvault list -g $resourceGroup --resource-type vault --query "[$kvIndex].id" -o tsv) + $retryCount = 0 + $maxRetries = 5 + $aioStatus = "notDeployed" + + # Enable custom locations on the Arc-enabled cluster + Write-Host "[$(Get-Date -Format t)] INFO: Enabling custom locations on the Arc-enabled cluster" -ForegroundColor DarkGray + Write-Host "`n" + az config set extension.use_dynamic_install=yes_without_prompt + az connectedk8s enable-features --name $arcClusterName ` + --resource-group $resourceGroup ` + --features cluster-connect custom-locations ` + --custom-locations-oid $customLocationRPOID ` + --only-show-errors + + # Create the Schema registry for the cluster + Write-Host "[$(Get-Date -Format t)] INFO: Creating the schema registry on the Arc-enabled cluster" -ForegroundColor DarkGray + Write-Host "`n" + $schemaId = $(az iot ops schema registry create --name "$arcClusterName-registry" ` + --resource-group $resourceGroup ` + --registry-namespace "$arcClusterName-$namingGuid" ` + --sa-resource-id $(az storage account show --name $aioStorageAccountName --resource-group $resourceGroup -o tsv --query id) ` + --query id -o tsv) + + do { + az iot ops init --cluster $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --sr-resource-id $schemaId ` + --add-insecure-listener ` + --only-show-errors + #az iot ops init --cluster $arcClusterName.toLower() -g $resourceGroup --kv-id $keyVaultId --sp-app-id $spnClientId --sp-secret $spnClientSecret --sp-object-id $spnObjectId --mq-service-type loadBalancer --mq-insecure true --simulate-plc false --no-block --only-show-errors + if ($? -eq $false) { + $aioStatus = "notDeployed" + Write-Host "`n" + Write-Host "[$(Get-Date -Format t)] Error: An error occured while deploying AIO on the cluster...Retrying" -ForegroundColor DarkRed + Write-Host "`n" + az iot ops init --cluster $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --sr-resource-id $schemaId ` + --add-insecure-listener ` + --only-show-errors + $retryCount++ + } + else { + $aioStatus = "deployed" + } + } until ($aioStatus -eq "deployed" -or $retryCount -eq $maxRetries) + + # Configure the Azure IoT Operations instance for secret synchronization + $userAssignedMIResourceId = (az identity show -g $resourceGroup -n "aio-$clusterName-identity" --query id -o tsv --only-show-errors) + + Write-Host "[$(Get-Date -Format t)] INFO: Assigning the user-assigned managed identity to the Azure IoT Operations instance" -ForegroundColor DarkGray + Write-Host "`n" + az iot ops identity assign --name $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --mi-user-assigned $userAssignedMIResourceId + + Write-Host "[$(Get-Date -Format t)] INFO: Configure the Azure IoT Operations instance for secret synchronization" -ForegroundColor DarkGray + Write-Host "`n" + az iot ops secretsync enable --name $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --mi-user-assigned $userAssignedMIResourceId ` + --kv-resource-id $keyVaultId ` + --only-show-errors + + $kvIndex++ + } } \ No newline at end of file diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep index c0b7ad3428..5196470c23 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep @@ -13,6 +13,9 @@ param akvSku string = 'standard' @description('Azure Key Vault tenant ID') param tenantId string = subscription().tenantId +@description('Azure service principal object id') +param spnObjectId string + @description('Secret name') param aioPlaceHolder string = 'azure-iot-operations' @@ -24,6 +27,16 @@ param resourceTags object = { Project: 'Jumpstart_azure_aio' } +resource userAssignedManagedIdentitySeattle 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-07-31-preview' = { + name: 'aio-seattle-identity' + location: location +} + +resource userAssignedManagedIdentityChicago 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-07-31-preview' = { + name: 'aio-chicago-identity' + location: location +} + resource akv 'Microsoft.KeyVault/vaults@2023-02-01' = { name: akvNameSite1 location: location @@ -33,7 +46,7 @@ resource akv 'Microsoft.KeyVault/vaults@2023-02-01' = { name: akvSku family: 'A' } - accessPolicies: [] + enableRbacAuthorization: true enableSoftDelete: false tenantId: tenantId } @@ -56,7 +69,7 @@ resource akv2 'Microsoft.KeyVault/vaults@2023-02-01' = { name: akvSku family: 'A' } - accessPolicies: [] + enableRbacAuthorization: true enableSoftDelete: false tenantId: tenantId } @@ -69,3 +82,42 @@ resource aioSecretPlaceholder2 'Microsoft.KeyVault/vaults/secrets@2023-02-01' = value: aioPlaceHolderValue } } + +// Add role assignment for the SPN: Key Vault Secrets Officer +resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid(spnObjectId, resourceGroup().id, 'b86a8fe4-44ce-4948-aee5-eccb2c155cd7') + scope: resourceGroup() + properties: { + principalId: spnObjectId + roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', 'b86a8fe4-44ce-4948-aee5-eccb2c155cd7') + principalType: 'ServicePrincipal' + description: 'Key Vault Secrets Officer' + + } +} + +// Add role assignment for the SPN: Key Vault Secrets Officer +resource roleAssignmentAIOSeattle 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid(userAssignedManagedIdentitySeattle.name, resourceGroup().id, 'b86a8fe4-44ce-4948-aee5-eccb2c155cd7') + scope: resourceGroup() + properties: { + principalId: userAssignedManagedIdentitySeattle.properties.principalId + roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', 'b86a8fe4-44ce-4948-aee5-eccb2c155cd7') + principalType: 'ServicePrincipal' + description: 'Key Vault Secrets Officer' + + } +} + +// Add role assignment for the SPN: Key Vault Secrets Officer +resource roleAssignmentAIOChicago 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid(userAssignedManagedIdentitySeattle.name, resourceGroup().id, 'b86a8fe4-44ce-4948-aee5-eccb2c155cd7') + scope: resourceGroup() + properties: { + principalId: userAssignedManagedIdentityChicago.properties.principalId + roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', 'b86a8fe4-44ce-4948-aee5-eccb2c155cd7') + principalType: 'ServicePrincipal' + description: 'Key Vault Secrets Officer' + + } +} \ No newline at end of file diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index 307618556d..a27d6d2979 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -251,6 +251,7 @@ module keyVault 'data/keyVault.bicep' = { akvNameSite1: akvNameSite1 akvNameSite2: akvNameSite2 location: location + spnObjectId: spnObjectId } } From de939749f8d9ca123832c88c0ed710283fb7a689 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sat, 26 Oct 2024 22:35:15 +0300 Subject: [PATCH 138/409] Refactor OpenAI model deployments in aoai.bicep: Update role assignment for Key Vault Secrets Officer --- .../contoso_hypermarket/bicep/data/keyVault.bicep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep index 5196470c23..1ea0ef2675 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep @@ -111,7 +111,7 @@ resource roleAssignmentAIOSeattle 'Microsoft.Authorization/roleAssignments@2022- // Add role assignment for the SPN: Key Vault Secrets Officer resource roleAssignmentAIOChicago 'Microsoft.Authorization/roleAssignments@2022-04-01' = { - name: guid(userAssignedManagedIdentitySeattle.name, resourceGroup().id, 'b86a8fe4-44ce-4948-aee5-eccb2c155cd7') + name: guid(userAssignedManagedIdentityChicago.name, resourceGroup().id, 'b86a8fe4-44ce-4948-aee5-eccb2c155cd7') scope: resourceGroup() properties: { principalId: userAssignedManagedIdentityChicago.properties.principalId From 75786362d74bad43be1d5291d7e00b5b80a5dd40 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sat, 26 Oct 2024 22:49:00 +0300 Subject: [PATCH 139/409] Refactor OpenAI model deployments in aoai.bicep: Update scenario-specific deployment logic in AgLogonScript.ps1 --- azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 94e7efbc37..6f048bc08e 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -202,7 +202,7 @@ if ($scenario -eq "contoso_supermarket") { Deploy-SupermarketConfigs } -if ($scenario -eq "contoso_motors" -or $scenario -eq "contoso_hypermarket") { +if ($scenario -eq "contoso_motors") { Update-AzureIoTOpsExtension Deploy-AIO if($scenario -eq "contoso_motors"){ @@ -210,6 +210,10 @@ if ($scenario -eq "contoso_motors" -or $scenario -eq "contoso_hypermarket") { } $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray +}elseif($scenario -eq "contoso_hypermarket"){ + Deploy-AIO-Hypermarket + $mqttIpArray=Set-MQTTIpAddress + Deploy-MQTTExplorer -mqttIpArray $mqttIpArray } ############################################################## From 7afc5e7c832a766ec9742f647e77e6a24efeced8 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sat, 26 Oct 2024 22:50:48 +0300 Subject: [PATCH 140/409] Refactor OpenAI model deployments in aoai.bicep: Update scenario-specific deployment logic in AgLogonScript.ps1 --- azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 6f048bc08e..95bf2c9067 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -205,9 +205,7 @@ if ($scenario -eq "contoso_supermarket") { if ($scenario -eq "contoso_motors") { Update-AzureIoTOpsExtension Deploy-AIO - if($scenario -eq "contoso_motors"){ - Deploy-MotorsConfigs - } + Deploy-MotorsConfigs $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray }elseif($scenario -eq "contoso_hypermarket"){ From 67ad3ad3d95538bd2e9236a80ea7eb1c3a3474cd Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sat, 26 Oct 2024 23:52:19 +0300 Subject: [PATCH 141/409] Refactor OpenAI model deployments in aoai.bicep: Comment out unused code in Bootstrap.ps1 and storageAccount.bicep --- .../artifacts/PowerShell/Bootstrap.ps1 | 2 +- .../Modules/contoso_hypermarket.psm1 | 41 +++++++++++++++++-- .../artifacts/kubernetes/K3s/longhorn.yaml | 3 +- .../bicep/storage/storageAccount.bicep | 4 +- 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index b9f84bcda7..26dcff3f2d 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -273,7 +273,7 @@ elseif ($scenario -eq "contoso_hypermarket") { Invoke-WebRequest ($templateBaseUrl + "artifacts/kubernetes/K3s/kubeVipRbac.yml") -OutFile "$AgToolsDir\kubeVipRbac.yml" Invoke-WebRequest ($templateBaseUrl + "artifacts/kubernetes/K3s/kubeVipDaemon.yml") -OutFile "$AgToolsDir\kubeVipDaemon.yml" Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/Bookmarks-contoso-hypermarket") -OutFile "$AgToolsDir\Bookmarks" - Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/mq_cloudConnector.yml") -OutFile "$AgToolsDir\mq_cloudConnector.yml" + #Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/mq_cloudConnector.yml") -OutFile "$AgToolsDir\mq_cloudConnector.yml" Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/mqtt_explorer_settings.json") -OutFile "$AgToolsDir\mqtt_explorer_settings.json" Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-workloads.json") -OutFile "$AgMonitoringDir\grafana-app-workloads.json" Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-pods.json") -OutFile "$AgMonitoringDir\grafana-app-pods.json" diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index d1b5f533db..9e4e6b9fce 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -154,17 +154,20 @@ function Deploy-AIO-Hypermarket { # Create the Schema registry for the cluster Write-Host "[$(Get-Date -Format t)] INFO: Creating the schema registry on the Arc-enabled cluster" -ForegroundColor DarkGray Write-Host "`n" - $schemaId = $(az iot ops schema registry create --name "$arcClusterName-registry" ` + $schemaName = "${clusterName}schema" + $schemaId = $(az iot ops schema registry create --name $schemaName ` --resource-group $resourceGroup ` - --registry-namespace "$arcClusterName-$namingGuid" ` + --registry-namespace "$clusterName-namespace" ` --sa-resource-id $(az storage account show --name $aioStorageAccountName --resource-group $resourceGroup -o tsv --query id) ` --query id -o tsv) + # Initialize the Azure IoT Operations instance on the Arc-enabled cluster + Write-Host "[$(Get-Date -Format t)] INFO: Initialize the Azure IoT Operations instance on the Arc-enabled cluster" -ForegroundColor DarkGray + Write-Host "`n" do { az iot ops init --cluster $arcClusterName.toLower() ` --resource-group $resourceGroup ` --sr-resource-id $schemaId ` - --add-insecure-listener ` --only-show-errors #az iot ops init --cluster $arcClusterName.toLower() -g $resourceGroup --kv-id $keyVaultId --sp-app-id $spnClientId --sp-secret $spnClientSecret --sp-object-id $spnObjectId --mq-service-type loadBalancer --mq-insecure true --simulate-plc false --no-block --only-show-errors if ($? -eq $false) { @@ -175,7 +178,37 @@ function Deploy-AIO-Hypermarket { az iot ops init --cluster $arcClusterName.toLower() ` --resource-group $resourceGroup ` --sr-resource-id $schemaId ` - --add-insecure-listener ` + --only-show-errors + $retryCount++ + } + else { + $aioStatus = "deployed" + } + } until ($aioStatus -eq "deployed" -or $retryCount -eq $maxRetries) + + $retryCount = 0 + $maxRetries = 5 + # Create the Azure IoT Operations instance on the Arc-enabled cluster + Write-Host "[$(Get-Date -Format t)] INFO: Create the Azure IoT Operations instance on the Arc-enabled cluster" -ForegroundColor DarkGray + Write-Host "`n" + do { + az iot ops create --name $arcClusterName.toLower() ` + --cluster $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --add-insecure-listener true ` + --broker-listener-type LoadBalancer ` + --only-show-errors + + if ($? -eq $false) { + $aioStatus = "notDeployed" + Write-Host "`n" + Write-Host "[$(Get-Date -Format t)] Error: An error occured while deploying AIO on the cluster...Retrying" -ForegroundColor DarkRed + Write-Host "`n" + az iot ops create --name $arcClusterName.toLower() ` + --cluster $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --add-insecure-listener true ` + --broker-listener-type LoadBalancer ` --only-show-errors $retryCount++ } diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/longhorn.yaml b/azure_jumpstart_ag/artifacts/kubernetes/K3s/longhorn.yaml index b03ab89440..9ee2eea9d4 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/longhorn.yaml +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/longhorn.yaml @@ -64,7 +64,8 @@ metadata: app.kubernetes.io/version: v1.6.0 data: default-setting.yaml: |- - priority-class: longhorn-critical + default-setting.yaml: |- + default-data-path: /work/longhorn --- # Source: longhorn/templates/storageclass.yaml apiVersion: v1 diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep index 2573095910..4eecd61c11 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep @@ -41,12 +41,12 @@ resource storageQueue 'Microsoft.Storage/storageAccounts/queueServices/queues@20 name: storageQueueName } -resource storageAccountName_default_container 'Microsoft.Storage/storageAccounts/blobServices/containers@2021-04-01' = { +/*resource storageAccountName_default_container 'Microsoft.Storage/storageAccounts/blobServices/containers@2021-04-01' = { name: '${storageAccountName}/default/${stcontainerName}' dependsOn: [ storageAccount ] -} +}*/ // Add role assignment for the SPN: Storage Blob Data Contributor resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { From 609575d3fb47a208e137a3b2bec67562518f8149 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sat, 26 Oct 2024 23:58:53 +0300 Subject: [PATCH 142/409] Refactor OpenAI model deployments in aoai.bicep: Update priority class in longhorn.yaml --- azure_jumpstart_ag/artifacts/kubernetes/K3s/longhorn.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/longhorn.yaml b/azure_jumpstart_ag/artifacts/kubernetes/K3s/longhorn.yaml index 9ee2eea9d4..b03ab89440 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/longhorn.yaml +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/longhorn.yaml @@ -64,8 +64,7 @@ metadata: app.kubernetes.io/version: v1.6.0 data: default-setting.yaml: |- - default-setting.yaml: |- - default-data-path: /work/longhorn + priority-class: longhorn-critical --- # Source: longhorn/templates/storageclass.yaml apiVersion: v1 From dcda35c828cb0e9aed4be9e3c0b60e133de707f2 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sun, 27 Oct 2024 00:06:11 +0300 Subject: [PATCH 143/409] Refactor package dependencies in AgConfig-contoso-hypermarket.psd1 --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 60e0debe15..a2cfd40280 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -93,7 +93,9 @@ 'openssl.light', 'mqtt-explorer', 'gh', - 'python' + 'python', + 'sql-server-management-studio', + 'azure-data-studio' ) # Pip packages list From 6f9e25360606f525deb304a0efe7faaff39f0a49 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sun, 27 Oct 2024 00:07:03 +0300 Subject: [PATCH 144/409] Refactor package dependencies in AgConfig-contoso-hypermarket.psd1: Add ms-mssql.mssql extension --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index a2cfd40280..a3e0f3e357 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -113,7 +113,8 @@ 'esbenp.prettier-vscode', 'ms-kubernetes-tools.vscode-kubernetes-tools', 'mindaro.mindaro', - 'github.vscode-pull-request-github' + 'github.vscode-pull-request-github', + 'ms-mssql.mssql' ) # Git branches From d29aba50f2130c3e0b1db1b01b822d77f2d91e82 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Sat, 26 Oct 2024 17:28:43 -0400 Subject: [PATCH 145/409] Update script.kql --- .../contoso_hypermarket/bicep/data/script.kql | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql index eb4b15e25e..9b599864b4 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql @@ -25,7 +25,7 @@ .drop table sales ifexists // Create sales table -.create table sales (sale_date:datetime, store_id:string, sale_id:string, sale_line_items:dynamic, sale_total:real, payment_method: string, customer_id:string, register_id: string) +.create table sales (sale_id:string, sale_date:datetime, store_id:string, product_id:string, price: real, discount: discount, quantity:int, item_total:real, profit: real, payment_method: string, customer_id:string, register_id: string) // Create function to expand sales data .create-or-alter function expand_sales_data() @@ -34,11 +34,15 @@ | where subject == "topic/sales" | extend data = parse_json(event_data) | project + sale_id = tostring(data.sale_id), sale_date = todatetime(data.sale_date), store_id = tostring(data.store_id), - sale_id = tostring(data.sale_id), - sale_line_items = data.sale_line_items, - sale_total = toreal(data.sale_total), + product_id = tostring(data.product_id), + price = toreal(data.price), + discount = toreal(data.discount) + quantity = toint(data.quantity), + item_total = toreal(data.item_total), + profit = toreal(data.profit) payment_method = tostring(data.payment_method), customer_id = tostring(data.customer_id), register_id = tostring(data.register_id) From 7626b1e3915fd97b60b77d917e6cf039c00fe0a4 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sun, 27 Oct 2024 01:06:27 +0300 Subject: [PATCH 146/409] Refactor OpenAI model deployments in aoai.bicep: Update scenario-specific deployment logic in AgLogonScript.ps1, common.psm1, and contoso_hypermarket.psm1 --- .../artifacts/PowerShell/AgLogonScript.ps1 | 2 +- .../artifacts/PowerShell/Modules/common.psm1 | 14 +++++++++++--- .../PowerShell/Modules/contoso_hypermarket.psm1 | 7 +++++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 95bf2c9067..ee6174f67c 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -51,7 +51,7 @@ if ($scenario -eq "contoso_supermarket") { $global:stcontainerName = $Env:stcontainerName }elseif ($scenario -eq "contoso_hypermarket"){ $global:aioNamespace = "azure-iot-operations" - $global:mqListenerService = "aio-mq-dmqtt-frontend" + $global:mqListenerService = "aio-broker" $global:mqttExplorerReleasesUrl = $websiteUrls["mqttExplorerReleases"] $global:stagingStorageAccountName = $Env:stagingStorageAccountName $global:aioStorageAccountName = $Env:aioStorageAccountName diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index b1f29c7349..24783795f9 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -1351,9 +1351,17 @@ function Set-MQTTIpAddress { do { $mqttIp = kubectl get service $mqListenerService -n $aioNamespace -o jsonpath="{.status.loadBalancer.ingress[0].ip}" $services = kubectl get pods -n $aioNamespace -o json | ConvertFrom-Json - $matchingServices = $services.items | Where-Object { - $_.metadata.name -match "aio-mq-dmqtt" -and - $_.status.phase -notmatch "running" + if($scenario -ne 'contoso_hypermarket'){ + $matchingServices = $services.items | Where-Object { + $_.metadata.name -match "aio-mq-dmqtt" -and + $_.status.phase -notmatch "running" + } + } + else{ + $matchingServices = $services.items | Where-Object { + $_.metadata.name -match "aio-operator" -and + $_.status.phase -notmatch "Running" + } } Write-Host "[$(Get-Date -Format t)] INFO: Waiting for MQTT services to initialize and the service Ip address to be assigned...Waiting for 20 seconds" -ForegroundColor DarkGray Start-Sleep -Seconds 20 diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 9e4e6b9fce..a58a28293c 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -195,7 +195,6 @@ function Deploy-AIO-Hypermarket { az iot ops create --name $arcClusterName.toLower() ` --cluster $arcClusterName.toLower() ` --resource-group $resourceGroup ` - --add-insecure-listener true ` --broker-listener-type LoadBalancer ` --only-show-errors @@ -207,7 +206,6 @@ function Deploy-AIO-Hypermarket { az iot ops create --name $arcClusterName.toLower() ` --cluster $arcClusterName.toLower() ` --resource-group $resourceGroup ` - --add-insecure-listener true ` --broker-listener-type LoadBalancer ` --only-show-errors $retryCount++ @@ -219,6 +217,11 @@ function Deploy-AIO-Hypermarket { # Configure the Azure IoT Operations instance for secret synchronization $userAssignedMIResourceId = (az identity show -g $resourceGroup -n "aio-$clusterName-identity" --query id -o tsv --only-show-errors) + # Enable OIDC issuer and workload identity on the Arc-enabled cluster + az connectedk8s update -n $arcClusterName ` + --resource-group $resourceGroup ` + --enable-oidc-issuer ` + --enable-workload-identity Write-Host "[$(Get-Date -Format t)] INFO: Assigning the user-assigned managed identity to the Azure IoT Operations instance" -ForegroundColor DarkGray Write-Host "`n" From 802a95d8dd0bd1b24ec82b98ea6d2da5a453b3ee Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Sat, 26 Oct 2024 18:13:06 -0400 Subject: [PATCH 147/409] Update contoso_hypermarket.psm1 --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 0e0b198b4f..1dafc847b0 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -133,6 +133,7 @@ function Set-MicrosoftFabric { $fabricFolder = $AgConfig.AgDirectories["AgFabric"] $runFabricSetupAs = $AgConfig.FabricConfig["RunFabricSetupAs"] $fabricConfigFile = "$fabricFolder\fabric-config.json" + $eventHubKeyName = $AgConfig.FabricConfig["EventHubSharedAccessKeyName"] # Get Fabric capacity name from the resource group $fabricCapacityName = (az fabric capacity list --resource-group $Env:resourceGroup --query "[0].name" -o tsv) @@ -164,7 +165,7 @@ function Set-MicrosoftFabric { "fabricCapacityName": "$fabricCapacityName", "templateBaseUrl": "$Env:templateBaseUrl", "fabricWorkspaceName": "$fabricWorkspaceName", - "eventHubKeyName": "$AgConfig.FabricConfig["EventHubSharedAccessKeyName"]" + "eventHubKeyName": "$eventHubKeyName" } "@ From aeaffdc55e9dc5b7944fa532182b5b801e6c82e1 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Sat, 26 Oct 2024 18:23:07 -0400 Subject: [PATCH 148/409] Update script.kql --- .../contoso_hypermarket/bicep/data/script.kql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql index 9b599864b4..58f81524cb 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql @@ -25,7 +25,7 @@ .drop table sales ifexists // Create sales table -.create table sales (sale_id:string, sale_date:datetime, store_id:string, product_id:string, price: real, discount: discount, quantity:int, item_total:real, profit: real, payment_method: string, customer_id:string, register_id: string) +.create table sales (sale_id:string, sale_date:datetime, store_id:string, product_id:string, price:real, discount:real, quantity:int, item_total:real, profit:real, payment_method: string, customer_id:string, register_id: string) // Create function to expand sales data .create-or-alter function expand_sales_data() @@ -39,10 +39,10 @@ store_id = tostring(data.store_id), product_id = tostring(data.product_id), price = toreal(data.price), - discount = toreal(data.discount) + discount = toreal(data.discount), quantity = toint(data.quantity), item_total = toreal(data.item_total), - profit = toreal(data.profit) + profit = toreal(data.profit), payment_method = tostring(data.payment_method), customer_id = tostring(data.customer_id), register_id = tostring(data.register_id) From 4d984ebaf6b37940f2b2b2e86f26c3fcacd5b494 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sun, 27 Oct 2024 09:43:37 +0300 Subject: [PATCH 149/409] Refactor OpenAI model deployments in aoai.bicep: Remove unused code in Bootstrap.ps1 and storageAccount.bicep --- .../artifacts/PowerShell/AgLogonScript.ps1 | 2 -- azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 | 2 -- .../contoso_hypermarket/bicep/clientVm/clientVm.bicep | 5 +---- .../contoso_hypermarket/bicep/main.bicep | 7 +------ .../bicep/storage/storageAccount.bicep | 10 ---------- .../contoso_motors/bicep/clientVm/clientVm.bicep | 5 +---- azure_jumpstart_ag/contoso_motors/bicep/main.azd.bicep | 5 ----- azure_jumpstart_ag/contoso_motors/bicep/main.bicep | 5 ----- .../contoso_motors/bicep/storage/storageAccount.bicep | 10 ---------- 9 files changed, 3 insertions(+), 48 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index ee6174f67c..c0071b2846 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -48,7 +48,6 @@ if ($scenario -eq "contoso_supermarket") { $global:stagingStorageAccountName = $Env:stagingStorageAccountName $global:aioStorageAccountName = $Env:aioStorageAccountName $global:spnObjectId = $Env:spnObjectId - $global:stcontainerName = $Env:stcontainerName }elseif ($scenario -eq "contoso_hypermarket"){ $global:aioNamespace = "azure-iot-operations" $global:mqListenerService = "aio-broker" @@ -58,7 +57,6 @@ if ($scenario -eq "contoso_supermarket") { $global:k3sArcDataClusterName = $Env:k3sArcDataClusterName $global:k3sArcClusterName = $Env:k3sArcClusterName $global:spnObjectId = $Env:spnObjectId - $global:stcontainerName = $Env:stcontainerName $global:openAIEndpoint = $Env:openAIEndpoint $global:speachToTextEndpoint = $Env:speachToTextEndpoint } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 26dcff3f2d..1ee4527277 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -27,7 +27,6 @@ param ( [string]$scenario, [string]$customLocationRPOID, [string]$aioStorageAccountName, - [string]$stcontainerName, [string]$k3sArcClusterName, [string]$k3sArcDataClusterName, [string]$openAIEndpoint, @@ -69,7 +68,6 @@ param ( [System.Environment]::SetEnvironmentVariable('scenario', $scenario, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('customLocationRPOID', $customLocationRPOID, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('aioStorageAccountName', $aioStorageAccountName, [System.EnvironmentVariableTarget]::Machine) -[System.Environment]::SetEnvironmentVariable('stcontainerName', $stcontainerName, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('k3sArcClusterName', $k3sArcClusterName, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('k3sArcDataClusterName', $k3sArcDataClusterName, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('openAIEndpoint', $openAIEndpoint, [System.EnvironmentVariableTarget]::Machine) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep index 24587afc66..334c432c88 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep @@ -54,9 +54,6 @@ param deployBastion bool = false @description('Storage account used for staging file artifacts') param storageAccountName string -@description('The name of ESA container in Storage Account') -param stcontainerName string - @description('The login server name of the Azure Container Registry') param acrName string @@ -207,7 +204,7 @@ resource vmBootstrap 'Microsoft.Compute/virtualMachines/extensions@2022-11-01' = fileUris: [ uri(templateBaseUrl, 'artifacts/PowerShell/Bootstrap.ps1') ] - commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnObjectId ${spnObjectId} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -acrName ${acrName} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName} -stcontainerName ${stcontainerName} -k3sArcClusterName ${k3sArcClusterName} -k3sArcDataClusterName ${k3sArcDataClusterName} -openAIEndpoint ${openAIEndpoint} -speachToTextEndpoint ${speachToTextEndpoint}' + commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnObjectId ${spnObjectId} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -acrName ${acrName} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName} -k3sArcClusterName ${k3sArcClusterName} -k3sArcDataClusterName ${k3sArcDataClusterName} -openAIEndpoint ${openAIEndpoint} -speachToTextEndpoint ${speachToTextEndpoint}' } } } diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index a27d6d2979..e52428fc89 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -37,7 +37,7 @@ param logAnalyticsWorkspaceName string = 'Ag-Workspace-${namingGuid}' param githubAccount string = 'sebassem' @description('Target GitHub branch') -param githubBranch string = 'agora_hypermarket' +param githubBranch string = 'agora_aio_latest' @description('Choice to deploy Bastion to connect to the client VM') param deployBastion bool = false @@ -69,9 +69,6 @@ param fabricCapacityAdmin string @description('Name of the storage account') param aioStorageAccountName string = 'aiostg${namingGuid}' -@description('The name of ESA container in Storage Account') -param stcontainerName string = 'esacontainer' - @description('The custom location RPO ID') param customLocationRPOID string @@ -228,7 +225,6 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { scenario: scenario customLocationRPOID: customLocationRPOID spnObjectId: spnObjectId - stcontainerName: stcontainerName k3sArcClusterName: k3sArcClusterName k3sArcDataClusterName: k3sArcDataClusterName openAIEndpoint: azureOpenAI.outputs.openAIEndpoint @@ -261,7 +257,6 @@ module storageAccount 'storage/storageAccount.bicep' = { storageAccountName: aioStorageAccountName location: location storageQueueName: storageQueueName - stcontainerName: stcontainerName spnObjectId: spnObjectId } } diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep index 4eecd61c11..546b7df08f 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep @@ -12,9 +12,6 @@ param skuName string = 'Standard_LRS' param storageQueueName string = 'aioQueue' -@description('The name of ESA container in Storage Account') -param stcontainerName string - @description('Azure service principal object id') param spnObjectId string @@ -41,13 +38,6 @@ resource storageQueue 'Microsoft.Storage/storageAccounts/queueServices/queues@20 name: storageQueueName } -/*resource storageAccountName_default_container 'Microsoft.Storage/storageAccounts/blobServices/containers@2021-04-01' = { - name: '${storageAccountName}/default/${stcontainerName}' - dependsOn: [ - storageAccount - ] -}*/ - // Add role assignment for the SPN: Storage Blob Data Contributor resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { name: guid(spnObjectId, resourceGroup().id, 'ba92f5b4-2d11-453d-a403-e96b0029c9fe') diff --git a/azure_jumpstart_ag/contoso_motors/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_motors/bicep/clientVm/clientVm.bicep index 3e9be93c56..930bdd1538 100644 --- a/azure_jumpstart_ag/contoso_motors/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_motors/bicep/clientVm/clientVm.bicep @@ -54,9 +54,6 @@ param deployBastion bool = false @description('Storage account used for staging file artifacts') param storageAccountName string -@description('The name of ESA container in Storage Account') -param stcontainerName string - @description('The login server name of the Azure Container Registry') param acrName string @@ -199,7 +196,7 @@ resource vmBootstrap 'Microsoft.Compute/virtualMachines/extensions@2022-11-01' = fileUris: [ uri(templateBaseUrl, 'artifacts/PowerShell/Bootstrap.ps1') ] - commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnObjectId ${spnObjectId} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -acrName ${acrName} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -adxClusterName ${adxClusterName} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName} -stcontainerName ${stcontainerName}' + commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnObjectId ${spnObjectId} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -acrName ${acrName} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -adxClusterName ${adxClusterName} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName}' } } } diff --git a/azure_jumpstart_ag/contoso_motors/bicep/main.azd.bicep b/azure_jumpstart_ag/contoso_motors/bicep/main.azd.bicep index 4b62046e9b..e4234c81d5 100644 --- a/azure_jumpstart_ag/contoso_motors/bicep/main.azd.bicep +++ b/azure_jumpstart_ag/contoso_motors/bicep/main.azd.bicep @@ -81,9 +81,6 @@ param akvNameSite2 string = 'agakv2${namingGuid}' @description('Name of the storage account') param aioStorageAccountName string = 'aiostg${namingGuid}' -@description('The name of ESA container in Storage Account') -param stcontainerName string = 'esacontainer' - @description('The name of the Azure Data Explorer cluster') param adxClusterName string = 'agadx${namingGuid}' @@ -157,7 +154,6 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { adxClusterName: adxClusterName customLocationRPOID: customLocationRPOID scenario: scenario - stcontainerName: stcontainerName } } @@ -178,7 +174,6 @@ module storageAccount 'storage/storageAccount.bicep' = { storageAccountName: aioStorageAccountName location: location storageQueueName: storageQueueName - stcontainerName: stcontainerName } } diff --git a/azure_jumpstart_ag/contoso_motors/bicep/main.bicep b/azure_jumpstart_ag/contoso_motors/bicep/main.bicep index dc593e32dc..4ab212c57f 100644 --- a/azure_jumpstart_ag/contoso_motors/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_motors/bicep/main.bicep @@ -72,9 +72,6 @@ param stagingDataCGName string = 'mqttdataemulator' @description('Name of the storage account') param aioStorageAccountName string = 'aiostg${namingGuid}' -@description('The name of ESA container in Storage Account') -param stcontainerName string = 'esacontainer' - @description('The name of the Azure Data Explorer cluster') param adxClusterName string = 'agadx${namingGuid}' @@ -145,7 +142,6 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { customLocationRPOID: customLocationRPOID scenario: scenario aioStorageAccountName: aioStorageAccountName - stcontainerName: stcontainerName } } @@ -165,7 +161,6 @@ module storageAccount 'storage/storageAccount.bicep' = { storageAccountName: aioStorageAccountName location: location storageQueueName: storageQueueName - stcontainerName: stcontainerName } } diff --git a/azure_jumpstart_ag/contoso_motors/bicep/storage/storageAccount.bicep b/azure_jumpstart_ag/contoso_motors/bicep/storage/storageAccount.bicep index 35d095bce9..baa298048b 100644 --- a/azure_jumpstart_ag/contoso_motors/bicep/storage/storageAccount.bicep +++ b/azure_jumpstart_ag/contoso_motors/bicep/storage/storageAccount.bicep @@ -12,9 +12,6 @@ param skuName string = 'Standard_LRS' param storageQueueName string = 'aioQueue' -@description('The name of ESA container in Storage Account') -param stcontainerName string - resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = { name: storageAccountName location: location @@ -37,12 +34,5 @@ resource storageQueue 'Microsoft.Storage/storageAccounts/queueServices/queues@20 name: storageQueueName } -resource storageAccountName_default_container 'Microsoft.Storage/storageAccounts/blobServices/containers@2021-04-01' = { - name: '${storageAccountName}/default/${stcontainerName}' - dependsOn: [ - storageAccount - ] -} - output queueName string = storageQueueName output storageAccountId string = storageAccount.id From 160c40d34b164e5ea9d55098ffa23772db4679a2 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sun, 27 Oct 2024 09:44:20 +0300 Subject: [PATCH 150/409] Refactor OpenAI model deployments in aoai.bicep: Update target GitHub account and branch in main.bicep --- azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index e52428fc89..50630a5ba2 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -34,10 +34,10 @@ param sshRSAPublicKey string param logAnalyticsWorkspaceName string = 'Ag-Workspace-${namingGuid}' @description('Target GitHub account') -param githubAccount string = 'sebassem' +param githubAccount string = 'microsoft' @description('Target GitHub branch') -param githubBranch string = 'agora_aio_latest' +param githubBranch string = 'agora_2.0' @description('Choice to deploy Bastion to connect to the client VM') param deployBastion bool = false From 74b0b6f34e26500b244ca700146cd304dab6707c Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sun, 27 Oct 2024 09:48:18 +0300 Subject: [PATCH 151/409] Refactor OpenAI model deployments in aoai.bicep: Update scenario-specific deployment logic in AgLogonScript.ps1 and contoso_hypermarket.psm1 --- azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 | 2 +- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index c0071b2846..ab46ca184d 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -207,7 +207,7 @@ if ($scenario -eq "contoso_motors") { $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray }elseif($scenario -eq "contoso_hypermarket"){ - Deploy-AIO-Hypermarket + Deploy-AIO-M2 $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index a58a28293c..88777b1f61 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -126,7 +126,7 @@ function Set-K3sClusters { } } -function Deploy-AIO-Hypermarket { +function Deploy-AIO-M2 { Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the clusters" -ForegroundColor DarkGray Write-Host "`n" $kvIndex = 0 From b68b4b08ba12c2ef084acce90f0b33e17d92e5e6 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sun, 27 Oct 2024 10:38:39 +0300 Subject: [PATCH 152/409] test for-each parallel --- .../Modules/contoso_hypermarket.psm1 | 119 +++++++++++++++++- 1 file changed, 118 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 88777b1f61..8611a9bdbc 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -130,8 +130,16 @@ function Deploy-AIO-M2 { Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the clusters" -ForegroundColor DarkGray Write-Host "`n" $kvIndex = 0 - foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + $AgConfig.SiteConfig.GetEnumerator()| Foreach-Object -ThrottleLimit 5 -Parallel { + $cluster = $_ + $AgConfig = $using:AgConfig $clusterName = $cluster.Name.ToLower() + $namingGuid = $using:namingGuid + $kvIndex = $using:kvIndex + $resourceGroup = $using:resourceGroup + $customLocationRPOID = $using:customLocationRPOID + $aioStorageAccountName = $using:aioStorageAccountName + Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the $clusterName cluster" -ForegroundColor Gray Write-Host "`n" kubectx $clusterName @@ -239,4 +247,113 @@ function Deploy-AIO-M2 { $kvIndex++ } + <#foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + $clusterName = $cluster.Name.ToLower() + Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the $clusterName cluster" -ForegroundColor Gray + Write-Host "`n" + kubectx $clusterName + $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" + $keyVaultId = (az keyvault list -g $resourceGroup --resource-type vault --query "[$kvIndex].id" -o tsv) + $retryCount = 0 + $maxRetries = 5 + $aioStatus = "notDeployed" + + # Enable custom locations on the Arc-enabled cluster + Write-Host "[$(Get-Date -Format t)] INFO: Enabling custom locations on the Arc-enabled cluster" -ForegroundColor DarkGray + Write-Host "`n" + az config set extension.use_dynamic_install=yes_without_prompt + az connectedk8s enable-features --name $arcClusterName ` + --resource-group $resourceGroup ` + --features cluster-connect custom-locations ` + --custom-locations-oid $customLocationRPOID ` + --only-show-errors + + # Create the Schema registry for the cluster + Write-Host "[$(Get-Date -Format t)] INFO: Creating the schema registry on the Arc-enabled cluster" -ForegroundColor DarkGray + Write-Host "`n" + $schemaName = "${clusterName}schema" + $schemaId = $(az iot ops schema registry create --name $schemaName ` + --resource-group $resourceGroup ` + --registry-namespace "$clusterName-namespace" ` + --sa-resource-id $(az storage account show --name $aioStorageAccountName --resource-group $resourceGroup -o tsv --query id) ` + --query id -o tsv) + + # Initialize the Azure IoT Operations instance on the Arc-enabled cluster + Write-Host "[$(Get-Date -Format t)] INFO: Initialize the Azure IoT Operations instance on the Arc-enabled cluster" -ForegroundColor DarkGray + Write-Host "`n" + do { + az iot ops init --cluster $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --sr-resource-id $schemaId ` + --only-show-errors + #az iot ops init --cluster $arcClusterName.toLower() -g $resourceGroup --kv-id $keyVaultId --sp-app-id $spnClientId --sp-secret $spnClientSecret --sp-object-id $spnObjectId --mq-service-type loadBalancer --mq-insecure true --simulate-plc false --no-block --only-show-errors + if ($? -eq $false) { + $aioStatus = "notDeployed" + Write-Host "`n" + Write-Host "[$(Get-Date -Format t)] Error: An error occured while deploying AIO on the cluster...Retrying" -ForegroundColor DarkRed + Write-Host "`n" + az iot ops init --cluster $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --sr-resource-id $schemaId ` + --only-show-errors + $retryCount++ + } + else { + $aioStatus = "deployed" + } + } until ($aioStatus -eq "deployed" -or $retryCount -eq $maxRetries) + + $retryCount = 0 + $maxRetries = 5 + # Create the Azure IoT Operations instance on the Arc-enabled cluster + Write-Host "[$(Get-Date -Format t)] INFO: Create the Azure IoT Operations instance on the Arc-enabled cluster" -ForegroundColor DarkGray + Write-Host "`n" + do { + az iot ops create --name $arcClusterName.toLower() ` + --cluster $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --broker-listener-type LoadBalancer ` + --only-show-errors + + if ($? -eq $false) { + $aioStatus = "notDeployed" + Write-Host "`n" + Write-Host "[$(Get-Date -Format t)] Error: An error occured while deploying AIO on the cluster...Retrying" -ForegroundColor DarkRed + Write-Host "`n" + az iot ops create --name $arcClusterName.toLower() ` + --cluster $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --broker-listener-type LoadBalancer ` + --only-show-errors + $retryCount++ + } + else { + $aioStatus = "deployed" + } + } until ($aioStatus -eq "deployed" -or $retryCount -eq $maxRetries) + + # Configure the Azure IoT Operations instance for secret synchronization + $userAssignedMIResourceId = (az identity show -g $resourceGroup -n "aio-$clusterName-identity" --query id -o tsv --only-show-errors) + # Enable OIDC issuer and workload identity on the Arc-enabled cluster + az connectedk8s update -n $arcClusterName ` + --resource-group $resourceGroup ` + --enable-oidc-issuer ` + --enable-workload-identity + + Write-Host "[$(Get-Date -Format t)] INFO: Assigning the user-assigned managed identity to the Azure IoT Operations instance" -ForegroundColor DarkGray + Write-Host "`n" + az iot ops identity assign --name $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --mi-user-assigned $userAssignedMIResourceId + + Write-Host "[$(Get-Date -Format t)] INFO: Configure the Azure IoT Operations instance for secret synchronization" -ForegroundColor DarkGray + Write-Host "`n" + az iot ops secretsync enable --name $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --mi-user-assigned $userAssignedMIResourceId ` + --kv-resource-id $keyVaultId ` + --only-show-errors + + $kvIndex++ + }#> } \ No newline at end of file From 8b1b3e440fa98aba2dcb6af043e0de6708de02cb Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sun, 27 Oct 2024 11:02:29 +0300 Subject: [PATCH 153/409] Refactor Azure IoT Operations instance configuration in contoso_hypermarket.psm1 --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 8611a9bdbc..1526263b16 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -333,6 +333,8 @@ function Deploy-AIO-M2 { } until ($aioStatus -eq "deployed" -or $retryCount -eq $maxRetries) # Configure the Azure IoT Operations instance for secret synchronization + Write-Host "[$(Get-Date -Format t)] INFO: Configuring the Azure IoT Operations instance for secret synchronization" -ForegroundColor DarkGray + Write-Host "`n" $userAssignedMIResourceId = (az identity show -g $resourceGroup -n "aio-$clusterName-identity" --query id -o tsv --only-show-errors) # Enable OIDC issuer and workload identity on the Arc-enabled cluster az connectedk8s update -n $arcClusterName ` From 01408a55e53fbbbf21d5d3fb02107442e7602a37 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sun, 27 Oct 2024 11:57:06 +0300 Subject: [PATCH 154/409] Refactor Azure IoT Operations instance configuration in contoso_hypermarket.psm1 --- .../Modules/contoso_hypermarket.psm1 | 378 ++++++------------ 1 file changed, 130 insertions(+), 248 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 1526263b16..417172d762 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -1,145 +1,136 @@ -function Get-K3sConfigFile{ - # Downloading k3s Kubernetes cluster kubeconfig file - Write-Host "Downloading k3s Kubeconfigs" - $Env:AZCOPY_AUTO_LOGIN_TYPE="PSCRED" - foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { - $clusterName = $cluster.Name.ToLower() - $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" - $containerName = $arcClusterName.toLower() - $sourceFile = "https://$stagingStorageAccountName.blob.core.windows.net/$containerName/config" - azcopy copy $sourceFile "C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" --check-length=false - $sourceFile = "https://$stagingStorageAccountName.blob.core.windows.net/$containerName/*" - azcopy cp --check-md5 FailIfDifferentOrMissing $sourceFile "$AgLogsDir\" --include-pattern "*.log" - } +function Get-K3sConfigFile { + # Downloading k3s Kubernetes cluster kubeconfig file + Write-Host "Downloading k3s Kubeconfigs" + $Env:AZCOPY_AUTO_LOGIN_TYPE = "PSCRED" + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + $clusterName = $cluster.Name.ToLower() + $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" + $containerName = $arcClusterName.toLower() + $sourceFile = "https://$stagingStorageAccountName.blob.core.windows.net/$containerName/config" + azcopy copy $sourceFile "C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" --check-length=false + $sourceFile = "https://$stagingStorageAccountName.blob.core.windows.net/$containerName/*" + azcopy cp --check-md5 FailIfDifferentOrMissing $sourceFile "$AgLogsDir\" --include-pattern "*.log" + } } -function Merge-K3sConfigFiles{ +function Merge-K3sConfigFiles { -$mergedKubeconfigPath = "C:\Users\$adminUsername\.kube\config" + $mergedKubeconfigPath = "C:\Users\$adminUsername\.kube\config" -$kubeconfig1Path = "C:\Users\$adminUsername\.kube\ag-k3s-seattle" -$kubeconfig2Path = "C:\Users\$adminUsername\.kube\ag-k3s-chicago" + $kubeconfig1Path = "C:\Users\$adminUsername\.kube\ag-k3s-seattle" + $kubeconfig2Path = "C:\Users\$adminUsername\.kube\ag-k3s-chicago" -# Extract base file names (without extensions) to use as new names -$suffix1 = [System.IO.Path]::GetFileNameWithoutExtension($kubeconfig1Path) -$suffix2 = [System.IO.Path]::GetFileNameWithoutExtension($kubeconfig2Path) + # Extract base file names (without extensions) to use as new names + $suffix1 = [System.IO.Path]::GetFileNameWithoutExtension($kubeconfig1Path) + $suffix2 = [System.IO.Path]::GetFileNameWithoutExtension($kubeconfig2Path) -# Load the kubeconfig files, ensuring no empty lines or structures -$kubeconfig1 = get-content $kubeconfig1Path | ConvertFrom-Yaml -$kubeconfig2 = get-content $kubeconfig2Path | ConvertFrom-Yaml + # Load the kubeconfig files, ensuring no empty lines or structures + $kubeconfig1 = get-content $kubeconfig1Path | ConvertFrom-Yaml + $kubeconfig2 = get-content $kubeconfig2Path | ConvertFrom-Yaml -# Function to replace cluster, user, and context names with the file name, while keeping original server addresses -function Set-NamesWithFileName { - param ( - [hashtable]$kubeconfigData, - [string]$newName - ) + # Function to replace cluster, user, and context names with the file name, while keeping original server addresses + function Set-NamesWithFileName { + param ( + [hashtable]$kubeconfigData, + [string]$newName + ) - # Replace cluster names but keep the server addresses - foreach ($cluster in $kubeconfigData.clusters) { - if ($cluster.name -and $cluster.cluster.server) { - $cluster.name = "$newName" + # Replace cluster names but keep the server addresses + foreach ($cluster in $kubeconfigData.clusters) { + if ($cluster.name -and $cluster.cluster.server) { + $cluster.name = "$newName" + } } - } - # Replace user names - foreach ($user in $kubeconfigData.users) { - if ($user.name) { - $user.name = "$newName" + # Replace user names + foreach ($user in $kubeconfigData.users) { + if ($user.name) { + $user.name = "$newName" + } } - } - # Replace context names, but retain the correct mapping to cluster and user - foreach ($context in $kubeconfigData.contexts) { - if ($context.name -and $context.context.cluster -and $context.context.user) { - $context.name = "$newName" - $context.context.cluster = "$newName" - $context.context.user = "$newName" + # Replace context names, but retain the correct mapping to cluster and user + foreach ($context in $kubeconfigData.contexts) { + if ($context.name -and $context.context.cluster -and $context.context.user) { + $context.name = "$newName" + $context.context.cluster = "$newName" + $context.context.user = "$newName" + } } - } - return $kubeconfigData -} + return $kubeconfigData + } -# Apply renaming using file names -$kubeconfig1 = Set-NamesWithFileName -kubeconfigData $kubeconfig1 -newName $suffix1 -$kubeconfig2 = Set-NamesWithFileName -kubeconfigData $kubeconfig2 -newName $suffix2 - -# Merge the clusters, users, and contexts from both kubeconfigs -$mergedClusters = $kubeconfig1.clusters + $kubeconfig2.clusters -$mergedUsers = $kubeconfig1.users + $kubeconfig2.users -$mergedContexts = $kubeconfig1.contexts + $kubeconfig2.contexts - -# Prepare the merged kubeconfig ensuring no empty or null fields -$mergedKubeconfig = @{ - apiVersion = $kubeconfig1.apiVersion - kind = $kubeconfig1.kind - clusters = $mergedClusters | Where-Object { $_.name -and $_.cluster.server } - users = $mergedUsers | Where-Object { $_.name } - contexts = $mergedContexts | Where-Object { $_.name -and $_.context.cluster -and $_.context.user } - "current-context" = $kubeconfig1."current-context" # Retain the current context of the first file -} + # Apply renaming using file names + $kubeconfig1 = Set-NamesWithFileName -kubeconfigData $kubeconfig1 -newName $suffix1 + $kubeconfig2 = Set-NamesWithFileName -kubeconfigData $kubeconfig2 -newName $suffix2 + + # Merge the clusters, users, and contexts from both kubeconfigs + $mergedClusters = $kubeconfig1.clusters + $kubeconfig2.clusters + $mergedUsers = $kubeconfig1.users + $kubeconfig2.users + $mergedContexts = $kubeconfig1.contexts + $kubeconfig2.contexts + + # Prepare the merged kubeconfig ensuring no empty or null fields + $mergedKubeconfig = @{ + apiVersion = $kubeconfig1.apiVersion + kind = $kubeconfig1.kind + clusters = $mergedClusters | Where-Object { $_.name -and $_.cluster.server } + users = $mergedUsers | Where-Object { $_.name } + contexts = $mergedContexts | Where-Object { $_.name -and $_.context.cluster -and $_.context.user } + "current-context" = $kubeconfig1."current-context" # Retain the current context of the first file + } -# Convert the merged data back to YAML and save to a new file -$mergedKubeconfig | ConvertTo-Yaml | Set-Content -Path $mergedKubeconfigPath + # Convert the merged data back to YAML and save to a new file + $mergedKubeconfig | ConvertTo-Yaml | Set-Content -Path $mergedKubeconfigPath -Write-Host "Kubeconfig files successfully merged into $mergedKubeconfigPath" -kubectx seattle="ag-k3s-seattle" -kubectx chicago="ag-k3s-chicago" + Write-Host "Kubeconfig files successfully merged into $mergedKubeconfigPath" + kubectx seattle="ag-k3s-seattle" + kubectx chicago="ag-k3s-chicago" } function Set-K3sClusters { - Write-Host "Configuring kube-vip on K3s clusters" - az login --service-principal --username $Env:spnClientID --password=$Env:spnClientSecret --tenant $Env:spnTenantId - az account set -s $subscriptionId - foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { - if ($cluster.Value.Type -eq "k3s") { - $clusterName = $cluster.Value.FriendlyName.ToLower() - $vmName = $cluster.Value.ArcClusterName + "-$namingGuid" - kubectx $clusterName - $k3sVIP = $(az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``true``].privateIPAddress" -otsv) - Write-Host "Assigning kube-vip-role on k3s cluster" - $kubeVipRbac = "$($Agconfig.AgDirectories.AgToolsDir)\kubeVipRbac.yml" - kubectl apply -f $kubeVipRbac - - $kubeVipDaemonset = "$($Agconfig.AgDirectories.AgToolsDir)\kubeVipDaemon.yml" + Write-Host "Configuring kube-vip on K3s clusters" + az login --service-principal --username $Env:spnClientID --password=$Env:spnClientSecret --tenant $Env:spnTenantId + az account set -s $subscriptionId + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + if ($cluster.Value.Type -eq "k3s") { + $clusterName = $cluster.Value.FriendlyName.ToLower() + $vmName = $cluster.Value.ArcClusterName + "-$namingGuid" + kubectx $clusterName + $k3sVIP = $(az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``true``].privateIPAddress" -otsv) + Write-Host "Assigning kube-vip-role on k3s cluster" + $kubeVipRbac = "$($Agconfig.AgDirectories.AgToolsDir)\kubeVipRbac.yml" + kubectl apply -f $kubeVipRbac + + $kubeVipDaemonset = "$($Agconfig.AgDirectories.AgToolsDir)\kubeVipDaemon.yml" (Get-Content -Path $kubeVipDaemonset) -replace 'k3sVIPPlaceholder', "$k3sVIP" | Set-Content -Path $kubeVipDaemonset - kubectl apply -f $kubeVipDaemonset + kubectl apply -f $kubeVipDaemonset - Write-Host "Deploying Kube vip cloud controller on k3s cluster" - kubectl apply -f https://raw.githubusercontent.com/kube-vip/kube-vip-cloud-provider/main/manifest/kube-vip-cloud-controller.yaml + Write-Host "Deploying Kube vip cloud controller on k3s cluster" + kubectl apply -f https://raw.githubusercontent.com/kube-vip/kube-vip-cloud-provider/main/manifest/kube-vip-cloud-controller.yaml - $serviceIpRange = $(az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``false``].privateIPAddress" -otsv) - $sortedIps = $serviceIpRange | Sort-Object {[System.Version]$_} - $lowestServiceIp = $sortedIps[0] - $highestServiceIp = $sortedIps[-1] + $serviceIpRange = $(az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``false``].privateIPAddress" -otsv) + $sortedIps = $serviceIpRange | Sort-Object { [System.Version]$_ } + $lowestServiceIp = $sortedIps[0] + $highestServiceIp = $sortedIps[-1] - kubectl create configmap -n kube-system kubevip --from-literal range-global=$lowestServiceIp-$highestServiceIp - Start-Sleep -Seconds 30 + kubectl create configmap -n kube-system kubevip --from-literal range-global=$lowestServiceIp-$highestServiceIp + Start-Sleep -Seconds 30 - Write-Host "Creating longhorn storage on K3scluster" - kubectl apply -f "$($Agconfig.AgDirectories.AgToolsDir)\longhorn.yaml" - Start-Sleep -Seconds 30 - Write-Host "`n" - } - } + Write-Host "Creating longhorn storage on K3scluster" + kubectl apply -f "$($Agconfig.AgDirectories.AgToolsDir)\longhorn.yaml" + Start-Sleep -Seconds 30 + Write-Host "`n" + } + } } function Deploy-AIO-M2 { - Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the clusters" -ForegroundColor DarkGray + Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the Arc-enabled clusters" -ForegroundColor Gray Write-Host "`n" - $kvIndex = 0 - $AgConfig.SiteConfig.GetEnumerator()| Foreach-Object -ThrottleLimit 5 -Parallel { - $cluster = $_ - $AgConfig = $using:AgConfig + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { $clusterName = $cluster.Name.ToLower() - $namingGuid = $using:namingGuid - $kvIndex = $using:kvIndex - $resourceGroup = $using:resourceGroup - $customLocationRPOID = $using:customLocationRPOID - $aioStorageAccountName = $using:aioStorageAccountName - Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the $clusterName cluster" -ForegroundColor Gray Write-Host "`n" kubectx $clusterName @@ -154,29 +145,29 @@ function Deploy-AIO-M2 { Write-Host "`n" az config set extension.use_dynamic_install=yes_without_prompt az connectedk8s enable-features --name $arcClusterName ` - --resource-group $resourceGroup ` - --features cluster-connect custom-locations ` - --custom-locations-oid $customLocationRPOID ` - --only-show-errors + --resource-group $resourceGroup ` + --features cluster-connect custom-locations ` + --custom-locations-oid $customLocationRPOID ` + --only-show-errors # Create the Schema registry for the cluster Write-Host "[$(Get-Date -Format t)] INFO: Creating the schema registry on the Arc-enabled cluster" -ForegroundColor DarkGray Write-Host "`n" $schemaName = "${clusterName}schema" $schemaId = $(az iot ops schema registry create --name $schemaName ` - --resource-group $resourceGroup ` - --registry-namespace "$clusterName-namespace" ` - --sa-resource-id $(az storage account show --name $aioStorageAccountName --resource-group $resourceGroup -o tsv --query id) ` - --query id -o tsv) + --resource-group $resourceGroup ` + --registry-namespace "$clusterName-namespace" ` + --sa-resource-id $(az storage account show --name $aioStorageAccountName --resource-group $resourceGroup -o tsv --query id) ` + --query id -o tsv) # Initialize the Azure IoT Operations instance on the Arc-enabled cluster Write-Host "[$(Get-Date -Format t)] INFO: Initialize the Azure IoT Operations instance on the Arc-enabled cluster" -ForegroundColor DarkGray Write-Host "`n" do { az iot ops init --cluster $arcClusterName.toLower() ` - --resource-group $resourceGroup ` - --sr-resource-id $schemaId ` - --only-show-errors + --resource-group $resourceGroup ` + --sr-resource-id $schemaId ` + --only-show-errors #az iot ops init --cluster $arcClusterName.toLower() -g $resourceGroup --kv-id $keyVaultId --sp-app-id $spnClientId --sp-secret $spnClientSecret --sp-object-id $spnObjectId --mq-service-type loadBalancer --mq-insecure true --simulate-plc false --no-block --only-show-errors if ($? -eq $false) { $aioStatus = "notDeployed" @@ -184,9 +175,9 @@ function Deploy-AIO-M2 { Write-Host "[$(Get-Date -Format t)] Error: An error occured while deploying AIO on the cluster...Retrying" -ForegroundColor DarkRed Write-Host "`n" az iot ops init --cluster $arcClusterName.toLower() ` - --resource-group $resourceGroup ` - --sr-resource-id $schemaId ` - --only-show-errors + --resource-group $resourceGroup ` + --sr-resource-id $schemaId ` + --only-show-errors $retryCount++ } else { @@ -201,119 +192,10 @@ function Deploy-AIO-M2 { Write-Host "`n" do { az iot ops create --name $arcClusterName.toLower() ` - --cluster $arcClusterName.toLower() ` - --resource-group $resourceGroup ` - --broker-listener-type LoadBalancer ` - --only-show-errors - - if ($? -eq $false) { - $aioStatus = "notDeployed" - Write-Host "`n" - Write-Host "[$(Get-Date -Format t)] Error: An error occured while deploying AIO on the cluster...Retrying" -ForegroundColor DarkRed - Write-Host "`n" - az iot ops create --name $arcClusterName.toLower() ` --cluster $arcClusterName.toLower() ` --resource-group $resourceGroup ` --broker-listener-type LoadBalancer ` --only-show-errors - $retryCount++ - } - else { - $aioStatus = "deployed" - } - } until ($aioStatus -eq "deployed" -or $retryCount -eq $maxRetries) - - # Configure the Azure IoT Operations instance for secret synchronization - $userAssignedMIResourceId = (az identity show -g $resourceGroup -n "aio-$clusterName-identity" --query id -o tsv --only-show-errors) - # Enable OIDC issuer and workload identity on the Arc-enabled cluster - az connectedk8s update -n $arcClusterName ` - --resource-group $resourceGroup ` - --enable-oidc-issuer ` - --enable-workload-identity - - Write-Host "[$(Get-Date -Format t)] INFO: Assigning the user-assigned managed identity to the Azure IoT Operations instance" -ForegroundColor DarkGray - Write-Host "`n" - az iot ops identity assign --name $arcClusterName.toLower() ` - --resource-group $resourceGroup ` - --mi-user-assigned $userAssignedMIResourceId - - Write-Host "[$(Get-Date -Format t)] INFO: Configure the Azure IoT Operations instance for secret synchronization" -ForegroundColor DarkGray - Write-Host "`n" - az iot ops secretsync enable --name $arcClusterName.toLower() ` - --resource-group $resourceGroup ` - --mi-user-assigned $userAssignedMIResourceId ` - --kv-resource-id $keyVaultId ` - --only-show-errors - - $kvIndex++ - } - <#foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { - $clusterName = $cluster.Name.ToLower() - Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the $clusterName cluster" -ForegroundColor Gray - Write-Host "`n" - kubectx $clusterName - $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" - $keyVaultId = (az keyvault list -g $resourceGroup --resource-type vault --query "[$kvIndex].id" -o tsv) - $retryCount = 0 - $maxRetries = 5 - $aioStatus = "notDeployed" - - # Enable custom locations on the Arc-enabled cluster - Write-Host "[$(Get-Date -Format t)] INFO: Enabling custom locations on the Arc-enabled cluster" -ForegroundColor DarkGray - Write-Host "`n" - az config set extension.use_dynamic_install=yes_without_prompt - az connectedk8s enable-features --name $arcClusterName ` - --resource-group $resourceGroup ` - --features cluster-connect custom-locations ` - --custom-locations-oid $customLocationRPOID ` - --only-show-errors - - # Create the Schema registry for the cluster - Write-Host "[$(Get-Date -Format t)] INFO: Creating the schema registry on the Arc-enabled cluster" -ForegroundColor DarkGray - Write-Host "`n" - $schemaName = "${clusterName}schema" - $schemaId = $(az iot ops schema registry create --name $schemaName ` - --resource-group $resourceGroup ` - --registry-namespace "$clusterName-namespace" ` - --sa-resource-id $(az storage account show --name $aioStorageAccountName --resource-group $resourceGroup -o tsv --query id) ` - --query id -o tsv) - - # Initialize the Azure IoT Operations instance on the Arc-enabled cluster - Write-Host "[$(Get-Date -Format t)] INFO: Initialize the Azure IoT Operations instance on the Arc-enabled cluster" -ForegroundColor DarkGray - Write-Host "`n" - do { - az iot ops init --cluster $arcClusterName.toLower() ` - --resource-group $resourceGroup ` - --sr-resource-id $schemaId ` - --only-show-errors - #az iot ops init --cluster $arcClusterName.toLower() -g $resourceGroup --kv-id $keyVaultId --sp-app-id $spnClientId --sp-secret $spnClientSecret --sp-object-id $spnObjectId --mq-service-type loadBalancer --mq-insecure true --simulate-plc false --no-block --only-show-errors - if ($? -eq $false) { - $aioStatus = "notDeployed" - Write-Host "`n" - Write-Host "[$(Get-Date -Format t)] Error: An error occured while deploying AIO on the cluster...Retrying" -ForegroundColor DarkRed - Write-Host "`n" - az iot ops init --cluster $arcClusterName.toLower() ` - --resource-group $resourceGroup ` - --sr-resource-id $schemaId ` - --only-show-errors - $retryCount++ - } - else { - $aioStatus = "deployed" - } - } until ($aioStatus -eq "deployed" -or $retryCount -eq $maxRetries) - - $retryCount = 0 - $maxRetries = 5 - # Create the Azure IoT Operations instance on the Arc-enabled cluster - Write-Host "[$(Get-Date -Format t)] INFO: Create the Azure IoT Operations instance on the Arc-enabled cluster" -ForegroundColor DarkGray - Write-Host "`n" - do { - az iot ops create --name $arcClusterName.toLower() ` - --cluster $arcClusterName.toLower() ` - --resource-group $resourceGroup ` - --broker-listener-type LoadBalancer ` - --only-show-errors if ($? -eq $false) { $aioStatus = "notDeployed" @@ -321,10 +203,10 @@ function Deploy-AIO-M2 { Write-Host "[$(Get-Date -Format t)] Error: An error occured while deploying AIO on the cluster...Retrying" -ForegroundColor DarkRed Write-Host "`n" az iot ops create --name $arcClusterName.toLower() ` - --cluster $arcClusterName.toLower() ` - --resource-group $resourceGroup ` - --broker-listener-type LoadBalancer ` - --only-show-errors + --cluster $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --broker-listener-type LoadBalancer ` + --only-show-errors $retryCount++ } else { @@ -338,24 +220,24 @@ function Deploy-AIO-M2 { $userAssignedMIResourceId = (az identity show -g $resourceGroup -n "aio-$clusterName-identity" --query id -o tsv --only-show-errors) # Enable OIDC issuer and workload identity on the Arc-enabled cluster az connectedk8s update -n $arcClusterName ` - --resource-group $resourceGroup ` - --enable-oidc-issuer ` - --enable-workload-identity + --resource-group $resourceGroup ` + --enable-oidc-issuer ` + --enable-workload-identity Write-Host "[$(Get-Date -Format t)] INFO: Assigning the user-assigned managed identity to the Azure IoT Operations instance" -ForegroundColor DarkGray Write-Host "`n" az iot ops identity assign --name $arcClusterName.toLower() ` - --resource-group $resourceGroup ` - --mi-user-assigned $userAssignedMIResourceId + --resource-group $resourceGroup ` + --mi-user-assigned $userAssignedMIResourceId Write-Host "[$(Get-Date -Format t)] INFO: Configure the Azure IoT Operations instance for secret synchronization" -ForegroundColor DarkGray Write-Host "`n" az iot ops secretsync enable --name $arcClusterName.toLower() ` - --resource-group $resourceGroup ` - --mi-user-assigned $userAssignedMIResourceId ` - --kv-resource-id $keyVaultId ` - --only-show-errors + --resource-group $resourceGroup ` + --mi-user-assigned $userAssignedMIResourceId ` + --kv-resource-id $keyVaultId ` + --only-show-errors $kvIndex++ - }#> + } } \ No newline at end of file From e847835a8257bdcca247a659462f350452e11d9d Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Sun, 27 Oct 2024 09:24:17 -0500 Subject: [PATCH 155/409] retry logic --- .../artifacts/kubernetes/K3s/installK3s.sh | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index e4bdd8bb9c..3bb59a0259 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -81,7 +81,21 @@ export AZCOPY_AUTO_LOGIN_TYPE=MSI check_dpkg_lock # Installing Azure CLI & Azure Arc extensions -curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash +max_retries=5 +retry_count=0 +success=false + +while [ $retry_count -lt $max_retries ]; do + curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash + if [ $? -eq 0 ]; then + success=true + break + else + echo "Failed to install Az CLI. Retrying (Attempt $((retry_count+1)))..." + retry_count=$((retry_count+1)) + sleep 10 + fi +done echo "" echo "Log in to Azure" From 9fbeb0f378f3ffade0ade4d7d1727151f3e05fd2 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Mon, 28 Oct 2024 06:14:23 +0100 Subject: [PATCH 156/409] Removed invalid package --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 1 - 1 file changed, 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index d2be50f3ea..7b83db597c 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -79,7 +79,6 @@ 'Microsoft.PowerShell', 'Microsoft.Bicep', 'Kubernetes.kubectl', - 'vcredist140', 'Microsoft.Edge', 'Microsoft.Azure.AZCopy.10', 'Microsoft.VisualStudioCode', From d8ff71ce2af42f5e6ef5c3550167514689d8d74e Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Mon, 28 Oct 2024 07:19:49 +0100 Subject: [PATCH 157/409] Removed call to dataExplorer.bicep --- .../contoso_hypermarket/bicep/main.bicep | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index 1561ebfe5e..506ac18f9b 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -231,16 +231,6 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { k3sArcClusterName: k3sArcClusterName k3sArcDataClusterName: k3sArcDataClusterName vmAutologon: vmAutologon - } -} -module adx 'data/dataExplorer.bicep' = { - name: 'adxDeployment' - params: { - adxClusterName: adxClusterName - location: location - eventHubResourceId: eventHub.outputs.eventHubResourceId - eventHubName: eventHubName - eventHubNamespaceName: eventHubNamespaceName openAIEndpoint: azureOpenAI.outputs.openAIEndpoint speachToTextEndpoint: azureOpenAI.outputs.speechToTextEndpoint } From 747fe7cbe92195e99527ce2be124b22e4aafb228 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Mon, 28 Oct 2024 07:21:50 +0100 Subject: [PATCH 158/409] Removed invalid package name - vcredist140 --- .../artifacts/PowerShell/AgConfig-contoso-motors.psd1 | 1 - .../artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 | 1 - 2 files changed, 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 index 96e0b9c4c2..8d2a014b43 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 @@ -76,7 +76,6 @@ 'Microsoft.PowerShell', 'Microsoft.Bicep', 'Kubernetes.kubectl', - 'vcredist140', 'Microsoft.Edge', 'Microsoft.Azure.AZCopy.10', 'Microsoft.VisualStudioCode', diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 index 2bb76d6e52..45c8f6383a 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 @@ -63,7 +63,6 @@ 'Microsoft.PowerShell', 'Microsoft.Bicep', 'Kubernetes.kubectl', - 'vcredist140', 'Microsoft.Edge', 'Microsoft.Azure.AZCopy.10', 'Microsoft.VisualStudioCode', From bedaea996b1cdac34f4933cbd47e51389975f5d7 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Mon, 28 Oct 2024 11:09:27 +0100 Subject: [PATCH 159/409] Added WinGet packages and VS Code extension --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 3 +++ .../artifacts/PowerShell/AgConfig-contoso-motors.psd1 | 2 ++ .../artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 | 3 +++ 3 files changed, 8 insertions(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 7b83db597c..e186b59eeb 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -82,6 +82,9 @@ 'Microsoft.Edge', 'Microsoft.Azure.AZCopy.10', 'Microsoft.VisualStudioCode', + 'Microsoft.AzureDataStudio', + 'Microsoft.VisualStudioCode', + 'Microsoft.SQLServerManagementStudio', 'Git.Git', '7zip.7zip', 'ahmetb.kubectx', diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 index 8d2a014b43..f8b4e2c433 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 @@ -78,7 +78,9 @@ 'Kubernetes.kubectl', 'Microsoft.Edge', 'Microsoft.Azure.AZCopy.10', + 'Microsoft.AzureDataStudio', 'Microsoft.VisualStudioCode', + 'Microsoft.SQLServerManagementStudio', 'Git.Git', '7zip.7zip', 'ahmetb.kubectx', diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 index 45c8f6383a..46ed021b4c 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-supermarket.psd1 @@ -66,6 +66,9 @@ 'Microsoft.Edge', 'Microsoft.Azure.AZCopy.10', 'Microsoft.VisualStudioCode', + 'Microsoft.AzureDataStudio', + 'Microsoft.VisualStudioCode', + 'Microsoft.SQLServerManagementStudio', 'Git.Git', '7zip.7zip', 'ahmetb.kubectx', From 2a2e7ed78b9736541c6d2472c6b2b12c5f5ea89e Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Mon, 28 Oct 2024 11:56:10 +0100 Subject: [PATCH 160/409] Added namingGuid to namespace and schema names --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 417172d762..459969e97d 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -153,10 +153,10 @@ function Deploy-AIO-M2 { # Create the Schema registry for the cluster Write-Host "[$(Get-Date -Format t)] INFO: Creating the schema registry on the Arc-enabled cluster" -ForegroundColor DarkGray Write-Host "`n" - $schemaName = "${clusterName}schema" + $schemaName = "${clusterName}-${$Env:namingGuid}-schema" $schemaId = $(az iot ops schema registry create --name $schemaName ` --resource-group $resourceGroup ` - --registry-namespace "$clusterName-namespace" ` + --registry-namespace "$clusterName-${$Env:namingGuid}-namespace" ` --sa-resource-id $(az storage account show --name $aioStorageAccountName --resource-group $resourceGroup -o tsv --query id) ` --query id -o tsv) From 04a540f445a97a7f33bac3f2f83f1336a7697278 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Mon, 28 Oct 2024 12:16:35 +0100 Subject: [PATCH 161/409] Enabled automatic updates for client VM (reboot suppressed) --- .../contoso_hypermarket/bicep/clientVm/clientVm.bicep | 10 +++++++++- .../contoso_motors/bicep/clientVm/clientVm.bicep | 10 +++++++++- .../contoso_supermarket/bicep/clientVm/clientVm.bicep | 10 +++++++++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep index 1241658abf..5d716c5676 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep @@ -184,7 +184,15 @@ resource vm 'Microsoft.Compute/virtualMachines@2022-11-01' = { adminPassword: windowsAdminPassword windowsConfiguration: { provisionVMAgent: true - enableAutomaticUpdates: false + enableAutomaticUpdates: true + enableVMAgentPlatformUpdates: true + patchSettings: { + assessmentMode: 'AutomaticByPlatform' + patchMode: 'AutomaticByPlatform' + automaticByPlatformSettings: { + rebootSetting: 'Never' + } + } } } } diff --git a/azure_jumpstart_ag/contoso_motors/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_motors/bicep/clientVm/clientVm.bicep index 1ccac39bac..1a4405968d 100644 --- a/azure_jumpstart_ag/contoso_motors/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_motors/bicep/clientVm/clientVm.bicep @@ -176,7 +176,15 @@ resource vm 'Microsoft.Compute/virtualMachines@2022-11-01' = { adminPassword: windowsAdminPassword windowsConfiguration: { provisionVMAgent: true - enableAutomaticUpdates: false + enableAutomaticUpdates: true + enableVMAgentPlatformUpdates: true + patchSettings: { + assessmentMode: 'AutomaticByPlatform' + patchMode: 'AutomaticByPlatform' + automaticByPlatformSettings: { + rebootSetting: 'Never' + } + } } } } diff --git a/azure_jumpstart_ag/contoso_supermarket/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_supermarket/bicep/clientVm/clientVm.bicep index 8a6df0b996..9bf77ee67a 100644 --- a/azure_jumpstart_ag/contoso_supermarket/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_supermarket/bicep/clientVm/clientVm.bicep @@ -182,7 +182,15 @@ resource vm 'Microsoft.Compute/virtualMachines@2022-11-01' = { adminPassword: windowsAdminPassword windowsConfiguration: { provisionVMAgent: true - enableAutomaticUpdates: false + enableAutomaticUpdates: true + enableVMAgentPlatformUpdates: true + patchSettings: { + assessmentMode: 'AutomaticByPlatform' + patchMode: 'AutomaticByPlatform' + automaticByPlatformSettings: { + rebootSetting: 'Never' + } + } } } } From 6cb2103e53fbb8ed97ee518db82b34490d1f9171 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Mon, 28 Oct 2024 12:24:25 +0100 Subject: [PATCH 162/409] Changed VM size for Hypermarket to Standard_D8s_v5 --- .../contoso_hypermarket/bicep/clientVm/clientVm.bicep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep index 5d716c5676..90d989afb7 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep @@ -141,7 +141,7 @@ resource vm 'Microsoft.Compute/virtualMachines@2022-11-01' = { } properties: { hardwareProfile: { - vmSize: 'Standard_D32s_v5' + vmSize: 'Standard_D8s_v5' } storageProfile: { osDisk: { From f8a5e2a0e178e7a7fce3fac479f058567c1c57d7 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Mon, 28 Oct 2024 13:04:59 +0100 Subject: [PATCH 163/409] Removed data-disk --- .../bicep/clientVm/clientVm.bicep | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep index 90d989afb7..544915e814 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep @@ -159,17 +159,7 @@ resource vm 'Microsoft.Compute/virtualMachines@2022-11-01' = { sku: windowsOSVersion version: 'latest' } - dataDisks: [ - { - diskSizeGB: 1024 - lun: 0 - createOption: 'Empty' - caching: 'ReadWrite' - managedDisk: { - storageAccountType: 'Premium_LRS' - } - } - ] + dataDisks: [] } networkProfile: { networkInterfaces: [ From 820906af4fa20555151c4f3162c73ab39a75a1bc Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Mon, 28 Oct 2024 08:50:10 -0400 Subject: [PATCH 164/409] Update AgConfig-contoso-hypermarket.psd1 --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 1 - 1 file changed, 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 9a44507727..41fa3e3b58 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -59,7 +59,6 @@ @{name="customlocation"; version="latest"}, @{name="kusto"; version="latest"}, @{name="storage-preview"; version="latest"}, - @{name="azure-iot-ops"; version="0.5.1b1"}, @{name="microsoft-fabric"; version="latest"} ) From 9375514b82f435409e774ad725aa1e116c0c6c2d Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Mon, 28 Oct 2024 08:51:14 -0400 Subject: [PATCH 165/409] Update AgConfig-contoso-hypermarket.psd1 --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 41fa3e3b58..9ff61f49c4 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -58,8 +58,7 @@ @{name="eventgrid"; version="latest"}, @{name="customlocation"; version="latest"}, @{name="kusto"; version="latest"}, - @{name="storage-preview"; version="latest"}, - @{name="microsoft-fabric"; version="latest"} + @{name="storage-preview"; version="latest"} ) # PowerShell modules From 7cc292a0976da1bef77e50637bf2402854bdabd0 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Mon, 28 Oct 2024 09:12:24 -0400 Subject: [PATCH 166/409] Merge conflicts --- .../AgConfig-contoso-hypermarket.psd1 | 24 +- .../Modules/contoso_hypermarket.psm1 | 364 ++++++++++-------- 2 files changed, 223 insertions(+), 165 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 9ff61f49c4..a3e0f3e357 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -15,7 +15,8 @@ AgL1Files = "C:\Ag\L1Files" AgAppsRepo = "C:\Ag\AppsRepo" AgMonitoringDir = "C:\Ag\Monitoring" - AgFabric = "C:\Ag\Fabric" + AgAdxDashboards = "C:\Ag\AdxDashboards" + AgDataEmulator = "C:\Ag\DataEmulator" } # Required URLs @@ -47,8 +48,7 @@ "Microsoft.DeviceRegistry", "Microsoft.EventGrid", "Microsoft.IoTOperationsOrchestrator", - "Microsoft.IoTOperations", - "Microsoft.Fabric" + "Microsoft.IoTOperations" ) # Az CLI required extensions @@ -58,7 +58,8 @@ @{name="eventgrid"; version="latest"}, @{name="customlocation"; version="latest"}, @{name="kusto"; version="latest"}, - @{name="storage-preview"; version="latest"} + @{name="storage-preview"; version="latest"}, + @{name="azure-iot-ops"; version="0.7.0b2"} ) # PowerShell modules @@ -92,7 +93,9 @@ 'openssl.light', 'mqtt-explorer', 'gh', - 'python' + 'python', + 'sql-server-management-studio', + 'azure-data-studio' ) # Pip packages list @@ -110,7 +113,8 @@ 'esbenp.prettier-vscode', 'ms-kubernetes-tools.vscode-kubernetes-tools', 'mindaro.mindaro', - 'github.vscode-pull-request-github' + 'github.vscode-pull-request-github', + 'ms-mssql.mssql' ) # Git branches @@ -204,14 +208,6 @@ } } - FabricConfig = @{ - WorkspacePrefix = "contoso-hypermarket" - EventHubSharedAccessKeyName = "FabricSharedAccessKey" - EventHubName = "contoso-hypermarket" - EventHubCG = "fabriccg" - RunFabricSetupAs = "user" - } - # Microsoft Edge startup settings variables EdgeSettingRegistryPath = 'HKLM:\SOFTWARE\Policies\Microsoft\Edge' EdgeSettingValueTrue = '00000001' diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 1dafc847b0..417172d762 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -1,181 +1,243 @@ -function Get-K3sConfigFile{ - # Downloading k3s Kubernetes cluster kubeconfig file - Write-Host "Downloading k3s Kubeconfigs" - $Env:AZCOPY_AUTO_LOGIN_TYPE="PSCRED" - foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { - $clusterName = $cluster.Name.ToLower() - $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" - $containerName = $arcClusterName.toLower() - $sourceFile = "https://$stagingStorageAccountName.blob.core.windows.net/$containerName/config" - azcopy copy $sourceFile "C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" --check-length=false - $sourceFile = "https://$stagingStorageAccountName.blob.core.windows.net/$containerName/*" - azcopy cp --check-md5 FailIfDifferentOrMissing $sourceFile "$AgLogsDir\" --include-pattern "*.log" - } +function Get-K3sConfigFile { + # Downloading k3s Kubernetes cluster kubeconfig file + Write-Host "Downloading k3s Kubeconfigs" + $Env:AZCOPY_AUTO_LOGIN_TYPE = "PSCRED" + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + $clusterName = $cluster.Name.ToLower() + $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" + $containerName = $arcClusterName.toLower() + $sourceFile = "https://$stagingStorageAccountName.blob.core.windows.net/$containerName/config" + azcopy copy $sourceFile "C:\Users\$adminUsername\.kube\ag-k3s-$clusterName" --check-length=false + $sourceFile = "https://$stagingStorageAccountName.blob.core.windows.net/$containerName/*" + azcopy cp --check-md5 FailIfDifferentOrMissing $sourceFile "$AgLogsDir\" --include-pattern "*.log" + } } -function Merge-K3sConfigFiles{ +function Merge-K3sConfigFiles { -$mergedKubeconfigPath = "C:\Users\$adminUsername\.kube\config" + $mergedKubeconfigPath = "C:\Users\$adminUsername\.kube\config" -$kubeconfig1Path = "C:\Users\$adminUsername\.kube\ag-k3s-seattle" -$kubeconfig2Path = "C:\Users\$adminUsername\.kube\ag-k3s-chicago" + $kubeconfig1Path = "C:\Users\$adminUsername\.kube\ag-k3s-seattle" + $kubeconfig2Path = "C:\Users\$adminUsername\.kube\ag-k3s-chicago" -# Extract base file names (without extensions) to use as new names -$suffix1 = [System.IO.Path]::GetFileNameWithoutExtension($kubeconfig1Path) -$suffix2 = [System.IO.Path]::GetFileNameWithoutExtension($kubeconfig2Path) + # Extract base file names (without extensions) to use as new names + $suffix1 = [System.IO.Path]::GetFileNameWithoutExtension($kubeconfig1Path) + $suffix2 = [System.IO.Path]::GetFileNameWithoutExtension($kubeconfig2Path) -# Load the kubeconfig files, ensuring no empty lines or structures -$kubeconfig1 = get-content $kubeconfig1Path | ConvertFrom-Yaml -$kubeconfig2 = get-content $kubeconfig2Path | ConvertFrom-Yaml + # Load the kubeconfig files, ensuring no empty lines or structures + $kubeconfig1 = get-content $kubeconfig1Path | ConvertFrom-Yaml + $kubeconfig2 = get-content $kubeconfig2Path | ConvertFrom-Yaml -# Function to replace cluster, user, and context names with the file name, while keeping original server addresses -function Set-NamesWithFileName { - param ( - [hashtable]$kubeconfigData, - [string]$newName - ) + # Function to replace cluster, user, and context names with the file name, while keeping original server addresses + function Set-NamesWithFileName { + param ( + [hashtable]$kubeconfigData, + [string]$newName + ) - # Replace cluster names but keep the server addresses - foreach ($cluster in $kubeconfigData.clusters) { - if ($cluster.name -and $cluster.cluster.server) { - $cluster.name = "$newName" + # Replace cluster names but keep the server addresses + foreach ($cluster in $kubeconfigData.clusters) { + if ($cluster.name -and $cluster.cluster.server) { + $cluster.name = "$newName" + } } - } - # Replace user names - foreach ($user in $kubeconfigData.users) { - if ($user.name) { - $user.name = "$newName" + # Replace user names + foreach ($user in $kubeconfigData.users) { + if ($user.name) { + $user.name = "$newName" + } } - } - # Replace context names, but retain the correct mapping to cluster and user - foreach ($context in $kubeconfigData.contexts) { - if ($context.name -and $context.context.cluster -and $context.context.user) { - $context.name = "$newName" - $context.context.cluster = "$newName" - $context.context.user = "$newName" + # Replace context names, but retain the correct mapping to cluster and user + foreach ($context in $kubeconfigData.contexts) { + if ($context.name -and $context.context.cluster -and $context.context.user) { + $context.name = "$newName" + $context.context.cluster = "$newName" + $context.context.user = "$newName" + } } - } - return $kubeconfigData -} + return $kubeconfigData + } -# Apply renaming using file names -$kubeconfig1 = Set-NamesWithFileName -kubeconfigData $kubeconfig1 -newName $suffix1 -$kubeconfig2 = Set-NamesWithFileName -kubeconfigData $kubeconfig2 -newName $suffix2 - -# Merge the clusters, users, and contexts from both kubeconfigs -$mergedClusters = $kubeconfig1.clusters + $kubeconfig2.clusters -$mergedUsers = $kubeconfig1.users + $kubeconfig2.users -$mergedContexts = $kubeconfig1.contexts + $kubeconfig2.contexts - -# Prepare the merged kubeconfig ensuring no empty or null fields -$mergedKubeconfig = @{ - apiVersion = $kubeconfig1.apiVersion - kind = $kubeconfig1.kind - clusters = $mergedClusters | Where-Object { $_.name -and $_.cluster.server } - users = $mergedUsers | Where-Object { $_.name } - contexts = $mergedContexts | Where-Object { $_.name -and $_.context.cluster -and $_.context.user } - "current-context" = $kubeconfig1."current-context" # Retain the current context of the first file -} + # Apply renaming using file names + $kubeconfig1 = Set-NamesWithFileName -kubeconfigData $kubeconfig1 -newName $suffix1 + $kubeconfig2 = Set-NamesWithFileName -kubeconfigData $kubeconfig2 -newName $suffix2 + + # Merge the clusters, users, and contexts from both kubeconfigs + $mergedClusters = $kubeconfig1.clusters + $kubeconfig2.clusters + $mergedUsers = $kubeconfig1.users + $kubeconfig2.users + $mergedContexts = $kubeconfig1.contexts + $kubeconfig2.contexts + + # Prepare the merged kubeconfig ensuring no empty or null fields + $mergedKubeconfig = @{ + apiVersion = $kubeconfig1.apiVersion + kind = $kubeconfig1.kind + clusters = $mergedClusters | Where-Object { $_.name -and $_.cluster.server } + users = $mergedUsers | Where-Object { $_.name } + contexts = $mergedContexts | Where-Object { $_.name -and $_.context.cluster -and $_.context.user } + "current-context" = $kubeconfig1."current-context" # Retain the current context of the first file + } -# Convert the merged data back to YAML and save to a new file -$mergedKubeconfig | ConvertTo-Yaml | Set-Content -Path $mergedKubeconfigPath + # Convert the merged data back to YAML and save to a new file + $mergedKubeconfig | ConvertTo-Yaml | Set-Content -Path $mergedKubeconfigPath -Write-Host "Kubeconfig files successfully merged into $mergedKubeconfigPath" -kubectx seattle="ag-k3s-seattle" -kubectx chicago="ag-k3s-chicago" + Write-Host "Kubeconfig files successfully merged into $mergedKubeconfigPath" + kubectx seattle="ag-k3s-seattle" + kubectx chicago="ag-k3s-chicago" } function Set-K3sClusters { - Write-Host "Configuring kube-vip on K3s clusters" - az login --service-principal --username $Env:spnClientID --password=$Env:spnClientSecret --tenant $Env:spnTenantId - az account set -s $subscriptionId - foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { - if ($cluster.Value.Type -eq "k3s") { - $clusterName = $cluster.Value.FriendlyName.ToLower() - $vmName = $cluster.Value.ArcClusterName + "-$namingGuid" - kubectx $clusterName - $k3sVIP = $(az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``true``].privateIPAddress" -otsv) - Write-Host "Assigning kube-vip-role on k3s cluster" - $kubeVipRbac = "$($Agconfig.AgDirectories.AgToolsDir)\kubeVipRbac.yml" - kubectl apply -f $kubeVipRbac - - $kubeVipDaemonset = "$($Agconfig.AgDirectories.AgToolsDir)\kubeVipDaemon.yml" + Write-Host "Configuring kube-vip on K3s clusters" + az login --service-principal --username $Env:spnClientID --password=$Env:spnClientSecret --tenant $Env:spnTenantId + az account set -s $subscriptionId + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + if ($cluster.Value.Type -eq "k3s") { + $clusterName = $cluster.Value.FriendlyName.ToLower() + $vmName = $cluster.Value.ArcClusterName + "-$namingGuid" + kubectx $clusterName + $k3sVIP = $(az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``true``].privateIPAddress" -otsv) + Write-Host "Assigning kube-vip-role on k3s cluster" + $kubeVipRbac = "$($Agconfig.AgDirectories.AgToolsDir)\kubeVipRbac.yml" + kubectl apply -f $kubeVipRbac + + $kubeVipDaemonset = "$($Agconfig.AgDirectories.AgToolsDir)\kubeVipDaemon.yml" (Get-Content -Path $kubeVipDaemonset) -replace 'k3sVIPPlaceholder', "$k3sVIP" | Set-Content -Path $kubeVipDaemonset - kubectl apply -f $kubeVipDaemonset + kubectl apply -f $kubeVipDaemonset - Write-Host "Deploying Kube vip cloud controller on k3s cluster" - kubectl apply -f https://raw.githubusercontent.com/kube-vip/kube-vip-cloud-provider/main/manifest/kube-vip-cloud-controller.yaml + Write-Host "Deploying Kube vip cloud controller on k3s cluster" + kubectl apply -f https://raw.githubusercontent.com/kube-vip/kube-vip-cloud-provider/main/manifest/kube-vip-cloud-controller.yaml - $serviceIpRange = $(az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``false``].privateIPAddress" -otsv) - $sortedIps = $serviceIpRange | Sort-Object {[System.Version]$_} - $lowestServiceIp = $sortedIps[0] - $highestServiceIp = $sortedIps[-1] + $serviceIpRange = $(az network nic ip-config list --resource-group $Env:resourceGroup --nic-name $vmName-NIC --query "[?primary == ``false``].privateIPAddress" -otsv) + $sortedIps = $serviceIpRange | Sort-Object { [System.Version]$_ } + $lowestServiceIp = $sortedIps[0] + $highestServiceIp = $sortedIps[-1] - kubectl create configmap -n kube-system kubevip --from-literal range-global=$lowestServiceIp-$highestServiceIp - Start-Sleep -Seconds 30 - - Write-Host "Creating longhorn storage on K3scluster" - kubectl apply -f "$($Agconfig.AgDirectories.AgToolsDir)\longhorn.yaml" - Start-Sleep -Seconds 30 - Write-Host "`n" - } - } -} + kubectl create configmap -n kube-system kubevip --from-literal range-global=$lowestServiceIp-$highestServiceIp + Start-Sleep -Seconds 30 -function Set-MicrosoftFabric { - # Load Agconfi - $fabricWorkspacePrefix = $AgConfig.FabricConfig["WorkspacePrefix"] - $fabricWorkspaceName = "$fabricWorkspacePrefix-$namingGuid" - $fabricFolder = $AgConfig.AgDirectories["AgFabric"] - $runFabricSetupAs = $AgConfig.FabricConfig["RunFabricSetupAs"] - $fabricConfigFile = "$fabricFolder\fabric-config.json" - $eventHubKeyName = $AgConfig.FabricConfig["EventHubSharedAccessKeyName"] - - # Get Fabric capacity name from the resource group - $fabricCapacityName = (az fabric capacity list --resource-group $Env:resourceGroup --query "[0].name" -o tsv) - if (-not $fabricCapacityName) { - Write-Error "Fabric capacity not found in the resource group $Env:resourceGroup" - return - } - - # Get EventHub namespace created in the resource group - $eventHubNS = (az eventhubs namespace list --resource-group $Env:resourceGroup --query "[0].name" -o tsv) - if (-not $eventHubNS) { - Write-Error "EventHub namespaces not found in the resource group $Env:resourceGroup" - return - } - - # Get EventHub name from the eventhub namespace created in the resource group - $eventHubName = (az eventhubs eventhub list --namespace $eventHubNS --resource-group $Env:resourceGroup --query "[0].name" -o tsv) - if (-not $eventHubName) { - Write-Error "No Event Hub created in the EventHub namespace $eventHubNS" - return - } - - $configJson = @" - { - "tenantID": "$Env:spnTenantId", - "runAs": "$runFabricSetupAs", - "azureLocation": "$Env:azureLocation", - "resourceGroup": "$Env:resourceGroup", - "fabricCapacityName": "$fabricCapacityName", - "templateBaseUrl": "$Env:templateBaseUrl", - "fabricWorkspaceName": "$fabricWorkspaceName", - "eventHubKeyName": "$eventHubKeyName" + Write-Host "Creating longhorn storage on K3scluster" + kubectl apply -f "$($Agconfig.AgDirectories.AgToolsDir)\longhorn.yaml" + Start-Sleep -Seconds 30 + Write-Host "`n" + } } -"@ - - $configJson | Set-Content -Path $fabricConfigFile - Write-Host "Fabric config file created at $fabricConfigFile" +} - # Download Fabric workspace setup script from GitHuB - $scriptFilePath = "$fabricFolder\SetupFabricWorkspace.ps1" - Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/SetupFabricWorkspace.ps1") -OutFile $scriptFilePath - if (-not (Test-Path -Path $scriptFilePath)) { - Write-Error "Unable to download script file: 'SetupFabricWorkspace.ps1' from GitHub" +function Deploy-AIO-M2 { + Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the Arc-enabled clusters" -ForegroundColor Gray + Write-Host "`n" + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + $clusterName = $cluster.Name.ToLower() + Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the $clusterName cluster" -ForegroundColor Gray + Write-Host "`n" + kubectx $clusterName + $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" + $keyVaultId = (az keyvault list -g $resourceGroup --resource-type vault --query "[$kvIndex].id" -o tsv) + $retryCount = 0 + $maxRetries = 5 + $aioStatus = "notDeployed" + + # Enable custom locations on the Arc-enabled cluster + Write-Host "[$(Get-Date -Format t)] INFO: Enabling custom locations on the Arc-enabled cluster" -ForegroundColor DarkGray + Write-Host "`n" + az config set extension.use_dynamic_install=yes_without_prompt + az connectedk8s enable-features --name $arcClusterName ` + --resource-group $resourceGroup ` + --features cluster-connect custom-locations ` + --custom-locations-oid $customLocationRPOID ` + --only-show-errors + + # Create the Schema registry for the cluster + Write-Host "[$(Get-Date -Format t)] INFO: Creating the schema registry on the Arc-enabled cluster" -ForegroundColor DarkGray + Write-Host "`n" + $schemaName = "${clusterName}schema" + $schemaId = $(az iot ops schema registry create --name $schemaName ` + --resource-group $resourceGroup ` + --registry-namespace "$clusterName-namespace" ` + --sa-resource-id $(az storage account show --name $aioStorageAccountName --resource-group $resourceGroup -o tsv --query id) ` + --query id -o tsv) + + # Initialize the Azure IoT Operations instance on the Arc-enabled cluster + Write-Host "[$(Get-Date -Format t)] INFO: Initialize the Azure IoT Operations instance on the Arc-enabled cluster" -ForegroundColor DarkGray + Write-Host "`n" + do { + az iot ops init --cluster $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --sr-resource-id $schemaId ` + --only-show-errors + #az iot ops init --cluster $arcClusterName.toLower() -g $resourceGroup --kv-id $keyVaultId --sp-app-id $spnClientId --sp-secret $spnClientSecret --sp-object-id $spnObjectId --mq-service-type loadBalancer --mq-insecure true --simulate-plc false --no-block --only-show-errors + if ($? -eq $false) { + $aioStatus = "notDeployed" + Write-Host "`n" + Write-Host "[$(Get-Date -Format t)] Error: An error occured while deploying AIO on the cluster...Retrying" -ForegroundColor DarkRed + Write-Host "`n" + az iot ops init --cluster $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --sr-resource-id $schemaId ` + --only-show-errors + $retryCount++ + } + else { + $aioStatus = "deployed" + } + } until ($aioStatus -eq "deployed" -or $retryCount -eq $maxRetries) + + $retryCount = 0 + $maxRetries = 5 + # Create the Azure IoT Operations instance on the Arc-enabled cluster + Write-Host "[$(Get-Date -Format t)] INFO: Create the Azure IoT Operations instance on the Arc-enabled cluster" -ForegroundColor DarkGray + Write-Host "`n" + do { + az iot ops create --name $arcClusterName.toLower() ` + --cluster $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --broker-listener-type LoadBalancer ` + --only-show-errors + + if ($? -eq $false) { + $aioStatus = "notDeployed" + Write-Host "`n" + Write-Host "[$(Get-Date -Format t)] Error: An error occured while deploying AIO on the cluster...Retrying" -ForegroundColor DarkRed + Write-Host "`n" + az iot ops create --name $arcClusterName.toLower() ` + --cluster $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --broker-listener-type LoadBalancer ` + --only-show-errors + $retryCount++ + } + else { + $aioStatus = "deployed" + } + } until ($aioStatus -eq "deployed" -or $retryCount -eq $maxRetries) + + # Configure the Azure IoT Operations instance for secret synchronization + Write-Host "[$(Get-Date -Format t)] INFO: Configuring the Azure IoT Operations instance for secret synchronization" -ForegroundColor DarkGray + Write-Host "`n" + $userAssignedMIResourceId = (az identity show -g $resourceGroup -n "aio-$clusterName-identity" --query id -o tsv --only-show-errors) + # Enable OIDC issuer and workload identity on the Arc-enabled cluster + az connectedk8s update -n $arcClusterName ` + --resource-group $resourceGroup ` + --enable-oidc-issuer ` + --enable-workload-identity + + Write-Host "[$(Get-Date -Format t)] INFO: Assigning the user-assigned managed identity to the Azure IoT Operations instance" -ForegroundColor DarkGray + Write-Host "`n" + az iot ops identity assign --name $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --mi-user-assigned $userAssignedMIResourceId + + Write-Host "[$(Get-Date -Format t)] INFO: Configure the Azure IoT Operations instance for secret synchronization" -ForegroundColor DarkGray + Write-Host "`n" + az iot ops secretsync enable --name $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --mi-user-assigned $userAssignedMIResourceId ` + --kv-resource-id $keyVaultId ` + --only-show-errors + + $kvIndex++ } } \ No newline at end of file From 30f5201f5fcb45b89150da23e1502b24934fdcbc Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Mon, 28 Oct 2024 09:17:30 -0400 Subject: [PATCH 167/409] Fixed fabric automation issues --- .../AgConfig-contoso-hypermarket.psd1 | 13 ++++- .../Modules/contoso_hypermarket.psm1 | 54 ++++++++++++++++++ .../PowerShell/SetupFabricWorkspace.ps1 | 56 +++++++++---------- .../contoso_hypermarket/bicep/data/script.kql | 33 ++++++++++- 4 files changed, 123 insertions(+), 33 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index a3e0f3e357..cdbb022f78 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -15,8 +15,7 @@ AgL1Files = "C:\Ag\L1Files" AgAppsRepo = "C:\Ag\AppsRepo" AgMonitoringDir = "C:\Ag\Monitoring" - AgAdxDashboards = "C:\Ag\AdxDashboards" - AgDataEmulator = "C:\Ag\DataEmulator" + AgFabric = "C:\Ag\Fabric" } # Required URLs @@ -48,7 +47,8 @@ "Microsoft.DeviceRegistry", "Microsoft.EventGrid", "Microsoft.IoTOperationsOrchestrator", - "Microsoft.IoTOperations" + "Microsoft.IoTOperations", + "Microsoft.Fabric" ) # Az CLI required extensions @@ -213,4 +213,11 @@ EdgeSettingValueTrue = '00000001' EdgeSettingValueFalse = '00000000' + FabricConfig = @{ + WorkspacePrefix = "contoso-hypermarket" + EventHubSharedAccessKeyName = "FabricSharedAccessKey" + EventHubName = "contoso-hypermarket" + EventHubCG = "fabriccg" + RunFabricSetupAs = "user" + } } \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 417172d762..6859269de1 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -240,4 +240,58 @@ function Deploy-AIO-M2 { $kvIndex++ } +} + +function Set-MicrosoftFabric { + # Load Agconfi + $fabricWorkspacePrefix = $AgConfig.FabricConfig["WorkspacePrefix"] + $fabricWorkspaceName = "$fabricWorkspacePrefix-$namingGuid" + $fabricFolder = $AgConfig.AgDirectories["AgFabric"] + $runFabricSetupAs = $AgConfig.FabricConfig["RunFabricSetupAs"] + $fabricConfigFile = "$fabricFolder\fabric-config.json" + $eventHubKeyName = $AgConfig.FabricConfig["EventHubSharedAccessKeyName"] + + # Get Fabric capacity name from the resource group + $fabricCapacityName = (az fabric capacity list --resource-group $Env:resourceGroup --query "[0].name" -o tsv) + if (-not $fabricCapacityName) { + Write-Error "Fabric capacity not found in the resource group $Env:resourceGroup" + return + } + + # Get EventHub namespace created in the resource group + $eventHubNS = (az eventhubs namespace list --resource-group $Env:resourceGroup --query "[0].name" -o tsv) + if (-not $eventHubNS) { + Write-Error "EventHub namespaces not found in the resource group $Env:resourceGroup" + return + } + + # Get EventHub name from the eventhub namespace created in the resource group + $eventHubName = (az eventhubs eventhub list --namespace $eventHubNS --resource-group $Env:resourceGroup --query "[0].name" -o tsv) + if (-not $eventHubName) { + Write-Error "No Event Hub created in the EventHub namespace $eventHubNS" + return + } + + $configJson = @" + { + "tenantID": "$Env:spnTenantId", + "runAs": "$runFabricSetupAs", + "azureLocation": "$Env:azureLocation", + "resourceGroup": "$Env:resourceGroup", + "fabricCapacityName": "$fabricCapacityName", + "templateBaseUrl": "$Env:templateBaseUrl", + "fabricWorkspaceName": "$fabricWorkspaceName", + "eventHubKeyName": "$eventHubKeyName" + } +"@ + + $configJson | Set-Content -Path $fabricConfigFile + Write-Host "Fabric config file created at $fabricConfigFile" + + # Download Fabric workspace setup script from GitHuB + $scriptFilePath = "$fabricFolder\SetupFabricWorkspace.ps1" + Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/SetupFabricWorkspace.ps1") -OutFile $scriptFilePath + if (-not (Test-Path -Path $scriptFilePath)) { + Write-Error "Unable to download script file: 'SetupFabricWorkspace.ps1' from GitHub" + } } \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 index bbb31f4572..8ab3a6f9ac 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 @@ -119,7 +119,7 @@ $headers = @{"Authorization" = "Bearer $fabricAccessToken"; "Content-Type" = "ap Write-Host "INFO: Creating Eventhouse with name $eventhouseName." $eventhouseResp = Invoke-WebRequest -Method Post -Uri $eventhouseApi -Body $apiPayload -Headers $headers -if (($eventhouseResp.StatusCode -ge 200) -or ($eventhouseResp.StatusCode -le 204)){ +if (($eventhouseResp.StatusCode -ge 200) -and ($eventhouseResp.StatusCode -le 204)){ Write-Host "INFO: Eventhouse created with name $eventhouseName." } else { @@ -137,8 +137,8 @@ $kqlQueryServiceUri = $kqlDatabaseInfo[0].properties.queryServiceUri $kqlDatabaseId = $kqlDatabaseInfo[0].id $kqlDatabaseName = $kqlDatabaseInfo[0].displayName -# Create KQL database tables to store retail data -$databaseName = $eventhouseName +Write-Host "INFO: KQL database details. Database Name: $kqlDatabaseName, Database ID: $kqlDatabaseId, kqlQueryServiceUri: $kqlQueryServiceUri" + # Download KQL script from GitHub $kqlScriptUrl = $templateBaseUrl + "contoso_hypermarket/bicep/data/script.kql" @@ -162,18 +162,18 @@ $headers = @{ } # Create payload to create KQL database schema and functions -Write-Host "INFO: Creating KQL script." +Write-Host "INFO: Executing KQL script." $body = @{ - db = $databaseName + db = $kqlDatabaseName csl = "$kqlScript" } | ConvertTo-Json $httpResp = Invoke-RestMethod -Method Post -Uri "$kqlQueryServiceUri/v1/rest/mgmt" -Headers $headers -Body $body -if (($httpResp.StatusCode -ge 200) -or ($httpResp.StatusCode -le 204)){ - Write-Host "INFO: products table created." +if ($httpResp.Tables.Count -ge 1){ + Write-Host "INFO: KQL script execution completed." } else { - Write-Host "ERROR: Failed to create products table." + Write-Host "ERROR: Failed to execute KQL script." Exit } @@ -208,8 +208,8 @@ $body = @" $kqlDashboardsApi = "https://api.fabric.microsoft.com/v1/workspaces/$fabricWorkspaceId/kqlDashboards" $headers = @{"Authorization" = "Bearer $fabricAccessToken"; "Content-Type" = "application/json"} $httpResp = Invoke-RestMethod -Method Post -Uri $kqlDashboardsApi -Headers $headers -Body $body -if (($httpResp.StatusCode -ge 200) -or ($httpResp.StatusCode -le 204)){ - Write-Host "INFO: Created KQL dashboard report." +if ($httpResp.id.Length -gt 0){ + Write-Host "INFO: Created KQL dashboard report with ID: $($httpResp.id)" } else { Write-Host "ERROR: Failed to create KQL dashboard report." @@ -234,15 +234,18 @@ if ($eventHubInfo.Count -ne 1) { } $eventHubNamespace = $eventHubInfo[0].name +Write-Host "INFO: Found EventHub Namespace: $eventHubNamespace" # Make sure Eventhub with name 'orders' exists $eventHubs = az eventhubs eventhub list --namespace-name $eventHubInfo[0].name --resource-group $resourceGroup | ConvertFrom-Json $eventHubName = $eventHubs[0].name if (-not $eventHubName) { - Write-Host "ERROR: Event Hubs not found in the EventHub namespace $eventHubInfo[0].name." + Write-Host "ERROR: Event Hubs not found in the EventHub namespace $eventHubNamespace" Exit } +Write-Host "INFO: Found EventHub: $eventHubName" + # Get Event Hub credentials Write-Host "INFO: Retrieving Event Hub key for '$eventHubKeyName' Shared Acess Policy." $eventHubKey = az eventhubs namespace authorization-rule keys list --resource-group $resourceGroup --namespace-name $eventHubNamespace --name $eventHubKeyName --query primaryKey --output tsv @@ -297,8 +300,8 @@ $connectionBody = @" # Call API to create Event Hub connection in Power BI Write-Host "INFO: Calling API to create EventHub data connection." $dataConnectionResp = Invoke-RestMethod -Method Post -Uri $powerBIEndpoint -Body $connectionBody -ContentType "application/json" -Headers @{ Authorization = "Bearer $powerbiAccessToken" } -if (($dataConnectionResp.StatusCode -ge 200) -or ($dataConnectionResp.StatusCode -le 204)){ - Write-Host "INFO: Created EventHub data connection." +if ($dataConnectionResp.id.Length -gt 0){ + Write-Host "INFO: Created EventHub data connection with Connection ID: $($dataConnectionResp.id)" } else { Write-Host "ERROR: Failed to create EventHub data connection." @@ -307,6 +310,7 @@ else { # Get connection id $DataSourceConnectionId = $dataConnectionResp.id +Write-Host "INFO: EventHub DataSourceConnectionId: $DataSourceConnectionId" # Create header to authorize with Power BI service $headers = @{ @@ -330,7 +334,7 @@ $mwcTokenBody = @" Write-Host "INFO: Requesting MWC token from Power BI API." $mwcTokenApi = "https://wabi-us-central-b-primary-redirect.analysis.windows.net/metadata/v201606/generatemwctokenv2" $mwcTokenResp = Invoke-RestMethod -Method Post -Uri $mwcTokenApi -Headers $headers -Body $mwcTokenBody -if (($mwcTokenResp.StatusCode -ge 200) -or ($mwcTokenResp.StatusCode -le 204)){ +if ($mwcTokenResp.Token.Length -gt 0){ Write-Host "INFO: Received MWC token." } else { @@ -341,7 +345,8 @@ else { $mwcToken = $mwcTokenResp.token # Event Hub connection body -$streamApi = "https://pbipeastus1-eastus.pbidedicated.windows.net/webapi/capacities/$fabricCapacityId/workloads/Kusto/KustoService/direct/v1/databases/$kqlDatabaseId/dataConnections/$DataSourceConnectionId" +$uriPrefix = $fabricCapacityId -replace '-', '' +$streamApi = "https://$uriPrefix.pbidedicated.windows.net/webapi/capacities/$fabricCapacityId/workloads/Kusto/KustoService/direct/v1/databases/$kqlDatabaseId/dataConnections/$DataSourceConnectionId" $streamBody = @" { "DataConnectionType": "EventHubDataConnection", @@ -355,16 +360,16 @@ $streamBody = @" "DataFormat": "multijson", "DataSourceConnectionId": "$DataSourceConnectionId", "DataConnectionType": "EventHubDataConnection", - "DataConnectionName": "$fabricWorkspaceName-$eventHubName" + "DataConnectionName": "$fabricWorkspaceName" } } "@ # Use MWC Token to create event data connection - Write-Host "INFO: Creating eventstream in KQL database to ingest data." +Write-Host "INFO: Creating eventstream in KQL database to ingest data." $dataSourceConnectionId = Invoke-RestMethod -Method Post -Uri $streamApi -Body $streamBody -ContentType "application/json" -Headers @{ Authorization = "MwcToken $mwcToken" } -if (($mwcTokenResp.StatusCode -ge 200) -or ($mwcTokenResp.StatusCode -le 204)){ - Write-Host "INFO: Created eventstream in KQL database." +if ($dataSourceConnectionId.Length -gt 0){ + Write-Host "INFO: Created eventstream in KQL database with ID: $dataSourceConnectionId" } else { Write-Host "ERROR: Failed to create eventstream in KQL database." @@ -378,7 +383,7 @@ Write-Host "INFO: Downloading and preparing nootebook to import into Fabric work $ordersNotebookBody = (Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/artifacts/notebooks/$ordersSalesForecastNotebook").Content -replace '{{KQL_CLUSTER_URI}}', $kqlQueryServiceUri -replace '{{KQL_DATABASE_NAME}}', $kqlDatabaseName # Convert the KQL dashboard report payload to base64 -Write-Host "INFO: Conerting report content into base64 encoded format." +Write-Host "INFO: Converting report content into base64 encoded format." $base64Payload = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($ordersNotebookBody)) # Build KQL dashboard report payload from the report template @@ -402,14 +407,9 @@ $body = @" # Create KQL dashboard report $nootebookApi = "https://api.fabric.microsoft.com/v1/workspaces/$fabricWorkspaceId/notebooks" $headers = @{"Authorization" = "Bearer $fabricAccessToken"; "Content-Type" = "application/json"} -$httpResp = Invoke-RestMethod -Method Post -Uri $nootebookApi -Headers $headers -Body $body -if (($httpResp.StatusCode -ge 200) -or ($httpResp.StatusCode -le 204)){ - Write-Host "INFO: Created notebook in Fabric workspace." -} -else { - Write-Host "ERROR: Failed to create notebook." - Exit -} +$notebookResp = Invoke-RestMethod -Method Post -Uri $nootebookApi -Headers $headers -Body $body +$notebookResp +Write-Host "INFO: Created notebook in Fabric workspace." # Stop logging into the log file Stop-Transcript \ No newline at end of file diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql index 58f81524cb..14fb85a10c 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql @@ -25,7 +25,7 @@ .drop table sales ifexists // Create sales table -.create table sales (sale_id:string, sale_date:datetime, store_id:string, product_id:string, price:real, discount:real, quantity:int, item_total:real, profit:real, payment_method: string, customer_id:string, register_id: string) +.create table sales (sale_id: string, sale_date: datetime, store_id: string, store_city:string, product_id: string, product_category:string, product_name:string, price: real, discount: real, quantity: int, item_total: real, profit: real, payment_method: string, customer_id:string, register_id: string) // Create function to expand sales data .create-or-alter function expand_sales_data() @@ -37,7 +37,10 @@ sale_id = tostring(data.sale_id), sale_date = todatetime(data.sale_date), store_id = tostring(data.store_id), + store_city = tostring(data.store_city), product_id = tostring(data.product_id), + product_category = tostring(data.product_category), + product_name = tostring(data.product_name), price = toreal(data.price), discount = toreal(data.discount), quantity = toint(data.quantity), @@ -73,4 +76,30 @@ } // Create policy -.alter table inventory policy update @'[{"Source": "staging", "Query": "expand_inventory_data()", "IsEnabled": "True"}]' \ No newline at end of file +.alter table inventory policy update @'[{"Source": "staging", "Query": "expand_inventory_data()", "IsEnabled": "True"}]' + +// Create product table +.drop table products ifexists +.create table products (product_id:string, name:string, price:real, stock:int, category: string, photo_path:string) +.ingest inline into table products <| + 1,Red Apple,0.2,1000,Fruits,static/img/product1.jpg + 2,Banana,0.2,300,Fruits,static/img/product2.jpg + 3,Avocado,1.25,1000,Vegetables,static/img/product3.jpg + 4,Bread,3.0,200,Bakery,static/img/product4.jpg + 5,Milk,2.5,200,Dairy,static/img/product5.jpg + 6,Orange Juice,3.25,100,Fruits,static/img/product6.jpg + 7,Chips,0.25,1000,Snacks,static/img/product7.jpg + 8,Red Pepper,0.5,800,Vegetables,static/img/product8.jpg + 9,Lettuce,0.3,2000,Vegetables,static/img/product9.jpg + 10,Tomato,0.4,5000,Vegetables,static/img/product10.jpg + 11,Strawberry,2.0,500,Fruits,static/img/product11.jpg + 12,Eggs,3.0,10000,Poultry,static/img/product12.jpg + +// Create stores table +.drop table stores ifexists +.create table stores (store_id:string, city:string, state:string, country:string) +.ingest inline into table stores <| + CHI,Chicago,IL,United States + SEA,Seattle, WA,United States + NYC,New York, NY,United States + DAL,Dallas,TX,United States From 062c6cb4574b30cd43edc2281542adcd7df8bf64 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Mon, 28 Oct 2024 15:13:53 +0100 Subject: [PATCH 168/409] Added more tests --- .../PowerShell/tests/common.tests.ps1 | 10 ++- .../artifacts/PowerShell/tests/k8s.tests.ps1 | 61 ++++++++++++++++--- 2 files changed, 61 insertions(+), 10 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 index 2dfc2a962f..7d68813079 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 @@ -1,13 +1,17 @@ BeforeDiscovery { - $null = Connect-AzAccount -Identity -Tenant $env:spnTenantId -Subscription $env:subscriptionId + # Login to Azure PowerShell with service principal provided by user + $spnpassword = ConvertTo-SecureString $env:spnClientSecret -AsPlainText -Force + $spncredential = New-Object System.Management.Automation.PSCredential ($env:spnClientId, $spnpassword) + Connect-AzAccount -ServicePrincipal -Credential $spncredential -Tenant $env:spnTenantId -Subscription $env:subscriptionId } Describe "ArcBox resource group" { BeforeAll { $ResourceGroupName = $env:resourceGroup } - It "should have 30 resources or more" { + It "should have 27 resources or more" { (Get-AzResource -ResourceGroupName $ResourceGroupName).count | Should -BeGreaterOrEqual 27 } -} \ No newline at end of file +} + diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 index cade013441..f75aa8aa93 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 @@ -1,23 +1,70 @@ BeforeDiscovery { - $clusters = @("Ag-K3s-Chicago","Ag-K3s-Seattle") - # Login to Azure PowerShell with service principal provided by user $spnpassword = ConvertTo-SecureString $env:spnClientSecret -AsPlainText -Force $spncredential = New-Object System.Management.Automation.PSCredential ($env:spnClientId, $spnpassword) Connect-AzAccount -ServicePrincipal -Credential $spncredential -Tenant $env:spnTenantId -Subscription $env:subscriptionId + # Import the configuration data + $AgConfig = Import-PowerShellDataFile -Path $Env:AgConfigPath + + # Initialize an array to hold the ArcClusterName values + $ArcClusterNames = @() + + # Loop through each SiteConfig and extract the ArcClusterName + foreach ($site in $AgConfig.SiteConfig.Values) { + $ArcClusterNames += $site.ArcClusterName + } + } -Describe "" -ForEach $clusters { +Describe "" -ForEach $ArcClusterNames { BeforeAll { - $cluster = $_ - $connectedCluster = Get-AzConnectedKubernetes -ResourceGroupName $env:resourceGroup -SubscriptionId $env:subscriptionId | Where-Object Name -like $cluster* + $cluster = $_ + "-$($Env:namingGuid)" + $cluster + $connectedCluster = Get-AzConnectedKubernetes -ResourceGroupName $env:resourceGroup -SubscriptionId $env:subscriptionId -Name $cluster + $aioStatus = az iot ops check --as-object 2>$null | ConvertFrom-Json + $aioPodStatus = kubectl get pods -n azure-iot-operations -o json | ConvertFrom-Json + # Run kubectl to get service details in the azure-iot-operations namespace + $aioServices = kubectl get svc -n azure-iot-operations -o json | ConvertFrom-Json } It "Cluster exists" { - $connectedCluster | Should -Not -BeNullOrEmpty + $connectedCluster | Should -Not -BeNullOrEmpty } It "Azure Arc Connected cluster is connected" { $connectedCluster.ConnectivityStatus | Should -Be "Connected" } -} \ No newline at end of file + It "Azure IOT Operations targets should be successfully deployed" { + foreach ($target in $aioStatus.postDeployment.targets.psobject.Properties) { + $target.Value._all_.status | Should -BeIn @("success", "warning") -Because "Target $($target.Name) should have a successful or warning deployment status" + } + } + It "All pods should be in Running, Completed, or have no containers in CrashLoopBackOff" { + foreach ($pod in $aioPodStatus.items) { + # Check the overall pod phase first + if ($pod.status.phase -in @("Running", "Succeeded")) { + # Now check container statuses within each pod + $containersInCrashLoop = $pod.status.containerStatuses | Where-Object { + $_.state.waiting.reason -eq "CrashLoopBackOff" + } + + # Ensure there are no containers in CrashLoopBackOff for this pod + $containersInCrashLoop | Should -BeNullOrEmpty -Because "Pod $($pod.metadata.name) should not have containers in CrashLoopBackOff" + } + else { + # If the pod phase is not Running or Succeeded, fail the test + $pod.status.phase | Should -BeIn @("Running", "Succeeded") -Because "Pod $($pod.metadata.name) should be Running or Completed" + } + } + } + It "Azure IoT Operations - aio-operator service should be online with a valid ClusterIP" { + # Find the aio-operator service in the list + $aioOperatorService = $aioServices.items | Where-Object { $_.metadata.name -eq "aio-operator" } + + # Verify that the aio-operator service exists + $aioOperatorService | Should -Not -BeNullOrEmpty -Because "The aio-operator service should exist in the azure-iot-operations namespace" + + # Verify that the aio-operator service has a ClusterIP assigned + $aioOperatorService.spec.clusterIP | Should -Not -BeNullOrEmpty -Because "The aio-operator service should have a valid ClusterIP assigned" + } +} From 1c4116bfbfeeb6f42ab9f3c3942a4b3c0db7660b Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Mon, 28 Oct 2024 15:42:50 +0100 Subject: [PATCH 169/409] Updated WinGet logging --- azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 index c79b2ec5a4..09a2bd58b7 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 @@ -41,7 +41,7 @@ while (-not $success -and $retryCount -lt $maxRetries) { try { foreach ($app in $AgConfig.WingetPackagesList) { Write-Host "Installing $app" - & $winget install -e --id $app --silent --accept-package-agreements --accept-source-agreements --ignore-warnings --log "$AgLogsDir\winget.log" > $null 2>&1 + & $winget install -e --id $app --silent --accept-package-agreements --accept-source-agreements --ignore-warnings } # If the command succeeds, set $success to $true to exit the loop From 377de78d37bf5c8a3e7cdea2aaa1b73767a78d3b Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Mon, 28 Oct 2024 15:55:56 +0100 Subject: [PATCH 170/409] Bugfix - syntax --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 459969e97d..a0363a8ff4 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -153,10 +153,10 @@ function Deploy-AIO-M2 { # Create the Schema registry for the cluster Write-Host "[$(Get-Date -Format t)] INFO: Creating the schema registry on the Arc-enabled cluster" -ForegroundColor DarkGray Write-Host "`n" - $schemaName = "${clusterName}-${$Env:namingGuid}-schema" + $schemaName = "${clusterName}-$($Env:namingGuid)-schema" $schemaId = $(az iot ops schema registry create --name $schemaName ` --resource-group $resourceGroup ` - --registry-namespace "$clusterName-${$Env:namingGuid}-namespace" ` + --registry-namespace "$clusterName-$($Env:namingGuid)-namespace" ` --sa-resource-id $(az storage account show --name $aioStorageAccountName --resource-group $resourceGroup -o tsv --query id) ` --query id -o tsv) From 40e94cd24a0dbe3aef3727f92a1bd58f262b1e37 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Mon, 28 Oct 2024 17:23:22 +0100 Subject: [PATCH 171/409] Bumped number of expected resources --- .../artifacts/PowerShell/tests/common.tests.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 index 7d68813079..96e4a85aa1 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 @@ -10,8 +10,8 @@ Describe "ArcBox resource group" { BeforeAll { $ResourceGroupName = $env:resourceGroup } - It "should have 27 resources or more" { - (Get-AzResource -ResourceGroupName $ResourceGroupName).count | Should -BeGreaterOrEqual 27 + It "should have 79 resources or more" { + (Get-AzResource -ResourceGroupName $ResourceGroupName).count | Should -BeGreaterOrEqual 79 } } From 5a95e2ede85ca4101b1e7ea14ec76660b26b6130 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Mon, 28 Oct 2024 17:26:38 +0100 Subject: [PATCH 172/409] Added variables to be able to run the script standalone --- azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 index 8c9ca48499..0fc17a4630 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 @@ -1,16 +1,16 @@ #Requires -Modules @{ ModuleName="Pester"; ModuleVersion="5.6.0"} +$AgConfig = Import-PowerShellDataFile -Path $Env:AgConfigPath +$AgTestsDir = $AgConfig.AgDirectories["AgTestsDir"] Invoke-Pester -Path "$AgTestsDir\common.tests.ps1" -Output Detailed -PassThru -OutVariable tests_common $tests_passed = $tests_common.Passed.Count $tests_failed = $tests_common.Failed.Count - Invoke-Pester -Path "$AgTestsDir\k8s.tests.ps1" -Output Detailed -PassThru -OutVariable tests_k8s $tests_passed = $tests_passed + $tests_k8s.Passed.Count $tests_failed = $tests_failed + $tests_k8s.Failed.Count - Write-Output "Tests succeeded: $tests_passed" Write-Output "Tests failed: $tests_failed" From 27a419152e78f5a503cae173048e4bcf2efd91b9 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Mon, 28 Oct 2024 12:51:10 -0400 Subject: [PATCH 173/409] comment AIO --- .../artifacts/PowerShell/AgLogonScript.ps1 | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 0e94e37363..320aca3ad7 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -192,25 +192,25 @@ if ($scenario -eq "contoso_supermarket") { --namespace $AgConfig.nginx.Namespace ` --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Nginx.log") } -##################################################################### -# Configuring applications on the clusters using GitOps -##################################################################### -if ($scenario -eq "contoso_supermarket") { - Write-Host "[$(Get-Date -Format t)] INFO: Configuring GitOps (Step 13/17)" -ForegroundColor DarkGreen - Deploy-SupermarketConfigs -} +# ##################################################################### +# # Configuring applications on the clusters using GitOps +# ##################################################################### +# if ($scenario -eq "contoso_supermarket") { +# Write-Host "[$(Get-Date -Format t)] INFO: Configuring GitOps (Step 13/17)" -ForegroundColor DarkGreen +# Deploy-SupermarketConfigs +# } -if ($scenario -eq "contoso_motors") { - Update-AzureIoTOpsExtension - Deploy-AIO - Deploy-MotorsConfigs - $mqttIpArray=Set-MQTTIpAddress - Deploy-MQTTExplorer -mqttIpArray $mqttIpArray -}elseif($scenario -eq "contoso_hypermarket"){ - Deploy-AIO-M2 - $mqttIpArray=Set-MQTTIpAddress - Deploy-MQTTExplorer -mqttIpArray $mqttIpArray -} +# if ($scenario -eq "contoso_motors") { +# Update-AzureIoTOpsExtension +# Deploy-AIO +# Deploy-MotorsConfigs +# $mqttIpArray=Set-MQTTIpAddress +# Deploy-MQTTExplorer -mqttIpArray $mqttIpArray +# }elseif($scenario -eq "contoso_hypermarket"){ +# Deploy-AIO-M2 +# $mqttIpArray=Set-MQTTIpAddress +# Deploy-MQTTExplorer -mqttIpArray $mqttIpArray +# } ############################################################## # Deploy Kubernetes Prometheus Stack for Observability @@ -236,9 +236,9 @@ if($scenario -eq "contoso_motors"){ ##################################################################### # Deploy Microsoft Fabric ##################################################################### -if($scenario -eq "contoso_hypermarket"){ - Set-MicrosoftFabric -} +# if($scenario -eq "contoso_hypermarket"){ +# Set-MicrosoftFabric +# } ############################################################## # Creating bookmarks and setting merged kubeconfigs From 7b342067aebf52e9b516fd0ef7d3619ff3a69620 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Mon, 28 Oct 2024 14:28:02 -0400 Subject: [PATCH 174/409] Add AIO back --- .../artifacts/PowerShell/AgLogonScript.ps1 | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 320aca3ad7..713116e037 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -192,25 +192,25 @@ if ($scenario -eq "contoso_supermarket") { --namespace $AgConfig.nginx.Namespace ` --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Nginx.log") } -# ##################################################################### -# # Configuring applications on the clusters using GitOps -# ##################################################################### -# if ($scenario -eq "contoso_supermarket") { -# Write-Host "[$(Get-Date -Format t)] INFO: Configuring GitOps (Step 13/17)" -ForegroundColor DarkGreen -# Deploy-SupermarketConfigs -# } +##################################################################### +# Configuring applications on the clusters using GitOps +##################################################################### +if ($scenario -eq "contoso_supermarket") { + Write-Host "[$(Get-Date -Format t)] INFO: Configuring GitOps (Step 13/17)" -ForegroundColor DarkGreen + Deploy-SupermarketConfigs +} -# if ($scenario -eq "contoso_motors") { -# Update-AzureIoTOpsExtension -# Deploy-AIO -# Deploy-MotorsConfigs -# $mqttIpArray=Set-MQTTIpAddress -# Deploy-MQTTExplorer -mqttIpArray $mqttIpArray -# }elseif($scenario -eq "contoso_hypermarket"){ -# Deploy-AIO-M2 -# $mqttIpArray=Set-MQTTIpAddress -# Deploy-MQTTExplorer -mqttIpArray $mqttIpArray -# } +if ($scenario -eq "contoso_motors") { + Update-AzureIoTOpsExtension + Deploy-AIO + Deploy-MotorsConfigs + $mqttIpArray=Set-MQTTIpAddress + Deploy-MQTTExplorer -mqttIpArray $mqttIpArray +}elseif($scenario -eq "contoso_hypermarket"){ + Deploy-AIO-M2 + $mqttIpArray=Set-MQTTIpAddress + Deploy-MQTTExplorer -mqttIpArray $mqttIpArray +} ############################################################## # Deploy Kubernetes Prometheus Stack for Observability From 89aa014bfa7e6f09cc5f1d768a8b5a01cf586ce4 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 28 Oct 2024 22:05:16 +0300 Subject: [PATCH 175/409] Refactor Azure Jumpstart AG PowerShell module to use insecure listener for broker --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 6859269de1..9e182b9401 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -194,7 +194,7 @@ function Deploy-AIO-M2 { az iot ops create --name $arcClusterName.toLower() ` --cluster $arcClusterName.toLower() ` --resource-group $resourceGroup ` - --broker-listener-type LoadBalancer ` + --add-insecure-listener ` --only-show-errors if ($? -eq $false) { @@ -205,7 +205,7 @@ function Deploy-AIO-M2 { az iot ops create --name $arcClusterName.toLower() ` --cluster $arcClusterName.toLower() ` --resource-group $resourceGroup ` - --broker-listener-type LoadBalancer ` + --add-insecure-listener ` --only-show-errors $retryCount++ } From 0d57ea4654610f208451ee0b297f2be23966191d Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 28 Oct 2024 22:42:51 +0300 Subject: [PATCH 176/409] Refactor Azure Jumpstart AG PowerShell module to use insecure listener for broker --- .../Modules/contoso_hypermarket.psm1 | 15 +++++++++-- .../bicep/data/keyVault.bicep | 25 +++++++++++-------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 9e182b9401..6bd871edfd 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -104,7 +104,7 @@ function Set-K3sClusters { kubectl apply -f $kubeVipRbac $kubeVipDaemonset = "$($Agconfig.AgDirectories.AgToolsDir)\kubeVipDaemon.yml" - (Get-Content -Path $kubeVipDaemonset) -replace 'k3sVIPPlaceholder', "$k3sVIP" | Set-Content -Path $kubeVipDaemonset + (Get-Content -Path $kubeVipDaemonset) -replace 'k3sVIPPlaceholder', "$k3sVIP" | Set-Content -Path $kubeVipDaemonset kubectl apply -f $kubeVipDaemonset Write-Host "Deploying Kube vip cloud controller on k3s cluster" @@ -133,6 +133,11 @@ function Deploy-AIO-M2 { $clusterName = $cluster.Name.ToLower() Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the $clusterName cluster" -ForegroundColor Gray Write-Host "`n" + # Create user-assigned identity for AIO secrets management + Write-Host "Create user-assigned identity for AIO secrets management" -ForegroundColor DarkGray + Write-Host "`n" + $userAssignedManagedIdentityName = "aio-${cluster.Value.ArcClusterName}-${namingGuid}-kv-identity" + $userAssignedMIResourceId = $(az identity create -g $resourceGroup -n $userAssignedManagedIdentityName -o tsv --query id) kubectx $clusterName $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" $keyVaultId = (az keyvault list -g $resourceGroup --resource-type vault --query "[$kvIndex].id" -o tsv) @@ -217,7 +222,7 @@ function Deploy-AIO-M2 { # Configure the Azure IoT Operations instance for secret synchronization Write-Host "[$(Get-Date -Format t)] INFO: Configuring the Azure IoT Operations instance for secret synchronization" -ForegroundColor DarkGray Write-Host "`n" - $userAssignedMIResourceId = (az identity show -g $resourceGroup -n "aio-$clusterName-identity" --query id -o tsv --only-show-errors) + # Enable OIDC issuer and workload identity on the Arc-enabled cluster az connectedk8s update -n $arcClusterName ` --resource-group $resourceGroup ` @@ -232,6 +237,12 @@ function Deploy-AIO-M2 { Write-Host "[$(Get-Date -Format t)] INFO: Configure the Azure IoT Operations instance for secret synchronization" -ForegroundColor DarkGray Write-Host "`n" + # Create user-assigned identity for AIO secrets management + Write-Host "Create user-assigned identity for cloud connections" -ForegroundColor DarkGray + Write-Host "`n" + $userAssignedManagedIdentityName = "aio-${cluster.Value.ArcClusterName}-${namingGuid}-cloud-identity" + $userAssignedMIResourceId = $(az identity create -g $resourceGroup -n $userAssignedManagedIdentityName -o tsv --query id) + az iot ops secretsync enable --name $arcClusterName.toLower() ` --resource-group $resourceGroup ` --mi-user-assigned $userAssignedMIResourceId ` diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep index 1ea0ef2675..f9b83d33bb 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep @@ -27,16 +27,6 @@ param resourceTags object = { Project: 'Jumpstart_azure_aio' } -resource userAssignedManagedIdentitySeattle 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-07-31-preview' = { - name: 'aio-seattle-identity' - location: location -} - -resource userAssignedManagedIdentityChicago 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-07-31-preview' = { - name: 'aio-chicago-identity' - location: location -} - resource akv 'Microsoft.KeyVault/vaults@2023-02-01' = { name: akvNameSite1 location: location @@ -96,6 +86,7 @@ resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { } } +/* // Add role assignment for the SPN: Key Vault Secrets Officer resource roleAssignmentAIOSeattle 'Microsoft.Authorization/roleAssignments@2022-04-01' = { name: guid(userAssignedManagedIdentitySeattle.name, resourceGroup().id, 'b86a8fe4-44ce-4948-aee5-eccb2c155cd7') @@ -120,4 +111,16 @@ resource roleAssignmentAIOChicago 'Microsoft.Authorization/roleAssignments@2022- description: 'Key Vault Secrets Officer' } -} \ No newline at end of file +} + + +resource userAssignedManagedIdentitySeattle 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-07-31-preview' = { + name: 'aio-seattle-identity' + location: location +} + +resource userAssignedManagedIdentityChicago 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-07-31-preview' = { + name: 'aio-chicago-identity' + location: location +} +*/ \ No newline at end of file From 7e2a27e5640cfcc23aa278230e41792f930d6ab6 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 28 Oct 2024 22:49:14 +0300 Subject: [PATCH 177/409] Refactor Azure Jumpstart AG PowerShell module: Fix typo in Agconfig variable name --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 6bd871edfd..e85d30f138 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -254,7 +254,7 @@ function Deploy-AIO-M2 { } function Set-MicrosoftFabric { - # Load Agconfi + # Load Agconfig $fabricWorkspacePrefix = $AgConfig.FabricConfig["WorkspacePrefix"] $fabricWorkspaceName = "$fabricWorkspacePrefix-$namingGuid" $fabricFolder = $AgConfig.AgDirectories["AgFabric"] From e4d4c20ed38e83c45141c6249842aa3972967800 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 28 Oct 2024 22:51:42 +0300 Subject: [PATCH 178/409] Refactor Azure Jumpstart AG PowerShell module: Update variable names and namespaces --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index e85d30f138..ba91f22967 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -136,7 +136,7 @@ function Deploy-AIO-M2 { # Create user-assigned identity for AIO secrets management Write-Host "Create user-assigned identity for AIO secrets management" -ForegroundColor DarkGray Write-Host "`n" - $userAssignedManagedIdentityName = "aio-${cluster.Value.ArcClusterName}-${namingGuid}-kv-identity" + $userAssignedManagedIdentityName = "aio-${clusterName}-${namingGuid}-kv-identity" $userAssignedMIResourceId = $(az identity create -g $resourceGroup -n $userAssignedManagedIdentityName -o tsv --query id) kubectx $clusterName $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" @@ -158,10 +158,10 @@ function Deploy-AIO-M2 { # Create the Schema registry for the cluster Write-Host "[$(Get-Date -Format t)] INFO: Creating the schema registry on the Arc-enabled cluster" -ForegroundColor DarkGray Write-Host "`n" - $schemaName = "${clusterName}schema" + $schemaName = "${clusterName}schema${namingGuid}" $schemaId = $(az iot ops schema registry create --name $schemaName ` --resource-group $resourceGroup ` - --registry-namespace "$clusterName-namespace" ` + --registry-namespace "$clusterName-${namingGuid}-namespace" ` --sa-resource-id $(az storage account show --name $aioStorageAccountName --resource-group $resourceGroup -o tsv --query id) ` --query id -o tsv) @@ -240,7 +240,7 @@ function Deploy-AIO-M2 { # Create user-assigned identity for AIO secrets management Write-Host "Create user-assigned identity for cloud connections" -ForegroundColor DarkGray Write-Host "`n" - $userAssignedManagedIdentityName = "aio-${cluster.Value.ArcClusterName}-${namingGuid}-cloud-identity" + $userAssignedManagedIdentityName = "aio-${clusterName}-${namingGuid}-cloud-identity" $userAssignedMIResourceId = $(az identity create -g $resourceGroup -n $userAssignedManagedIdentityName -o tsv --query id) az iot ops secretsync enable --name $arcClusterName.toLower() ` From 85a77e87ecb8b9d0b7a38aaacf0f4e15e04a51f0 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 28 Oct 2024 22:52:45 +0300 Subject: [PATCH 179/409] Refactor Azure Jumpstart AG PowerShell module: Update schema registry naming convention --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index ba91f22967..f73e118fc0 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -158,10 +158,10 @@ function Deploy-AIO-M2 { # Create the Schema registry for the cluster Write-Host "[$(Get-Date -Format t)] INFO: Creating the schema registry on the Arc-enabled cluster" -ForegroundColor DarkGray Write-Host "`n" - $schemaName = "${clusterName}schema${namingGuid}" + $schemaName = "${clusterName}-$($Env:namingGuid)-schema" $schemaId = $(az iot ops schema registry create --name $schemaName ` --resource-group $resourceGroup ` - --registry-namespace "$clusterName-${namingGuid}-namespace" ` + --registry-namespace "$clusterName-$($Env:namingGuid)-namespace" ` --sa-resource-id $(az storage account show --name $aioStorageAccountName --resource-group $resourceGroup -o tsv --query id) ` --query id -o tsv) From bdfd3c34abe54e73851e2c132ceefe1876be1748 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 29 Oct 2024 00:31:22 +0300 Subject: [PATCH 180/409] Refactor Azure Jumpstart AG PowerShell module: Update mqListenerService to use insecure listener for broker --- .../artifacts/PowerShell/AgLogonScript.ps1 | 2 +- .../artifacts/PowerShell/Bootstrap.ps1 | 4 +-- .../Modules/contoso_hypermarket.psm1 | 21 +++++++----- .../mqtt_explorer_settings_hypermarket.json | 34 +++++++++++++++++++ ...son => mqtt_explorer_settings_motors.json} | 0 5 files changed, 49 insertions(+), 12 deletions(-) create mode 100644 azure_jumpstart_ag/artifacts/settings/mqtt_explorer_settings_hypermarket.json rename azure_jumpstart_ag/artifacts/settings/{mqtt_explorer_settings.json => mqtt_explorer_settings_motors.json} (100%) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 0e94e37363..ce09297d1e 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -50,7 +50,7 @@ if ($scenario -eq "contoso_supermarket") { $global:spnObjectId = $Env:spnObjectId }elseif ($scenario -eq "contoso_hypermarket"){ $global:aioNamespace = "azure-iot-operations" - $global:mqListenerService = "aio-broker" + $global:mqListenerService = "aio-broker-insecure" $global:mqttExplorerReleasesUrl = $websiteUrls["mqttExplorerReleases"] $global:stagingStorageAccountName = $Env:stagingStorageAccountName $global:aioStorageAccountName = $Env:aioStorageAccountName diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 1ee4527277..7fcecb3001 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -264,7 +264,7 @@ if($scenario -eq "contoso_supermarket"){ elseif ($scenario -eq "contoso_motors") { Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/Bookmarks-contoso-motors") -OutFile "$AgToolsDir\Bookmarks" Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/mq_cloudConnector.yml") -OutFile "$AgToolsDir\mq_cloudConnector.yml" - Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/mqtt_explorer_settings.json") -OutFile "$AgToolsDir\mqtt_explorer_settings.json" + Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/mqtt_explorer_settings_motors.json") -OutFile "$AgToolsDir\mqtt_explorer_settings.json" } elseif ($scenario -eq "contoso_hypermarket") { Invoke-WebRequest ($templateBaseUrl + "artifacts/kubernetes/K3s/longhorn.yaml") -OutFile "$AgToolsDir\longhorn.yaml" @@ -272,7 +272,7 @@ elseif ($scenario -eq "contoso_hypermarket") { Invoke-WebRequest ($templateBaseUrl + "artifacts/kubernetes/K3s/kubeVipDaemon.yml") -OutFile "$AgToolsDir\kubeVipDaemon.yml" Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/Bookmarks-contoso-hypermarket") -OutFile "$AgToolsDir\Bookmarks" #Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/mq_cloudConnector.yml") -OutFile "$AgToolsDir\mq_cloudConnector.yml" - Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/mqtt_explorer_settings.json") -OutFile "$AgToolsDir\mqtt_explorer_settings.json" + Invoke-WebRequest ($templateBaseUrl + "artifacts/settings/mqtt_explorer_settings_hypermarket.json") -OutFile "$AgToolsDir\mqtt_explorer_settings.json" Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-workloads.json") -OutFile "$AgMonitoringDir\grafana-app-workloads.json" Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-pods.json") -OutFile "$AgMonitoringDir\grafana-app-pods.json" Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-node-exporter-full-v2.json") -OutFile "$AgMonitoringDir\grafana-node-exporter-full-v2.json" diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index f73e118fc0..fd5d23d4f1 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -136,8 +136,15 @@ function Deploy-AIO-M2 { # Create user-assigned identity for AIO secrets management Write-Host "Create user-assigned identity for AIO secrets management" -ForegroundColor DarkGray Write-Host "`n" - $userAssignedManagedIdentityName = "aio-${clusterName}-${namingGuid}-kv-identity" - $userAssignedMIResourceId = $(az identity create -g $resourceGroup -n $userAssignedManagedIdentityName -o tsv --query id) + $userAssignedManagedIdentityKvName = "aio-${clusterName}-${namingGuid}-kv-identity" + $userAssignedMIKvResourceId = $(az identity create -g $resourceGroup -n $userAssignedManagedIdentityKvName -o tsv --query id) + + # Create user-assigned identity for AIO secrets management + Write-Host "Create user-assigned identity for cloud connections" -ForegroundColor DarkGray + Write-Host "`n" + $userAssignedManagedIdentityCloudName = "aio-${clusterName}-${namingGuid}-cloud-identity" + $userAssignedMICloudResourceId = $(az identity create -g $resourceGroup -n $userAssignedManagedIdentityCloudName -o tsv --query id) + kubectx $clusterName $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" $keyVaultId = (az keyvault list -g $resourceGroup --resource-type vault --query "[$kvIndex].id" -o tsv) @@ -200,6 +207,7 @@ function Deploy-AIO-M2 { --cluster $arcClusterName.toLower() ` --resource-group $resourceGroup ` --add-insecure-listener ` + --enable-rsync ` --only-show-errors if ($? -eq $false) { @@ -233,19 +241,14 @@ function Deploy-AIO-M2 { Write-Host "`n" az iot ops identity assign --name $arcClusterName.toLower() ` --resource-group $resourceGroup ` - --mi-user-assigned $userAssignedMIResourceId + --mi-user-assigned $userAssignedMIKvResourceId Write-Host "[$(Get-Date -Format t)] INFO: Configure the Azure IoT Operations instance for secret synchronization" -ForegroundColor DarkGray Write-Host "`n" - # Create user-assigned identity for AIO secrets management - Write-Host "Create user-assigned identity for cloud connections" -ForegroundColor DarkGray - Write-Host "`n" - $userAssignedManagedIdentityName = "aio-${clusterName}-${namingGuid}-cloud-identity" - $userAssignedMIResourceId = $(az identity create -g $resourceGroup -n $userAssignedManagedIdentityName -o tsv --query id) az iot ops secretsync enable --name $arcClusterName.toLower() ` --resource-group $resourceGroup ` - --mi-user-assigned $userAssignedMIResourceId ` + --mi-user-assigned $userAssignedMICloudResourceId ` --kv-resource-id $keyVaultId ` --only-show-errors diff --git a/azure_jumpstart_ag/artifacts/settings/mqtt_explorer_settings_hypermarket.json b/azure_jumpstart_ag/artifacts/settings/mqtt_explorer_settings_hypermarket.json new file mode 100644 index 0000000000..f039a408ad --- /dev/null +++ b/azure_jumpstart_ag/artifacts/settings/mqtt_explorer_settings_hypermarket.json @@ -0,0 +1,34 @@ +{ + "ConnectionManager_connections": { + "mqtt.eclipse.org": { + "certValidation": false, + "clientId": "mqtt-explorer-640c948e", + "encryption": false, + "host": "seattleIpPlaceholder", + "id": "mqtt.eclipse.org", + "name": "seattle", + "port": 1883, + "protocol": "mqtt", + "subscriptions": [ + "#", + "$SYS/#" + ], + "type": "mqtt" + }, + "mqtt.eclipse.org2": { + "certValidation": false, + "clientId": "mqtt-explorer-640c948e", + "encryption": false, + "host": "chicagoIpPlaceholder", + "id": "mqtt.eclipse.org2", + "name": "chicago", + "port": 1883, + "protocol": "mqtt", + "subscriptions": [ + "#", + "$SYS/#" + ], + "type": "mqtt" + } + } +} \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/settings/mqtt_explorer_settings.json b/azure_jumpstart_ag/artifacts/settings/mqtt_explorer_settings_motors.json similarity index 100% rename from azure_jumpstart_ag/artifacts/settings/mqtt_explorer_settings.json rename to azure_jumpstart_ag/artifacts/settings/mqtt_explorer_settings_motors.json From e7f970572988cb19bbabb604e13acbdcefb54f2f Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 29 Oct 2024 00:32:53 +0300 Subject: [PATCH 181/409] Refactor Azure Jumpstart AG PowerShell module: Add support for enabling rsync during deployment --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 1 + 1 file changed, 1 insertion(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index fd5d23d4f1..4e59ca2386 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -219,6 +219,7 @@ function Deploy-AIO-M2 { --cluster $arcClusterName.toLower() ` --resource-group $resourceGroup ` --add-insecure-listener ` + --enable-rsync ` --only-show-errors $retryCount++ } From dc351c6fd780b2875f16e77caef827ee349e8b94 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 29 Oct 2024 00:33:07 +0300 Subject: [PATCH 182/409] Refactor Azure Jumpstart AG PowerShell module: Remove redundant rsync flag in Deploy-AIO-M2 function --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 2 -- 1 file changed, 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 4e59ca2386..b2aca93041 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -207,7 +207,6 @@ function Deploy-AIO-M2 { --cluster $arcClusterName.toLower() ` --resource-group $resourceGroup ` --add-insecure-listener ` - --enable-rsync ` --only-show-errors if ($? -eq $false) { @@ -219,7 +218,6 @@ function Deploy-AIO-M2 { --cluster $arcClusterName.toLower() ` --resource-group $resourceGroup ` --add-insecure-listener ` - --enable-rsync ` --only-show-errors $retryCount++ } From 44df7e9b0511408d0ae62e3b82419e4c85bd37ab Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 29 Oct 2024 00:42:54 +0300 Subject: [PATCH 183/409] Refactor Azure Jumpstart AG PowerShell module: Update vmSize to 'Standard_D8s_v5' in clientVm.bicep --- .../contoso_hypermarket/bicep/clientVm/clientVm.bicep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep index 334c432c88..f4680b236d 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep @@ -139,7 +139,7 @@ resource vm 'Microsoft.Compute/virtualMachines@2022-11-01' = { } properties: { hardwareProfile: { - vmSize: 'Standard_D32s_v5' + vmSize: 'Standard_D8s_v5' } storageProfile: { osDisk: { From b8ca58c893bd109f68e5ddc54d46a8e8ecaa384d Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 29 Oct 2024 01:37:21 +0300 Subject: [PATCH 184/409] Refactor Azure Jumpstart AG PowerShell module: Add support for enabling rsync during deployment --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index b2aca93041..e890cd2f6a 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -129,6 +129,7 @@ function Set-K3sClusters { function Deploy-AIO-M2 { Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the Arc-enabled clusters" -ForegroundColor Gray Write-Host "`n" + $kvIndex = 0 foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { $clusterName = $cluster.Name.ToLower() Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the $clusterName cluster" -ForegroundColor Gray @@ -180,7 +181,6 @@ function Deploy-AIO-M2 { --resource-group $resourceGroup ` --sr-resource-id $schemaId ` --only-show-errors - #az iot ops init --cluster $arcClusterName.toLower() -g $resourceGroup --kv-id $keyVaultId --sp-app-id $spnClientId --sp-secret $spnClientSecret --sp-object-id $spnObjectId --mq-service-type loadBalancer --mq-insecure true --simulate-plc false --no-block --only-show-errors if ($? -eq $false) { $aioStatus = "notDeployed" Write-Host "`n" @@ -242,13 +242,15 @@ function Deploy-AIO-M2 { --resource-group $resourceGroup ` --mi-user-assigned $userAssignedMIKvResourceId + Start-Sleep -Seconds 60 + Write-Host "[$(Get-Date -Format t)] INFO: Configure the Azure IoT Operations instance for secret synchronization" -ForegroundColor DarkGray Write-Host "`n" az iot ops secretsync enable --name $arcClusterName.toLower() ` + --kv-resource-id $keyVaultId ` --resource-group $resourceGroup ` --mi-user-assigned $userAssignedMICloudResourceId ` - --kv-resource-id $keyVaultId ` --only-show-errors $kvIndex++ From ac8002a09dfb9a399f0fad9478ec763f2b18b267 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Tue, 29 Oct 2024 08:03:20 +0100 Subject: [PATCH 185/409] WinGet - remove pindown + cleanup --- azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 index 09a2bd58b7..c81b44aeed 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 @@ -9,13 +9,7 @@ $logFilePath = Join-Path -Path $AgLogsDir -ChildPath ('WinGet-provisioning-' + ( Start-Transcript -Path $logFilePath -Force -ErrorAction SilentlyContinue # Install WinGet PowerShell modules -Install-PSResource -Name Microsoft.WinGet.Client -Scope AllUsers -Quiet -AcceptLicense -TrustRepository -Version 1.8.1911 -#Install-PSResource -Name Microsoft.WinGet.DSC -Scope AllUsers -Quiet -AcceptLicense -TrustRepository -Prerelease -Version 1.8.1911-alpha - -# Install DSC resources required for ArcBox -#Install-PSResource -Name DSCR_Font -Scope AllUsers -Quiet -AcceptLicense -TrustRepository -#Install-PSResource -Name HyperVDsc -Scope AllUsers -Quiet -AcceptLicense -TrustRepository -Prerelease -#Install-PSResource -Name NetworkingDsc -Scope AllUsers -Quiet -AcceptLicense -TrustRepository +Install-PSResource -Name Microsoft.WinGet.Client -Scope AllUsers -Quiet -AcceptLicense -TrustRepository # Install WinGet CLI $null = Repair-WinGetPackageManager -AllUsers From ddfa35dbefeafed41e882c5a94f95c193d8a1539 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Tue, 29 Oct 2024 16:32:36 +0100 Subject: [PATCH 186/409] Added kvIndex variable initialization --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 1 + 1 file changed, 1 insertion(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index a0363a8ff4..f8ad8b6e7d 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -129,6 +129,7 @@ function Set-K3sClusters { function Deploy-AIO-M2 { Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the Arc-enabled clusters" -ForegroundColor Gray Write-Host "`n" + $kvIndex = 0 foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { $clusterName = $cluster.Name.ToLower() Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the $clusterName cluster" -ForegroundColor Gray From ad66ca15f36ec590ac908f6843d2dcb6f50a7596 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Tue, 29 Oct 2024 14:23:48 -0400 Subject: [PATCH 187/409] update CHM logo --- azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 966b128e0c..a661b17b3b 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -323,6 +323,8 @@ elseif ($scenario -eq "contoso_hypermarket") { Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-pods.json") -OutFile "$AgMonitoringDir\grafana-app-pods.json" Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-node-exporter-full-v2.json") -OutFile "$AgMonitoringDir\grafana-node-exporter-full-v2.json" Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-stores.json") -OutFile "$AgMonitoringDir\grafana-app-stores.json" + Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso-hypermarket.png") -OutFile $AgIconsDir\contoso-hypermarket.png + Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso-hypermarket.svg") -OutFile $AgIconsDir\contoso-hypermarket.svg } From ff80fffcb2259fe9e85e51162b18b1daee4a8a77 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Tue, 29 Oct 2024 17:15:41 -0400 Subject: [PATCH 188/409] comment aio --- .../artifacts/PowerShell/AgLogonScript.ps1 | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index df768c5496..8aff77312d 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -207,25 +207,25 @@ if ($scenario -eq "contoso_supermarket") { --namespace $AgConfig.nginx.Namespace ` --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Nginx.log") } -##################################################################### -# Configuring applications on the clusters using GitOps -##################################################################### -if ($scenario -eq "contoso_supermarket") { - Write-Host "[$(Get-Date -Format t)] INFO: Configuring GitOps (Step 13/17)" -ForegroundColor DarkGreen - Deploy-SupermarketConfigs -} +# ##################################################################### +# # Configuring applications on the clusters using GitOps +# ##################################################################### +# if ($scenario -eq "contoso_supermarket") { +# Write-Host "[$(Get-Date -Format t)] INFO: Configuring GitOps (Step 13/17)" -ForegroundColor DarkGreen +# Deploy-SupermarketConfigs +# } -if ($scenario -eq "contoso_motors") { - Update-AzureIoTOpsExtension - Deploy-AIO - Deploy-MotorsConfigs - $mqttIpArray=Set-MQTTIpAddress - Deploy-MQTTExplorer -mqttIpArray $mqttIpArray -}elseif($scenario -eq "contoso_hypermarket"){ - Deploy-AIO-M2 - $mqttIpArray=Set-MQTTIpAddress - Deploy-MQTTExplorer -mqttIpArray $mqttIpArray -} +# if ($scenario -eq "contoso_motors") { +# Update-AzureIoTOpsExtension +# Deploy-AIO +# Deploy-MotorsConfigs +# $mqttIpArray=Set-MQTTIpAddress +# Deploy-MQTTExplorer -mqttIpArray $mqttIpArray +# }elseif($scenario -eq "contoso_hypermarket"){ +# Deploy-AIO-M2 +# $mqttIpArray=Set-MQTTIpAddress +# Deploy-MQTTExplorer -mqttIpArray $mqttIpArray +# } ############################################################## # Deploy Kubernetes Prometheus Stack for Observability From 2f548a7ba3969847b6c3838c323bd328abd51357 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Tue, 29 Oct 2024 22:25:29 +0100 Subject: [PATCH 189/409] Export test results to file and resource group tag --- .../PowerShell/tests/Invoke-Test.ps1 | 49 ++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 index 0fc17a4630..b9851b8556 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 @@ -2,7 +2,6 @@ $AgConfig = Import-PowerShellDataFile -Path $Env:AgConfigPath $AgTestsDir = $AgConfig.AgDirectories["AgTestsDir"] - Invoke-Pester -Path "$AgTestsDir\common.tests.ps1" -Output Detailed -PassThru -OutVariable tests_common $tests_passed = $tests_common.Passed.Count $tests_failed = $tests_common.Failed.Count @@ -19,4 +18,50 @@ Write-Header "Adding deployment test results to wallpaper using BGInfo" Set-Content "$Env:windir\TEMP\agora-tests-succeeded.txt" $tests_passed Set-Content "$Env:windir\TEMP\agora-tests-failed.txt" $tests_failed -bginfo.exe $AgTestsDir\ag-bginfo.bgi /timer:0 /NOLICPROMPT \ No newline at end of file +bginfo.exe $AgTestsDir\ag-bginfo.bgi /timer:0 /NOLICPROMPT + + +$DeploymentStatusPath = "C:\Ag\Logs\DeploymentStatus.log" + +Write-Header "Exporting deployment test results to $DeploymentStatusPath" + +Write-Output "`n" | Out-File -FilePath $DeploymentStatusPath + +$asciiArt = @" +██████╗ ███████╗██████╗ ██╗ ██████╗ ██╗ ██╗███╗ ███╗███████╗███╗ ██╗████████╗ ███████╗████████╗ █████╗ ████████╗██╗ ██╗███████╗ +██╔══██╗██╔════╝██╔══██╗██║ ██╔═══██╗╚██╗ ██╔╝████╗ ████║██╔════╝████╗ ██║╚══██╔══╝ ██╔════╝╚══██╔══╝██╔══██╗╚══██╔══╝██║ ██║██╔════╝ +██║ ██║█████╗ ██████╔╝██║ ██║ ██║ ╚████╔╝ ██╔████╔██║█████╗ ██╔██╗ ██║ ██║ ███████╗ ██║ ███████║ ██║ ██║ ██║███████╗ +██║ ██║██╔══╝ ██╔═══╝ ██║ ██║ ██║ ╚██╔╝ ██║╚██╔╝██║██╔══╝ ██║╚██╗██║ ██║ ╚════██║ ██║ ██╔══██║ ██║ ██║ ██║╚════██║ +██████╔╝███████╗██║ ███████╗╚██████╔╝ ██║ ██║ ╚═╝ ██║███████╗██║ ╚████║ ██║ ███████║ ██║ ██║ ██║ ██║ ╚██████╔╝███████║ +╚═════╝ ╚══════╝╚═╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝ +"@ + +Write-Output $asciiArt | Out-File -FilePath $DeploymentStatusPath -Append + +Write-Output "`nTests succeeded: $tests_passed" | Out-File -FilePath $DeploymentStatusPath -Append +Write-Output "Tests failed: $tests_failed`n" | Out-File -FilePath $DeploymentStatusPath -Append + +Write-Output "To get an updated deployment status, open Windows Terminal and run:" | Out-File -FilePath $DeploymentStatusPath -Append +Write-Output "C:\Ag\Tests\Invoke-Test.ps1`n" | Out-File -FilePath $DeploymentStatusPath -Append + +Write-Output "Failed:" | Out-File -FilePath $DeploymentStatusPath -Append +$tests_common.Failed | Out-File -FilePath $DeploymentStatusPath -Append +$tests_k8s.Failed | Out-File -FilePath $DeploymentStatusPath -Append + +Write-Output "Passed:" | Out-File -FilePath $DeploymentStatusPath -Append +$tests_k8s.Passed | Out-File -FilePath $DeploymentStatusPath -Append +$tests_common.Passed | Out-File -FilePath $DeploymentStatusPath -Append + +Write-Header "Exporting deployment test results to resource group tag DeploymentStatus" + +$DeploymentStatusString = "Tests succeeded: $tests_passed Tests failed: $tests_failed" + +$tags = Get-AzResourceGroup -Name $env:resourceGroup | Select-Object -ExpandProperty Tags + +if ($null -ne $tags) { + $tags["DeploymentStatus"] = $DeploymentStatusString +} else { + $tags = @{"DeploymentStatus" = $DeploymentStatusString} +} + +$null = Set-AzResourceGroup -ResourceGroupName $env:resourceGroup -Tag $tags \ No newline at end of file From b0456a3d8d70e0167fcdbfaaa16a938ca2c7a58c Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Tue, 29 Oct 2024 22:28:10 +0100 Subject: [PATCH 190/409] Create desktop shortcut for Logs-folder --- .../artifacts/PowerShell/AgLogonScript.ps1 | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 771de201c9..efc9a6d487 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -288,6 +288,26 @@ if($scenario -eq "contoso_supermarket"){ Get-Job -name images-cache-cleanup | Remove-Job } +# Create desktop shortcut for Logs-folder +$WshShell = New-Object -comObject WScript.Shell +$LogsPath = "C:\Ag\Logs" +$Shortcut = $WshShell.CreateShortcut("$Env:USERPROFILE\Desktop\Logs.lnk") +$Shortcut.TargetPath = $LogsPath +$shortcut.WindowStyle = 3 +$shortcut.Save() + +# Configure Windows Terminal as the default terminal application +$registryPath = "HKCU:\Console\%%Startup" + +if (Test-Path $registryPath) { + Set-ItemProperty -Path $registryPath -Name "DelegationConsole" -Value "{2EACA947-7F5F-4CFA-BA87-8F7FBEEFBE69}" + Set-ItemProperty -Path $registryPath -Name "DelegationTerminal" -Value "{E12CFF52-A866-4C77-9A90-F570A7AA2C6B}" +} else { + New-Item -Path $registryPath -Force | Out-Null + Set-ItemProperty -Path $registryPath -Name "DelegationConsole" -Value "{2EACA947-7F5F-4CFA-BA87-8F7FBEEFBE69}" + Set-ItemProperty -Path $registryPath -Name "DelegationTerminal" -Value "{E12CFF52-A866-4C77-9A90-F570A7AA2C6B}" +} + # Removing the LogonScript Scheduled Task Write-Host "[$(Get-Date -Format t)] INFO: Removing scheduled logon task so it won't run on next login." -ForegroundColor Gray From 2e48a233f63485ad9720d2856f5f7e2e646eb20d Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Tue, 29 Oct 2024 22:52:17 +0100 Subject: [PATCH 191/409] Simplified log-file header --- .../artifacts/PowerShell/tests/Invoke-Test.ps1 | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 index b9851b8556..3e39ddec30 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/tests/Invoke-Test.ps1 @@ -25,18 +25,7 @@ $DeploymentStatusPath = "C:\Ag\Logs\DeploymentStatus.log" Write-Header "Exporting deployment test results to $DeploymentStatusPath" -Write-Output "`n" | Out-File -FilePath $DeploymentStatusPath - -$asciiArt = @" -██████╗ ███████╗██████╗ ██╗ ██████╗ ██╗ ██╗███╗ ███╗███████╗███╗ ██╗████████╗ ███████╗████████╗ █████╗ ████████╗██╗ ██╗███████╗ -██╔══██╗██╔════╝██╔══██╗██║ ██╔═══██╗╚██╗ ██╔╝████╗ ████║██╔════╝████╗ ██║╚══██╔══╝ ██╔════╝╚══██╔══╝██╔══██╗╚══██╔══╝██║ ██║██╔════╝ -██║ ██║█████╗ ██████╔╝██║ ██║ ██║ ╚████╔╝ ██╔████╔██║█████╗ ██╔██╗ ██║ ██║ ███████╗ ██║ ███████║ ██║ ██║ ██║███████╗ -██║ ██║██╔══╝ ██╔═══╝ ██║ ██║ ██║ ╚██╔╝ ██║╚██╔╝██║██╔══╝ ██║╚██╗██║ ██║ ╚════██║ ██║ ██╔══██║ ██║ ██║ ██║╚════██║ -██████╔╝███████╗██║ ███████╗╚██████╔╝ ██║ ██║ ╚═╝ ██║███████╗██║ ╚████║ ██║ ███████║ ██║ ██║ ██║ ██║ ╚██████╔╝███████║ -╚═════╝ ╚══════╝╚═╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝ -"@ - -Write-Output $asciiArt | Out-File -FilePath $DeploymentStatusPath -Append +Write-Output "Deployment Status" | Out-File -FilePath $DeploymentStatusPath Write-Output "`nTests succeeded: $tests_passed" | Out-File -FilePath $DeploymentStatusPath -Append Write-Output "Tests failed: $tests_failed`n" | Out-File -FilePath $DeploymentStatusPath -Append From f2f53e076b3fe19cb4574edabdc8ae1898d01bc3 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Tue, 29 Oct 2024 19:34:17 -0400 Subject: [PATCH 192/409] Update image --- .../artifacts/icons/contoso-hypermarket.png | Bin 21451 -> 20539 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.png b/azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.png index cdd805675c19b8e3348b256ee1076f05aa331b5a..379dae8644522f87e6c3e25150eb28d3ab083cf9 100644 GIT binary patch literal 20539 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%0DZiV(w$Ycmiik!zv>_pY==Ijuk8XQW?~YH7#V+ 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 eilQir=RW{|?sOk2Z9ESE0000!U{~#OSEN zU-ko5TpvAp`AAMuT;l`EUdE*{xVz!LrNw3Nx5eO*Q)N0o2a*Bgj6xeCjYqTm^Lrf) zQ{h(zYKJ=ikV?nOgU3B|;TD>v_=;dD0~Nf1{LpUiFWv_@+oJ3Xf`*E!ZbPST+OJ2s zgnn+X6*q2em0h`wpOkHE6>Z;dAVy)RXksWTkHC-6cJo^Ae@sR${rvif;SuI1)UThy zm2oIgJ#c~FfJa(0F(1Kqzlpd7{rCJQSS#e87sXJ#nI2J87F-SE{BJN23jBYgetYE9 zlerBOMgMo0N6;q}|2_4+0JRn3U4(P{^1opgah?8q>VK1+e*V9cy=6Y+yY1kHjTL@V zZuMZk*Cw#@b(qSlzxPKm2KHS3L>@v4TqwPCXf9$QialoJ9w`yQM zQZ4EtVG@wu{zsgVyZDh4x*aY9`xs$zg^f{L()H_G`tuP#mzL`{`yMSDzC*cvEgMF6 z!Uek$H{=9#))Rri3}PsY!z#7n$||AR=xX3Yor|LaQFEVLWBQi6^0X`y#igvbuESh z3+I3l&f|?%Erz^DPO^;V8SNV4jOm*G9v?pzIa;P)mLB#y23h(sL$7leMn3 z-)0WTviwUo%~g^p!h9A&VrMWn)4mh z=a|9o0!mWKzFHI}5P}L4??golPDCw_O!;2zB(t)zOsCFdb2lEZ%=KF_AE6bj$O2`J z0I7B}wHXGdqPAvdn|}`0yA3{eA=IgHG@Q%%qMol|Fq9iC(}^7&PM%^GKmen|S1yg1 z0c+RCdGkO~F=e&?)y&`+RP_m#!RAc!i@dQz1v%_E8$ZTxJ{oG>uZYrh%$S;Ej|RuS zjYNVBP{3~)A5oA=@P_=|edkfg$Zl66v%S`ToYl+Z%T{WpHa?W6*%GhC_4`l(BY*%W z#UhZE(gq>!sj2ecOkt>f(K3YhIz~6@o)~fReoU`#zm@D3a7xlWDQGh@X;j)7&C&QS z?-ZV$|H#Rz@Xyz5tsmJEnhZzgUl8 z>gcpxGDk3k$%>LfpJ-x&om|k2Tu)?o+2r<$m3NAjy;Twhb0eN58IU#w?&7&Ht&41 zSjCCO4$Mu;7VU4!>q~4f82}srEOXLB>w*XG{#38sP@XfQ+iO&>Jy4#z6Lf!-0%A8a zS=68zw!dnGpAU1ys;CiyAA$HwvDLEAT3NZvT7TWZ1iiOSy|+F7riYo1>}RTnC{jSj zsiBm0`U)|>CB$B5*RGc`Qdu`G#t3(-{i{>y>i)HsgVU#mYiIh{Gmeu7Z`Jzuu97po zB=g&xI4>0`9)vibxxb@h0dgsJM*9RCwEoO(wD;1RiGkfyMsjSRt56?XKc#9u+$8~$?Co**T#QR&FT_I`~|A?T)^H8={8$RaMoVmjs%UUSEWsk#(7eFt8L`Y966 zA4q|el6s{A6~!U&@XnS;n)G0rpqt{Wcn!3Fr_(4DaC*+ld^lZ)!#8U+-IIGru7syJ z?Uoa&Kxga3iFPVm8+w!yGjlrM7VgFxP=Ml3ww1;CTFPJu5@LU2&Yl-Uk!blY+h3|W~QmCLsUnp5RM6tU9n z;zDyGklN^PH%BP{JSLdS&)8eC}Wp0?PVD`RiZId*K2~))kB?-#cjI zc%T)iUb!=?#+gORjEn!D7V@HXQ3-ONAE$UKrutp>-!ShzPp&$Yzm^Do5Z;ICak7-d znS93XGi=IhbXrY7d1HP|y>#Eko|Wpu{HT-4vvK`C9+fRi+q+`FUb>XufA()=z{eVh?()_fC? z^@HIm=d~6S_*nSNogVQGK>wQl#(dB0tV>IG=x^Hd;aG>slpjo~fon6Z~APbJ}u zjF>H%QiF9-01o^gxM4yIz8<*Tj4O&3`IdTT?e2F~GW|5=XJMzv=-1>Ic*AM)T9>t3 zRDCA9MpS}G)7bmvWJ3KPG|}l{3iq#m9?PrUMy^EiMe{8vI@Bl3zTeTY^)NveG!iJ( zO461YHJBrHL`hioHLBw^V*%v2anr>ie-95p^~<isQ-BJa9tTxyG@P#ZP#)})dwxs*Pmc!H4 z$v1C&uZ=wcO5<^PK0CPJT6P;ddb==Hdneeq;a4d@l?Sfwv{N$JYwmGm5bB0#O8;-~ zMp^58)y))n)|O09zoaOR4r-Y|m8e#E|H_;^jomsS0}p%K>f#2OQ;5vl?(cuUc&&!% z$MX8}!RL~r zR&}Rb>a%sc-_e$wVh(c)7dOCv=?K0Fy6z2cTB`?IVhxTxctSumQ%fylICuz2l2SJ3 z3?fG2M>}tSQ>T=)TI*eli4FbWUa7{hME`wX*!g_ja&ON4$NPhfhKt7P2ZzgnEL{KN z)9%a_S=rCc#EvX%+AXLI%Tg%zW7{i0=Ae*e_^7=-i@dTPJIZQ0@EdAA_TC>Cbt$`# z{c-z5vB(|&1dYPw%QMCf#a4cpq(29IS;UUz=KD8v`Uu(s3$8@mES6u^PGSdhJ?Lo- z&1>gJr-8|ll!SmU?4B))-s7)s+|Uq>+)uTNw@Q&t2$9Zv61n|?kWYxo!Pj8y*M&4d zUN7Q9$1<)x?zHI^HqE;Ij(=VY*EZ98&QgfGRi$`B+xGusRzDaI=c5?PgHh8J6@UH4 zPk;I`f3y>t%9oedQBXbBSaC?(OdOqY)#tq;{9d|jt8nT=4&$=LN@7~1z9WxLK2n$~ za$mdPRI@;|u-8i^!8B|v#Y*E;ogbk}xIzvgyx>|7#LdGHL@Vd%kevRvSS=H-(J7Zu8!-_fM5su)Axu)z!#%1Z1^|VOUS~7$q z&u*Pz%a08(PUOf{5oe05;e31V4Ha|P)6v3-U2;mBS-y|6x!H#laAi{ef7k&AAqgq* zo@&B)R?!b(;Da?q^xF(unZ^{sGTkN`dGU7lPUk*~=#)0()4>d0BoQ9B9&)_0q1b%y z@94WpC2q`Gshq(1)ZFV}Gm97xJ>zQYUSzwxBn>x8&CSLg#`gpq%&z`SYYtPVVP`_X zePv_2%xc{_p8`H}mZ zSuSkO~KE1K2pQ|?di{mwmwxttRRoIu(wQu%JsNJvk$0*sQwr!Nu zqoCZ>^sR|PEGgta^w>fd1*TR1W0ETVlcK3S*+M=qHO&;+=@s)s6D;7?>?w5d=1moD zq?5AEobxlqOq1sZ84E#PE#+kFk$@W~yOzG?ZZPqe-s%5|%ukDqttG4BXy1N6U$!vr zYIB|;AejTRAj8glG}A)SUUX{ZP_`IC@Ia&_$XB2I#SeR_>F-w`EkGhz#_euky?s&1 zoo*M)IGV$xQ2UPZe7{^d`B+@-Rh1 zj|B1)ez4u!#tC~9!7R7+1}pBOMAEn5v;U==DpH79ouKxj9MU37vvy2sV zRyi^0(N$+jXKAI0khICPD%LG$_OiBhBsC`ewgXL%>JTweLb_;wVFEQF`b3W()sMLC|P zyo+%Re9HN8boPFJ^Gm3-RSX{@HU{JSl5xTZd+e2U%qVEee>AxYvq|W#{XA;drBA`F zPl3Ywm_eC^Gg3~J`{NRInYFh&V(9v)B9o^+&gO(JO91d}ur|1o)Mu+Pi>t3lnf}_p z`F?uB?UFfUqurfDS;vhkqPFajhu;NGp8Vl;L1odSDD>kGCXZ|@aP2AsEj>(~_2BEO z#Rs)@vn9cpP4yOQ$>}r>^%##s+wke)^c|LsEuZN$9XAS6(`%(l4|{4@{;(d?39;hN z%Nr}GwzJW{9D85P{p)j6tYb%ZY|t7>Vg@6{U3SpR?9PwB#AW`=H>B(OYt#90b6THo z?zZRrz={6NA3*SHq^F~9>4YV4#lY=q3FSnDLBN4*W1t_tR}c$%b}4OjnT5kTT=+4@ z@zgW&AgQ_s(1NRrG>hUs4g-7apA*}0UWW&xZ{5L&kcP|fXdKk5Pe{l|DfdcwM z2*!ku8c)V$ zPe|ZoIJuyFNc<~et-nTVU@g|rr3t5;%f3nj&I0p33E$zyt~hkzW``4l^7 z8p}MstaX8i?c;_@e`EJ~$XC^)&^uMEwJn09myWCC0ABC7Gu__`bF^Cy#%8{$3;3U? zzP7$an|Jmbx9k#~C?j!(t~V2SFTj4P>IsF7MGguGJ-w9n41IhMne30XBCpn!lvhze zF}~^*Zyqt-xDwg=wIw2TQE`HxmpTc^+O@H&JZl6puBAJz)1$`Hr4QJ-{s$G(!$B|1ex*T;;Ie?tWtX!h* zSRnUbKUHEjt=x?~Gb&fgIGX(AS=Q!%kB-5ax7OxZg6?Z-9yBbnLFEI_9$f9u5)~7he zM2}FA{mslrk~$+O(CFoL{X*39YWMPaPJ&-_meAhju7LMGBD-Fgk$FM1V=&9%6bA!# zDeApX-FyFI<8|HTq+ShW)xJc{7TC%CJSrrzcB&T`VS021POk0rfqQOG<1V4NkXmakDg%2ZtDyhxd_=h+P!6DpIGfkarlJKgROMBC$F@z4t9 z>ixzsi*PnXFye(A@SDJ2jE(!FxPoO)fs5TA8*I`YUBz*hW@N{`*ywSHJHMONZjHxX8t-YRHZUBk)B* z1cijZd*~6LYC;JxJU^M-(lBtu;L_1n2qT5slr(vyG>>(z?^c9#js%5^`?=QCD`1a= z_VuajF;_08uCIyVyK2`Q@(Ce53QI9atN3%Yr^Q#O@J;9{75@9PSt*0d@mZC&&mQjQ zMEV@7YGUs}Q^;3EvyN|h?86&vE?~|WjPf!SA8gXxKvNZGacf`ZIKK2iq;gzM2C$o` zT##FPGs7x|JlwVV+}tBL4GrEi&nqggVMZwaHo=;*TmiM-Ue{GCB#eEKj*kW|jdrrD zF+R4U3LKt-<|F*4fKmrNy+DCWUc&UOtm?|bdh5kRrskab{+!;xe(nBw-5vegidzH_ zW~f+rtEGHq{!2KwNn4&%&wh1Q3AdGgmsPSGh>0koET&2`wI7l~>xuAI@%qSlnZq(4Az_ z;Z>tEG|cq%tUfQy4J0r<#l7tnR%4#}XeEBZe=f^w6lQi;asz3@(Z)lD-0nv=Z`J#^$?O=tfu+|g+iUy@^3I#Ib=9p zWuM0yOgzTzgJ2W+Yf?8cBhwOV?PU)xzl?*SW^u6h6hgtaUt_S-&>&fYwv9PI6na=S zpfZ?n?&Xmwjo(r2M60VYynYt*Vba1ko=3dEtl`Xqrpr}b8j8W zKZzL(edEg%_Cq44%&i=TnE5(rb1&e5fW=+G1JU3zG96tjw37BlS*Z`_{GQ6}-4C~m z!0tDhl?|xdyS=|5v;tPEh?YV+TJtq}^EL9+8D#2&j<_v30vaEm;J7DX5-sX|hx%GO zUE85`D$%3jHKQ|*=Yyqe^+$GwvAu=^hYuhY6K$x^m2{43@7}OpGf{#wa%(M8D_hSC zP}|v`hc@TnyqYtDu;l2Du0P1BH7b0%kCJbkKDYs(#DfzN1v`E}P$BnDn9W>B07-qp33>PB=?<)hryF98X1^~+sW{DyamfbyRtTll(m zT^0WU#Q^{tw7!`?l-Ux4PcN2dF_#eqt8^PceyIdxcB3d|%=-4XaxL?9yr&lB`hIVF zcF3O(4X8hS$B|RCN8Z?0q>hy!jMW&HftlgiL1XPYoR`$RMh!E{+K%yyF$TWEP9gf5 z!+2Zyr8z&ssYGY>z0sb?QxQPE(;^zxJuuC0*f8qjiP7M>9s@`p=;2g&o~D=!TM^J5lISQyzEd*hqUq% zK4S+&7vb6p2`AL=O?#v}0gbtsFqAcwL?hNmi4j&U6QoZ6%5bk%vJAi=gHeGqb42_! zHE&dJb7LWm8viT2Yo-z;vm}TyL0Y~xD1ncW0pS!HzY=r0nXbc?n~oweB>Vg>25c!y zgbrbR1u`WdIm~`8irEA$p8Nfi`DiVX1y>^IO8|8R+gC7Yo{MZ4TGI1twcZ27sDk*n z2waK07({_ik}N-nG*UYB?IV!0El;<gs#}niT3YO|?&12<9$A-9(zPQk^s3`gjy? zn{CEWm>NqR<%VKK5t(~lthqC#mW6?vS3~AYGKT(UvLQSv{#P6T3YZ8(?_=0G<5@rI zX9v@nTYbSTSC^+$_+KqRr!)VnPExgBXwCps8|mv<%I_*wZnF=Sy#lG~I|UJSuQC=? zi^_>J{%w6?nhX~HHhu2q2mEaV4C^Hw>mH2jd2A)Gv}YzlBnM zeaA&l^ycdZ?q3D>B~uHQb)EUoZgc$rYA}ttw&mp%^GWDIe+KD*F5!WpK2qYs+fRW> z2(E^i`r@C@YWA3SdlFnHJJr|=u#HU^P&S4VzO`35CjswGB6y(RFA%(ijbB*IFFdyR zB`w=%fATKAj`-7}*67A`;c5c$-$@)GiqgdQ4hLL*7#sVX3yukP`bcRILjPrsc&@E2 zliLNu_T!>L-YjBD_^`fO-gQVFnls;~*T&c!kHgasQ7U8aXcI?jlVM&U>v|2M@LpkA zK3uH~dDv}YkHzzDfsi#^ugh0w+5lXQ=`+U*FXH+tvIz(q#>jUqwU}Ax%wSHTgxLf) znqXoNyd|7nF0=5)0)EfPMM$s^@!+|{e1VPa7mWC$Ld?51RGJP|N({eKPAIGn!+-HO!g7Zwz9%!MJ=-cQQI7U+ zuw~A%bW{?P2U*Vs=rgnKKn*vfGUQhfqodeOc=LYQE4YRwx^`|LXy6W0Mz%J@Ey6|C ze(vIN&sY+z>e%Q^K>&8=o3JtuHlGo`!A}F&0*aV86@U6aRTD7q=Q=-kD6Lv`Zb*Xt zDi!j4-C)0+-?Q+`*`mWGgxelWC9*f3ZMRxaSG+JM-8{DphM@EMe-%lQcDtVtJaq?66Y1f z%#p!|j{pX|wku-jFut3i4%Z2+!eiVRcItt!)G4WU=m}^JHi^d9ZQqvxYunu?C_+wBXK0 z*$rH&G1)~ZTg97hU4BX8G_|rm#|moX-%2zAd$%0vps(mY%nDsZtcUrl)+XHtI%CFT z;sV0vTN+2JaltSX`zIrYTVD>rBgu{PCLRb<_i?I>Nf zKuG>4+vk_EGfYnUUzx?8@%wv<75wIm@pq6fkEv;`#K8C1+RYr9NDGF!(Z*IRK#t_T zW{oQSNnD%w^;&{B5l^Sy9N0PP5-&C_aBBE6p~5PX-cMXY95O#KfU@IgrMEZdS21=u zF>6V9hrl!2u~1aF$W&8fHGvgWa$|~-@?Djdgl#t?^_@-BsmxUVjv0pAS?7do_#N)t zvvj-Zmy5VXk4)TEx^0|hz-VwuDdJ55GcY$k$>=(hSQ5gHF_W|GSMyw=q-D4pVf?bRn(s0L1tNU#2zuQL(Xgiog1K?v zS5$Zb45~qyUCNYL0lk6GQ+~#y>?nIBMu(^Fd`(oM9TEmF;sGH$8=piSE@>O=8Z(X& zCBGrPg@7{%(lj&mP$(q+N}`Fv?1HL3{1l*&7?0RDGGQ)2TCI9a=?XwG;hV?b>gy;B zapu;qA5FkCy(U%V#k&;}7I2o}Qg|6Zh;|->AevitWg|IhhXmc^ZcQDc#Ep1KF%o#% z1!A$S`9K=cc64YFQ=uD@_Bgzb58qvq)=&2H0i1y;?}}T~4L7Rk4!7t%`28pX`2?i8 zW6e$GiJFNh`Ft41_{&^q{(I|nSm`UU(mX(jB=Mx^v6SB8>*&-g69C6(B|phP215Ro zlx&WRS8&VR8BPe;2#~)CjeaAytCBCfSjLe#n|IoQ*~e+KmyYrnZpM*6y+ zNdMgv3;Zk#E_SI&b1-x~THkD&W}4#i;c)(h8=9cqM2G!5D0`t8S1v9b@Yk4KKLQDD zwbBz{ZjO}kTA#-&!9L-?8;I{60LmY<5%#YA$2%^%H+UHAWRaE7pqte1ckII@yJE=$rU}zDM1}M=+X<8#*2ic7@wwsaI56NQTs0Fn&`6f61$y$DTxJiKKW za~SeNNB?#2L(s^GaJ`tT{?o)bm%P^rX|Rg!EjMNCP`%vgcR_|MP=~uOkK=%mDGvSz zY4)iGnGc{a$EyLdIRd9S+=&+PF$odIyXLi1n%Fn%fRIZ2usO2|>@ENiZ?FF~=l#@4 zd&5h^JiHhCD*iAxBtPaSehzpCHR<0(jUNtfQ#qTX-}Ro&l>xlo5RCWD1~7_->@iBW zOxqE{(dF{0S<|npxEarET>C?%F5?9mCU9383MHQTmyMv`Of!DbushnadnV;J2xLNP zY_~c9+}JwNSFE3oe;CkG`GcceS;?2lY+hqtR+0>|Z8!TZFRX3oL_7t)E!}rC?b0-9 zEkWCvG1hdyCk53rp#sX<){>f5?ohy*!<+GJ_UZ=Fr<_bcs&Fa|l6A?s0FBMxM|^xX zIBNx;s$fgTLC)Trz8ygl6(GPhMkEmoN_nJ?u_vu_NcQIC15xdHI^5fH;~f^ z28$ZZHXM=edVWd!xp-b`w`|iTnDr}Or_3z%TA#aYOkm%4eaB$Q#jH&u-eTVLz%Q@| zGV?493qCRcTl|sji($u2Mp()>mcirC1&?l zn1B#Pn#^Q_{X*CT=mW(zDK^$)z&ms`TIhDrv3#X5W<~#$Y{AH~>?ybPLPNhb0qn6` zy|v*UFEfDL{%O~Qd>CLVsy4LgRt_bSqU_2`=0tG9UtJB~D7rX+>Nii-8hj8t`s5l@SUAPqr1Jp!ioGg|NxD}=o2?VV0yz*HLpmDcm+>KBIg0mNgt!c75^m)L zd%qytr1W(Odb27B%-BdcqJa9ETqTq(_Vfi{6}4b=43A*h_J<_~&8rP#pAn3d=OzCf zC>ob&VypCZsm&7uLTIMBuR5fOy^t+7Jg-MU>XGo`lP=ogK9E>|pk^~aUy5NVXWJ|S ztuY^zt^r}TY=w!;#7JI26e9VYGr8Py0FmO!Mv}2_7Ok@C(KR{j!{EiI> zgYRR$=azhQuz2Dk>(wl-DFamkaxtIVb7*Vq8BZ#9J0ZHejK%9%cn@>OH~^&0--5E5 zCG`D(6?YhqJ<-7j;P3=S`#E)i5#3Oj0gf?ARKZjlV+eC?Jd9}sRxpJ|?BWx?(L>Ft z;Cg5H4PY>py+qI7y!d#tYHd^xfeKBFzKWQ63m7Ocb2BO`Fgc$02b%;jP;B-iPI|YQ zO;%>+6X1-2R5B3dchTmao}L}8>Ru>y@;X-X{)vTE%4`IqKR78}0mZ@qcenRI;^l`8 zqaG>=4;!!ymg;!w8jDyM!^~K-CU>%uT{S&jN5VKHB zOpcBbpu43|Ee~=c4RQ)es0BjE_ipbqggubMvzgis?A*0k!XBz+t&gRw@DhR?vSqc9 zV^azE25mS|4lrJjoGy)wYJ!xrYwTUe1oO zx)b_>MmF~L(ij=bb8YIdKa7+vEO+wCpx;(nb)2eHczuwy^*R+||7+Oxx{?-ZqpNIJ z$iB)-49qP#mt`T3XNI*?TZL_Ls2XcbCf-3jcWud`?>EH01{=r$Qb@UUI#stq>JhH; zwbZ4ZYbpwf&i$y>x0PqG&|6z2XIT?nmDVf-rtYZL*@`?L725|L8MAd{SQkFb>)26o-E9UTGc#|d6F0sUzZW**SaH+?1p?S!YFgEbnF>|nCVvKK!Nhu&3RRsLe>fL$O~Ad zeDo5vx4KEFISleQ(L&DyuFmT7Tmn`d2*6ozBl2Fq!&aICbl`W=}HQvIvu8uYv;} zT=F;Kp_j!09rmFV5|Oh%Zz ztWvj-P$WMo>(@>?$)nA2PtlIv($nfrmI>J1XJC9NaGByUN1!z?xi_5zlMkfQ=}fA# zV!0<+y0itd^oKzKI-Xh%+RmWt62Ky-!=+uE(FrAa$b`M`s2Q1!0Vu1qiiD|k4Whth z$sv6WK|(bVH|oHf_#M^S3~1GYo+iF9{Ef_sChFr6@WX5!OX^FZ3i(zLLQDh(l@LZz)AF& zyfR-~2~tvZ-PziMnYZ<2BJiz;O%92v67Y!Qs>1550967OJY5C9$!qr;$Avp(zJ2^} zC(GN1qSO(b3^+C|+Czhk*ysOyEBFX%_U13o9}a&O|A#xnuMY*hK+W|3xlc?Gq;wMe zr~8Hbzam~wY9lVw5`J2h_=2 z0_o3pB4cFqWEsIgd4*-RKoSqzU@@c$@_9=SMQkSxtY)v6dKn zI$`}?@ChLUyDNGQI+XiKvA<6^7KMu}D3$?#5E6*+B}0L`MV)RYa1o#h(=!8AoMr~p zt0XA!cy;nJJ5}JMXh?G=g$v3|ZXm0K5VFu^+)xBY>>>{T$Y|}KPkB@_Z> zX`f(Zj_KQGuUqI_mNz)@rQWX&TeXlXm}pZ9x_&L=E7+_3b+&-%`ctGR3gkpA2sA*r zu!Bm0VnB2G#|-$L5PYeXHmZQ(bmeHMB%&vZV%n%FXKfNOVH`f~%gRj)GzJwSS|Qyl zF{Dy-WTpE8tTC`162Fksur3*gDpMSEhf+K=WzIX5&LMLK%{zmJE?;N<4q((N;x;Om zSL9OK#s09U(+K19^oGh}G}oq9Rr{q%K~5O-P}Mcq=9$EtfjXx!}!isw>||% zD4JyL4?~wKZ6QK|r| z=HV$Gf-SrB1aS7SiCpR5c}wiEDbZ~6&R3HNB5HGgQSK)a0N}~24D%4cWx*J$Dw}`T zhj#{gm?apkH+wa zYMiN)BJfslD)>(mlg_8dWYy)vv1mtRMU6k&HgVXMbO-zyhfjkN76t_W7Osxvd}$gy zo#XM=qRzgadH- zY-RY^mX%qB(_1Ql-_7fhRD@|DKM?)GKNW^G!+%+ENQP?0GW}oiUCrhAr*sU1_?V4aD<4-oeH? z-deyNXkDgyOk=$jf?4>e@NYs`i~b{i1^#@_yy_kg!*-` zm&+u1TtSRz$Bcf_@^jx3v2Q@t_%EtH9AD30QUzHrUZndJf4%5FUZ(0(@a3fK&z_yR z%)<&~57TnJ$@VFQBgd#m@7K+VqcYxf5x0>ZhNJgx^%r_;1mG_Zf0Lp88y%)Ptp{$u z8s9M$PJKblC(LF8ltbSXGghbsn!4Gy5J{UIxM6pGQV5DWPl)t*RBCsx0TNbAq%QnUF1q4QKNC>{lcK9 z701bDx0ZiUTr+3$Cm7oC6&;D5({o^j^%LE;o%O?34Rb;x3A!!}4-qTXjqV&GiTtuF z3|I4xm2ge6(FLX11a2etvgxmioR<-sRvsM1 zpRCT`$~dflE&@8)NThT>t4faaP>0oMbZ*=a4?!ezJ{xC#@W^+ZC=EbR^@WpwAY|`I zUIOTD;%v1)$g^7L@FW)@NUu9M{JrAE&Iq;bLpz|EyaD(fnda<3hFBes1&9z37;kn+ zHXgB5h%|7K$5qnxSQjq!}RbRc>3LUofcv;H5v!*SccJ`ETEC{Rf4E0>oj=y0wsW;gV_4XuE;Xlsp1k#)jjacQ; zrDibvtQM*(Y0j_s11WN_vAdTWdvSr2tf0u@KT3--c+KzIa&_S&0v-^?ZDZZ?kDA2_ zhOv;v8sSMJqt+$&331`aeub^v0*7m%h1<75Sb?(Occ8UdHip}8SOt|?y|SR@wY7na zw;F$4x8TfEcs0XSvhA;Fd0OI=RXT>za|)wE2O$gSo>GJ!uFmVmR69tkWB3&TvD7L# z%_8o^Knm|C7^o{d#+DU=75G%8qlx3!%4UB~!!tUP*ziYq++?dbDPBj`&w5nntk!~B zyeb!Fn|9YpopUf~3BpLaHyt~kzvu^i4^*1?-C3AyH+uIbZ~AMK>awM{k2OZ$rl-`S zp@Ax3pFEfMBT*G?3YNPwm6yd5;QV%mu$!V!?y-g8XxB;<62B#L>WbGG6lD-0tHblQ z=74#BR{=zJQKrTgsly@AkxetHP-moyc~Ztu(HNK@2Nd)=GpvYfx_CIxT7D}&Szf0K zNp9dUyYoM6PjZnZ%O=U#2R8mV^)OW(`{aEb!`rtK>x z_)@n~v3Vqh(2liq=Rc?qz7qVgl;=XPSPC5bnOMiwkQEUU(Ff$O{QjPbQ&3aV>>EsC zsFMF0ppY;^&i)doJn0M`W91{SowbYLrU&QfBU5kJu|&Ch>@QwXEp(7P$g|re)Pgc{ z%CpheGMW(r^qDi5McSgX@c)vC?Y<(+^^dwLdb=>!aI0v-FYT<|$Cojnqn-5;P`e}; z3wZB<>16slMe~!Zq=Wv_tlYRLK%oHdwU?ED-*d>~FAPj(Rf`a#cHgerF2P{WYU{2IsV{1Ql}lWRzM zLU@m}n^oD4>Y#1*J5yoKax<+oXyBLM%+qSnP2mUo<zqdM?y;11=(MJhqk>l)dYZoh0zg>}lqqYTJCu)+tY`Y&MgeuZKfo>G^h z8oNRnhjbiO{40$iqU4}Q=hN)0F+05Y zY(&iQnK-~k>GO^X8C4DE`g>tzLB~mWjpa(q7xI~MjV~*k@7=Uw{30bOOjH7`z<#w3 zo?9=qVmAOM>|K_y;_Mb8&0)OpV{;iXTFxlg5sAF)b~G{EGycg{UmpIk7G9~mGUYQc zVA|22QsV4J@9@1nIjwm4#J8}A%N3npTBfCMJteS%Ohy~fw&mfXF$R}IRF{Y*Ew*I~ z&aUs#6f)Yk3g0>j8)Yspm-(c7IKr6Bq7|nAml}r5^GoPxrlD}=1Y)|VZUCOtOxz4W z0OPFRo=J6|`>bX3vY;^vOV8pe0Pp0IdKKTffRvRpciGvkhePiqFUSK@2w^RjdzWo> zvc@#qMMO;h73oGIr4U9ipSlDenc=!|S_W;=S=LMYYJN{5or!Fs4n(M)Y%G&I^Wnmi zkDlj4<^Ti>9H&~zta<6_ZQ_XiT&gT^!{7I~DD9c;>aWnB+n+u>hY=26me+gMv7#T& zylB|Hs3}#F!Fj(*=RvGbA=8c8zuxN$IK`_Fk6t{?(QI)yD~RziHX zH>iwKU2BR$MF57i!TBOiPdcsRvkn+U7mmVjbXPW)ZO*<-0`**YaNMvM(Dg9LcSG~2(w)kmRNCaTw0ONbZkFPN3j=kfMX~;ed z`TH6wugs3wg6zmJ4FuvAs|v`t-pY|u#8OmFJ32<0u)mDEDL9rx05~PGp~z-xm$6wQ zE;vBwxUx5u4acO;be?K~JdBy?W!$NLYI7YV2jSrM&$nP;8?`bBOxrHH096BTETo5H zxhs1hwP+|6S$Qw^*dBV>@4hm9mbJpAl*`$LC(u}cQp2jgaf+P3qjd>o4`Ycs>{?p` zZOz9}d0)(8+%%x0FgAEm@r|t`MqAd_BA>qgt|Ix9%_K6XotvpK4gSNQ7lEmChbtf1 zzlgSot3X}wU@s(a)bg6AseqHF8ESXtEnc5NIjLXSoUPT-*%$+R!ur^7caTdxGl87QzIs#GxLQugVO4HD#NGG6(pl^r!KD>8-!W(ald^say>~qfE z`>eUgd-H=?X@b@_mYY}kh5jwVNdYGso1at)3gvs$!X6tAT7lh z*&R)!5!f9;+4&%bu7rlx%`&df%M`O``P@NU1hL<2;zf}j{9aax#NO#v3}a7#owFvw z!lz%QG?~@}Khi?4fs*%om!M77p7^5Y^V%g)J}}&vuuiY&t0~7jCbhom_~n@G=FlYU z$z%&Uk}WSHO@J+|%M(0a5xv@~#64)?n`KFeySMSfVFK35Cdpm(N|rN+7as!v8lRVsF|IrBR~0+3lbfovEHzdtI$5;g-tV>~)JxS7=CrblTZ@UeemV z+#bXa<#*5CY*A>vy@IPGMzGTCuZB!DvInk2{Lzn#D1BM+5cpGD9hrWiFG#3#4Dc zvvB|ZYc2EXFZfY|OIgR0AL;hsDJVjp%K1 zTZaYB1*1X=jMFR1pf~la z%+R5ri0FH>gE7g{{c)P1Ot95g=chh009fR!Sn zg4EN66o=Ie9jnqcdNsb2E65|{7~Ot3mk z>I8&o&`}o11mx>gqJm}qqR#0nSS;>9i_kxv>+`YMk;#uf7%N~MSr}_;S;XVXnGA{N zI%kCGK{9MSX*R_v}(llj+WEn=AZE&+~rqwo07u zAmCdLs(x>!;QZ_5oAyx_QAX&A)mTG7S!2VmOZeMHuFPH6$%xk6N`F2>d;+?!ne=?k z<<+(&+PgO9M>vnLyn9@FueyGF>vnU`{A(d8(zoavZTH+;@PWwEX$+z+uC1%YN~oCP z(?MYScT1cHU?336RPWOER)Cqw*1uygXw;9-Y}PWNeJWyAA&?pMu-?&p8CaHqyaJf& zieEM=t`~`QyaBp5{;oHqcUDSg1%huSJi#URFE0n7z1%(M=g04eLGdeDmi!{n_&z=x z-+`Vzz*jL&>n{j?dspL#Z~yv29#|_tZaXLIj*nU?lk3^a9N*oDvn1y+kikgIvHuvj zJy$`{H%QP_CN1X9^WmbE!@H(Eicyd~1<9}9AuZ7e5c^E6BH2rRVmgn1n!2q{v`TGw z3+&AqOQw&7O!4>^%^;lNC$vB%()Z8T_VU9`O4g|ulYNv*yM;DckTo{9Mhyp>ySHH) zWMjRrUXvVjb{)+2OEZhK3hVU(VP)x_(D?h@!?0xPGDlpq$Af|TZF9T+lBxI3N^x$b z5*sD}7{@UYKnj<_r`U~+8okzg&C{lZ%w>wFqRN8iqy0a|TqYdxFOoBds$I&C^|J-> z+%+Y+c9tuE_)zNjwekW)o_sblJ+OuM*zS7oyutI)S?M{yj19h&acxg zVDoCBCq6BcE?%_X?V3`g*!W)i8t$i7rlH%1-zqPgzst9MVS2$*JpkR?Se6D%Z;A>< z)IH~vsdL&^)_q_(`njbo*~V_lrR~|}nb*J^9pfHMkUK-G#;i9Ko24dw0GAe>;<7d^ zG-zZ|z8UxLeg{>ipt%(FtAyy7T}}HD{!huE?UT8rU0z*AecWZbZA@fv*WGt`v5zt& zz0pc1m)uWkL6SkufjpeNZk85$-7kXfM?@05qx4>=U-&(lbXU+k0o$aY)8ncQhNqqO zq+-Wi9E{;&bqIW8iTG#6`rMFZC&8>sXWkE-0dcxWd<<gD01TnqEGx#4*kR`aNbej2SZm?{RSud6c=Y?6y38TF!pN`0$WV zx;g_5TPzg1tQpN2+m%5^WLM+lgeB>+j9%X98x-@X=lvQUG9Wc0)d zI!#pQUdTog*wWZOY3%8f^Q2n(pm6G*XgWZZm~W=*KC^p0_a9@g#C*)_nKgSQm_*+9 zWS%+>aWyi$FI@TFe;&xho(fr;c{Jt zD0cZ2K?3Tx68$Yw0z}F#&i455NDFl-@p{+N$;>)XpH{0RjS}i(0Ll6T@g{CQ-ri#M z6M}r>U8``?k0yS@!IImSWswD|F6YkK%pI58|D&zom7mpHr<;oeCiUQm@f%1WrD*U@ z$oyLSgN^bx8HtlA3(B)em_8jf6m!5`XL%PO^1V4`hydN2>Y5 zcErR`XPiX0^D-`@gJ-}+jRc?zxQYdwe>D3j?i3($_Jz++&E5aGqj$P2zW$k-5_KRR zj((66_gpMIznhsdUAPeRfd3au*b%kcfv1m$uVu@5DnsN_d&iAv{7Px&hC+O8xnP0Ob6sZWH%wmJ2G zR85Pl)(q0zX6LurjqeyD@IlUnZV8jsTN2nN96%82j``|weP*Hl{**`WU}+d$2u@@d zgxkQlHLlojs+S1fKjYI)B`FjsPoz1!+m~QlF2HiRWVmC2>)+Q{12A!zB?&2+s8MX_ zQO#E!BfNXY&e|8z2Rnz?0kd26`Sz=wkCt@EEAi1q86 mkm~>6`oC=){|6_0BQ~j|-N5kP=T%_R$#dMy%CyMDJ^o*xbxd9W From 92d1ab7bd5da6255b9814ec3837dcd2af93c0a19 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Tue, 29 Oct 2024 20:53:19 -0400 Subject: [PATCH 193/409] revert --- .../artifacts/PowerShell/AgLogonScript.ps1 | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 5761f4c601..6b209a353c 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -207,25 +207,25 @@ if ($scenario -eq "contoso_supermarket") { --namespace $AgConfig.nginx.Namespace ` --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Nginx.log") } -# ##################################################################### -# # Configuring applications on the clusters using GitOps -# ##################################################################### -# if ($scenario -eq "contoso_supermarket") { -# Write-Host "[$(Get-Date -Format t)] INFO: Configuring GitOps (Step 13/17)" -ForegroundColor DarkGreen -# Deploy-SupermarketConfigs -# } +##################################################################### +# Configuring applications on the clusters using GitOps +##################################################################### +if ($scenario -eq "contoso_supermarket") { + Write-Host "[$(Get-Date -Format t)] INFO: Configuring GitOps (Step 13/17)" -ForegroundColor DarkGreen + Deploy-SupermarketConfigs +} -# if ($scenario -eq "contoso_motors") { -# Update-AzureIoTOpsExtension -# Deploy-AIO -# Deploy-MotorsConfigs -# $mqttIpArray=Set-MQTTIpAddress -# Deploy-MQTTExplorer -mqttIpArray $mqttIpArray -# }elseif($scenario -eq "contoso_hypermarket"){ -# Deploy-AIO-M2 -# $mqttIpArray=Set-MQTTIpAddress -# Deploy-MQTTExplorer -mqttIpArray $mqttIpArray -# } +if ($scenario -eq "contoso_motors") { + Update-AzureIoTOpsExtension + Deploy-AIO + Deploy-MotorsConfigs + $mqttIpArray=Set-MQTTIpAddress + Deploy-MQTTExplorer -mqttIpArray $mqttIpArray +}elseif($scenario -eq "contoso_hypermarket"){ + Deploy-AIO-M2 + $mqttIpArray=Set-MQTTIpAddress + Deploy-MQTTExplorer -mqttIpArray $mqttIpArray +} ############################################################## # Deploy Kubernetes Prometheus Stack for Observability From 7635f9aee290d3f0df9c2f8915ccf75ee411474d Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Tue, 29 Oct 2024 20:55:34 -0400 Subject: [PATCH 194/409] revert commented code --- azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 6b209a353c..efc9a6d487 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -251,9 +251,9 @@ if($scenario -eq "contoso_motors"){ ##################################################################### # Deploy Microsoft Fabric ##################################################################### -# if($scenario -eq "contoso_hypermarket"){ -# Set-MicrosoftFabric -# } +if($scenario -eq "contoso_hypermarket"){ + Set-MicrosoftFabric +} ############################################################## # Creating bookmarks and setting merged kubeconfigs From 89bfd5149fb15cd11e5a00e626085f9c1e1e394f Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Wed, 30 Oct 2024 05:40:50 +0100 Subject: [PATCH 195/409] Fixed casing --- azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 index f75aa8aa93..ab927d3975 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 @@ -34,7 +34,7 @@ Describe "" -ForEach $ArcClusterNames { It "Azure Arc Connected cluster is connected" { $connectedCluster.ConnectivityStatus | Should -Be "Connected" } - It "Azure IOT Operations targets should be successfully deployed" { + It "Azure IoT Operations targets should be successfully deployed" { foreach ($target in $aioStatus.postDeployment.targets.psobject.Properties) { $target.Value._all_.status | Should -BeIn @("success", "warning") -Because "Target $($target.Name) should have a successful or warning deployment status" } From 274c02da7399a1e846eb02b418bcf4b80292e820 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Wed, 30 Oct 2024 06:16:23 +0100 Subject: [PATCH 196/409] Remove pindown for WinGet modules Signed-off-by: Jan Egil Ring --- azure_jumpstart_arcbox/artifacts/WinGet.ps1 | 4 ++-- azure_jumpstart_hcibox/artifacts/PowerShell/WinGet.ps1 | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/azure_jumpstart_arcbox/artifacts/WinGet.ps1 b/azure_jumpstart_arcbox/artifacts/WinGet.ps1 index b685bbdf68..64510335a4 100644 --- a/azure_jumpstart_arcbox/artifacts/WinGet.ps1 +++ b/azure_jumpstart_arcbox/artifacts/WinGet.ps1 @@ -8,8 +8,8 @@ $logFilePath = Join-Path -Path $Env:ArcBoxLogsDir -ChildPath ('WinGet-provisioni Start-Transcript -Path $logFilePath -Force -ErrorAction SilentlyContinue # Install WinGet PowerShell modules -Install-PSResource -Name Microsoft.WinGet.Client -Scope AllUsers -Quiet -AcceptLicense -TrustRepository -Version 1.8.1911 -Install-PSResource -Name Microsoft.WinGet.DSC -Scope AllUsers -Quiet -AcceptLicense -TrustRepository -Prerelease -Version 1.8.1911-alpha +Install-PSResource -Name Microsoft.WinGet.Client -Scope AllUsers -Quiet -AcceptLicense -TrustRepository +Install-PSResource -Name Microsoft.WinGet.DSC -Scope AllUsers -Quiet -AcceptLicense -TrustRepository # Install DSC resources required for ArcBox Install-PSResource -Name DSCR_Font -Scope AllUsers -Quiet -AcceptLicense -TrustRepository diff --git a/azure_jumpstart_hcibox/artifacts/PowerShell/WinGet.ps1 b/azure_jumpstart_hcibox/artifacts/PowerShell/WinGet.ps1 index 7dbdd16122..fe9f430b33 100644 --- a/azure_jumpstart_hcibox/artifacts/PowerShell/WinGet.ps1 +++ b/azure_jumpstart_hcibox/artifacts/PowerShell/WinGet.ps1 @@ -7,8 +7,8 @@ $logFilePath = Join-Path -Path $Env:HCIBoxLogsDir -ChildPath ('WinGet-provisioni Start-Transcript -Path $logFilePath -Force -ErrorAction SilentlyContinue # Install WinGet PowerShell modules -Install-PSResource -Name Microsoft.WinGet.Client -Scope AllUsers -Quiet -AcceptLicense -TrustRepository -Version 1.8.1911 -Install-PSResource -Name Microsoft.WinGet.DSC -Scope AllUsers -Quiet -AcceptLicense -TrustRepository -Prerelease -Version 1.8.1911-alpha +Install-PSResource -Name Microsoft.WinGet.Client -Scope AllUsers -Quiet -AcceptLicense -TrustRepository +Install-PSResource -Name Microsoft.WinGet.DSC -Scope AllUsers -Quiet -AcceptLicense -TrustRepository # Install DSC resources required for ArcBox Install-PSResource -Name DSCR_Font -Scope AllUsers -Quiet -AcceptLicense -TrustRepository From ae66b6a7859f5193a9a70dd86e4f163e80f92f15 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Wed, 30 Oct 2024 19:07:02 -0400 Subject: [PATCH 197/409] Update script.kql --- .../contoso_hypermarket/bicep/data/script.kql | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql index 14fb85a10c..7c01217c69 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql @@ -82,24 +82,28 @@ .drop table products ifexists .create table products (product_id:string, name:string, price:real, stock:int, category: string, photo_path:string) .ingest inline into table products <| - 1,Red Apple,0.2,1000,Fruits,static/img/product1.jpg - 2,Banana,0.2,300,Fruits,static/img/product2.jpg - 3,Avocado,1.25,1000,Vegetables,static/img/product3.jpg - 4,Bread,3.0,200,Bakery,static/img/product4.jpg - 5,Milk,2.5,200,Dairy,static/img/product5.jpg - 6,Orange Juice,3.25,100,Fruits,static/img/product6.jpg - 7,Chips,0.25,1000,Snacks,static/img/product7.jpg - 8,Red Pepper,0.5,800,Vegetables,static/img/product8.jpg - 9,Lettuce,0.3,2000,Vegetables,static/img/product9.jpg - 10,Tomato,0.4,5000,Vegetables,static/img/product10.jpg - 11,Strawberry,2.0,500,Fruits,static/img/product11.jpg - 12,Eggs,3.0,10000,Poultry,static/img/product12.jpg +1,Red Apple,0.2,1000,Fruits,static/img/product1.jpg +2,Banana,0.2,300,Fruits,static/img/product2.jpg +3,Avocado,1.25,1000,Vegetables,static/img/product3.jpg +4,Bread,3.0,200,Bakery,static/img/product4.jpg +5,Milk,2.5,200,Dairy,static/img/product5.jpg +6,Orange Juice,3.25,100,Fruits,static/img/product6.jpg +7,Chips,0.25,1000,Snacks,static/img/product7.jpg +8,Red Pepper,0.5,800,Vegetables,static/img/product8.jpg +9,Lettuce,0.3,2000,Vegetables,static/img/product9.jpg +10,Tomato,0.4,5000,Vegetables,static/img/product10.jpg +11,Strawberry,2.0,500,Fruits,static/img/product11.jpg +12,Eggs,3.0,10000,Poultry,static/img/product12.jpg // Create stores table .drop table stores ifexists .create table stores (store_id:string, city:string, state:string, country:string) .ingest inline into table stores <| - CHI,Chicago,IL,United States - SEA,Seattle, WA,United States - NYC,New York, NY,United States - DAL,Dallas,TX,United States +CHI,Chicago,IL,United States +SEA,Seattle, WA,United States +NYC,New York, NY,United States +DAL,Dallas,TX,United States +ATL,Atlanta,GA,United States +LAS,Las Vegas,NV,United States +MIA",Miami,FL,United States +LAX,Los Angeles,CA,United States \ No newline at end of file From 79e63f76b52f7ac1104fb8fa46cdb4bda961e210 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Thu, 31 Oct 2024 13:56:36 -0400 Subject: [PATCH 198/409] update store assets dashboard --- .../monitoring/grafana-app-stores.json | 555 +++++++++--------- 1 file changed, 265 insertions(+), 290 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json index 67c3778931..9517c6602b 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json @@ -18,92 +18,22 @@ "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 0, - "id": 6, + "id": 5, "links": [], "panels": [ { + "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 }, - "id": 10, + "id": 20, + "panels": [], "title": "Lighting", "type": "row" }, - { - "datasource": { - "default": false, - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "continuous-GrYlRd" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "kwatth" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 1 - }, - "id": 11, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.2.2+security-01", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "disableTextWrap": false, - "editorMode": "builder", - "exemplar": false, - "expr": "lighting_power_usage_kwh", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "{{device_id}}", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Lighting Power Usage", - "type": "stat" - }, { "datasource": { "default": false, @@ -115,16 +45,6 @@ "color": { "mode": "thresholds" }, - "custom": { - "align": "center", - "cellOptions": { - "applyToRow": false, - "mode": "gradient", - "type": "color-background", - "wrapText": false - }, - "inspect": false - }, "mappings": [ { "options": { @@ -134,7 +54,7 @@ "text": "Off" }, "1": { - "color": "green", + "color": "yellow", "index": 1, "text": "On" } @@ -146,48 +66,46 @@ "mode": "absolute", "steps": [ { - "color": "green", + "color": "yellow", "value": null } ] } }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Time" - }, - "properties": [ - { - "id": "custom.hidden", - "value": true - } - ] - } - ] + "overrides": [] }, "gridPos": { "h": 6, - "w": 8, - "x": 8, + "w": 7, + "x": 0, "y": 1 }, "id": 12, "options": { - "cellHeight": "lg", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" + "displayMode": "gradient", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 16, + "minVizWidth": 8, + "namePlacement": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" ], - "show": false + "fields": "", + "values": false }, - "frameIndex": 0, - "showHeader": true + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" }, - "pluginVersion": "11.2.2+security-01", + "pluginVersion": "11.3.0", "targets": [ { "datasource": { @@ -195,9 +113,10 @@ "uid": "${datasource}" }, "disableTextWrap": false, - "editorMode": "builder", + "editorMode": "code", "exemplar": false, - "expr": "lighting_status", + "expr": "lighting_status ", + "format": "time_series", "fullMetaSearch": false, "includeNullMetadata": true, "instant": true, @@ -208,7 +127,7 @@ } ], "title": "Lighting Status", - "type": "table" + "type": "bargauge" }, { "datasource": { @@ -267,14 +186,15 @@ "value": 80 } ] - } + }, + "unit": "lumens" }, "overrides": [] }, "gridPos": { "h": 6, - "w": 8, - "x": 16, + "w": 9, + "x": 7, "y": 1 }, "id": 13, @@ -290,6 +210,7 @@ "sort": "none" } }, + "pluginVersion": "11.3.0", "targets": [ { "datasource": { @@ -311,19 +232,6 @@ "title": "Lighting Brightness Level", "type": "timeseries" }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 7 - }, - "id": 5, - "panels": [], - "title": "Refrigerator", - "type": "row" - }, { "datasource": { "default": false, @@ -343,14 +251,6 @@ { "color": "green", "value": null - }, - { - "color": "#EAB839", - "value": 5 - }, - { - "color": "red", - "value": 10 } ] }, @@ -361,15 +261,15 @@ "gridPos": { "h": 6, "w": 8, - "x": 0, - "y": 8 + "x": 16, + "y": 1 }, - "id": 3, + "id": 11, "options": { "colorMode": "value", "graphMode": "area", "justifyMode": "auto", - "orientation": "auto", + "orientation": "horizontal", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ @@ -382,7 +282,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "11.2.2+security-01", + "pluginVersion": "11.3.0", "targets": [ { "datasource": { @@ -392,8 +292,7 @@ "disableTextWrap": false, "editorMode": "builder", "exemplar": false, - "expr": "refrigerator_power_usage_kwh", - "format": "time_series", + "expr": "lighting_power_usage_kwh", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -403,9 +302,22 @@ "useBackend": false } ], - "title": "Refrigerator Power Usage", + "title": "Lighting Power Usage", "type": "stat" }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 7 + }, + "id": 17, + "panels": [], + "title": "Refrigerator", + "type": "row" + }, { "datasource": { "default": false, @@ -417,27 +329,17 @@ "color": { "mode": "thresholds" }, - "custom": { - "align": "center", - "cellOptions": { - "applyToRow": false, - "mode": "gradient", - "type": "color-background", - "wrapText": false - }, - "inspect": false - }, "mappings": [ { "options": { "0": { - "color": "dark-green", - "index": 1, + "color": "blue", + "index": 0, "text": "Closed" }, "1": { - "color": "dark-red", - "index": 0, + "color": "red", + "index": 1, "text": "Open" } }, @@ -448,48 +350,46 @@ "mode": "absolute", "steps": [ { - "color": "green", + "color": "red", "value": null } ] } }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Time" - }, - "properties": [ - { - "id": "custom.hidden", - "value": true - } - ] - } - ] + "overrides": [] }, "gridPos": { "h": 6, - "w": 8, - "x": 8, + "w": 7, + "x": 0, "y": 8 }, "id": 1, "options": { - "cellHeight": "lg", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" + "displayMode": "gradient", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 16, + "minVizWidth": 8, + "namePlacement": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" ], - "show": false + "fields": "", + "values": false }, - "frameIndex": 1, - "showHeader": true + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" }, - "pluginVersion": "11.2.2+security-01", + "pluginVersion": "11.3.0", "targets": [ { "datasource": { @@ -510,7 +410,7 @@ } ], "title": "Refrigerator Door", - "type": "table" + "type": "bargauge" }, { "datasource": { @@ -521,19 +421,23 @@ "fieldConfig": { "defaults": { "color": { - "mode": "continuous-GrYlRd" + "mode": "thresholds" }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "green", + "color": "blue", "value": null }, + { + "color": "#EAB839", + "value": 20 + }, { "color": "red", - "value": 80 + "value": 30 } ] }, @@ -543,8 +447,8 @@ }, "gridPos": { "h": 6, - "w": 8, - "x": 16, + "w": 9, + "x": 7, "y": 8 }, "id": 4, @@ -563,7 +467,7 @@ "showThresholdMarkers": true, "sizing": "auto" }, - "pluginVersion": "11.2.2+security-01", + "pluginVersion": "11.3.0", "targets": [ { "datasource": { @@ -585,29 +489,18 @@ "title": "Refrigerator Temperature", "type": "gauge" }, - { - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 14 - }, - "id": 2, - "title": "HVAC", - "type": "row" - }, { "datasource": { - "name": "${datasource}", + "default": false, "type": "prometheus", "uid": "${datasource}" }, "fieldConfig": { "defaults": { "color": { - "mode": "continuous-GrYlRd", - "seriesBy": "last" + "mode": "continuous-GrYlRd" }, + "fieldMinMax": false, "mappings": [], "thresholds": { "mode": "absolute", @@ -615,14 +508,6 @@ { "color": "green", "value": null - }, - { - "color": "#EAB839", - "value": 2.5 - }, - { - "color": "red", - "value": 4 } ] }, @@ -632,16 +517,16 @@ }, "gridPos": { "h": 6, - "w": 6, - "x": 0, - "y": 15 + "w": 8, + "x": 16, + "y": 8 }, - "id": 6, + "id": 3, "options": { "colorMode": "value", "graphMode": "area", "justifyMode": "auto", - "orientation": "auto", + "orientation": "horizontal", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ @@ -654,7 +539,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "11.2.2+security-01", + "pluginVersion": "11.3.0", "targets": [ { "datasource": { @@ -663,7 +548,9 @@ }, "disableTextWrap": false, "editorMode": "builder", - "expr": "hvac_power_usage_kwh", + "exemplar": false, + "expr": "refrigerator_power_usage_kwh", + "format": "time_series", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -673,9 +560,22 @@ "useBackend": false } ], - "title": "HVAC Power Usage", + "title": "Refrigerator Power Usage", "type": "stat" }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 14 + }, + "id": 10, + "panels": [], + "title": "HVAC", + "type": "row" + }, { "datasource": { "default": false, @@ -687,16 +587,6 @@ "color": { "mode": "thresholds" }, - "custom": { - "align": "center", - "cellOptions": { - "applyToRow": false, - "mode": "gradient", - "type": "color-background", - "wrapText": false - }, - "inspect": false - }, "mappings": [ { "options": { @@ -718,7 +608,7 @@ "mode": "absolute", "steps": [ { - "color": "green", + "color": "orange", "value": null } ] @@ -730,35 +620,42 @@ "id": "byName", "options": "Time" }, - "properties": [ - { - "id": "custom.hidden", - "value": true - } - ] + "properties": [] } ] }, "gridPos": { "h": 6, - "w": 6, - "x": 6, + "w": 5, + "x": 0, "y": 15 }, "id": 7, "options": { - "cellHeight": "lg", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" + "displayMode": "gradient", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 16, + "minVizWidth": 8, + "namePlacement": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" ], - "show": false + "fields": "", + "values": false }, - "showHeader": true + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" }, - "pluginVersion": "11.2.2+security-01", + "pluginVersion": "11.3.0", "targets": [ { "datasource": { @@ -779,7 +676,7 @@ } ], "title": "HVAC Mode", - "type": "table" + "type": "bargauge" }, { "datasource": { @@ -790,37 +687,36 @@ "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "continuous-GrYlRd", + "seriesBy": "last" }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "yellow", + "color": "green", "value": null - }, - { - "color": "red", - "value": 80 } ] }, - "unit": "humidity" + "unit": "kwatth" }, "overrides": [] }, "gridPos": { "h": 6, - "w": 6, - "x": 12, + "w": 5, + "x": 5, "y": 15 }, - "id": 8, + "id": 6, "options": { - "minVizHeight": 75, - "minVizWidth": 75, - "orientation": "auto", + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" @@ -828,11 +724,11 @@ "fields": "", "values": false }, - "showThresholdLabels": false, - "showThresholdMarkers": true, - "sizing": "auto" + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true }, - "pluginVersion": "11.2.2+security-01", + "pluginVersion": "11.3.0", "targets": [ { "datasource": { @@ -841,7 +737,7 @@ }, "disableTextWrap": false, "editorMode": "builder", - "expr": "hvac_humidity_percent", + "expr": "hvac_power_usage_kwh", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -851,8 +747,8 @@ "useBackend": false } ], - "title": "HVAC Humidity", - "type": "gauge" + "title": "HVAC Power Usage", + "type": "stat" }, { "datasource": { @@ -866,6 +762,8 @@ "mode": "thresholds" }, "mappings": [], + "max": 50, + "min": 0, "thresholds": { "mode": "absolute", "steps": [ @@ -874,8 +772,12 @@ "value": null }, { - "color": "orange", - "value": 80 + "color": "yellow", + "value": 15 + }, + { + "color": "#6ED0E0", + "value": 30 } ] }, @@ -885,8 +787,8 @@ }, "gridPos": { "h": 6, - "w": 6, - "x": 18, + "w": 7, + "x": 10, "y": 15 }, "id": 9, @@ -905,7 +807,7 @@ "showThresholdMarkers": true, "sizing": "auto" }, - "pluginVersion": "11.2.2+security-01", + "pluginVersion": "11.3.0", "targets": [ { "datasource": { @@ -927,10 +829,88 @@ ], "title": "HVAC Temperature", "type": "gauge" + }, + { + "datasource": { + "name": "${datasource}", + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + }, + { + "color": "orange", + "value": 40 + }, + { + "color": "#6ED0E0", + "value": 60 + } + ] + }, + "unit": "humidity" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 7, + "x": 17, + "y": 15 + }, + "id": 15, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "hvac_humidity_percent", + "hide": false, + "instant": true, + "legendFormat": "{{device_id}}", + "range": false, + "refId": "A" + } + ], + "title": "HVAC Humidity", + "type": "gauge" } ], + "preload": false, "refresh": "", - "schemaVersion": 39, + "schemaVersion": 40, "tags": [ "stores" ], @@ -938,33 +918,28 @@ "list": [ { "current": { - "selected": false, - "text": "chicago", - "value": "de1k92ntokqo0c" + "text": "seattle", + "value": "be2drih2vhlvkd" }, - "hide": 0, "includeAll": false, "label": "Store", - "multi": false, "name": "datasource", "options": [], "query": "prometheus", - "queryValue": "", "refresh": 1, "regex": "", - "skipUrlSync": false, "type": "datasource" } ] }, "time": { - "from": "now-15m", + "from": "now-5m", "to": "now" }, "timepicker": {}, "timezone": "browser", "title": "Store / Asset", - "uid": "ce1ncz4edo7b4a", - "version": 16, + "uid": "ed387aa7-6eac-4c48-8891-4834666ac7ce", + "version": 42, "weekStart": "" } \ No newline at end of file From d2faf96dbc78236e55a4a8dbef10ba9afbb67f51 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Thu, 31 Oct 2024 16:31:25 -0500 Subject: [PATCH 199/409] disable longhorn on hypermarket --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index e890cd2f6a..2b0f8767d3 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -118,10 +118,10 @@ function Set-K3sClusters { kubectl create configmap -n kube-system kubevip --from-literal range-global=$lowestServiceIp-$highestServiceIp Start-Sleep -Seconds 30 - Write-Host "Creating longhorn storage on K3scluster" - kubectl apply -f "$($Agconfig.AgDirectories.AgToolsDir)\longhorn.yaml" - Start-Sleep -Seconds 30 - Write-Host "`n" + # Write-Host "Creating longhorn storage on K3scluster" + # kubectl apply -f "$($Agconfig.AgDirectories.AgToolsDir)\longhorn.yaml" + # Start-Sleep -Seconds 30 + # Write-Host "`n" } } } From dc13c7cfb8067e97568a2ea293ee55b32f133a5c Mon Sep 17 00:00:00 2001 From: Dale Kirby <32211549+dkirby-ms@users.noreply.github.com> Date: Thu, 31 Oct 2024 16:40:05 -0500 Subject: [PATCH 200/409] disable longhorn on hypermarket (#2796) --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index e890cd2f6a..2b0f8767d3 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -118,10 +118,10 @@ function Set-K3sClusters { kubectl create configmap -n kube-system kubevip --from-literal range-global=$lowestServiceIp-$highestServiceIp Start-Sleep -Seconds 30 - Write-Host "Creating longhorn storage on K3scluster" - kubectl apply -f "$($Agconfig.AgDirectories.AgToolsDir)\longhorn.yaml" - Start-Sleep -Seconds 30 - Write-Host "`n" + # Write-Host "Creating longhorn storage on K3scluster" + # kubectl apply -f "$($Agconfig.AgDirectories.AgToolsDir)\longhorn.yaml" + # Start-Sleep -Seconds 30 + # Write-Host "`n" } } } From f6efe7da9ce200fa49075a4e5b376e4d88bc6439 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Thu, 31 Oct 2024 16:50:07 -0500 Subject: [PATCH 201/409] default bicepparam --- .../contoso_hypermarket/bicep/main.bicepparam | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicepparam diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicepparam b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicepparam new file mode 100644 index 0000000000..4778d1b37f --- /dev/null +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicepparam @@ -0,0 +1,12 @@ +using 'main.bicep' + +param spnClientId = '' +param spnClientSecret = '' +param spnTenantId = '' +param spnObjectId = '' +param windowsAdminUsername = 'agora' +param windowsAdminPassword = 'ArcPassword123!!' +param deployBastion = false +param customLocationRPOID = '' +param sshRSAPublicKey = '' +param fabricCapacityAdmin = '' From d876135e0fc4f4ccf5c8c6b973b9bda97c19050a Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Thu, 31 Oct 2024 16:50:54 -0500 Subject: [PATCH 202/409] remove azd deploy --- .../contoso_hypermarket/bicep/main.azd.bicep | 218 ------------------ .../bicep/main.azd.parameters.json | 39 ---- 2 files changed, 257 deletions(-) delete mode 100644 azure_jumpstart_ag/contoso_hypermarket/bicep/main.azd.bicep delete mode 100644 azure_jumpstart_ag/contoso_hypermarket/bicep/main.azd.parameters.json diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.azd.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.azd.bicep deleted file mode 100644 index 6c8e6ee20b..0000000000 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.azd.bicep +++ /dev/null @@ -1,218 +0,0 @@ -@description('Azure service principal client id') -param spnClientId string = '' - -@description('Azure service principal client secret') -@minLength(12) -@maxLength(123) -@secure() -param spnClientSecret string = newGuid() - -@description('Azure AD tenant id for your service principal') -param spnTenantId string = '' - -@minLength(1) -@maxLength(77) -@description('Prefix for resource group, i.e. {name}-rg') -param envName string = toLower(substring(newGuid(), 0, 5)) - -@description('Location for all resources') -param location string = '' - -@maxLength(5) -@description('Random GUID') -param namingGuid string = toLower(substring(newGuid(), 0, 5)) - -@description('Username for Windows account') -param windowsAdminUsername string = 'Agora' - -@description('Password for Windows account. Password must have 3 of the following: 1 lower case character, 1 upper case character, 1 number, and 1 special character. The value must be between 12 and 123 characters long') -@minLength(12) -@maxLength(123) -@secure() -param windowsAdminPassword string = newGuid() - -@description('Configure all linux machines with the SSH RSA public key string. Your key should include three parts, for example \'ssh-rsa AAAAB...snip...UcyupgH azureuser@linuxvm\'') -param sshRSAPublicKey string = '' - -@description('Name for your log analytics workspace') -param logAnalyticsWorkspaceName string = 'Ag-Workspace-${namingGuid}' - -@description('Target GitHub account') -param githubAccount string = 'microsoft' - -@description('Target GitHub branch') -param githubBranch string = 'main' - -@description('Choice to deploy Bastion to connect to the client VM') -param deployBastion bool = false - -@description('User github account where they have forked the repo https://github.com/microsoft/jumpstart-agora-apps') -@minLength(1) -param githubUser string = 'sampleUser' - -@description('GitHub Personal access token for the user account') -@minLength(1) -@secure() -param githubPAT string = newGuid() - -@description('Name of the Cloud VNet') -param virtualNetworkNameCloud string = 'Ag-Vnet-Prod' - -@description('Name of the Staging AKS subnet in the cloud virtual network') -param subnetNameCloudAksStaging string = 'Ag-Subnet-Staging' - -@description('Name of the inner-loop AKS subnet in the cloud virtual network') -param subnetNameCloudAksInnerLoop string = 'Ag-Subnet-InnerLoop' - -@description('The name of the Staging Kubernetes cluster resource') -param aksStagingClusterName string = 'Ag-AKS-Staging' - -@description('The name of the IotHub') -param iotHubName string = 'Ag-IotHub-${namingGuid}' - -@description('The name of the Cosmos DB account') -param accountName string = 'agcosmos${namingGuid}' - -@description('The name of the Azure Data Explorer cluster') -param adxClusterName string = 'agadx${namingGuid}' - -@description('The name of the Azure Data Explorer POS database') -param posOrdersDBName string = 'Orders' - -@minLength(5) -@maxLength(50) -@description('Name of the Azure Container Registry') -param acrName string = 'agacr${namingGuid}' - -@description('Override default RDP port using this parameter. Default is 3389. No changes will be made to the client VM.') -param rdpPort string = '3389' - -@description('The agora scenario to be deployed') -param scenario string = 'contoso_supermarket' - -var templateBaseUrl = 'https://raw.githubusercontent.com/${githubAccount}/azure_arc/${githubBranch}/azure_jumpstart_ag/' - -targetScope = 'subscription' - -resource rg 'Microsoft.Resources/resourceGroups@2020-06-01' = { - name: '${envName}-rg' - location: location -} - -module mgmtArtifactsAndPolicyDeployment 'mgmt/mgmtArtifacts.bicep' = { - name: 'mgmtArtifactsAndPolicyDeployment' - scope: rg - params: { - workspaceName: logAnalyticsWorkspaceName - location: location - } -} - -module networkDeployment 'mgmt/network.bicep' = { - name: 'networkDeployment' - scope: rg - params: { - virtualNetworkNameCloud: virtualNetworkNameCloud - subnetNameCloudAksStaging: subnetNameCloudAksStaging - subnetNameCloudAksInnerLoop: subnetNameCloudAksInnerLoop - deployBastion: deployBastion - location: location - } -} - -module storageAccountDeployment 'mgmt/storageAccount.bicep' = { - name: 'storageAccountDeployment' - scope: rg - params: { - location: location - } -} - -module kubernetesDeployment 'kubernetes/aks.bicep' = { - name: 'kubernetesDeployment' - scope: rg - params: { - aksStagingClusterName: aksStagingClusterName - virtualNetworkNameCloud: networkDeployment.outputs.virtualNetworkNameCloud - aksSubnetNameStaging: subnetNameCloudAksStaging - spnClientId: spnClientId - spnClientSecret: spnClientSecret - location: location - sshRSAPublicKey: sshRSAPublicKey - acrName: acrName - } -} - -module clientVmDeployment 'clientVm/clientVm.bicep' = { - name: 'clientVmDeployment' - scope: rg - params: { - windowsAdminUsername: windowsAdminUsername - windowsAdminPassword: windowsAdminPassword - spnClientId: spnClientId - spnClientSecret: spnClientSecret - spnTenantId: spnTenantId - workspaceName: logAnalyticsWorkspaceName - storageAccountName: storageAccountDeployment.outputs.storageAccountName - templateBaseUrl: templateBaseUrl - deployBastion: deployBastion - githubAccount: githubAccount - githubBranch: githubBranch - githubUser: githubUser - githubPAT: githubPAT - location: location - subnetId: networkDeployment.outputs.innerLoopSubnetId - aksStagingClusterName: aksStagingClusterName - iotHubHostName: iotHubDeployment.outputs.iotHubHostName - cosmosDBName: accountName - cosmosDBEndpoint: cosmosDBDeployment.outputs.cosmosDBEndpoint - acrName: acrName - rdpPort: rdpPort - adxClusterName: adxClusterName - namingGuid: namingGuid - scenario: scenario - } -} - -module iotHubDeployment 'data/iotHub.bicep' = { - name: 'iotHubDeployment' - scope: rg - params: { - location: location - iotHubName: iotHubName - } -} - -module adxDeployment 'data/dataExplorer.bicep' = { - name: 'adxDeployment' - scope: rg - params: { - location: location - adxClusterName: adxClusterName - iotHubId: iotHubDeployment.outputs.iotHubId - iotHubConsumerGroup: iotHubDeployment.outputs.iotHubConsumerGroup - cosmosDBAccountName: accountName - posOrdersDBName: posOrdersDBName - } -} - -module cosmosDBDeployment 'data/cosmosDB.bicep' = { - name: 'cosmosDBDeployment' - scope: rg - params: { - location: location - accountName: accountName - posOrdersDBName: posOrdersDBName - } -} - -output AZURE_TENANT_ID string = tenant().tenantId -output AZURE_RESOURCE_GROUP string = rg.name - -output NAMING_GUID string = namingGuid -output RDP_PORT string = rdpPort - -output ADX_CLUSTER_NAME string = adxClusterName -output IOT_HUB_NAME string = iotHubName -output COSMOS_DB_NAME string = accountName -output ACR_NAME string = acrName diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.azd.parameters.json b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.azd.parameters.json deleted file mode 100644 index ed06adf631..0000000000 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.azd.parameters.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", - "contentVersion": "1.0.0.0", - "parameters": { - "envName": { - "value": "${AZURE_ENV_NAME}" - }, - "location": { - "value": "${AZURE_LOCATION}" - }, - "spnClientId": { - "value": "${SPN_CLIENT_ID}" - }, - "spnClientSecret": { - "value": "${SPN_CLIENT_SECRET}" - }, - "spnTenantId": { - "value": "${SPN_TENANT_ID}" - }, - "windowsAdminUsername": { - "value": "${JS_WINDOWS_ADMIN_USERNAME}" - }, - "sshRSAPublicKey": { - "value": "${JS_SSH_RSA_PUBLIC_KEY}" - }, - "deployBastion": { - "value": false - }, - "rdpPort": { - "value": "${JS_RDP_PORT}" - }, - "githubUser": { - "value": "${JS_GITHUB_USER}" - }, - "githubPAT": { - "value": "${JS_GITHUB_PAT}" - } - } -} \ No newline at end of file From 0fb412e0299c0c83f7d1d408b87a4044b4fca42b Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Thu, 31 Oct 2024 17:05:37 -0500 Subject: [PATCH 203/409] remove datasvcs name --- azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index 506ac18f9b..a0c30660cf 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -171,7 +171,7 @@ module ubuntuRancherK3sDeployment 'kubernetes/ubuntuRancher.bicep' = { } module ubuntuRancherK3sDataSvcNodesDeployment 'kubernetes/ubuntuRancherNodes.bicep' = [for i in range(0, k3sClusterNodesCount): { - name: 'ubuntuRancherK3sDataSvcNodesDeployment-${i}' + name: 'ubuntuRancherK3sNodesDeployment-${i}' params: { sshRSAPublicKey: sshRSAPublicKey stagingStorageAccountName: toLower(storageAccountDeployment.outputs.storageAccountName) From bad67d15d036c759ade06d4f0b39722266baad35 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Fri, 1 Nov 2024 12:39:03 -0400 Subject: [PATCH 204/409] Update dashabord --- .../monitoring/grafana-app-stores.json | 322 +++++++++++++++++- 1 file changed, 317 insertions(+), 5 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json index 9517c6602b..1e52148af9 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json @@ -29,7 +29,7 @@ "x": 0, "y": 0 }, - "id": 20, + "id": 21, "panels": [], "title": "Lighting", "type": "row" @@ -313,7 +313,7 @@ "x": 0, "y": 7 }, - "id": 17, + "id": 20, "panels": [], "title": "Refrigerator", "type": "row" @@ -571,7 +571,7 @@ "x": 0, "y": 14 }, - "id": 10, + "id": 17, "panels": [], "title": "HVAC", "type": "row" @@ -906,10 +906,322 @@ ], "title": "HVAC Humidity", "type": "gauge" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 21 + }, + "id": 10, + "panels": [], + "title": "Sales", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "be2drih2vhlvkd" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "dark-green", + "value": null + } + ] + }, + "unit": "currencyUSD" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "sum(pos_total_amount_usd_total)" + }, + "properties": [ + { + "id": "displayName", + "value": "POS total amount (USD)" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "sum(auto_checkout_total_amount_usd_total)" + }, + "properties": [ + { + "id": "displayName", + "value": "Self Checkout total amount (USD)" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "C" + }, + "properties": [ + { + "id": "displayName", + "value": "Total Sales in USD" + }, + { + "id": "color", + "value": { + "mode": "palette-classic-by-name" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 11, + "x": 0, + "y": 22 + }, + "id": 22, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "editorMode": "code", + "exemplar": false, + "expr": "sum(pos_total_amount_usd_total)", + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "be2drih2vhlvkd" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(auto_checkout_total_amount_usd_total)", + "format": "time_series", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "B" + }, + { + "datasource": { + "name": "Expression", + "type": "__expr__", + "uid": "__expr__" + }, + "expression": "$A+$B", + "hide": false, + "refId": "C", + "type": "math" + } + ], + "title": "Sales Data", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "be2drih2vhlvkd" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 50, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "dash": [ + 10, + 10 + ], + "fill": "dash" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "dark-green", + "value": null + } + ] + }, + "unit": "currencyUSD" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "sum(pos_total_amount_usd_total)" + }, + "properties": [ + { + "id": "displayName", + "value": "POS total amount (USD)" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "sum(auto_checkout_total_amount_usd_total)" + }, + "properties": [ + { + "id": "displayName", + "value": "Self Checkout total amount (USD)" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "C" + }, + "properties": [ + { + "id": "displayName", + "value": "Total Sales in USD" + }, + { + "id": "color", + "value": { + "mode": "palette-classic-by-name" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 13, + "x": 11, + "y": 22 + }, + "id": 24, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "editorMode": "code", + "exemplar": false, + "expr": "sum(pos_total_amount_usd_total)", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "be2drih2vhlvkd" + }, + "editorMode": "code", + "expr": "sum(auto_checkout_total_amount_usd_total)", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "B" + }, + { + "datasource": { + "name": "Expression", + "type": "__expr__", + "uid": "__expr__" + }, + "expression": "$A+$B", + "hide": false, + "refId": "C", + "type": "math" + } + ], + "timeFrom": "24h", + "title": "Sales Data", + "type": "timeseries" } ], "preload": false, - "refresh": "", + "refresh": "5s", "schemaVersion": 40, "tags": [ "stores" @@ -940,6 +1252,6 @@ "timezone": "browser", "title": "Store / Asset", "uid": "ed387aa7-6eac-4c48-8891-4834666ac7ce", - "version": 42, + "version": 50, "weekStart": "" } \ No newline at end of file From d9f3872916ec35a081f7d2237bfbe1814ed97238 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Fri, 1 Nov 2024 12:57:15 -0400 Subject: [PATCH 205/409] Update AgConfig-contoso-hypermarket.psd1 --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index d8a7b50cbd..1579f5f667 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -59,7 +59,7 @@ @{name="customlocation"; version="latest"}, @{name="kusto"; version="latest"}, @{name="storage-preview"; version="latest"}, - @{name="azure-iot-ops"; version="0.7.0b2"} + @{name="azure-iot-ops"; version="latest"} ) # PowerShell modules From 31e520fcfd95afe7ccde42f7f0a8f91b57aa1a54 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Fri, 1 Nov 2024 14:06:45 -0400 Subject: [PATCH 206/409] Revert "Update AgConfig-contoso-hypermarket.psd1" This reverts commit d9f3872916ec35a081f7d2237bfbe1814ed97238. --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 1579f5f667..d8a7b50cbd 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -59,7 +59,7 @@ @{name="customlocation"; version="latest"}, @{name="kusto"; version="latest"}, @{name="storage-preview"; version="latest"}, - @{name="azure-iot-ops"; version="latest"} + @{name="azure-iot-ops"; version="0.7.0b2"} ) # PowerShell modules From b202d0ff4177dc521cd22010990ecb85eea6caf8 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Fri, 1 Nov 2024 21:07:57 +0100 Subject: [PATCH 207/409] Updated WinGet installation syntax Signed-off-by: Jan Egil Ring --- azure_jumpstart_arcbox/artifacts/WinGet.ps1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_arcbox/artifacts/WinGet.ps1 b/azure_jumpstart_arcbox/artifacts/WinGet.ps1 index 64510335a4..b3f1cb71bb 100644 --- a/azure_jumpstart_arcbox/artifacts/WinGet.ps1 +++ b/azure_jumpstart_arcbox/artifacts/WinGet.ps1 @@ -17,7 +17,9 @@ Install-PSResource -Name HyperVDsc -Scope AllUsers -Quiet -AcceptLicense -TrustR Install-PSResource -Name NetworkingDsc -Scope AllUsers -Quiet -AcceptLicense -TrustRepository # Install WinGet CLI -$null = Repair-WinGetPackageManager -AllUsers +$null = Repair-WinGetPackageManager -AllUsers -Force -Latest + +Get-WinGetVersion Write-Header 'Installing WinGet packages and DSC configurations' $winget = Join-Path -Path $env:LOCALAPPDATA -ChildPath Microsoft\WindowsApps\winget.exe From 151d37accefe2b91e87c3521c9ff2d5ce891291c Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Fri, 1 Nov 2024 21:20:46 +0100 Subject: [PATCH 208/409] Updated WinGet installation syntax Signed-off-by: Jan Egil Ring --- azure_jumpstart_hcibox/artifacts/PowerShell/WinGet.ps1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_hcibox/artifacts/PowerShell/WinGet.ps1 b/azure_jumpstart_hcibox/artifacts/PowerShell/WinGet.ps1 index fe9f430b33..68f4701f3f 100644 --- a/azure_jumpstart_hcibox/artifacts/PowerShell/WinGet.ps1 +++ b/azure_jumpstart_hcibox/artifacts/PowerShell/WinGet.ps1 @@ -16,7 +16,9 @@ Install-PSResource -Name HyperVDsc -Scope AllUsers -Quiet -AcceptLicense -TrustR Install-PSResource -Name NetworkingDsc -Scope AllUsers -Quiet -AcceptLicense -TrustRepository # Install WinGet CLI -$null = Repair-WinGetPackageManager -AllUsers +$null = Repair-WinGetPackageManager -AllUsers -Force -Latest + +Get-WinGetVersion Write-Output 'Installing WinGet packages and DSC configurations' $winget = Join-Path -Path $env:LOCALAPPDATA -ChildPath Microsoft\WindowsApps\winget.exe From de41ff7b5f7f58022893ddbb415a48850c92e50b Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Fri, 1 Nov 2024 22:15:04 -0400 Subject: [PATCH 209/409] Dataflow deployment changes --- .../AgConfig-contoso-hypermarket.psd1 | 2 +- .../artifacts/PowerShell/AgLogonScript.ps1 | 3 +- .../Modules/contoso_hypermarket.psm1 | 198 ++++++++++++++++++ .../fabric/contoso-hypermarket-dashboard.pbix | Bin 0 -> 313508 bytes .../orders-sales-forecast.ipynb | 0 .../bicep/data/dataflows.bicep | 142 +++++++++++++ .../contoso_hypermarket/bicep/data/script.kql | 43 +++- 7 files changed, 380 insertions(+), 8 deletions(-) create mode 100644 azure_jumpstart_ag/artifacts/fabric/contoso-hypermarket-dashboard.pbix rename azure_jumpstart_ag/artifacts/{notebooks => fabric}/orders-sales-forecast.ipynb (100%) create mode 100644 azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index d8a7b50cbd..1579f5f667 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -59,7 +59,7 @@ @{name="customlocation"; version="latest"}, @{name="kusto"; version="latest"}, @{name="storage-preview"; version="latest"}, - @{name="azure-iot-ops"; version="0.7.0b2"} + @{name="azure-iot-ops"; version="latest"} ) # PowerShell modules diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index efc9a6d487..852fd3b8eb 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -222,7 +222,8 @@ if ($scenario -eq "contoso_motors") { $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray }elseif($scenario -eq "contoso_hypermarket"){ - Deploy-AIO-M2 + #Deploy-AIO-M2 + Deploy-AIO-M3 $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 2b0f8767d3..d2be0534b4 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -257,6 +257,204 @@ function Deploy-AIO-M2 { } } +function Deploy-AIO-M3 { + Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the Arc-enabled clusters" -ForegroundColor Gray + Write-Host "`n" + + # Get Event Hub details from the resource group to assign role permissions to IoT Operations extension managed + $eventHubInfo = (az resource list --resource-group $resourceGroup --resource-type "Microsoft.EventHub/namespaces" | ConvertFrom-Json) + if ($eventHubInfo.Count -ne 1) { + Write-Host "ERROR: Resource group contains no Eventhub namespaces or more than one. Make sure to have only one EventHub namesapce in the resource group." -ForegroundColor DarkRed + return + } + + $eventHubNamespaceId = $eventHubInfo[0].id + $evenHubNamespaceHost = "$($eventHubInfo[0].name).servicebus.windows.net:9093" + + Write-Host "INFO: Found EventHub Namespace with Resource ID: $eventHubNamespaceId" -ForegroundColor DarkGray + + # Get Event Hub from the Event Hub namespace + $eventHubs = az eventhubs eventhub list --namespace-name $eventHubInfo[0].name --resource-group $resourceGroup | ConvertFrom-Json + $eventHubName = $eventHubs[0].name + if (-not $eventHubName) { + Write-Host "[$(Get-Date -Format t)] ERROR: Event Hub not found in the EventHub namespace $($eventHubInfo[0].name)" -ForegroundColor DarkRed + return + } + + # Download the bicep template + $dataflowBicepTemplatePath = "$($AgConfig.AgDirectories.AgTempDir)\iotDataFlows.bicep" + Invoke-WebRequest ($templateBaseUrl + "contoso_hypermarket/bicep/data/dataflows.bicep") -OutFile $dataflowBicepTemplatePath + if (-not (Test-Path -Path $dataflowBicepTemplatePath)) { + Write-Host "[$(Get-Date -Format t)] ERROR: $dataflowBicepTemplatePath file not found." -ForegroundColor DarkRed + return + } + + $kvIndex = 0 + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + $clusterName = $cluster.Name.ToLower() + Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the $clusterName cluster" -ForegroundColor Gray + Write-Host "`n" + # Create user-assigned identity for AIO secrets management + Write-Host "Create user-assigned identity for AIO secrets management" -ForegroundColor DarkGray + Write-Host "`n" + $userAssignedManagedIdentityKvName = "aio-${clusterName}-${namingGuid}-kv-identity" + $userAssignedMIKvResourceId = $(az identity create -g $resourceGroup -n $userAssignedManagedIdentityKvName -o tsv --query id) + + # Create user-assigned identity for AIO secrets management + Write-Host "Create user-assigned identity for cloud connections" -ForegroundColor DarkGray + Write-Host "`n" + $userAssignedManagedIdentityCloudName = "aio-${clusterName}-${namingGuid}-cloud-identity" + $userAssignedMICloudResourceId = $(az identity create -g $resourceGroup -n $userAssignedManagedIdentityCloudName -o tsv --query id) + + kubectx $clusterName + $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" + $keyVaultId = (az keyvault list -g $resourceGroup --resource-type vault --query "[$kvIndex].id" -o tsv) + $retryCount = 0 + $maxRetries = 5 + $aioStatus = "notDeployed" + + # Enable custom locations on the Arc-enabled cluster + Write-Host "[$(Get-Date -Format t)] INFO: Enabling custom locations on the Arc-enabled cluster" -ForegroundColor DarkGray + Write-Host "`n" + az config set extension.use_dynamic_install=yes_without_prompt + az connectedk8s enable-features --name $arcClusterName ` + --resource-group $resourceGroup ` + --features cluster-connect custom-locations ` + --custom-locations-oid $customLocationRPOID ` + --only-show-errors + + # Create the Schema registry for the cluster + Write-Host "[$(Get-Date -Format t)] INFO: Creating the schema registry on the Arc-enabled cluster" -ForegroundColor DarkGray + Write-Host "`n" + $schemaName = "${clusterName}-$($Env:namingGuid)-schema" + $schemaId = $(az iot ops schema registry create --name $schemaName ` + --resource-group $resourceGroup ` + --registry-namespace "$clusterName-$($Env:namingGuid)-namespace" ` + --sa-resource-id $(az storage account show --name $aioStorageAccountName --resource-group $resourceGroup -o tsv --query id) ` + --query id -o tsv) + + $customLocationName = (az resource list --resource-group $resourceGroup --resource-type "Microsoft.ExtendedLocation/customLocations" --query "[?contains(name, '$($arcClusterName.toLower())')].[name]" -o tsv) + if (-not $customLocationName) { + Write-Host "[$(Get-Date -Format t)] ERROR: Custom locaton not found for cluster $arcClusterName" -ForegroundColor DarkRed + return + } + + Write-Host "[$(Get-Date -Format t)] INFO: Custom locaton '$customLocationName' found for the cluster '$arcClusterName'" -ForegroundColor DarkGray + + # Initialize the Azure IoT Operations instance on the Arc-enabled cluster + Write-Host "[$(Get-Date -Format t)] INFO: Initialize the Azure IoT Operations instance on the Arc-enabled cluster" -ForegroundColor DarkGray + Write-Host "`n" + do { + az iot ops init --cluster $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --subscription $subscriptionId ` + --only-show-errors + if ($? -eq $false) { + $aioStatus = "notDeployed" + Write-Host "`n" + Write-Host "[$(Get-Date -Format t)] Error: An error occured while deploying AIO on the cluster...Retrying" -ForegroundColor DarkRed + Write-Host "`n" + az iot ops init --cluster $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --subscription $subscriptionId ` + --only-show-errors + $retryCount++ + } + else { + $aioStatus = "deployed" + } + } until ($aioStatus -eq "deployed" -or $retryCount -eq $maxRetries) + + $retryCount = 0 + $maxRetries = 5 + # Create the Azure IoT Operations instance on the Arc-enabled cluster + Write-Host "[$(Get-Date -Format t)] INFO: Create the Azure IoT Operations instance on the Arc-enabled cluster" -ForegroundColor DarkGray + Write-Host "`n" + do { + az iot ops create --name $arcClusterName.toLower() ` + --cluster $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --subscription $subscriptionId ` + --custom-location $customLocationName ` + --sr-resource-id $schemaId ` + --add-insecure-listener ` + --only-show-errors + + if ($? -eq $false) { + $aioStatus = "notDeployed" + Write-Host "`n" + Write-Host "[$(Get-Date -Format t)] Error: An error occured while deploying AIO on the cluster...Retrying" -ForegroundColor DarkRed + Write-Host "`n" + az iot ops create --name $arcClusterName.toLower() ` + --cluster $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --subscription $subscriptionId ` + --custom-location $customLocationName ` + --sr-resource-id $schemaId ` + --add-insecure-listener ` + --only-show-errors + + $retryCount++ + } + else { + $aioStatus = "deployed" + } + } until ($aioStatus -eq "deployed" -or $retryCount -eq $maxRetries) + + # Configure the Azure IoT Operations instance for secret synchronization + Write-Host "[$(Get-Date -Format t)] INFO: Configuring the Azure IoT Operations instance for secret synchronization" -ForegroundColor DarkGray + Write-Host "`n" + + # Enable OIDC issuer and workload identity on the Arc-enabled cluster + az connectedk8s update -n $arcClusterName ` + --resource-group $resourceGroup ` + --enable-oidc-issuer ` + --enable-workload-identity + + Write-Host "[$(Get-Date -Format t)] INFO: Assigning the user-assigned managed identity to the Azure IoT Operations instance" -ForegroundColor DarkGray + Write-Host "`n" + az iot ops identity assign --name $arcClusterName.toLower() ` + --resource-group $resourceGroup ` + --mi-user-assigned $userAssignedMIKvResourceId + + Start-Sleep -Seconds 60 + + Write-Host "[$(Get-Date -Format t)] INFO: Configure the Azure IoT Operations instance for secret synchronization" -ForegroundColor DarkGray + Write-Host "`n" + + az iot ops secretsync enable --name $arcClusterName.toLower() ` + --kv-resource-id $keyVaultId ` + --resource-group $resourceGroup ` + --mi-user-assigned $userAssignedMICloudResourceId ` + --only-show-errors + + $kvIndex++ + + # Get IoT Operations extension pricipalId + Write-Host "[$(Get-Date -Format t)] INFO: Retrieving IoT Operations extension principalId" -ForegroundColor DarkGray + $iotExtensionPrincipalId = (az k8s-extension list --resource-group $resourceGroup --cluster-name $arcClusterName --cluster-type connectedClusters --query "[?extensionType=='microsoft.iotoperations'].identity.principalId" -o tsv) + + # Assign "Azure Event Hubs Data Sender" role to IoT managed identity + Write-Host "[$(Get-Date -Format t)] INFO: Assigning 'Azure Event Hubs Data Sender role' to EventHub namespace" -ForegroundColor DarkGray + az role assignment create --assignee $iotExtensionPrincipalId --role "Azure Event Hubs Data Sender" --scope $eventHubNamespaceId + + # Deploy IoT DataFlows using bicep template + Write-Host "[$(Get-Date -Format t)] INFO: Deploying IoT DataFlows using bicep template" -ForegroundColor DarkGray + $deploymentName = "$arcClusterName" + "-iot-dataflow" + az deployment group create --name $deploymentName --resource-group $resourceGroup --template-file $dataflowBicepTemplatePath ` + --parameters aioInstanceName=$iotInstanceName evenHubNamespaceHost=$evenHubNamespaceHost eventHubName=$eventHubName ` + customLocationName=$customLocationName + + # Verify the deployment status + $deploymentStatus = az deployment group show --name $deploymentName --resource-group $resourceGroup --query properties.provisioningState -o tsv + if ($deploymentStatus -eq "Succeeded") { + Write-Host "[$(Get-Date -Format t)] INFO: Deployment succeeded for $deploymentName" -ForegroundColor Green + } else { + Write-Host "[$(Get-Date -Format t)] ERROR: Deployment failed for $deploymentName" -ForegroundColor Red + } + } +} + function Set-MicrosoftFabric { # Load Agconfig $fabricWorkspacePrefix = $AgConfig.FabricConfig["WorkspacePrefix"] diff --git a/azure_jumpstart_ag/artifacts/fabric/contoso-hypermarket-dashboard.pbix b/azure_jumpstart_ag/artifacts/fabric/contoso-hypermarket-dashboard.pbix new file mode 100644 index 0000000000000000000000000000000000000000..0ac6339e580ffb2db35a42be18202acae1dd71a8 GIT binary patch literal 313508 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

-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

8nK8wT>`VdmiY%7PGD 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

&G16~PKfF@Kf)kd^I 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 Date: Sat, 2 Nov 2024 00:26:43 -0400 Subject: [PATCH 210/409] add store dashboards --- .../AgConfig-contoso-hypermarket.psd1 | 2 +- .../artifacts/PowerShell/Bootstrap.ps1 | 1 + .../artifacts/PowerShell/Modules/common.psm1 | 1 + .../grafana-app-stores-shoppers.json | 991 ++++++++++++++++++ .../monitoring/grafana-app-stores.json | 24 +- 5 files changed, 1010 insertions(+), 9 deletions(-) create mode 100644 azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores-shoppers.json diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index d8a7b50cbd..12e3cdd48c 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -189,7 +189,7 @@ ProdURL = "http://localhost:3000" Dashboards = @{ "grafana.com" = @() # Dashboards from https://grafana.com/grafana/dashboards - "custom" = @('node-exporter-full-v2','cluster-global', 'app-workloads', 'app-pods', 'app-stores') # Dashboards from https://github.com/microsoft/azure_arc/tree/main/azure_jumpstart_ag/artifacts/monitoring + "custom" = @('node-exporter-full-v2','cluster-global', 'app-workloads', 'app-pods', 'app-stores', 'app-stores-shoppers') # Dashboards from https://github.com/microsoft/azure_arc/tree/main/azure_jumpstart_ag/artifacts/monitoring } } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index a661b17b3b..5af2c5792e 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -323,6 +323,7 @@ elseif ($scenario -eq "contoso_hypermarket") { Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-pods.json") -OutFile "$AgMonitoringDir\grafana-app-pods.json" Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-node-exporter-full-v2.json") -OutFile "$AgMonitoringDir\grafana-node-exporter-full-v2.json" Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-stores.json") -OutFile "$AgMonitoringDir\grafana-app-stores.json" + Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-stores-shoppers.json") -OutFile "$AgMonitoringDir\grafana-app-stores-shoppers.json" Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso-hypermarket.png") -OutFile $AgIconsDir\contoso-hypermarket.png Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso-hypermarket.svg") -OutFile $AgIconsDir\contoso-hypermarket.svg } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index 15e2ed6370..ca24b1c6fc 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -866,6 +866,7 @@ function Deploy-Prometheus { # Update Grafana Icons Copy-Item -Path $AgIconsDir\contoso-hypermarket.png -Destination "C:\Program Files\GrafanaLabs\grafana\public\img" Copy-Item -Path $AgIconsDir\contoso-hypermarket.svg -Destination "C:\Program Files\GrafanaLabs\grafana\public\img\grafana_icon.svg" + Copy-Item -Path $AgIconsDir\contoso-hypermarket.svg -Destination "C:\Program Files\GrafanaLabs\grafana\public\img\icons\iot\contoso-hypermarket.svg" Get-ChildItem -Path 'C:\Program Files\GrafanaLabs\grafana\public\build\*.js' -Recurse -File | ForEach-Object { (Get-Content $_.FullName) -replace 'className:u,src:"public/img/grafana_icon.svg"', 'className:u,src:"public/img/contoso-hypermarket.png"' | Set-Content $_.FullName diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores-shoppers.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores-shoppers.json new file mode 100644 index 0000000000..27314fff83 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores-shoppers.json @@ -0,0 +1,991 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 8, + "links": [], + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "be2drih2vhlvkd" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "light-green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 15, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "infinitePan": false, + "inlineEditing": true, + "panZoom": false, + "root": { + "background": { + "color": { + "fixed": "#080d08" + }, + "image": { + "field": "Time", + "fixed": "img/bg/p1.png", + "mode": "field" + }, + "size": "contain" + }, + "border": { + "color": { + "fixed": "dark-green" + }, + "radius": 0, + "width": 5 + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "elements": [ + { + "background": { + "color": { + "fixed": "dark-green" + }, + "size": "cover" + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 50, + "text": { + "field": "{__name__=\"lighting_brightness_level\", device_id=\"LightingSystem01\", endpoint=\"cerebral-metrics\", instance=\"10.42.1.27:8001\", job=\"cerebral-simulator-service\", namespace=\"contoso-hypermarket\", pod=\"cerebral-simulator-5bb7564f84-mmwnl\", service=\"cerebral-simulator-service\"}", + "fixed": "", + "mode": "field" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "links": [], + "name": "Element 1", + "oneClickMode": "off", + "placement": { + "height": 121.96614074707031, + "left": 494, + "rotation": 0, + "top": 46, + "width": 354.97393798828125 + }, + "type": "metric-value" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "size": 50, + "text": { + "fixed": "Zone 1" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "links": [], + "name": "Element 2", + "oneClickMode": "off", + "placement": { + "height": 64.98695373535156, + "left": 103, + "rotation": 0, + "top": 258, + "width": 230 + }, + "type": "text" + }, + { + "background": { + "color": { + "fixed": "dark-green" + }, + "size": "cover" + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 50, + "text": { + "field": "{__name__=\"lighting_brightness_level\", device_id=\"LightingSystem02\", endpoint=\"cerebral-metrics\", instance=\"10.42.1.27:8001\", job=\"cerebral-simulator-service\", namespace=\"contoso-hypermarket\", pod=\"cerebral-simulator-5bb7564f84-mmwnl\", service=\"cerebral-simulator-service\"}", + "fixed": "", + "mode": "field" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "links": [], + "name": "Element 3", + "oneClickMode": "off", + "placement": { + "height": 121.97914123535156, + "left": 494, + "rotation": 0, + "top": 229, + "width": 354.9869689941406 + }, + "type": "metric-value" + }, + { + "background": { + "color": { + "fixed": "dark-green" + }, + "image": { + "mode": "fixed" + }, + "size": "cover" + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 50, + "text": { + "field": "{__name__=\"lighting_brightness_level\", device_id=\"LightingSystem03\", endpoint=\"cerebral-metrics\", instance=\"10.42.1.27:8001\", job=\"cerebral-simulator-service\", namespace=\"contoso-hypermarket\", pod=\"cerebral-simulator-5bb7564f84-mmwnl\", service=\"cerebral-simulator-service\"}", + "fixed": "", + "mode": "field" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "links": [], + "name": "Element 4", + "oneClickMode": "off", + "placement": { + "height": 121.9921875, + "left": 494, + "rotation": 0, + "top": 399, + "width": 354.9869689941406 + }, + "type": "metric-value" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "fill": { + "fixed": "#D9D9D9" + }, + "path": { + "fixed": "img/icons/unicons/store.svg", + "mode": "fixed" + } + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "links": [], + "name": "Element 5", + "oneClickMode": "off", + "placement": { + "height": 135, + "left": -1, + "rotation": 0, + "top": 399, + "width": 207.99478149414062 + }, + "type": "icon" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "fill": { + "fixed": "#D9D9D9" + }, + "path": { + "fixed": "img/icons/unicons/shopping-cart.svg", + "mode": "fixed" + } + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "links": [], + "name": "Element 6", + "oneClickMode": "off", + "placement": { + "height": 100, + "left": 301, + "rotation": 0, + "top": 399, + "width": 100 + }, + "type": "icon" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "#010101" + }, + "size": 20, + "text": { + "fixed": "Shoppers age 20" + }, + "valign": "middle" + }, + "connections": [], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "links": [], + "name": "Element 7", + "oneClickMode": "off", + "placement": { + "height": 50, + "left": 572, + "rotation": 0, + "top": 129, + "width": 198.9973907470703 + }, + "type": "text" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "#010101" + }, + "size": 20, + "text": { + "fixed": "Shoppers age 30" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "links": [], + "name": "Element 8", + "oneClickMode": "off", + "placement": { + "height": 50, + "left": 572, + "rotation": 0, + "top": 312, + "width": 198.9973907470703 + }, + "type": "text" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "#010101" + }, + "size": 20, + "text": { + "fixed": "Shoppers age 40" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "links": [], + "name": "Element 9", + "oneClickMode": "off", + "placement": { + "height": 50, + "left": 572, + "rotation": 0, + "top": 477, + "width": 198.9973907470703 + }, + "type": "text" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "fill": { + "fixed": "#D9D9D9" + }, + "path": { + "fixed": "img/icons/iot/contoso-hypermarket.svg", + "mode": "fixed" + } + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "links": [], + "name": "Element 10", + "oneClickMode": "off", + "placement": { + "height": 82.99480438232422, + "left": 39, + "rotation": 0, + "top": 65, + "width": 415 + }, + "type": "icon" + } + ], + "name": "Element 1730518700970", + "oneClickMode": "off", + "placement": { + "height": 100, + "left": 0, + "rotation": 0, + "top": 0, + "width": 100 + }, + "type": "frame" + }, + "showAdvancedTypes": false + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "be2drih2vhlvkd" + }, + "editorMode": "code", + "expr": "lighting_brightness_level", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "", + "type": "canvas" + }, + { + "datasource": { + "type": "prometheus", + "uid": "be2drih2vhlvkd" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "light-green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 15, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 2, + "options": { + "infinitePan": false, + "inlineEditing": true, + "panZoom": false, + "root": { + "background": { + "color": { + "fixed": "#010101" + }, + "image": { + "field": "Time", + "fixed": "img/bg/p1.png", + "mode": "field" + }, + "size": "contain" + }, + "border": { + "color": { + "fixed": "dark-blue" + }, + "radius": 0, + "width": 5 + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "elements": [ + { + "background": { + "color": { + "fixed": "dark-blue" + }, + "size": "cover" + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "#000001" + }, + "size": 50, + "text": { + "field": "{__name__=\"lighting_brightness_level\", device_id=\"LightingSystem01\", endpoint=\"cerebral-metrics\", instance=\"10.42.1.27:8001\", job=\"cerebral-simulator-service\", namespace=\"contoso-hypermarket\", pod=\"cerebral-simulator-5bb7564f84-mmwnl\", service=\"cerebral-simulator-service\"}", + "fixed": "", + "mode": "field" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "links": [], + "name": "Element 1", + "oneClickMode": "off", + "placement": { + "height": 121.96614074707031, + "left": 494, + "rotation": 0, + "top": 46, + "width": 354.97393798828125 + }, + "type": "metric-value" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "size": 50, + "text": { + "fixed": "Zone 2" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "links": [], + "name": "Element 2", + "oneClickMode": "off", + "placement": { + "height": 64.98699951171875, + "left": 101, + "top": 258, + "width": 230 + }, + "type": "text" + }, + { + "background": { + "color": { + "fixed": "dark-blue" + }, + "size": "cover" + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 50, + "text": { + "field": "{__name__=\"lighting_brightness_level\", device_id=\"LightingSystem02\", endpoint=\"cerebral-metrics\", instance=\"10.42.1.27:8001\", job=\"cerebral-simulator-service\", namespace=\"contoso-hypermarket\", pod=\"cerebral-simulator-5bb7564f84-mmwnl\", service=\"cerebral-simulator-service\"}", + "fixed": "", + "mode": "field" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "links": [], + "name": "Element 3", + "oneClickMode": "off", + "placement": { + "height": 121.96614074707031, + "left": 494, + "rotation": 0, + "top": 229, + "width": 354.9869689941406 + }, + "type": "metric-value" + }, + { + "background": { + "color": { + "fixed": "dark-blue" + }, + "image": { + "mode": "fixed" + }, + "size": "cover" + }, + "border": { + "color": { + "fixed": "dark-green" + }, + "width": 0 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 50, + "text": { + "field": "{__name__=\"lighting_brightness_level\", device_id=\"LightingSystem03\", endpoint=\"cerebral-metrics\", instance=\"10.42.1.27:8001\", job=\"cerebral-simulator-service\", namespace=\"contoso-hypermarket\", pod=\"cerebral-simulator-5bb7564f84-mmwnl\", service=\"cerebral-simulator-service\"}", + "fixed": "", + "mode": "field" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "links": [], + "name": "Element 4", + "oneClickMode": "off", + "placement": { + "height": 121.9921875, + "left": 494, + "rotation": 0, + "top": 399, + "width": 354.9869689941406 + }, + "type": "metric-value" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "fill": { + "fixed": "#D9D9D9" + }, + "path": { + "fixed": "img/icons/unicons/store.svg", + "mode": "fixed" + } + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "links": [], + "name": "Element 5", + "oneClickMode": "off", + "placement": { + "height": 135, + "left": 8, + "top": 387, + "width": 207.99478149414062 + }, + "type": "icon" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "fill": { + "fixed": "#D9D9D9" + }, + "path": { + "fixed": "img/icons/unicons/shopping-cart.svg", + "mode": "fixed" + } + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "links": [], + "name": "Element 6", + "oneClickMode": "off", + "placement": { + "height": 100, + "left": 299, + "top": 399, + "width": 100 + }, + "type": "icon" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "#010101" + }, + "size": 20, + "text": { + "fixed": "Shoppers age 20" + }, + "valign": "middle" + }, + "connections": [], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "links": [], + "name": "Element 7", + "oneClickMode": "off", + "placement": { + "height": 50, + "left": 572, + "rotation": 0, + "top": 129, + "width": 198.9973907470703 + }, + "type": "text" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "#010101" + }, + "size": 20, + "text": { + "fixed": "Shoppers age 30" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "links": [], + "name": "Element 8", + "oneClickMode": "off", + "placement": { + "height": 50, + "left": 572, + "rotation": 0, + "top": 312, + "width": 198.9973907470703 + }, + "type": "text" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "#010101" + }, + "size": 20, + "text": { + "fixed": "Shoppers age 40" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "links": [], + "name": "Element 9", + "oneClickMode": "off", + "placement": { + "height": 50, + "left": 572, + "rotation": 0, + "top": 477, + "width": 198.9973907470703 + }, + "type": "text" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "fill": { + "fixed": "#D9D9D9" + }, + "path": { + "field": "", + "fixed": "img/icons/iot/contoso-hypermarket.svg", + "mode": "fixed" + } + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "links": [], + "name": "Element 10", + "oneClickMode": "off", + "placement": { + "height": 66.9921875, + "left": 33, + "top": 73, + "width": 416.9921875 + }, + "type": "icon" + } + ], + "name": "Element 1730518700970", + "oneClickMode": "off", + "placement": { + "height": 100, + "left": 0, + "rotation": 0, + "top": 0, + "width": 100 + }, + "type": "frame" + }, + "showAdvancedTypes": false + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "be2drih2vhlvkd" + }, + "editorMode": "code", + "expr": "lighting_brightness_level", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "", + "type": "canvas" + } + ], + "preload": false, + "schemaVersion": 40, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-5m", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "Store / Shopper Insights", + "uid": "be2p0z52wn1mof", + "version": 4, + "weekStart": "" +} \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json index 1e52148af9..d4dee45bbb 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json @@ -923,7 +923,7 @@ { "datasource": { "type": "prometheus", - "uid": "be2drih2vhlvkd" + "uid": "${datasource}" }, "fieldConfig": { "defaults": { @@ -1014,6 +1014,10 @@ "pluginVersion": "11.3.0", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, "editorMode": "code", "exemplar": false, "expr": "sum(pos_total_amount_usd_total)", @@ -1025,7 +1029,7 @@ { "datasource": { "type": "prometheus", - "uid": "be2drih2vhlvkd" + "uid": "${datasource}" }, "editorMode": "code", "exemplar": false, @@ -1055,7 +1059,7 @@ { "datasource": { "type": "prometheus", - "uid": "be2drih2vhlvkd" + "uid": "${datasource}" }, "fieldConfig": { "defaults": { @@ -1181,6 +1185,10 @@ "pluginVersion": "11.3.0", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, "editorMode": "code", "exemplar": false, "expr": "sum(pos_total_amount_usd_total)", @@ -1193,7 +1201,7 @@ { "datasource": { "type": "prometheus", - "uid": "be2drih2vhlvkd" + "uid": "${datasource}" }, "editorMode": "code", "expr": "sum(auto_checkout_total_amount_usd_total)", @@ -1230,8 +1238,8 @@ "list": [ { "current": { - "text": "seattle", - "value": "be2drih2vhlvkd" + "text": "chicago", + "value": "ae2dreulofdvke" }, "includeAll": false, "label": "Store", @@ -1245,13 +1253,13 @@ ] }, "time": { - "from": "now-5m", + "from": "now-15m", "to": "now" }, "timepicker": {}, "timezone": "browser", "title": "Store / Asset", "uid": "ed387aa7-6eac-4c48-8891-4834666ac7ce", - "version": 50, + "version": 51, "weekStart": "" } \ No newline at end of file From 040a44d15b307de41200e2ab8f4c14c40126f9f4 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Sat, 2 Nov 2024 06:52:16 -0500 Subject: [PATCH 211/409] names --- azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index a0c30660cf..181b57becc 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -141,7 +141,7 @@ module storageAccountDeployment 'mgmt/storageAccount.bicep' = { } module ubuntuRancherK3sDataSvcDeployment 'kubernetes/ubuntuRancher.bicep' = { - name: 'ubuntuRancherK3sDataSvcDeployment' + name: 'ubuntuRancherK3s2Deployment' params: { sshRSAPublicKey: sshRSAPublicKey stagingStorageAccountName: toLower(storageAccountDeployment.outputs.storageAccountName) @@ -189,7 +189,7 @@ module ubuntuRancherK3sDataSvcNodesDeployment 'kubernetes/ubuntuRancherNodes.bic }] module ubuntuRancherK3sNodesDeployment 'kubernetes/ubuntuRancherNodes.bicep' = [for i in range(0, k3sClusterNodesCount): { - name: 'ubuntuRancherK3sNodesDeployment-${i}' + name: 'ubuntuRancherK3sNodes2Deployment-${i}' params: { sshRSAPublicKey: sshRSAPublicKey stagingStorageAccountName: toLower(storageAccountDeployment.outputs.storageAccountName) From ca3a051dd5922bb00df6dccc6670a29ea3872f17 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Sat, 2 Nov 2024 08:00:34 -0500 Subject: [PATCH 212/409] bug --- azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 index c81b44aeed..8cf23e06a2 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 @@ -12,7 +12,7 @@ Start-Transcript -Path $logFilePath -Force -ErrorAction SilentlyContinue Install-PSResource -Name Microsoft.WinGet.Client -Scope AllUsers -Quiet -AcceptLicense -TrustRepository # Install WinGet CLI -$null = Repair-WinGetPackageManager -AllUsers +$null = Repair-WinGetPackageManager -AllUsers -Force -Latest Write-Header 'Installing WinGet packages and DSC configurations' $winget = Join-Path -Path $env:LOCALAPPDATA -ChildPath Microsoft\WindowsApps\winget.exe From dcafd1c832c2b0fc4d2123465e4e7ebfcb8e388a Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sat, 2 Nov 2024 10:28:55 -0400 Subject: [PATCH 213/409] comment --- .../artifacts/PowerShell/AgLogonScript.ps1 | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index efc9a6d487..cc1a6cd783 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -215,17 +215,17 @@ if ($scenario -eq "contoso_supermarket") { Deploy-SupermarketConfigs } -if ($scenario -eq "contoso_motors") { - Update-AzureIoTOpsExtension - Deploy-AIO - Deploy-MotorsConfigs - $mqttIpArray=Set-MQTTIpAddress - Deploy-MQTTExplorer -mqttIpArray $mqttIpArray -}elseif($scenario -eq "contoso_hypermarket"){ - Deploy-AIO-M2 - $mqttIpArray=Set-MQTTIpAddress - Deploy-MQTTExplorer -mqttIpArray $mqttIpArray -} +# if ($scenario -eq "contoso_motors") { +# Update-AzureIoTOpsExtension +# Deploy-AIO +# Deploy-MotorsConfigs +# $mqttIpArray=Set-MQTTIpAddress +# Deploy-MQTTExplorer -mqttIpArray $mqttIpArray +# }elseif($scenario -eq "contoso_hypermarket"){ +# Deploy-AIO-M2 +# $mqttIpArray=Set-MQTTIpAddress +# Deploy-MQTTExplorer -mqttIpArray $mqttIpArray +# } ############################################################## # Deploy Kubernetes Prometheus Stack for Observability @@ -248,12 +248,12 @@ if($scenario -eq "contoso_motors"){ Deploy-ADXDashboardReports } -##################################################################### -# Deploy Microsoft Fabric -##################################################################### -if($scenario -eq "contoso_hypermarket"){ - Set-MicrosoftFabric -} +# ##################################################################### +# # Deploy Microsoft Fabric +# ##################################################################### +# if($scenario -eq "contoso_hypermarket"){ +# Set-MicrosoftFabric +# } ############################################################## # Creating bookmarks and setting merged kubeconfigs From a6a43c8acd7305573d5867bfce92d6ececd8636f Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Sat, 2 Nov 2024 12:02:24 -0400 Subject: [PATCH 214/409] Update contoso_hypermarket.psm1 --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index d2be0534b4..1302efe5f4 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -333,13 +333,7 @@ function Deploy-AIO-M3 { --sa-resource-id $(az storage account show --name $aioStorageAccountName --resource-group $resourceGroup -o tsv --query id) ` --query id -o tsv) - $customLocationName = (az resource list --resource-group $resourceGroup --resource-type "Microsoft.ExtendedLocation/customLocations" --query "[?contains(name, '$($arcClusterName.toLower())')].[name]" -o tsv) - if (-not $customLocationName) { - Write-Host "[$(Get-Date -Format t)] ERROR: Custom locaton not found for cluster $arcClusterName" -ForegroundColor DarkRed - return - } - - Write-Host "[$(Get-Date -Format t)] INFO: Custom locaton '$customLocationName' found for the cluster '$arcClusterName'" -ForegroundColor DarkGray + $customLocationName = $arcClusterName.toLower() + "-cl" # Initialize the Azure IoT Operations instance on the Arc-enabled cluster Write-Host "[$(Get-Date -Format t)] INFO: Initialize the Azure IoT Operations instance on the Arc-enabled cluster" -ForegroundColor DarkGray From f0967b45b70f19ced67bd3d9a36101ce7a6c0834 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Sat, 2 Nov 2024 14:08:11 -0400 Subject: [PATCH 215/409] Fixed deployment issues --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 5 ++++- .../contoso_hypermarket/bicep/data/dataflows.bicep | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 1302efe5f4..b40af2e483 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -282,7 +282,7 @@ function Deploy-AIO-M3 { } # Download the bicep template - $dataflowBicepTemplatePath = "$($AgConfig.AgDirectories.AgTempDir)\iotDataFlows.bicep" + $dataflowBicepTemplatePath = "$($AgConfig.AgDirectories.AgTempDir)\dataflows.bicep" Invoke-WebRequest ($templateBaseUrl + "contoso_hypermarket/bicep/data/dataflows.bicep") -OutFile $dataflowBicepTemplatePath if (-not (Test-Path -Path $dataflowBicepTemplatePath)) { Write-Host "[$(Get-Date -Format t)] ERROR: $dataflowBicepTemplatePath file not found." -ForegroundColor DarkRed @@ -435,6 +435,9 @@ function Deploy-AIO-M3 { # Deploy IoT DataFlows using bicep template Write-Host "[$(Get-Date -Format t)] INFO: Deploying IoT DataFlows using bicep template" -ForegroundColor DarkGray $deploymentName = "$arcClusterName" + "-iot-dataflow" + $iotInstanceName = $arcClusterName.toLower() + + Write-Host "[$(Get-Date -Format t)] INFO: az deployment group create --name $deploymentName --resource-group $resourceGroup --template-file $dataflowBicepTemplatePath --parameters aioInstanceName=$iotInstanceName evenHubNamespaceHost=$evenHubNamespaceHost eventHubName=$eventHubName customLocationName=$customLocationName" az deployment group create --name $deploymentName --resource-group $resourceGroup --template-file $dataflowBicepTemplatePath ` --parameters aioInstanceName=$iotInstanceName evenHubNamespaceHost=$evenHubNamespaceHost eventHubName=$eventHubName ` customLocationName=$customLocationName diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep index f0ef7e8558..e2c79ff997 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep @@ -82,7 +82,7 @@ resource iotDataFlow 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflo sourceSettings: { endpointRef: defaultDataflowEndpointName dataSources: [ - 'iot/devices+' + 'iot' ] } } @@ -120,7 +120,7 @@ resource commercialDataFlow 'Microsoft.IoTOperations/instances/dataflowProfiles/ sourceSettings: { endpointRef: defaultDataflowEndpointName dataSources: [ - 'iot/devices' + 'topic/commercial' ] } } From 4f21f6041fd0bb08223cd8487fa3bb7a36a19ce7 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Sat, 2 Nov 2024 15:29:05 -0400 Subject: [PATCH 216/409] Update script.kql --- azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql index bf7328eac2..25ceb3a085 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql @@ -110,13 +110,14 @@ LAX,Los Angeles,CA,United States // Create Industrial Operations Data Tables .drop table iot_data ifexists -.create table iot_data (timestamp: datetime, device_id: string, equipment_type: string, data: dynamic ) +.create table iot_data (timestamp: datetime, store_id: string, device_id: string, equipment_type: string, data: dynamic ) // Create staging ingestion mapping .create table iot_data ingestion json mapping "iot_data_mapping" ``` [ {"column":"timestamp","path":"$['timestamp']","datatype":"datetime"}, +{"column":"store_id","path":"$['store_id']","datatype":"string"}, {"column":"device_id","path":"$['device_id']","datatype":"string"}, {"column":"equipment_type","path":"$['equipment_type']","datatype":"string"}, {"column":"data","path":"$['data']","datatype":""} @@ -131,6 +132,7 @@ LAX,Los Angeles,CA,United States | extend data = parse_json(event_data) | project timestamp = todatetime(data.timestamp), + store_id = tostring(data.store_id), device_id = tostring(data.device_id), equipment_type = tostring(data.equipment_type), data = data.data, From ceb470cd0bf0c115789c8055bebb8211d34e1287 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Sat, 2 Nov 2024 16:16:41 -0400 Subject: [PATCH 217/409] Update dataflows.bicep --- .../contoso_hypermarket/bicep/data/dataflows.bicep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep index e2c79ff997..f75ac4db10 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep @@ -82,7 +82,7 @@ resource iotDataFlow 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflo sourceSettings: { endpointRef: defaultDataflowEndpointName dataSources: [ - 'iot' + 'iot/devices' ] } } From 30137eb8ff958799fd6cdb241987ab54a54dfc8d Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sat, 2 Nov 2024 16:32:38 -0400 Subject: [PATCH 218/409] uncomment --- .../artifacts/PowerShell/AgLogonScript.ps1 | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index cc1a6cd783..f0cbe4c95a 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -215,17 +215,17 @@ if ($scenario -eq "contoso_supermarket") { Deploy-SupermarketConfigs } -# if ($scenario -eq "contoso_motors") { -# Update-AzureIoTOpsExtension -# Deploy-AIO -# Deploy-MotorsConfigs -# $mqttIpArray=Set-MQTTIpAddress -# Deploy-MQTTExplorer -mqttIpArray $mqttIpArray -# }elseif($scenario -eq "contoso_hypermarket"){ -# Deploy-AIO-M2 -# $mqttIpArray=Set-MQTTIpAddress -# Deploy-MQTTExplorer -mqttIpArray $mqttIpArray -# } +if ($scenario -eq "contoso_motors") { + Update-AzureIoTOpsExtension + Deploy-AIO + Deploy-MotorsConfigs + $mqttIpArray=Set-MQTTIpAddress + Deploy-MQTTExplorer -mqttIpArray $mqttIpArray +}elseif($scenario -eq "contoso_hypermarket"){ + Deploy-AIO-M2 + $mqttIpArray=Set-MQTTIpAddress + Deploy-MQTTExplorer -mqttIpArray $mqttIpArray +} ############################################################## # Deploy Kubernetes Prometheus Stack for Observability From 93eb06d8f0647997872c3a9520e69edc6891a1f9 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sat, 2 Nov 2024 18:51:08 -0400 Subject: [PATCH 219/409] remove sales data --- .../monitoring/grafana-app-stores.json | 324 +----------------- 1 file changed, 2 insertions(+), 322 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json index d4dee45bbb..3f47aad9de 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json @@ -906,326 +906,6 @@ ], "title": "HVAC Humidity", "type": "gauge" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 21 - }, - "id": 10, - "panels": [], - "title": "Sales", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "dark-green", - "value": null - } - ] - }, - "unit": "currencyUSD" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "sum(pos_total_amount_usd_total)" - }, - "properties": [ - { - "id": "displayName", - "value": "POS total amount (USD)" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "sum(auto_checkout_total_amount_usd_total)" - }, - "properties": [ - { - "id": "displayName", - "value": "Self Checkout total amount (USD)" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "C" - }, - "properties": [ - { - "id": "displayName", - "value": "Total Sales in USD" - }, - { - "id": "color", - "value": { - "mode": "palette-classic-by-name" - } - } - ] - } - ] - }, - "gridPos": { - "h": 6, - "w": 11, - "x": 0, - "y": 22 - }, - "id": 22, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "sum(pos_total_amount_usd_total)", - "instant": true, - "legendFormat": "__auto", - "range": false, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "sum(auto_checkout_total_amount_usd_total)", - "format": "time_series", - "hide": false, - "instant": true, - "legendFormat": "__auto", - "range": false, - "refId": "B" - }, - { - "datasource": { - "name": "Expression", - "type": "__expr__", - "uid": "__expr__" - }, - "expression": "$A+$B", - "hide": false, - "refId": "C", - "type": "math" - } - ], - "title": "Sales Data", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 50, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineStyle": { - "dash": [ - 10, - 10 - ], - "fill": "dash" - }, - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "dark-green", - "value": null - } - ] - }, - "unit": "currencyUSD" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "sum(pos_total_amount_usd_total)" - }, - "properties": [ - { - "id": "displayName", - "value": "POS total amount (USD)" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "sum(auto_checkout_total_amount_usd_total)" - }, - "properties": [ - { - "id": "displayName", - "value": "Self Checkout total amount (USD)" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "C" - }, - "properties": [ - { - "id": "displayName", - "value": "Total Sales in USD" - }, - { - "id": "color", - "value": { - "mode": "palette-classic-by-name" - } - } - ] - } - ] - }, - "gridPos": { - "h": 6, - "w": 13, - "x": 11, - "y": 22 - }, - "id": 24, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "11.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "sum(pos_total_amount_usd_total)", - "hide": false, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(auto_checkout_total_amount_usd_total)", - "hide": false, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "B" - }, - { - "datasource": { - "name": "Expression", - "type": "__expr__", - "uid": "__expr__" - }, - "expression": "$A+$B", - "hide": false, - "refId": "C", - "type": "math" - } - ], - "timeFrom": "24h", - "title": "Sales Data", - "type": "timeseries" } ], "preload": false, @@ -1253,12 +933,12 @@ ] }, "time": { - "from": "now-15m", + "from": "now-5m", "to": "now" }, "timepicker": {}, "timezone": "browser", - "title": "Store / Asset", + "title": "Store / Industrial Assets Health", "uid": "ed387aa7-6eac-4c48-8891-4834666ac7ce", "version": 51, "weekStart": "" From 5efa7705bbdcd2f3979c99c25df65754b7203a32 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sun, 3 Nov 2024 00:14:13 -0400 Subject: [PATCH 220/409] add emtry row --- .../monitoring/grafana-app-stores.json | 70 ++++++++++++++++--- 1 file changed, 61 insertions(+), 9 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json index 3f47aad9de..21ddf5ccd5 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json @@ -306,13 +306,39 @@ "type": "stat" }, { - "collapsed": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 7 }, + "id": 22, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "", + "mode": "markdown" + }, + "pluginVersion": "11.3.0", + "title": "", + "transparent": true, + "type": "text" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 8 + }, "id": 20, "panels": [], "title": "Refrigerator", @@ -362,7 +388,7 @@ "h": 6, "w": 7, "x": 0, - "y": 8 + "y": 9 }, "id": 1, "options": { @@ -449,7 +475,7 @@ "h": 6, "w": 9, "x": 7, - "y": 8 + "y": 9 }, "id": 4, "options": { @@ -519,7 +545,7 @@ "h": 6, "w": 8, "x": 16, - "y": 8 + "y": 9 }, "id": 3, "options": { @@ -563,13 +589,39 @@ "title": "Refrigerator Power Usage", "type": "stat" }, + { + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 15 + }, + "id": 23, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "", + "mode": "markdown" + }, + "pluginVersion": "11.3.0", + "title": "", + "transparent": true, + "type": "text" + }, { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 14 + "y": 16 }, "id": 17, "panels": [], @@ -628,7 +680,7 @@ "h": 6, "w": 5, "x": 0, - "y": 15 + "y": 17 }, "id": 7, "options": { @@ -708,7 +760,7 @@ "h": 6, "w": 5, "x": 5, - "y": 15 + "y": 17 }, "id": 6, "options": { @@ -789,7 +841,7 @@ "h": 6, "w": 7, "x": 10, - "y": 15 + "y": 17 }, "id": 9, "options": { @@ -869,7 +921,7 @@ "h": 6, "w": 7, "x": 17, - "y": 15 + "y": 17 }, "id": 15, "options": { From 9ad156d667b0a4337d9f85d2b68dcc8235f16f25 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sun, 3 Nov 2024 00:25:23 -0400 Subject: [PATCH 221/409] update dashboards --- .../AgConfig-contoso-hypermarket.psd1 | 2 +- .../artifacts/PowerShell/Bootstrap.ps1 | 5 +- ...ores.json => grafana-app-store-asset.json} | 0 .../monitoring/grafana-app-store-pos.json | 945 ++++++++++++++++++ ...s.json => grafana-app-store-shoppers.json} | 0 5 files changed, 949 insertions(+), 3 deletions(-) rename azure_jumpstart_ag/artifacts/monitoring/{grafana-app-stores.json => grafana-app-store-asset.json} (100%) create mode 100644 azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-pos.json rename azure_jumpstart_ag/artifacts/monitoring/{grafana-app-stores-shoppers.json => grafana-app-store-shoppers.json} (100%) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 1001eecd5b..c9611c71c1 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -189,7 +189,7 @@ ProdURL = "http://localhost:3000" Dashboards = @{ "grafana.com" = @() # Dashboards from https://grafana.com/grafana/dashboards - "custom" = @('node-exporter-full-v2','cluster-global', 'app-workloads', 'app-pods', 'app-stores', 'app-stores-shoppers') # Dashboards from https://github.com/microsoft/azure_arc/tree/main/azure_jumpstart_ag/artifacts/monitoring + "custom" = @('node-exporter-full-v2','cluster-global', 'app-workloads', 'app-pods', 'app-store-asset', 'app-store-shoppers', 'app-store-pos') # Dashboards from https://github.com/microsoft/azure_arc/tree/main/azure_jumpstart_ag/artifacts/monitoring } } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 5af2c5792e..3d49a45111 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -322,8 +322,9 @@ elseif ($scenario -eq "contoso_hypermarket") { Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-workloads.json") -OutFile "$AgMonitoringDir\grafana-app-workloads.json" Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-pods.json") -OutFile "$AgMonitoringDir\grafana-app-pods.json" Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-node-exporter-full-v2.json") -OutFile "$AgMonitoringDir\grafana-node-exporter-full-v2.json" - Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-stores.json") -OutFile "$AgMonitoringDir\grafana-app-stores.json" - Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-stores-shoppers.json") -OutFile "$AgMonitoringDir\grafana-app-stores-shoppers.json" + Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-store-asset.json") -OutFile "$AgMonitoringDir\grafana-app-store-asset.json" + Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-store-shoppers.json") -OutFile "$AgMonitoringDir\grafana-app-store-shoppers.json" + Invoke-WebRequest ($templateBaseUrl + "artifacts/monitoring/grafana-app-store-pos.json") -OutFile "$AgMonitoringDir\grafana-app-store-pos.json" Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso-hypermarket.png") -OutFile $AgIconsDir\contoso-hypermarket.png Invoke-WebRequest ($templateBaseUrl + "artifacts/icons/contoso-hypermarket.svg") -OutFile $AgIconsDir\contoso-hypermarket.svg } diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-asset.json similarity index 100% rename from azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores.json rename to azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-asset.json diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-pos.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-pos.json new file mode 100644 index 0000000000..6fe8058f76 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-pos.json @@ -0,0 +1,945 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 10, + "links": [], + "panels": [ + { + "datasource": { + "default": false, + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "POS01" + }, + "properties": [] + } + ] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 24, + "options": { + "displayMode": "lcd", + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 16, + "minVizWidth": 8, + "namePlacement": "left", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "increase(pos_items_sold_total[1h])", + "hide": false, + "instant": false, + "legendFormat": "{{device_id}}", + "range": true, + "refId": "A" + } + ], + "title": "POS items Sold (last 1 hour)", + "type": "bargauge" + }, + { + "datasource": { + "default": false, + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic-by-name" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "POS01" + }, + "properties": [] + } + ] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 33, + "options": { + "displayMode": "lcd", + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 16, + "minVizWidth": 8, + "namePlacement": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "valueMode": "text" + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "increase(pos_items_sold_total[1d])", + "hide": false, + "instant": false, + "legendFormat": "{{device_id}}", + "range": true, + "refId": "A" + } + ], + "title": "POS items Sold (last 1 day)", + "type": "bargauge" + }, + { + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 7 + }, + "id": 22, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "", + "mode": "markdown" + }, + "pluginVersion": "11.3.0", + "title": "", + "transparent": true, + "type": "text" + }, + { + "datasource": { + "default": false, + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "light-red", + "mode": "continuous-YlRd" + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 8 + }, + "id": 26, + "options": { + "displayMode": "gradient", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 16, + "minVizWidth": 8, + "namePlacement": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "disableTextWrap": false, + "editorMode": "code", + "exemplar": false, + "expr": "increase(auto_checkout_errors_total[1h])", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": true, + "legendFormat": "{{device_id}}", + "range": false, + "refId": "A", + "useBackend": false + } + ], + "title": "Self-Checkout Errors (last 1 hour)", + "type": "bargauge" + }, + { + "datasource": { + "default": false, + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 10, + "x": 8, + "y": 8 + }, + "id": 27, + "options": { + "displayMode": "lcd", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "maxVizHeight": 300, + "minVizHeight": 16, + "minVizWidth": 8, + "namePlacement": "hidden", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "disableTextWrap": false, + "editorMode": "code", + "exemplar": false, + "expr": "increase(auto_checkout_items_scanned_total[1h])", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{device_id}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Self-Checkout Items Scanned (last 1 hour)", + "type": "bargauge" + }, + { + "datasource": { + "default": false, + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 8 + }, + "id": 28, + "options": { + "displayLabels": [ + "value" + ], + "legend": { + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "pieType": "pie", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "disableTextWrap": false, + "editorMode": "code", + "exemplar": false, + "expr": "increase(auto_checkout_items_scanned_total[1d])", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{device_id}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Self-Checkout Items Scanned (last 1 day)", + "type": "piechart" + }, + { + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 15 + }, + "id": 31, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "", + "mode": "markdown" + }, + "pluginVersion": "11.3.0", + "title": "", + "transparent": true, + "type": "text" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "left", + "fillOpacity": 80, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "scaleDistribution": { + "type": "linear" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 34, + "options": { + "barRadius": 0, + "barWidth": 0.97, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "orientation": "horizontal", + "showValue": "always", + "stacking": "none", + "tooltip": { + "mode": "single", + "sort": "none" + }, + "xField": "Time", + "xTickLabelRotation": 0, + "xTickLabelSpacing": 200 + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "topk(10,sum(smart_shelf_stock_level) by (device_id, product_id))", + "instant": true, + "legendFormat": "{{device_id}} - {{product_id}}", + "range": false, + "refId": "A" + } + ], + "title": "Smart Shelf Stock Level", + "type": "barchart" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisGridShow": true, + "axisLabel": "", + "axisPlacement": "right", + "fillOpacity": 80, + "gradientMode": "hue", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "scaleDistribution": { + "type": "linear" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 16 + }, + "id": 35, + "options": { + "barRadius": 0, + "barWidth": 0.97, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "orientation": "vertical", + "showValue": "auto", + "stacking": "none", + "tooltip": { + "mode": "single", + "sort": "none" + }, + "xTickLabelRotation": 0, + "xTickLabelSpacing": 200 + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "topk(10,sum(smart_shelf_threshold) by (device_id, product_id))", + "instant": true, + "legendFormat": "{{device_id}} - {{product_id}}", + "range": false, + "refId": "A" + } + ], + "title": "Smart Shelf Threshold", + "type": "barchart" + }, + { + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 25 + }, + "id": 32, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "", + "mode": "markdown" + }, + "pluginVersion": "11.3.0", + "title": "", + "transparent": true, + "type": "text" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "masskg" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 26 + }, + "id": 29, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "scale_tare_weight_kg", + "legendFormat": "{{device_id}}", + "range": true, + "refId": "A" + } + ], + "title": "Scale Tare Weight", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "scheme", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "dash": [ + 10, + 10 + ], + "fill": "dash" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "masskg" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 26 + }, + "id": 30, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "scale_weight_kg", + "legendFormat": "{{device_id}}", + "range": true, + "refId": "A" + } + ], + "title": "Scale Weight", + "type": "timeseries" + }, + { + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 33 + }, + "id": 23, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "", + "mode": "markdown" + }, + "pluginVersion": "11.3.0", + "title": "", + "transparent": true, + "type": "text" + } + ], + "preload": false, + "refresh": "5s", + "schemaVersion": 40, + "tags": [ + "stores" + ], + "templating": { + "list": [ + { + "current": { + "text": "seattle", + "value": "be2drih2vhlvkd" + }, + "includeAll": false, + "label": "Store", + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "type": "datasource" + } + ] + }, + "time": { + "from": "now-5m", + "to": "now" + }, + "timepicker": { + "hidden": true + }, + "timezone": "browser", + "title": "Store / Point-of-Sale (PoS) Assets Health", + "uid": "cbeda37e-ab2f-4778-97dc-9d329290c0b6", + "version": 21, + "weekStart": "" +} \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores-shoppers.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-shoppers.json similarity index 100% rename from azure_jumpstart_ag/artifacts/monitoring/grafana-app-stores-shoppers.json rename to azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-shoppers.json From 492e12dae5cded1268fdb5eda3956b9f89807bc9 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sun, 3 Nov 2024 00:27:14 -0400 Subject: [PATCH 222/409] update icon --- .../artifacts/icons/contoso-hypermarket.png | Bin 20539 -> 6586 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.png b/azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.png index 379dae8644522f87e6c3e25150eb28d3ab083cf9..6dcbbcfab17534d2a7fe391b656207d32cd1b6e5 100644 GIT binary patch literal 6586 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 literal 20539 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%0DZiV(w$Ycmiik!zv>_pY==Ijuk8XQW?~YH7#V+ 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 eilQir=RW{|?sOk2Z9ESE0000 Date: Sun, 3 Nov 2024 00:30:44 -0400 Subject: [PATCH 223/409] uncomment --- .../artifacts/PowerShell/AgLogonScript.ps1 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index ac14159aa2..852fd3b8eb 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -249,12 +249,12 @@ if($scenario -eq "contoso_motors"){ Deploy-ADXDashboardReports } -# ##################################################################### -# # Deploy Microsoft Fabric -# ##################################################################### -# if($scenario -eq "contoso_hypermarket"){ -# Set-MicrosoftFabric -# } +##################################################################### +# Deploy Microsoft Fabric +##################################################################### +if($scenario -eq "contoso_hypermarket"){ + Set-MicrosoftFabric +} ############################################################## # Creating bookmarks and setting merged kubeconfigs From 83f98b4707084162fa03c0b9d774af00466357a5 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sun, 3 Nov 2024 00:33:26 -0400 Subject: [PATCH 224/409] revert image --- .../artifacts/icons/contoso-hypermarket.png | Bin 6586 -> 14911 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.png b/azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.png index 6dcbbcfab17534d2a7fe391b656207d32cd1b6e5..81609efd81c1309f90380a934945a05dd862fda0 100644 GIT binary patch literal 14911 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 literal 6586 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 From dc43b1285471a6dfa0912b2ddc3962bd2d3e375e Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Sun, 3 Nov 2024 00:35:07 -0400 Subject: [PATCH 225/409] revert image --- .../artifacts/icons/contoso-hypermarket.png | Bin 14911 -> 20539 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.png b/azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.png index 81609efd81c1309f90380a934945a05dd862fda0..379dae8644522f87e6c3e25150eb28d3ab083cf9 100644 GIT binary patch literal 20539 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%0DZiV(w$Ycmiik!zv>_pY==Ijuk8XQW?~YH7#V+ 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 eilQir=RW{|?sOk2Z9ESE00006Gpc=^kpBH-0bH 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 From 669e63e9d4aef5e3707fb901c3d948a4fa004db9 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sun, 3 Nov 2024 23:10:26 +0200 Subject: [PATCH 226/409] Update Azure IoT Ops version and add Azure OpenAI secrets setup --- .../PowerShell/AgConfig-contoso-hypermarket.psd1 | 2 +- .../artifacts/PowerShell/AgLogonScript.ps1 | 1 + .../PowerShell/Modules/contoso_hypermarket.psm1 | 13 ++++++++++++- .../contoso_hypermarket/bicep/ai/aoai.bicep | 4 +--- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index c9611c71c1..53730e9bd8 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -59,7 +59,7 @@ @{name="customlocation"; version="latest"}, @{name="kusto"; version="latest"}, @{name="storage-preview"; version="latest"}, - @{name="azure-iot-ops"; version="latest"} + @{name="azure-iot-ops"; version="0.8.0b1"} ) # PowerShell modules diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 852fd3b8eb..b35e9df395 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -226,6 +226,7 @@ if ($scenario -eq "contoso_motors") { Deploy-AIO-M3 $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray + Set-AzureOpenAISecrets } ############################################################## diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index b40af2e483..564e8a7505 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -272,7 +272,7 @@ function Deploy-AIO-M3 { $evenHubNamespaceHost = "$($eventHubInfo[0].name).servicebus.windows.net:9093" Write-Host "INFO: Found EventHub Namespace with Resource ID: $eventHubNamespaceId" -ForegroundColor DarkGray - + # Get Event Hub from the Event Hub namespace $eventHubs = az eventhubs eventhub list --namespace-name $eventHubInfo[0].name --resource-group $resourceGroup | ConvertFrom-Json $eventHubName = $eventHubs[0].name @@ -504,4 +504,15 @@ function Set-MicrosoftFabric { if (-not (Test-Path -Path $scriptFilePath)) { Write-Error "Unable to download script file: 'SetupFabricWorkspace.ps1' from GitHub" } +} + +function Set-AzureOpenAISecrets { + $openAIAccountName = $(az cognitiveservices account list -g $resourceGroup --query [].name -o tsv) + $openAIEndpoint = $(az cognitiveservices account show --name $openAIAccountName --resource-group $resourceGroup --query properties.endpoint -o tsv) + $openAIKey = $(az cognitiveservices account keys list --name $openAIAccountName --resource-group $resourceGroup --query key1 -o tsv) + + kubectl create secret generic azure-openai-secret ` + --namespace=contoso-hypermarket ` + --from-literal=azure-openai-endpoint=$openAIEndpoint ` + --from-literal=azure-openai-api-key=$openAIKey } \ No newline at end of file diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep index 20272e6beb..0dd6c5bbe6 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep @@ -71,6 +71,4 @@ resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { } output openAIEndpoint string = filter(items(openAIAccount.properties.endpoints), endpoint => endpoint.key == 'OpenAI Language Model Instance API')[0].value -output speechToTextEndpoint string = filter(items(openAIAccount.properties.endpoints), endpoint => endpoint.key == 'Speech Services Speech to Text')[0].value - - +output speechToTextEndpoint string = filter(items(openAIAccount.properties.endpoints), endpoint => endpoint.key == 'Speech Services Speech to Text')[0].value \ No newline at end of file From e5685f43e75f95fbe01e26532138638558d2bdb9 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Sun, 3 Nov 2024 23:13:57 +0200 Subject: [PATCH 227/409] Update Azure IoT Ops version to latest in AgConfig-contoso-hypermarket.psd1 --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 53730e9bd8..c9611c71c1 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -59,7 +59,7 @@ @{name="customlocation"; version="latest"}, @{name="kusto"; version="latest"}, @{name="storage-preview"; version="latest"}, - @{name="azure-iot-ops"; version="0.8.0b1"} + @{name="azure-iot-ops"; version="latest"} ) # PowerShell modules From 48e9a70d4b1638e7f6d4c41c23c39a8faf0d1df9 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Sun, 3 Nov 2024 17:40:36 -0500 Subject: [PATCH 228/409] Update script.kql --- azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql index 25ceb3a085..4cec0f6a99 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql @@ -135,7 +135,7 @@ LAX,Los Angeles,CA,United States store_id = tostring(data.store_id), device_id = tostring(data.device_id), equipment_type = tostring(data.equipment_type), - data = data.data, + data = data.data } // Create policy From cf175ec781f8ce9a93db6dc2a5c4bea211b48e29 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Sun, 3 Nov 2024 17:44:13 -0500 Subject: [PATCH 229/409] Update contoso_hypermarket.psm1 --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 1 + 1 file changed, 1 insertion(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index b40af2e483..4af2ee6d41 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -485,6 +485,7 @@ function Set-MicrosoftFabric { $configJson = @" { "tenantID": "$Env:spnTenantId", + "subscriptionID": "$Env:subscriptionId", "runAs": "$runFabricSetupAs", "azureLocation": "$Env:azureLocation", "resourceGroup": "$Env:resourceGroup", From c6ebe4e7ace10a58876159425a2a6b3b4034c69c Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Sun, 3 Nov 2024 18:48:46 -0500 Subject: [PATCH 230/409] Included PowerBI automation --- .../PowerShell/SetupFabricWorkspace.ps1 | 525 ++++++++++-------- .../artifacts/fabric/Contoso-Hypermarket.zip | Bin 0 -> 103849 bytes 2 files changed, 294 insertions(+), 231 deletions(-) create mode 100644 azure_jumpstart_ag/artifacts/fabric/Contoso-Hypermarket.zip diff --git a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 index 8ab3a6f9ac..82b768e095 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 @@ -1,12 +1,12 @@ param ( - [string]$fabricConfigFile = "fabric-config.json" # Used to run the script locally + [string]$fabricConfigFile = "c:\temp\fabric-config.json" # Used to run the script locally ) #################################################################################################### -# This PS script create all necessary Microsoft Fabric items to support Agora Retail 2.0 +# This PS script create all necessary Microsoft Fabric items to support Contoso Hypermarket # data pipeline integration and dashboards -# access rights deploy Microsoft Fabric items used in Agora Manufacturing scenario. +# Access rights deploy Microsoft Fabric items used in Contoso Hypermarket scenario. # Make sure Create Workpace is enabled in Frabric for service principals. #Access settings using https://app.fabric.microsoft.com/admin-portal/tenantSettings?experience=power-bi @@ -14,7 +14,7 @@ param ( # # { # "runAs": "user", # Indicates whether to run under regular user account or managed identity -# "resourceGroup": "rg-fabric", # Resource group where Agora Retail 2.0 is deployed +# "resourceGroup": "rg-fabric", # Resource group where Contoso Hypermaerket is deployed # "templateBaseUrl": "https://raw.githubusercontent.com/main/azure_arc/main/azure_arc_data/azure_jumpstart_ag/artifacts" # } # @@ -28,6 +28,8 @@ Set-PSDebug -Strict if ([System.IO.File]::Exists($fabricConfigFile)){ $fabricConfig = Get-Content $fabricConfigFile | ConvertFrom-Json $runAs = $fabricConfig.runAs + $tenantID = $fabricConfig.tenantID + $subscriptionID = $fabricConfig.subscriptionID $resourceGroup = $fabricConfig.resourceGroup $templateBaseUrl = $fabricConfig.templateBaseUrl $fabricWorkspaceName = $fabricConfig.fabricWorkspaceName @@ -36,159 +38,174 @@ if ([System.IO.File]::Exists($fabricConfigFile)){ $AgLogsDir = "." } else { - Write-Host "ERROR: Fabric configuration file '$fabricConfigFile' not found." + Write-Host "[$(Get-Date -Format t)] ERROR: Fabric configuration file '$fabricConfigFile' not found." -ForegroundColor DarkRed Exit } -Start-Transcript -Path ($AgLogsDir + "\SetupFabricWorkspace.log") -Write-Host "[$(Get-Date -Format t)] INFO: Configuring Fabric Wrokspace" -ForegroundColor DarkGreen - # Define variables to create Fabric workspace and KQL database $fabricResource = "https://api.fabric.microsoft.com" # Fabric API resource to get access tokens for authorization to Fabric $kustoResource = "https://api.kusto.windows.net" # Kusto API resource to get access tokens for authorization KQL database $powerbiResource = "https://analysis.windows.net/powerbi/api" # Power BI API resource to get access token for authorization to Power BI +$global:workspaceId = "" +$global:kqlClusterUri = "" + +Start-Transcript -Path ($AgLogsDir + "\SetupFabricWorkspace.log") +Write-Host "[$(Get-Date -Format t)] INFO: Configuring Fabric Wrokspace" -ForegroundColor DarkGreen # Login to Azure as end user or managed identity to get access tokens for different API endpoints if ($runAs -eq "user") { # login using device code - az login --use-device-code --allow-no-subscriptions + az login --tenant $tenantID --use-device-code --allow-no-subscriptions } else { # Login using managed identity - az login --identity -} - -# Get access token to authorize access to Fabric APIs -$fabricAccessToken = (az account get-access-token --resource $fabricResource --query accessToken --output tsv) -if ($fabricAccessToken -eq '') { - write-host "ERROR: Failed to get access token using managed identity." + Write-Host "[$(Get-Date -Format t)] ERROR: Authentication type '$runAs' not supported to setup Microsoft Fabric workspace." -ForegroundColor DarkRed + Stop-Transcript Exit } -# List Fabric capacities to assign to Fabric workspace to avoid Powrer BI Premium license -write-host "INFO: Checking if there is a Fabric capacity created with specified name." -$fabricCapacityApi = "https://api.fabric.microsoft.com/v1/capacities" -$headers = @{"Authorization" = "Bearer $fabricAccessToken";} -$httpResp = Invoke-WebRequest -Method Get -Uri $fabricCapacityApi -Headers $headers -if (!($httpResp.StatusCode -eq 200)){ - Write-Host "ERROR: Failed to get Fabric capacities." - Exit -} +# Set the Azure subscription +az account set --subscription $subscriptionID -# Display current Fabric capacities -$fabricCapacities = (ConvertFrom-Json($httpResp.Content)).value -foreach ($fabricCapacity in $fabricCapacities){ - Write-Host "INFO: Fabric capacity name: $($fabricCapacity.displayName), id: $($fabricCapacity.Id), state: $($fabricCapacity.state)" -} +function Set-Fabric-Workspace { -# Verify if Fabric capacity exists with specific name -$fabricCapacity = $fabricCapacities | Where-Object { $_.displayName -eq $fabriccapacityName } -if (-not $fabricCapacity.Id){ - Write-Host "ERROR: Fabric capacity not found with capacity name '$fabriccapacityName'" - Exit -} -else { - Write-Host "INFO: Found Fabric capacity with capacity name '$fabriccapacityName'" -} + # List Fabric capacities to assign to Fabric workspace to avoid Powrer BI Premium license + write-host "INFO: Checking if there is a Fabric capacity created with specified name." + $fabricCapacityApi = "https://api.fabric.microsoft.com/v1/capacities" + $headers = @{"Authorization" = "Bearer $fabricAccessToken";} + $httpResp = Invoke-WebRequest -Method Get -Uri $fabricCapacityApi -Headers $headers + if (!($httpResp.StatusCode -eq 200)){ + Write-Host "ERROR: Failed to get Fabric capacities." + return + } -# Create Fabric Workspace -$fabricWorkspacesApi = "https://api.fabric.microsoft.com/v1/workspaces" -$fabricCapacityId = $fabricCapacity.Id -Write-Host "INFO: Creating Fabric workspace with name '$fabricWorkspaceName' and assigning Fabric Capacity id '$fabricCapacityId'" + # Display current Fabric capacities + $fabricCapacities = (ConvertFrom-Json($httpResp.Content)).value + foreach ($fabricCapacity in $fabricCapacities){ + Write-Host "INFO: Fabric capacity name: $($fabricCapacity.displayName), id: $($fabricCapacity.Id), state: $($fabricCapacity.state)" + } -$apiPayload = "{'displayName': '$fabricWorkspaceName', 'capacityId': '$fabricCapacityId', 'Description': 'Jumpstart Agora Retail data analytics workspace.'}" -$headers = @{"Authorization" = "Bearer $fabricAccessToken"; "Content-Type" = "application/json" } -$workspaceResp = Invoke-WebRequest -Method Post -Uri $fabricWorkspacesApi -Body $apiPayload -Headers $headers -if (($workspaceResp.StatusCode -ge 200) -and ($workspaceResp.StatusCode -le 204)){ - Write-Host "INFO: Fabric workspace created with name '$fabricWorkspaceName' and assigned Fabric Capacity with id '$fabricCapacityId'" -} -else { - Write-Host "ERROR: Failed to create Fabric workspace." - Exit -} + # Verify if Fabric capacity exists with specific name + $fabricCapacity = $fabricCapacities | Where-Object { $_.displayName -eq $fabriccapacityName } + if (-not $fabricCapacity){ + Write-Host "ERROR: Fabric capacity not found with capacity name '$fabriccapacityName'" + return + } + else { + Write-Host "INFO: Found Fabric capacity with capacity name '$fabriccapacityName' and id '$($fabricCapacity.id)" + } -# Get newly created Fabric workspace id to create KQL database and other Fabric items -$fabricWorkspaceId = (ConvertFrom-Json($workspaceResp.Content)).id -Write-Host "INFO: Fabric workspace id is $fabricWorkspaceId" + # Assign fabric capacity id + $fabricCapacityId = $fabricCapacity.id -# Create Eventhouse to store retail data -$eventhouseApi = "https://api.fabric.microsoft.com/v1/workspaces/$fabricWorkspaceId/eventhouses" -$eventhouseName = "$fabriccapacityName-KQL".ToLower() -$apiPayload = "{'displayName': '$eventhouseName', 'description': 'Eventhouse to host KQL database for Agora Hypermarket data.'}" -$headers = @{"Authorization" = "Bearer $fabricAccessToken"; "Content-Type" = "application/json" } + # Get access token to authorize access to Fabric APIs + $fabricAccessToken = (az account get-access-token --resource $fabricResource --query accessToken --output tsv) + if ($fabricAccessToken -eq '') { + write-host "ERROR: Failed to get access token using managed identity." + return + } -Write-Host "INFO: Creating Eventhouse with name $eventhouseName." -$eventhouseResp = Invoke-WebRequest -Method Post -Uri $eventhouseApi -Body $apiPayload -Headers $headers -if (($eventhouseResp.StatusCode -ge 200) -and ($eventhouseResp.StatusCode -le 204)){ - Write-Host "INFO: Eventhouse created with name $eventhouseName." -} -else { - Write-Host "ERROR: Failed to create Eventhouse." - Exit -} + # Create Fabric Workspace + $fabricWorkspacesApi = "https://api.fabric.microsoft.com/v1/workspaces" + $headers = @{"Authorization" = "Bearer $fabricAccessToken"; "Content-Type" = "application/json" } -# Get KQL database created in Eventhouse -Write-Host "INFO: Get default KQL database created in Eventhouse." -$kqlDatabasesApi = "https://api.fabric.microsoft.com/v1/workspaces/$fabricWorkspaceId/kqlDatabases" -$headers = @{"Authorization" = "Bearer $fabricAccessToken";} -$kqlDatabasesResp = Invoke-WebRequest -Method Get -Uri $kqlDatabasesApi -Headers $headers -$kqlDatabaseInfo = (ConvertFrom-Json($kqlDatabasesResp.Content)).value -$kqlQueryServiceUri = $kqlDatabaseInfo[0].properties.queryServiceUri -$kqlDatabaseId = $kqlDatabaseInfo[0].id -$kqlDatabaseName = $kqlDatabaseInfo[0].displayName + Write-Host "INFO: Creating Fabric workspace with name '$fabricWorkspaceName' and assigning Fabric Capacity id '$fabricCapacityId'" -Write-Host "INFO: KQL database details. Database Name: $kqlDatabaseName, Database ID: $kqlDatabaseId, kqlQueryServiceUri: $kqlQueryServiceUri" + $apiPayload = "{'displayName': '$fabricWorkspaceName', 'capacityId': '$fabricCapacityId', 'Description': 'Contoso Hypermarket data analytics workspace.'}" + $workspaceResp = Invoke-WebRequest -Method Post -Uri $fabricWorkspacesApi -Body $apiPayload -Headers $headers + if (($workspaceResp.StatusCode -ge 200) -and ($workspaceResp.StatusCode -le 204)){ + Write-Host "INFO: Fabric workspace created with name '$fabricWorkspaceName' and assigned Fabric Capacity with id '$fabricCapacityId'" + } + else { + Write-Host "ERROR: Failed to create Fabric workspace." + return + } + # Get newly created Fabric workspace id to create KQL database and other Fabric items + $fabricWorkspaceId = (ConvertFrom-Json($workspaceResp.Content)).id + Write-Host "INFO: Fabric workspace id is $fabricWorkspaceId" -# Download KQL script from GitHub -$kqlScriptUrl = $templateBaseUrl + "contoso_hypermarket/bicep/data/script.kql" -$kqlScript = (Invoke-WebRequest $kqlScriptUrl).Content -if (-not $kqlScript) { - write-host "ERROR: Failed to download KQL script to create database schema." - Exit -} + # Assign workspac variable to global variable + $global:workspaceId = $fabricWorkspaceId -# Get access token to authorize with the Kusto query endpoint -Write-Host "INFO: Get access token to authorize access to Kusto API endpoint $kustoResource" -$kustoAccessToken = (az account get-access-token --resource $kustoResource --query accessToken --output tsv) -if (-not $kustoAccessToken) { - write-host "ERROR: Failed to get access token to access Kusto endpoint $kustoResource." - Exit -} + # Create Eventhouse to store retail data + $eventhouseApi = "https://api.fabric.microsoft.com/v1/workspaces/$fabricWorkspaceId/eventhouses" + $eventhouseName = "$fabriccapacityName-KQL".ToLower() + $apiPayload = "{'displayName': '$eventhouseName', 'description': 'Eventhouse to host KQL database for Contoso Hypermarket data.'}" + $headers = @{"Authorization" = "Bearer $fabricAccessToken"; "Content-Type" = "application/json" } -$headers = @{ - "Authorization" = "Bearer $kustoAccessToken" - "Content-Type" = "application/json" -} + Write-Host "INFO: Creating Eventhouse with name $eventhouseName." + $eventhouseResp = Invoke-WebRequest -Method Post -Uri $eventhouseApi -Body $apiPayload -Headers $headers + if (($eventhouseResp.StatusCode -ge 200) -and ($eventhouseResp.StatusCode -le 204)){ + Write-Host "INFO: Eventhouse created with name $eventhouseName." + } + else { + Write-Host "ERROR: Failed to create Eventhouse." + return + } + + # Get KQL database created in Eventhouse + Write-Host "INFO: Get default KQL database created in Eventhouse." + $kqlDatabasesApi = "https://api.fabric.microsoft.com/v1/workspaces/$fabricWorkspaceId/kqlDatabases" + $headers = @{"Authorization" = "Bearer $fabricAccessToken";} + $kqlDatabasesResp = Invoke-WebRequest -Method Get -Uri $kqlDatabasesApi -Headers $headers + $kqlDatabaseInfo = (ConvertFrom-Json($kqlDatabasesResp.Content)).value + $kqlQueryServiceUri = $kqlDatabaseInfo[0].properties.queryServiceUri + $kqlDatabaseId = $kqlDatabaseInfo[0].id + $kqlDatabaseName = $kqlDatabaseInfo[0].displayName + + $global:kqlClusterUri = $kqlQueryServiceUri + Write-Host "INFO: KQL database details. Database Name: $kqlDatabaseName, Database ID: $kqlDatabaseId, kqlQueryServiceUri: $kqlQueryServiceUri" + + + # Download KQL script from GitHub + $kqlScriptUrl = $templateBaseUrl + "contoso_hypermarket/bicep/data/script.kql" + $kqlScript = (Invoke-WebRequest $kqlScriptUrl).Content + if (-not $kqlScript) { + write-host "ERROR: Failed to download KQL script to create database schema." + return + } -# Create payload to create KQL database schema and functions -Write-Host "INFO: Executing KQL script." -$body = @{ - db = $kqlDatabaseName - csl = "$kqlScript" -} | ConvertTo-Json + # Get access token to authorize with the Kusto query endpoint + Write-Host "INFO: Get access token to authorize access to Kusto API endpoint $kustoResource" + $kustoAccessToken = (az account get-access-token --resource $kustoResource --query accessToken --output tsv) + if (-not $kustoAccessToken) { + write-host "ERROR: Failed to get access token to access Kusto endpoint $kustoResource." + return + } -$httpResp = Invoke-RestMethod -Method Post -Uri "$kqlQueryServiceUri/v1/rest/mgmt" -Headers $headers -Body $body -if ($httpResp.Tables.Count -ge 1){ - Write-Host "INFO: KQL script execution completed." -} -else { - Write-Host "ERROR: Failed to execute KQL script." - Exit -} + $headers = @{ + "Authorization" = "Bearer $kustoAccessToken" + "Content-Type" = "application/json" + } + + # Create payload to create KQL database schema and functions + Write-Host "INFO: Executing KQL script." + $body = @{ + db = $kqlDatabaseName + csl = "$kqlScript" + } | ConvertTo-Json + + $httpResp = Invoke-RestMethod -Method Post -Uri "$kqlQueryServiceUri/v1/rest/mgmt" -Headers $headers -Body $body + if ($httpResp.Tables.Count -ge 1){ + Write-Host "INFO: KQL script execution completed." + } + else { + Write-Host "ERROR: Failed to execute KQL script." + return + } -# Download dashboard report and Update to use KQL database -# Download dashboard report and Update to use KQL database -$hyperMarketDashboardReport = $templateBaseUrl + "artifacts/adx_dashboards/fabric-hypermarket-dashboard.json" -Write-Host "INFO: Downloading and preparing dashboard report to import into Fabric workspace." -$ordersDashboardBody = (Invoke-WebRequest -Method Get -Uri $hyperMarketDashboardReport).Content -replace '{{KQL_CLUSTER_URI}}', $kqlQueryServiceUri -replace '{{KQL_DATABASE_ID}}', $kqlDatabaseId -replace '{{FABRIC_WORKSPACE_ID}}', $fabricWorkspaceId + # Download dashboard report and Update to use KQL database + $hyperMarketDashboardReport = $templateBaseUrl + "artifacts/adx_dashboards/fabric-hypermarket-dashboard.json" + Write-Host "INFO: Downloading and preparing dashboard report to import into Fabric workspace." + $ordersDashboardBody = (Invoke-WebRequest -Method Get -Uri $hyperMarketDashboardReport).Content -replace '{{KQL_CLUSTER_URI}}', $kqlQueryServiceUri -replace '{{KQL_DATABASE_ID}}', $kqlDatabaseId -replace '{{FABRIC_WORKSPACE_ID}}', $fabricWorkspaceId -# Convert the KQL dashboard report payload to base64 -Write-Host "INFO: Conerting report content into base64 encoded format." -$base64Payload = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($ordersDashboardBody)) + # Convert the KQL dashboard report payload to base64 + Write-Host "INFO: Conerting report content into base64 encoded format." + $base64Payload = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($ordersDashboardBody)) -# Build KQL dashboard report payload from the report template -$body = @" + # Build KQL dashboard report payload from the report template + $body = @" { "displayName": "Contoso_Hypermarket", "description": "Contoso Hypermarket Dashboard Report", @@ -204,63 +221,63 @@ $body = @" } "@ -# Create KQL dashboard report -$kqlDashboardsApi = "https://api.fabric.microsoft.com/v1/workspaces/$fabricWorkspaceId/kqlDashboards" -$headers = @{"Authorization" = "Bearer $fabricAccessToken"; "Content-Type" = "application/json"} -$httpResp = Invoke-RestMethod -Method Post -Uri $kqlDashboardsApi -Headers $headers -Body $body -if ($httpResp.id.Length -gt 0){ - Write-Host "INFO: Created KQL dashboard report with ID: $($httpResp.id)" -} -else { - Write-Host "ERROR: Failed to create KQL dashboard report." - Exit -} + # Create KQL dashboard report + $kqlDashboardsApi = "https://api.fabric.microsoft.com/v1/workspaces/$fabricWorkspaceId/kqlDashboards" + $headers = @{"Authorization" = "Bearer $fabricAccessToken"; "Content-Type" = "application/json"} + $httpResp = Invoke-RestMethod -Method Post -Uri $kqlDashboardsApi -Headers $headers -Body $body + if ($httpResp.id.Length -gt 0){ + Write-Host "INFO: Created KQL dashboard report with ID: $($httpResp.id)" + } + else { + Write-Host "ERROR: Failed to create KQL dashboard report." + return + } -# Get access token to authorize Power BI service. -Write-Host "INFO: Get access token to access Power BI APIs." -$powerbiAccessToken = (az account get-access-token --resource $powerbiResource --query accessToken --output tsv) -if ($powerbiAccessToken -eq '') { - Write-Host "ERROR: Failed to get access token to access Power BI service." - Exit -} + # Get access token to authorize Power BI service. + Write-Host "INFO: Get access token to access Power BI APIs." + $powerbiAccessToken = (az account get-access-token --resource $powerbiResource --query accessToken --output tsv) + if ($powerbiAccessToken -eq '') { + Write-Host "ERROR: Failed to get access token to access Power BI service." + return + } -# Power BI API endpoint to create EventHut connection -$powerBIEndpoint = "https://api.powerbi.com/v2.0/myorg/me/gatewayClusterCloudDatasource" + # Power BI API endpoint to create EventHut connection + $powerBIEndpoint = "https://api.powerbi.com/v2.0/myorg/me/gatewayClusterCloudDatasource" -# Get Evenhub connection details -$eventHubInfo = (az resource list --resource-group $resourceGroup --resource-type "Microsoft.EventHub/namespaces" | ConvertFrom-Json) -if ($eventHubInfo.Count -ne 1) { - Write-Host "ERROR: Resource group contains no Eventhub namespaces or more than one. Make sure to have only one EventHub namesapce in the resource group." -} + # Get Evenhub connection details + $eventHubInfo = (az resource list --resource-group $resourceGroup --resource-type "Microsoft.EventHub/namespaces" | ConvertFrom-Json) + if ($eventHubInfo.Count -ne 1) { + Write-Host "ERROR: Resource group contains no Eventhub namespaces or more than one. Make sure to have only one EventHub namesapce in the resource group." + } -$eventHubNamespace = $eventHubInfo[0].name -Write-Host "INFO: Found EventHub Namespace: $eventHubNamespace" + $eventHubNamespace = $eventHubInfo[0].name + Write-Host "INFO: Found EventHub Namespace: $eventHubNamespace" -# Make sure Eventhub with name 'orders' exists -$eventHubs = az eventhubs eventhub list --namespace-name $eventHubInfo[0].name --resource-group $resourceGroup | ConvertFrom-Json -$eventHubName = $eventHubs[0].name -if (-not $eventHubName) { - Write-Host "ERROR: Event Hubs not found in the EventHub namespace $eventHubNamespace" - Exit -} + # Make sure Eventhub with name 'orders' exists + $eventHubs = az eventhubs eventhub list --namespace-name $eventHubInfo[0].name --resource-group $resourceGroup | ConvertFrom-Json + $eventHubName = $eventHubs[0].name + if (-not $eventHubName) { + Write-Host "ERROR: Event Hubs not found in the EventHub namespace $eventHubNamespace" + return + } -Write-Host "INFO: Found EventHub: $eventHubName" + Write-Host "INFO: Found EventHub: $eventHubName" -# Get Event Hub credentials -Write-Host "INFO: Retrieving Event Hub key for '$eventHubKeyName' Shared Acess Policy." -$eventHubKey = az eventhubs namespace authorization-rule keys list --resource-group $resourceGroup --namespace-name $eventHubNamespace --name $eventHubKeyName --query primaryKey --output tsv -if ($eventHubKey -eq '') { - Write-Host "ERROR: Failed to retrieve Event Hub key." - Exit -} + # Get Event Hub credentials + Write-Host "INFO: Retrieving Event Hub key for '$eventHubKeyName' Shared Acess Policy." + $eventHubKey = az eventhubs namespace authorization-rule keys list --resource-group $resourceGroup --namespace-name $eventHubNamespace --name $eventHubKeyName --query primaryKey --output tsv + if ($eventHubKey -eq '') { + Write-Host "ERROR: Failed to retrieve Event Hub key." + return + } -Write-Host "INFO: Received Event Hub key." + Write-Host "INFO: Received Event Hub key." -# Create body to create EventHub data source -$eventHubEndpoint = "$eventHubNamespace.servicebus.windows.net" -$connectionBody = @" + # Create body to create EventHub data source + $eventHubEndpoint = "$eventHubNamespace.servicebus.windows.net" + $connectionBody = @" { - "datasourceName": "$fabricWorkspaceName-$eventHubName", + "datasourceName": "$fabricWorkspaceName-$eventHubName-Test", "datasourceType": "Extension", "connectionDetails": "{\"endpoint\":\"$eventHubEndpoint\",\"entityPath\":\"$eventHubName\"}", "singleSignOnType": "None", @@ -297,29 +314,29 @@ $connectionBody = @" } "@ -# Call API to create Event Hub connection in Power BI -Write-Host "INFO: Calling API to create EventHub data connection." -$dataConnectionResp = Invoke-RestMethod -Method Post -Uri $powerBIEndpoint -Body $connectionBody -ContentType "application/json" -Headers @{ Authorization = "Bearer $powerbiAccessToken" } -if ($dataConnectionResp.id.Length -gt 0){ - Write-Host "INFO: Created EventHub data connection with Connection ID: $($dataConnectionResp.id)" -} -else { - Write-Host "ERROR: Failed to create EventHub data connection." - Exit -} + # Call API to create Event Hub connection in Power BI + Write-Host "INFO: Calling API to create EventHub data connection." + $dataConnectionResp = Invoke-RestMethod -Method Post -Uri $powerBIEndpoint -Body $connectionBody -ContentType "application/json" -Headers @{ Authorization = "Bearer $powerbiAccessToken" } + if ($dataConnectionResp.id.Length -gt 0){ + Write-Host "INFO: Created EventHub data connection with Connection ID: $($dataConnectionResp.id)" + } + else { + Write-Host "ERROR: Failed to create EventHub data connection." + return + } -# Get connection id -$DataSourceConnectionId = $dataConnectionResp.id -Write-Host "INFO: EventHub DataSourceConnectionId: $DataSourceConnectionId" + # Get connection id + $DataSourceConnectionId = $dataConnectionResp.id + Write-Host "INFO: EventHub DataSourceConnectionId: $DataSourceConnectionId" -# Create header to authorize with Power BI service -$headers = @{ - "Authorization" = "Bearer $powerbiAccessToken" - "Content-Type" = "application/json" -} + # Create header to authorize with Power BI service + $headers = @{ + "Authorization" = "Bearer $powerbiAccessToken" + "Content-Type" = "application/json" + } -# Get MWC token to authorize and create data connections. This is a temporary workaround until Fabric releases API to create data connections -$mwcTokenBody = @" + # Get MWC token to authorize and create data connections. This is a temporary workaround until Fabric releases API to create data connections + $mwcTokenBody = @" { "type": "[Start] GetMWCTokenV2", "workloadType": "Kusto", @@ -331,23 +348,23 @@ $mwcTokenBody = @" } "@ -Write-Host "INFO: Requesting MWC token from Power BI API." -$mwcTokenApi = "https://wabi-us-central-b-primary-redirect.analysis.windows.net/metadata/v201606/generatemwctokenv2" -$mwcTokenResp = Invoke-RestMethod -Method Post -Uri $mwcTokenApi -Headers $headers -Body $mwcTokenBody -if ($mwcTokenResp.Token.Length -gt 0){ - Write-Host "INFO: Received MWC token." -} -else { - Write-Host "ERROR: Failed to get MWC token." - Exit -} + Write-Host "INFO: Requesting MWC token from Power BI API." + $mwcTokenApi = "https://wabi-us-central-b-primary-redirect.analysis.windows.net/metadata/v201606/generatemwctokenv2" + $mwcTokenResp = Invoke-RestMethod -Method Post -Uri $mwcTokenApi -Headers $headers -Body $mwcTokenBody + if ($mwcTokenResp.Token.Length -gt 0){ + Write-Host "INFO: Received MWC token." + } + else { + Write-Host "ERROR: Failed to get MWC token." + return + } -$mwcToken = $mwcTokenResp.token + $mwcToken = $mwcTokenResp.token -# Event Hub connection body -$uriPrefix = $fabricCapacityId -replace '-', '' -$streamApi = "https://$uriPrefix.pbidedicated.windows.net/webapi/capacities/$fabricCapacityId/workloads/Kusto/KustoService/direct/v1/databases/$kqlDatabaseId/dataConnections/$DataSourceConnectionId" -$streamBody = @" + # Event Hub connection body + $uriPrefix = $fabricCapacityId -replace '-', '' + $streamApi = "https://$uriPrefix.pbidedicated.windows.net/webapi/capacities/$fabricCapacityId/workloads/Kusto/KustoService/direct/v1/databases/$kqlDatabaseId/dataConnections/$DataSourceConnectionId" + $streamBody = @" { "DataConnectionType": "EventHubDataConnection", "DataConnectionProperties": { @@ -365,29 +382,29 @@ $streamBody = @" } "@ -# Use MWC Token to create event data connection -Write-Host "INFO: Creating eventstream in KQL database to ingest data." -$dataSourceConnectionId = Invoke-RestMethod -Method Post -Uri $streamApi -Body $streamBody -ContentType "application/json" -Headers @{ Authorization = "MwcToken $mwcToken" } -if ($dataSourceConnectionId.Length -gt 0){ - Write-Host "INFO: Created eventstream in KQL database with ID: $dataSourceConnectionId" -} -else { - Write-Host "ERROR: Failed to create eventstream in KQL database." - Exit -} + # Use MWC Token to create event data connection + Write-Host "INFO: Creating eventstream in KQL database to ingest data." + $dataSourceConnectionId = Invoke-RestMethod -Method Post -Uri $streamApi -Body $streamBody -ContentType "application/json" -Headers @{ Authorization = "MwcToken $mwcToken" } + if ($dataSourceConnectionId.Length -gt 0){ + Write-Host "INFO: Created eventstream in KQL database with ID: $dataSourceConnectionId" + } + else { + Write-Host "ERROR: Failed to create eventstream in KQL database." + return + } -# Import data sceince notebook for sales forecast -# Download dashboard report and Update to use KQL database -$ordersSalesForecastNotebook = "orders-sales-forecast.ipynb" -Write-Host "INFO: Downloading and preparing nootebook to import into Fabric workspace." -$ordersNotebookBody = (Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/artifacts/notebooks/$ordersSalesForecastNotebook").Content -replace '{{KQL_CLUSTER_URI}}', $kqlQueryServiceUri -replace '{{KQL_DATABASE_NAME}}', $kqlDatabaseName + # Import data sceince notebook for sales forecast + # Download dashboard report and Update to use KQL database + $ordersSalesForecastNotebook = "orders-sales-forecast.ipynb" + Write-Host "INFO: Downloading and preparing nootebook to import into Fabric workspace." + $ordersNotebookBody = (Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/artifacts/fabric/$ordersSalesForecastNotebook").Content -replace '{{KQL_CLUSTER_URI}}', $kqlQueryServiceUri -replace '{{KQL_DATABASE_NAME}}', $kqlDatabaseName -# Convert the KQL dashboard report payload to base64 -Write-Host "INFO: Converting report content into base64 encoded format." -$base64Payload = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($ordersNotebookBody)) + # Convert the KQL dashboard report payload to base64 + Write-Host "INFO: Converting report content into base64 encoded format." + $base64Payload = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($ordersNotebookBody)) -# Build KQL dashboard report payload from the report template -$body = @" + # Build KQL dashboard report payload from the report template + $body = @" { "displayName": "Orders Sales Forecast Notebook", "description": "A notebook description", @@ -404,12 +421,58 @@ $body = @" } "@ -# Create KQL dashboard report -$nootebookApi = "https://api.fabric.microsoft.com/v1/workspaces/$fabricWorkspaceId/notebooks" -$headers = @{"Authorization" = "Bearer $fabricAccessToken"; "Content-Type" = "application/json"} -$notebookResp = Invoke-RestMethod -Method Post -Uri $nootebookApi -Headers $headers -Body $body -$notebookResp -Write-Host "INFO: Created notebook in Fabric workspace." + # Create KQL dashboard report + $nootebookApi = "https://api.fabric.microsoft.com/v1/workspaces/$fabricWorkspaceId/notebooks" + $headers = @{"Authorization" = "Bearer $fabricAccessToken"; "Content-Type" = "application/json"} + $notebookResp = Invoke-RestMethod -Method Post -Uri $nootebookApi -Headers $headers -Body $body + $notebookResp + Write-Host "INFO: Created notebook in Fabric workspace." +} + +# Function to import Power BI reports into Fabric workspace +function Set-PowerBI-Project { + # Parameters + $pbipFolder = Get-Location # Path to the folder containing Power BI project files, default to current directory + $pbipSemanticModelPath = "$pbipFolder\Contoso-Hypermarket.SemanticModel" + $pbipReportPath = "$pbipFolder\Contoso-Hypermarket.Report" + + # Download modules and install + New-Item -ItemType Directory -Path ".\modules" -ErrorAction SilentlyContinue | Out-Null + @("https://raw.githubusercontent.com/microsoft/Analysis-Services/master/pbidevmode/fabricps-pbip/FabricPS-PBIP.psm1" + , "https://raw.githubusercontent.com/microsoft/Analysis-Services/master/pbidevmode/fabricps-pbip/FabricPS-PBIP.psd1") |% { + Invoke-WebRequest -Uri $_ -OutFile ".\modules\$(Split-Path $_ -Leaf)" + } + if(-not (Get-Module Az.Accounts -ListAvailable)) { + Install-Module Az.Accounts -Scope CurrentUser -Force + } + Import-Module ".\modules\FabricPS-PBIP" -Force + + # Update KQL endpoint + $modelFilePath = "$pbipSemanticModelPath\model.bim" + + # Replace KQL cluster URI for the model to connect + Write-Host "INFO: Replace KQL cluster URI in the semantic model." + (Get-Content -Path $modelFilePath) -replace '{{FABRIC_KQL_CLUSTER_URI}}', $global:kqlClusterUri | Set-Content -Path $modelFilePath + + # Authenticate to fabric + Set-FabricAuthToken -reset + + # Import the semantic model and save the item id + Write-Host "INFO: Import the semantic model and save the item id." + $semanticModelImport = Import-FabricItem -workspaceId $global:workspaceId -path $pbipSemanticModelPath + Write-Host "INFO: Imported semantic model with the item id $($semanticModelImport.id)" + + # Import the report and ensure its binded to the previous imported report + Write-Host "INFO: Import the PowerBI report and save the item id." + $reportImport = Import-FabricItem -workspaceId $fabricWorkspaceId -path $pbipReportPath -itemProperties @{"semanticModelId" = $semanticModelImport.Id} + Write-Host "INFO: Imported PowerBI report with the item id $($reportImport.id)" +} + +# Create Fabric workspace and KQL database +Set-Fabric-Workspace + +# Import PowerBI report +Set-PowerBI-Project # Stop logging into the log file -Stop-Transcript \ No newline at end of file +Stop-Transcript diff --git a/azure_jumpstart_ag/artifacts/fabric/Contoso-Hypermarket.zip b/azure_jumpstart_ag/artifacts/fabric/Contoso-Hypermarket.zip new file mode 100644 index 0000000000000000000000000000000000000000..5c32bfd6123d9715333d87615ab664c7c234f010 GIT binary patch literal 103849 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

@Y3$ebmnqkm_|~ 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 j-+!xe{vgvowNfbufB;VCKtQm8fBo Date: Sun, 3 Nov 2024 19:10:47 -0500 Subject: [PATCH 231/409] Update SetupFabricWorkspace.ps1 --- .../artifacts/PowerShell/SetupFabricWorkspace.ps1 | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 index 82b768e095..c5f7bfe543 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 @@ -433,6 +433,15 @@ function Set-Fabric-Workspace { function Set-PowerBI-Project { # Parameters $pbipFolder = Get-Location # Path to the folder containing Power BI project files, default to current directory + + # Download PowerBI report zip file + $localFilePath = "$pbipFolder\Contoso-Hypermarket.zip" + Write-Host "INFO: Downloading Power BI report zip file." + Invoke-WebRequest -Uri "$templateBaseUrl" + "artifacts/fabric/Contoso-Hypermarket.zip" -OutFile $localFilePath + + Write-Host "INFO: Unzipping Power BI report zip file." + Expand-Archive -Path $localFilePath -DestinationPath $pbipFolder -Force + $pbipSemanticModelPath = "$pbipFolder\Contoso-Hypermarket.SemanticModel" $pbipReportPath = "$pbipFolder\Contoso-Hypermarket.Report" From 640b1d669bd419278344f675a101a0f49655a664 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Sun, 3 Nov 2024 20:53:00 -0500 Subject: [PATCH 232/409] Update dataflows.bicep --- .../contoso_hypermarket/bicep/data/dataflows.bicep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep index f75ac4db10..19bda10ba5 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep @@ -82,7 +82,7 @@ resource iotDataFlow 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflo sourceSettings: { endpointRef: defaultDataflowEndpointName dataSources: [ - 'iot/devices' + 'iot/devices/#' ] } } From c66261fee3cfbb81d6e2b34b9be655e36da5f0fc Mon Sep 17 00:00:00 2001 From: Mike Rhoads Date: Sun, 3 Nov 2024 20:09:07 -0600 Subject: [PATCH 233/409] add contoso-hypermarket GitOps configs --- .../PowerShell/AgConfig-contoso-motors.psd1 | 8 +- .../artifacts/PowerShell/AgLogonScript.ps1 | 1 + .../Modules/contoso_hypermarket.psm1 | 124 ++++++++++++++++++ 3 files changed, 129 insertions(+), 4 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 index f8b4e2c433..0107c01df8 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 @@ -219,10 +219,10 @@ AppConfig = @{ inferencing_deployment = @{ - GitOpsConfigName = "contoso-motors" - KustomizationName = "contoso-motors" - KustomizationPath="./contoso_manufacturing/operations" - Namespace = "contoso-motors" + GitOpsConfigName = "contoso-hypermarket" + KustomizationName = "contoso-hypermarket" + KustomizationPath="./agora/contoso_hypermarket" + Namespace = "contoso-hypermarket" Order = 1 } } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 852fd3b8eb..61887a76d4 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -224,6 +224,7 @@ if ($scenario -eq "contoso_motors") { }elseif($scenario -eq "contoso_hypermarket"){ #Deploy-AIO-M2 Deploy-AIO-M3 + Deploy-HypermarketConfigs $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index b40af2e483..741002635b 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -504,4 +504,128 @@ function Set-MicrosoftFabric { if (-not (Test-Path -Path $scriptFilePath)) { Write-Error "Unable to download script file: 'SetupFabricWorkspace.ps1' from GitHub" } +} +function Deploy-HypermarketConfigs { + + + # Loop through the clusters and deploy the configs in AppConfig hashtable in AgConfig-contoso-hypermarket.psd + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + Start-Job -Name gitops -ScriptBlock { + $AgConfig = $using:AgConfig + $cluster = $using:cluster + $namingGuid = $using:namingGuid + $resourceGroup = $using:resourceGroup + $appClonedRepo = $using:appUpstreamRepo + $appsRepo = $using:appsRepo + + $AgConfig.AppConfig.GetEnumerator() | sort-object -Property @{Expression = { $_.value.Order }; Ascending = $true } | ForEach-Object { + $app = $_ + $clusterName = $cluster.value.ArcClusterName + "-$namingGuid" + $branch = $cluster.value.Branch.ToLower() + $configName = $app.value.GitOpsConfigName.ToLower() + $namespace = $app.value.Namespace + $appName = $app.Value.KustomizationName + $appPath = $app.Value.KustomizationPath + $retryCount = 0 + $maxRetries = 2 + + Write-Host "[$(Get-Date -Format t)] INFO: Creating GitOps config for $configName on $($cluster.Value.ArcClusterName+"-$namingGuid")" -ForegroundColor Gray + $type = "connectedClusters" + + # Wait for Kubernetes API server to become available + $apiServer = kubectl config view --context $cluster.Name.ToLower() --minify -o jsonpath='{.clusters[0].cluster.server}' + $apiServerAddress = $apiServer -replace '.*https://| .*$' + $apiServerFqdn = ($apiServerAddress -split ":")[0] + $apiServerPort = ($apiServerAddress -split ":")[1] + + do { + $result = Test-NetConnection -ComputerName $apiServerFqdn -Port $apiServerPort -WarningAction SilentlyContinue + if ($result.TcpTestSucceeded) { + break + } + else { + Start-Sleep -Seconds 5 + } + } while ($true) + + + az k8s-configuration flux create ` + --cluster-name $clusterName ` + --resource-group $resourceGroup ` + --name $configName ` + --cluster-type $type ` + --scope cluster ` + --url $appClonedRepo ` + --branch $branch ` + --sync-interval 3s ` + --kustomization name=$appName path=$appPath prune=true retry_interval=1m ` + --timeout 10m ` + --namespace $namespace ` + --only-show-errors ` + 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + + do { + $configStatus = $(az k8s-configuration flux show --name $configName --cluster-name $clusterName --cluster-type $type --resource-group $resourceGroup -o json 2>$null) | convertFrom-JSON + if ($configStatus.ComplianceState -eq "Compliant") { + Write-Host "[$(Get-Date -Format t)] INFO: GitOps configuration $configName is ready on $clusterName" -ForegroundColor DarkGreen | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + } + else { + if ($configStatus.ComplianceState -ne "Non-compliant") { + Start-Sleep -Seconds 20 + } + elseif ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -lt $maxRetries) { + Start-Sleep -Seconds 20 + $configStatus = $(az k8s-configuration flux show --name $configName --cluster-name $clusterName --cluster-type $type --resource-group $resourceGroup -o json 2>$null) | convertFrom-JSON + if ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -lt $maxRetries) { + $retryCount++ + Write-Host "[$(Get-Date -Format t)] INFO: Attempting to re-install $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + Write-Host "[$(Get-Date -Format t)] INFO: Deleting $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + az k8s-configuration flux delete ` + --resource-group $resourceGroup ` + --cluster-name $clusterName ` + --cluster-type $type ` + --name $configName ` + --force ` + --yes ` + --only-show-errors ` + 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + + Start-Sleep -Seconds 10 + Write-Host "[$(Get-Date -Format t)] INFO: Re-creating $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + + az k8s-configuration flux create ` + --cluster-name $clusterName ` + --resource-group $resourceGroup ` + --name $configName ` + --cluster-type $type ` + --scope cluster ` + --url $appClonedRepo ` + --branch $branch ` + --sync-interval 3s ` + --kustomization name=$appName path=$appPath prune=true ` + --timeout 30m ` + --namespace $namespace ` + --only-show-errors ` + 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + } + } + elseif ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -eq $maxRetries) { + Write-Host "[$(Get-Date -Format t)] ERROR: GitOps configuration $configName has failed on $clusterName. Exiting..." -ForegroundColor White -BackgroundColor Red | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + break + } + } + } until ($configStatus.ComplianceState -eq "Compliant") + } + } + } + + while ($(Get-Job -Name gitops).State -eq 'Running') { + #Write-Host "[$(Get-Date -Format t)] INFO: Waiting for GitOps configuration to complete on all clusters...waiting 60 seconds" -ForegroundColor Gray + Receive-Job -Name gitops -WarningAction SilentlyContinue + Start-Sleep -Seconds 60 + } + + Get-Job -name gitops | Remove-Job + Write-Host "[$(Get-Date -Format t)] INFO: GitOps configuration complete." -ForegroundColor Green + Write-Host } \ No newline at end of file From 33c362f72df7274e6362e4becdbfc76769f10699 Mon Sep 17 00:00:00 2001 From: Mike Rhoads Date: Sun, 3 Nov 2024 20:13:00 -0600 Subject: [PATCH 234/409] Revert "add contoso-hypermarket GitOps configs" This reverts commit c66261fee3cfbb81d6e2b34b9be655e36da5f0fc. --- .../PowerShell/AgConfig-contoso-motors.psd1 | 8 +- .../artifacts/PowerShell/AgLogonScript.ps1 | 1 - .../Modules/contoso_hypermarket.psm1 | 124 ------------------ 3 files changed, 4 insertions(+), 129 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 index 0107c01df8..f8b4e2c433 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 @@ -219,10 +219,10 @@ AppConfig = @{ inferencing_deployment = @{ - GitOpsConfigName = "contoso-hypermarket" - KustomizationName = "contoso-hypermarket" - KustomizationPath="./agora/contoso_hypermarket" - Namespace = "contoso-hypermarket" + GitOpsConfigName = "contoso-motors" + KustomizationName = "contoso-motors" + KustomizationPath="./contoso_manufacturing/operations" + Namespace = "contoso-motors" Order = 1 } } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 61887a76d4..852fd3b8eb 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -224,7 +224,6 @@ if ($scenario -eq "contoso_motors") { }elseif($scenario -eq "contoso_hypermarket"){ #Deploy-AIO-M2 Deploy-AIO-M3 - Deploy-HypermarketConfigs $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 741002635b..b40af2e483 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -504,128 +504,4 @@ function Set-MicrosoftFabric { if (-not (Test-Path -Path $scriptFilePath)) { Write-Error "Unable to download script file: 'SetupFabricWorkspace.ps1' from GitHub" } -} -function Deploy-HypermarketConfigs { - - - # Loop through the clusters and deploy the configs in AppConfig hashtable in AgConfig-contoso-hypermarket.psd - foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { - Start-Job -Name gitops -ScriptBlock { - $AgConfig = $using:AgConfig - $cluster = $using:cluster - $namingGuid = $using:namingGuid - $resourceGroup = $using:resourceGroup - $appClonedRepo = $using:appUpstreamRepo - $appsRepo = $using:appsRepo - - $AgConfig.AppConfig.GetEnumerator() | sort-object -Property @{Expression = { $_.value.Order }; Ascending = $true } | ForEach-Object { - $app = $_ - $clusterName = $cluster.value.ArcClusterName + "-$namingGuid" - $branch = $cluster.value.Branch.ToLower() - $configName = $app.value.GitOpsConfigName.ToLower() - $namespace = $app.value.Namespace - $appName = $app.Value.KustomizationName - $appPath = $app.Value.KustomizationPath - $retryCount = 0 - $maxRetries = 2 - - Write-Host "[$(Get-Date -Format t)] INFO: Creating GitOps config for $configName on $($cluster.Value.ArcClusterName+"-$namingGuid")" -ForegroundColor Gray - $type = "connectedClusters" - - # Wait for Kubernetes API server to become available - $apiServer = kubectl config view --context $cluster.Name.ToLower() --minify -o jsonpath='{.clusters[0].cluster.server}' - $apiServerAddress = $apiServer -replace '.*https://| .*$' - $apiServerFqdn = ($apiServerAddress -split ":")[0] - $apiServerPort = ($apiServerAddress -split ":")[1] - - do { - $result = Test-NetConnection -ComputerName $apiServerFqdn -Port $apiServerPort -WarningAction SilentlyContinue - if ($result.TcpTestSucceeded) { - break - } - else { - Start-Sleep -Seconds 5 - } - } while ($true) - - - az k8s-configuration flux create ` - --cluster-name $clusterName ` - --resource-group $resourceGroup ` - --name $configName ` - --cluster-type $type ` - --scope cluster ` - --url $appClonedRepo ` - --branch $branch ` - --sync-interval 3s ` - --kustomization name=$appName path=$appPath prune=true retry_interval=1m ` - --timeout 10m ` - --namespace $namespace ` - --only-show-errors ` - 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - - do { - $configStatus = $(az k8s-configuration flux show --name $configName --cluster-name $clusterName --cluster-type $type --resource-group $resourceGroup -o json 2>$null) | convertFrom-JSON - if ($configStatus.ComplianceState -eq "Compliant") { - Write-Host "[$(Get-Date -Format t)] INFO: GitOps configuration $configName is ready on $clusterName" -ForegroundColor DarkGreen | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - } - else { - if ($configStatus.ComplianceState -ne "Non-compliant") { - Start-Sleep -Seconds 20 - } - elseif ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -lt $maxRetries) { - Start-Sleep -Seconds 20 - $configStatus = $(az k8s-configuration flux show --name $configName --cluster-name $clusterName --cluster-type $type --resource-group $resourceGroup -o json 2>$null) | convertFrom-JSON - if ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -lt $maxRetries) { - $retryCount++ - Write-Host "[$(Get-Date -Format t)] INFO: Attempting to re-install $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - Write-Host "[$(Get-Date -Format t)] INFO: Deleting $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - az k8s-configuration flux delete ` - --resource-group $resourceGroup ` - --cluster-name $clusterName ` - --cluster-type $type ` - --name $configName ` - --force ` - --yes ` - --only-show-errors ` - 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - - Start-Sleep -Seconds 10 - Write-Host "[$(Get-Date -Format t)] INFO: Re-creating $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - - az k8s-configuration flux create ` - --cluster-name $clusterName ` - --resource-group $resourceGroup ` - --name $configName ` - --cluster-type $type ` - --scope cluster ` - --url $appClonedRepo ` - --branch $branch ` - --sync-interval 3s ` - --kustomization name=$appName path=$appPath prune=true ` - --timeout 30m ` - --namespace $namespace ` - --only-show-errors ` - 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - } - } - elseif ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -eq $maxRetries) { - Write-Host "[$(Get-Date -Format t)] ERROR: GitOps configuration $configName has failed on $clusterName. Exiting..." -ForegroundColor White -BackgroundColor Red | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - break - } - } - } until ($configStatus.ComplianceState -eq "Compliant") - } - } - } - - while ($(Get-Job -Name gitops).State -eq 'Running') { - #Write-Host "[$(Get-Date -Format t)] INFO: Waiting for GitOps configuration to complete on all clusters...waiting 60 seconds" -ForegroundColor Gray - Receive-Job -Name gitops -WarningAction SilentlyContinue - Start-Sleep -Seconds 60 - } - - Get-Job -name gitops | Remove-Job - Write-Host "[$(Get-Date -Format t)] INFO: GitOps configuration complete." -ForegroundColor Green - Write-Host } \ No newline at end of file From 84560505d40327d2eab90f95fbe5d132b0001475 Mon Sep 17 00:00:00 2001 From: Mike Rhoads Date: Sun, 3 Nov 2024 20:18:15 -0600 Subject: [PATCH 235/409] Revert "add contoso-hypermarket GitOps configs" This reverts commit c66261fee3cfbb81d6e2b34b9be655e36da5f0fc. --- .../PowerShell/AgConfig-contoso-motors.psd1 | 8 +- .../artifacts/PowerShell/AgLogonScript.ps1 | 1 - .../Modules/contoso_hypermarket.psm1 | 124 ------------------ 3 files changed, 4 insertions(+), 129 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 index 0107c01df8..f8b4e2c433 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-motors.psd1 @@ -219,10 +219,10 @@ AppConfig = @{ inferencing_deployment = @{ - GitOpsConfigName = "contoso-hypermarket" - KustomizationName = "contoso-hypermarket" - KustomizationPath="./agora/contoso_hypermarket" - Namespace = "contoso-hypermarket" + GitOpsConfigName = "contoso-motors" + KustomizationName = "contoso-motors" + KustomizationPath="./contoso_manufacturing/operations" + Namespace = "contoso-motors" Order = 1 } } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 61887a76d4..852fd3b8eb 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -224,7 +224,6 @@ if ($scenario -eq "contoso_motors") { }elseif($scenario -eq "contoso_hypermarket"){ #Deploy-AIO-M2 Deploy-AIO-M3 - Deploy-HypermarketConfigs $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 741002635b..b40af2e483 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -504,128 +504,4 @@ function Set-MicrosoftFabric { if (-not (Test-Path -Path $scriptFilePath)) { Write-Error "Unable to download script file: 'SetupFabricWorkspace.ps1' from GitHub" } -} -function Deploy-HypermarketConfigs { - - - # Loop through the clusters and deploy the configs in AppConfig hashtable in AgConfig-contoso-hypermarket.psd - foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { - Start-Job -Name gitops -ScriptBlock { - $AgConfig = $using:AgConfig - $cluster = $using:cluster - $namingGuid = $using:namingGuid - $resourceGroup = $using:resourceGroup - $appClonedRepo = $using:appUpstreamRepo - $appsRepo = $using:appsRepo - - $AgConfig.AppConfig.GetEnumerator() | sort-object -Property @{Expression = { $_.value.Order }; Ascending = $true } | ForEach-Object { - $app = $_ - $clusterName = $cluster.value.ArcClusterName + "-$namingGuid" - $branch = $cluster.value.Branch.ToLower() - $configName = $app.value.GitOpsConfigName.ToLower() - $namespace = $app.value.Namespace - $appName = $app.Value.KustomizationName - $appPath = $app.Value.KustomizationPath - $retryCount = 0 - $maxRetries = 2 - - Write-Host "[$(Get-Date -Format t)] INFO: Creating GitOps config for $configName on $($cluster.Value.ArcClusterName+"-$namingGuid")" -ForegroundColor Gray - $type = "connectedClusters" - - # Wait for Kubernetes API server to become available - $apiServer = kubectl config view --context $cluster.Name.ToLower() --minify -o jsonpath='{.clusters[0].cluster.server}' - $apiServerAddress = $apiServer -replace '.*https://| .*$' - $apiServerFqdn = ($apiServerAddress -split ":")[0] - $apiServerPort = ($apiServerAddress -split ":")[1] - - do { - $result = Test-NetConnection -ComputerName $apiServerFqdn -Port $apiServerPort -WarningAction SilentlyContinue - if ($result.TcpTestSucceeded) { - break - } - else { - Start-Sleep -Seconds 5 - } - } while ($true) - - - az k8s-configuration flux create ` - --cluster-name $clusterName ` - --resource-group $resourceGroup ` - --name $configName ` - --cluster-type $type ` - --scope cluster ` - --url $appClonedRepo ` - --branch $branch ` - --sync-interval 3s ` - --kustomization name=$appName path=$appPath prune=true retry_interval=1m ` - --timeout 10m ` - --namespace $namespace ` - --only-show-errors ` - 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - - do { - $configStatus = $(az k8s-configuration flux show --name $configName --cluster-name $clusterName --cluster-type $type --resource-group $resourceGroup -o json 2>$null) | convertFrom-JSON - if ($configStatus.ComplianceState -eq "Compliant") { - Write-Host "[$(Get-Date -Format t)] INFO: GitOps configuration $configName is ready on $clusterName" -ForegroundColor DarkGreen | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - } - else { - if ($configStatus.ComplianceState -ne "Non-compliant") { - Start-Sleep -Seconds 20 - } - elseif ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -lt $maxRetries) { - Start-Sleep -Seconds 20 - $configStatus = $(az k8s-configuration flux show --name $configName --cluster-name $clusterName --cluster-type $type --resource-group $resourceGroup -o json 2>$null) | convertFrom-JSON - if ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -lt $maxRetries) { - $retryCount++ - Write-Host "[$(Get-Date -Format t)] INFO: Attempting to re-install $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - Write-Host "[$(Get-Date -Format t)] INFO: Deleting $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - az k8s-configuration flux delete ` - --resource-group $resourceGroup ` - --cluster-name $clusterName ` - --cluster-type $type ` - --name $configName ` - --force ` - --yes ` - --only-show-errors ` - 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - - Start-Sleep -Seconds 10 - Write-Host "[$(Get-Date -Format t)] INFO: Re-creating $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - - az k8s-configuration flux create ` - --cluster-name $clusterName ` - --resource-group $resourceGroup ` - --name $configName ` - --cluster-type $type ` - --scope cluster ` - --url $appClonedRepo ` - --branch $branch ` - --sync-interval 3s ` - --kustomization name=$appName path=$appPath prune=true ` - --timeout 30m ` - --namespace $namespace ` - --only-show-errors ` - 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - } - } - elseif ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -eq $maxRetries) { - Write-Host "[$(Get-Date -Format t)] ERROR: GitOps configuration $configName has failed on $clusterName. Exiting..." -ForegroundColor White -BackgroundColor Red | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - break - } - } - } until ($configStatus.ComplianceState -eq "Compliant") - } - } - } - - while ($(Get-Job -Name gitops).State -eq 'Running') { - #Write-Host "[$(Get-Date -Format t)] INFO: Waiting for GitOps configuration to complete on all clusters...waiting 60 seconds" -ForegroundColor Gray - Receive-Job -Name gitops -WarningAction SilentlyContinue - Start-Sleep -Seconds 60 - } - - Get-Job -name gitops | Remove-Job - Write-Host "[$(Get-Date -Format t)] INFO: GitOps configuration complete." -ForegroundColor Green - Write-Host } \ No newline at end of file From c87a069b9bf7cdc312e3a30eb1e1c6efd4667ab8 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Sun, 3 Nov 2024 21:18:45 -0500 Subject: [PATCH 236/409] Update SetupFabricWorkspace.ps1 --- .../PowerShell/SetupFabricWorkspace.ps1 | 285 ++++++++++++++++-- 1 file changed, 258 insertions(+), 27 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 index c5f7bfe543..60ce3994e2 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 @@ -1,7 +1,3 @@ -param ( - [string]$fabricConfigFile = "c:\temp\fabric-config.json" # Used to run the script locally -) - #################################################################################################### # This PS script create all necessary Microsoft Fabric items to support Contoso Hypermarket # data pipeline integration and dashboards @@ -22,6 +18,8 @@ param ( $ProgressPreference = "SilentlyContinue" Set-PSDebug -Strict +$fabricConfigFile = (Get-Location).Path + "\fabric-config.json" + ##################################################################### # Initialize the environment ##################################################################### @@ -46,6 +44,8 @@ else { $fabricResource = "https://api.fabric.microsoft.com" # Fabric API resource to get access tokens for authorization to Fabric $kustoResource = "https://api.kusto.windows.net" # Kusto API resource to get access tokens for authorization KQL database $powerbiResource = "https://analysis.windows.net/powerbi/api" # Power BI API resource to get access token for authorization to Power BI +$script:apiUrl = "https://api.fabric.microsoft.com/v1" + $global:workspaceId = "" $global:kqlClusterUri = "" @@ -67,6 +67,13 @@ else { # Set the Azure subscription az account set --subscription $subscriptionID +# Get access token to authorize access to Fabric APIs +$fabricAccessToken = (az account get-access-token --resource $fabricResource --query accessToken --output tsv) +if ($fabricAccessToken -eq '') { + write-host "ERROR: Failed to get access token using managed identity." + return +} + function Set-Fabric-Workspace { # List Fabric capacities to assign to Fabric workspace to avoid Powrer BI Premium license @@ -98,13 +105,6 @@ function Set-Fabric-Workspace { # Assign fabric capacity id $fabricCapacityId = $fabricCapacity.id - # Get access token to authorize access to Fabric APIs - $fabricAccessToken = (az account get-access-token --resource $fabricResource --query accessToken --output tsv) - if ($fabricAccessToken -eq '') { - write-host "ERROR: Failed to get access token using managed identity." - return - } - # Create Fabric Workspace $fabricWorkspacesApi = "https://api.fabric.microsoft.com/v1/workspaces" $headers = @{"Authorization" = "Bearer $fabricAccessToken"; "Content-Type" = "application/json" } @@ -429,6 +429,251 @@ function Set-Fabric-Workspace { Write-Host "INFO: Created notebook in Fabric workspace." } +Function Invoke-FabricAPIRequest { + param( + [Parameter(Mandatory = $false)] [string] $authToken, + [Parameter(Mandatory = $true)] [string] $uri, + [Parameter(Mandatory = $false)] [ValidateSet('Get', 'Post', 'Delete', 'Put', 'Patch')] [string] $method = "Get", + [Parameter(Mandatory = $false)] $body, + [Parameter(Mandatory = $false)] [string] $contentType = "application/json; charset=utf-8", + [Parameter(Mandatory = $false)] [int] $timeoutSec = 240, + [Parameter(Mandatory = $false)] [int] $retryCount = 0 + ) + + $fabricHeaders = @{ + 'Content-Type' = $contentType + 'Authorization' = "Bearer {0}" -f $fabricAccessToken + } + + try { + + $requestUrl = "$($script:apiUrl)/$uri" + Write-Verbose "Calling $requestUrl" + + $response = Invoke-WebRequest -Headers $fabricHeaders -Method $method -Uri $requestUrl -Body $body -TimeoutSec $timeoutSec + $lroFailOrNoResultFlag = $false + if ($response.StatusCode -eq 202) { + do { + $asyncUrl = [string]$response.Headers.Location + Write-Host "Waiting for request to complete. Sleeping..." + + Start-Sleep -Seconds 5 + $response = Invoke-WebRequest -Headers $fabricHeaders -Method Get -Uri $asyncUrl + $lroStatusContent = $response.Content | ConvertFrom-Json + } + while ($lroStatusContent.status -ine "succeeded" -and $lroStatusContent.status -ine "failed") + + if ($lroStatusContent.status -ieq "succeeded") { + $resultUrl = [string]$response.Headers.Location + if ($resultUrl) { + $response = Invoke-WebRequest -Headers $fabricHeaders -Method Get -Uri $resultUrl + } + else { + $lroFailOrNoResultFlag = $true + } + } + else { + $lroFailOrNoResultFlag = $true + if ($lroStatusContent.error) { + throw "LRO API Error: '$($lroStatusContent.error.errorCode)' - $($lroStatusContent.error.message)" + } + } + } + + #if ($response.StatusCode -in @(200,201) -and $response.Content) + if (!$lroFailOrNoResultFlag -and $response.Content) { + $contentBytes = $response.RawContentStream.ToArray() + + # Test for BOM + if ($contentBytes[0] -eq 0xef -and $contentBytes[1] -eq 0xbb -and $contentBytes[2] -eq 0xbf) { + $contentText = [System.Text.Encoding]::UTF8.GetString($contentBytes[3..$contentBytes.Length]) + } + else { + $contentText = $response.Content + } + + $jsonResult = $contentText | ConvertFrom-Json + if ($jsonResult.value) { + $jsonResult = $jsonResult.value + } + + Write-Output $jsonResult -NoEnumerate + } + } + catch { + $response = $_.Exception.Response + } +} + + +Function Import-FabricItem { + param + ( + [Parameter(Mandatory)] + [string]$path, + + [Parameter(Mandatory)] + [string]$workspaceId, + + [hashtable]$itemProperties, + [switch]$skipIfExists + ) + + # Search for folders with .pbir and .pbism in it + $itemsInFolder = Get-ChildItem -LiteralPath $path | ? { @(".pbism", ".pbir") -contains $_.Extension } + + if ($itemsInFolder.Count -eq 0) { + Write-Host "Cannot find valid item definitions (*.pbir; *.pbism) in the '$path'" + return + } + + if ($itemsInFolder | ? { $_.Extension -ieq ".pbir" }) { + $itemType = "Report" + } + elseif ($itemsInFolder | ? { $_.Extension -ieq ".pbism" }) { + $itemType = "SemanticModel" + } + else { + throw "Cannot determine the itemType." + } + + # Get existing items of the workspace + $items = Invoke-FabricAPIRequest -Uri "workspaces/$workspaceId/items" -Method Get + + Write-Host "Existing items in the workspace: $($items.Count)" + $files = Get-ChildItem -LiteralPath $path -Recurse -Attributes !Directory + + # Remove files not required for the API: item.*.json; cache.abf; .pbi folder + $files = $files | ? { $_.Name -notlike "item.*.json" -and $_.Name -notlike "*.abf" -and $_.Directory.Name -notlike ".pbi" } + + # Prioritizes reading the displayName and type from itemProperties parameter + $displayName = $null + if ($itemProperties -ne $null) { + $displayName = $itemProperties.displayName + } + + # Try to read the item properties from the .platform file if not found in itemProperties + if ((!$itemType -or !$displayName) -and (Test-Path -LiteralPath "$path\.platform")) { + $itemMetadataStr = Get-Content -LiteralPath "$path\.platform" + + $itemMetadata = $itemMetadataStr | ConvertFrom-Json + $itemType = $itemMetadata.metadata.type + $displayName = $itemMetadata.metadata.displayName + } + + if (!$itemType -or !$displayName) { + throw "Cannot import item if any of the following properties is missing: itemType, displayName" + } + + $itemPathAbs = Resolve-Path -LiteralPath $path + $parts = $files |% { + $filePath = $_.FullName + if ($filePath -like "*.pbir") { + $fileContentText = Get-Content -LiteralPath $filePath + $pbirJson = $fileContentText | ConvertFrom-Json + + $datasetId = $itemProperties.semanticModelId + if ($datasetId -or ($pbirJson.datasetReference.byPath -and $pbirJson.datasetReference.byPath.path)) { + if (!$datasetId) { + throw "Cannot import directly a report using byPath connection. You must first resolve the semantic model id and pass it through the 'itemProperties.semanticModelId' parameter." + } + else { + Write-Host "Binding to semantic model: $datasetId" + } + + $pbirJson.datasetReference.byPath = $null + $pbirJson.datasetReference.byConnection = @{ + "connectionString" = $null + "pbiServiceModelId" = $null + "pbiModelVirtualServerName" = "sobe_wowvirtualserver" + "pbiModelDatabaseName" = "$datasetId" + "name" = "EntityDataSource" + "connectionType" = "pbiServiceXmlaStyleLive" + } + + $newPBIR = $pbirJson | ConvertTo-Json + $fileContent = [system.Text.Encoding]::UTF8.GetBytes($newPBIR) + } + # if its byConnection then just send original + else { + $fileContent = [system.Text.Encoding]::UTF8.GetBytes($fileContentText) + } + } + else { + $fileContent = Get-Content -LiteralPath $filePath -AsByteStream -Raw + } + + $partPath = $filePath.Replace($itemPathAbs, "").TrimStart("\").Replace("\", "/") + $fileEncodedContent = ($fileContent) ? [Convert]::ToBase64String($fileContent) : "" + + Write-Output @{ + Path = $partPath + Payload = $fileEncodedContent + PayloadType = "InlineBase64" + } + } + + Write-Host "Payload parts:" + + $parts | % { Write-Host "part: $($_.Path)" } + $itemId = $null + + # Check if there is already an item with same displayName and type + $foundItem = $items | ? { $_.type -ieq $itemType -and $_.displayName -ieq $displayName } + if ($foundItem) { + if ($foundItem.Count -gt 1) { + throw "Found more than one item for displayName '$displayName'" + } + + Write-Host "Item '$displayName' of type '$itemType' already exists." -ForegroundColor Yellow + $itemId = $foundItem.id + } + + if ($itemId -eq $null) { + write-host "Creating a new item" + # Prepare the request + $itemRequest = @{ + displayName = $displayName + type = $itemType + definition = @{ + Parts = $parts + } + } | ConvertTo-Json -Depth 3 + + $createItemResult = Invoke-FabricAPIRequest -uri "workspaces/$workspaceId/items" -method Post -body $itemRequest + $itemId = $createItemResult.id + + write-host "Created a new item with ID '$itemId' $([datetime]::Now.ToString("s"))" -ForegroundColor Green + Write-Output @{ + "id" = $itemId + "displayName" = $displayName + "type" = $itemType + } + } + else { + if ($skipIfExists) { + write-host "Item '$displayName' of type '$itemType' already exists. Skipping." -ForegroundColor Yellow + } + else { + write-host "Updating item definition" + $itemRequest = @{ + definition = @{ + Parts = $parts + } + } | ConvertTo-Json -Depth 3 + + Invoke-FabricAPIRequest -Uri "workspaces/$workspaceId/items/$itemId/updateDefinition" -Method Post -Body $itemRequest + write-host "Updated item with ID '$itemId' $([datetime]::Now.ToString("s"))" -ForegroundColor Green + } + + Write-Output @{ + "id" = $itemId + "displayName" = $displayName + "type" = $itemType + } + } +} + # Function to import Power BI reports into Fabric workspace function Set-PowerBI-Project { # Parameters @@ -437,7 +682,7 @@ function Set-PowerBI-Project { # Download PowerBI report zip file $localFilePath = "$pbipFolder\Contoso-Hypermarket.zip" Write-Host "INFO: Downloading Power BI report zip file." - Invoke-WebRequest -Uri "$templateBaseUrl" + "artifacts/fabric/Contoso-Hypermarket.zip" -OutFile $localFilePath + Invoke-WebRequest -Uri "$templateBaseUrl/artifacts/fabric/Contoso-Hypermarket.zip" -OutFile $localFilePath Write-Host "INFO: Unzipping Power BI report zip file." Expand-Archive -Path $localFilePath -DestinationPath $pbipFolder -Force @@ -445,17 +690,6 @@ function Set-PowerBI-Project { $pbipSemanticModelPath = "$pbipFolder\Contoso-Hypermarket.SemanticModel" $pbipReportPath = "$pbipFolder\Contoso-Hypermarket.Report" - # Download modules and install - New-Item -ItemType Directory -Path ".\modules" -ErrorAction SilentlyContinue | Out-Null - @("https://raw.githubusercontent.com/microsoft/Analysis-Services/master/pbidevmode/fabricps-pbip/FabricPS-PBIP.psm1" - , "https://raw.githubusercontent.com/microsoft/Analysis-Services/master/pbidevmode/fabricps-pbip/FabricPS-PBIP.psd1") |% { - Invoke-WebRequest -Uri $_ -OutFile ".\modules\$(Split-Path $_ -Leaf)" - } - if(-not (Get-Module Az.Accounts -ListAvailable)) { - Install-Module Az.Accounts -Scope CurrentUser -Force - } - Import-Module ".\modules\FabricPS-PBIP" -Force - # Update KQL endpoint $modelFilePath = "$pbipSemanticModelPath\model.bim" @@ -463,9 +697,6 @@ function Set-PowerBI-Project { Write-Host "INFO: Replace KQL cluster URI in the semantic model." (Get-Content -Path $modelFilePath) -replace '{{FABRIC_KQL_CLUSTER_URI}}', $global:kqlClusterUri | Set-Content -Path $modelFilePath - # Authenticate to fabric - Set-FabricAuthToken -reset - # Import the semantic model and save the item id Write-Host "INFO: Import the semantic model and save the item id." $semanticModelImport = Import-FabricItem -workspaceId $global:workspaceId -path $pbipSemanticModelPath @@ -473,7 +704,7 @@ function Set-PowerBI-Project { # Import the report and ensure its binded to the previous imported report Write-Host "INFO: Import the PowerBI report and save the item id." - $reportImport = Import-FabricItem -workspaceId $fabricWorkspaceId -path $pbipReportPath -itemProperties @{"semanticModelId" = $semanticModelImport.Id} + $reportImport = Import-FabricItem -workspaceId $global:workspaceId -path $pbipReportPath -itemProperties @{"semanticModelId" = $semanticModelImport.Id} Write-Host "INFO: Imported PowerBI report with the item id $($reportImport.id)" } From 55e8a8738f0c6d15adf85fd14d2dac5d2c4af39b Mon Sep 17 00:00:00 2001 From: Mike Rhoads Date: Sun, 3 Nov 2024 20:24:18 -0600 Subject: [PATCH 237/409] add hypermarket GitOps config --- .../AgConfig-contoso-hypermarket.psd1 | 8 +- .../artifacts/PowerShell/AgLogonScript.ps1 | 1 + .../Modules/contoso_hypermarket.psm1 | 123 ++++++++++++++++++ 3 files changed, 128 insertions(+), 4 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index c9611c71c1..9b06c263a0 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -201,10 +201,10 @@ AppConfig = @{ inferencing_deployment = @{ - GitOpsConfigName = "contoso-motors" - KustomizationName = "contoso-motors" - KustomizationPath="./contoso_manufacturing/operations" - Namespace = "contoso-motors" + GitOpsConfigName = "contoso-hypermarket" + KustomizationName = "contoso-hypermarket" + KustomizationPath="./agora/contoso_hypermarket" + Namespace = "contoso-hypermarket" Order = 1 } } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 852fd3b8eb..3a1ce9b8ca 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -224,6 +224,7 @@ if ($scenario -eq "contoso_motors") { }elseif($scenario -eq "contoso_hypermarket"){ #Deploy-AIO-M2 Deploy-AIO-M3 + Deploy-MotorsConfigs $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index b40af2e483..5e7d252bc3 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -504,4 +504,127 @@ function Set-MicrosoftFabric { if (-not (Test-Path -Path $scriptFilePath)) { Write-Error "Unable to download script file: 'SetupFabricWorkspace.ps1' from GitHub" } +} +function Deploy-MotorsConfigs { + + # Loop through the clusters and deploy the configs in AppConfig hashtable in AgConfig-contoso-hypermarket.psd + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + Start-Job -Name gitops -ScriptBlock { + $AgConfig = $using:AgConfig + $cluster = $using:cluster + $namingGuid = $using:namingGuid + $resourceGroup = $using:resourceGroup + $appClonedRepo = $using:appUpstreamRepo + $appsRepo = $using:appsRepo + + $AgConfig.AppConfig.GetEnumerator() | sort-object -Property @{Expression = { $_.value.Order }; Ascending = $true } | ForEach-Object { + $app = $_ + $clusterName = $cluster.value.ArcClusterName + "-$namingGuid" + $branch = $cluster.value.Branch.ToLower() + $configName = $app.value.GitOpsConfigName.ToLower() + $namespace = $app.value.Namespace + $appName = $app.Value.KustomizationName + $appPath = $app.Value.KustomizationPath + $retryCount = 0 + $maxRetries = 2 + + Write-Host "[$(Get-Date -Format t)] INFO: Creating GitOps config for $configName on $($cluster.Value.ArcClusterName+"-$namingGuid")" -ForegroundColor Gray + $type = "connectedClusters" + + # Wait for Kubernetes API server to become available + $apiServer = kubectl config view --context $cluster.Name.ToLower() --minify -o jsonpath='{.clusters[0].cluster.server}' + $apiServerAddress = $apiServer -replace '.*https://| .*$' + $apiServerFqdn = ($apiServerAddress -split ":")[0] + $apiServerPort = ($apiServerAddress -split ":")[1] + + do { + $result = Test-NetConnection -ComputerName $apiServerFqdn -Port $apiServerPort -WarningAction SilentlyContinue + if ($result.TcpTestSucceeded) { + break + } + else { + Start-Sleep -Seconds 5 + } + } while ($true) + + + az k8s-configuration flux create ` + --cluster-name $clusterName ` + --resource-group $resourceGroup ` + --name $configName ` + --cluster-type $type ` + --scope cluster ` + --url $appClonedRepo ` + --branch $branch ` + --sync-interval 3s ` + --kustomization name=$appName path=$appPath prune=true retry_interval=1m ` + --timeout 10m ` + --namespace $namespace ` + --only-show-errors ` + 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + + do { + $configStatus = $(az k8s-configuration flux show --name $configName --cluster-name $clusterName --cluster-type $type --resource-group $resourceGroup -o json 2>$null) | convertFrom-JSON + if ($configStatus.ComplianceState -eq "Compliant") { + Write-Host "[$(Get-Date -Format t)] INFO: GitOps configuration $configName is ready on $clusterName" -ForegroundColor DarkGreen | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + } + else { + if ($configStatus.ComplianceState -ne "Non-compliant") { + Start-Sleep -Seconds 20 + } + elseif ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -lt $maxRetries) { + Start-Sleep -Seconds 20 + $configStatus = $(az k8s-configuration flux show --name $configName --cluster-name $clusterName --cluster-type $type --resource-group $resourceGroup -o json 2>$null) | convertFrom-JSON + if ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -lt $maxRetries) { + $retryCount++ + Write-Host "[$(Get-Date -Format t)] INFO: Attempting to re-install $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + Write-Host "[$(Get-Date -Format t)] INFO: Deleting $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + az k8s-configuration flux delete ` + --resource-group $resourceGroup ` + --cluster-name $clusterName ` + --cluster-type $type ` + --name $configName ` + --force ` + --yes ` + --only-show-errors ` + 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + + Start-Sleep -Seconds 10 + Write-Host "[$(Get-Date -Format t)] INFO: Re-creating $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + + az k8s-configuration flux create ` + --cluster-name $clusterName ` + --resource-group $resourceGroup ` + --name $configName ` + --cluster-type $type ` + --scope cluster ` + --url $appClonedRepo ` + --branch $branch ` + --sync-interval 3s ` + --kustomization name=$appName path=$appPath prune=true ` + --timeout 30m ` + --namespace $namespace ` + --only-show-errors ` + 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + } + } + elseif ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -eq $maxRetries) { + Write-Host "[$(Get-Date -Format t)] ERROR: GitOps configuration $configName has failed on $clusterName. Exiting..." -ForegroundColor White -BackgroundColor Red | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + break + } + } + } until ($configStatus.ComplianceState -eq "Compliant") + } + } + } + + while ($(Get-Job -Name gitops).State -eq 'Running') { + #Write-Host "[$(Get-Date -Format t)] INFO: Waiting for GitOps configuration to complete on all clusters...waiting 60 seconds" -ForegroundColor Gray + Receive-Job -Name gitops -WarningAction SilentlyContinue + Start-Sleep -Seconds 60 + } + + Get-Job -name gitops | Remove-Job + Write-Host "[$(Get-Date -Format t)] INFO: GitOps configuration complete." -ForegroundColor Green + Write-Host } \ No newline at end of file From 59bd8f9b60727a7d95d4b0929463d7f2e695f04e Mon Sep 17 00:00:00 2001 From: Mike Rhoads Date: Sun, 3 Nov 2024 20:28:37 -0600 Subject: [PATCH 238/409] fix deploy-hypermarketconfig name --- azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 | 2 +- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 3a1ce9b8ca..61887a76d4 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -224,7 +224,7 @@ if ($scenario -eq "contoso_motors") { }elseif($scenario -eq "contoso_hypermarket"){ #Deploy-AIO-M2 Deploy-AIO-M3 - Deploy-MotorsConfigs + Deploy-HypermarketConfigs $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 5e7d252bc3..c6d79c0286 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -505,7 +505,7 @@ function Set-MicrosoftFabric { Write-Error "Unable to download script file: 'SetupFabricWorkspace.ps1' from GitHub" } } -function Deploy-MotorsConfigs { +function Deploy-HypermarketConfigs { # Loop through the clusters and deploy the configs in AppConfig hashtable in AgConfig-contoso-hypermarket.psd foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { From bb0814446640c8ab922bfcf9215d47dc059cd3dc Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Sun, 3 Nov 2024 21:39:42 -0500 Subject: [PATCH 239/409] Update azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 Co-authored-by: Dale Kirby <32211549+dkirby-ms@users.noreply.github.com> --- .../artifacts/PowerShell/SetupFabricWorkspace.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 index 60ce3994e2..de43d6a5ab 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 @@ -3,7 +3,7 @@ # data pipeline integration and dashboards # Access rights deploy Microsoft Fabric items used in Contoso Hypermarket scenario. -# Make sure Create Workpace is enabled in Frabric for service principals. +# Make sure Create Workspace is enabled in Frabric for service principals. #Access settings using https://app.fabric.microsoft.com/admin-portal/tenantSettings?experience=power-bi # NOTE: To run locally create a file named fabric-config.json with the following content From e5c8dc6abebbc97eb52c38de8a3502b48bae0a15 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Sun, 3 Nov 2024 21:39:53 -0500 Subject: [PATCH 240/409] Update azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 Co-authored-by: Dale Kirby <32211549+dkirby-ms@users.noreply.github.com> --- .../artifacts/PowerShell/SetupFabricWorkspace.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 index de43d6a5ab..832f45e56e 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 @@ -10,7 +10,7 @@ # # { # "runAs": "user", # Indicates whether to run under regular user account or managed identity -# "resourceGroup": "rg-fabric", # Resource group where Contoso Hypermaerket is deployed +# "resourceGroup": "rg-fabric", # Resource group where Contoso Hypermarket is deployed # "templateBaseUrl": "https://raw.githubusercontent.com/main/azure_arc/main/azure_arc_data/azure_jumpstart_ag/artifacts" # } # From 14941fee273dcd8e3e5f24b82a2bf5cf111caa1f Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 4 Nov 2024 09:38:54 +0200 Subject: [PATCH 241/409] Add support for managed identity login in Azure CLI and PowerShell scripts for contoso_hypermarket scenario --- .../artifacts/PowerShell/AgLogonScript.ps1 | 6 ++- .../artifacts/PowerShell/Modules/common.psm1 | 37 +++++++++++---- .../Modules/contoso_hypermarket.psm1 | 7 +-- .../bicep/clientVm/clientVm.bicep | 45 +++++++++++++++++++ 4 files changed, 83 insertions(+), 12 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 852fd3b8eb..7f048aa6f3 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -102,7 +102,11 @@ $global:Credentials = New-Object System.Management.Automation.PSCredential($AgCo ##################################################################### Write-Host "[$(Get-Date -Format t)] INFO: Configuring Azure CLI (Step 1/17)" -ForegroundColor DarkGreen Write-Host "[$(Get-Date -Format t)] INFO: Logging into Az CLI using the service principal and secret provided at deployment" -ForegroundColor Gray -az login --service-principal --username $Env:spnClientID --password=$Env:spnClientSecret --tenant $Env:spnTenantId | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\AzCLI.log") +if($scenario -eq "contoso_hypermarket"){ + az login --identity | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\AzCLI.log") +}else{ + az login --service-principal --username $Env:spnClientID --password=$Env:spnClientSecret --tenant $Env:spnTenantId | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\AzCLI.log") +} az account set -s $subscriptionId Deploy-AzCLI diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index ca24b1c6fc..2b7e4c92f6 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -32,9 +32,15 @@ function Deploy-AzCLI { } function Deploy-AzPowerShell { - $azurePassword = ConvertTo-SecureString $Env:spnClientSecret -AsPlainText -Force - $psCred = New-Object System.Management.Automation.PSCredential($Env:spnClientID , $azurePassword) - Connect-AzAccount -Credential $psCred -TenantId $Env:spnTenantId -ServicePrincipal -Subscription $subscriptionId | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\AzPowerShell.log") + if($scenario -eq "contoso_hypermarket"){ + Connect-AzAccount -Identity -Tenant $tenantId -Subscription $subscriptionId + } + else { + $azurePassword = ConvertTo-SecureString $Env:spnClientSecret -AsPlainText -Force + $psCred = New-Object System.Management.Automation.PSCredential($Env:spnClientID , $azurePassword) + Connect-AzAccount -Credential $psCred -TenantId $Env:spnTenantId -ServicePrincipal -Subscription $subscriptionId | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\AzPowerShell.log") + } + Set-AzContext -Subscription $subscriptionId # Making module install dynamic @@ -523,7 +529,12 @@ function Deploy-VirtualizationInfrastructure { } function Deploy-AzContainerRegistry { - az login --service-principal --username $Env:spnClientID --password=$Env:spnClientSecret --tenant $Env:spnTenantId | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\AzCLI.log") + if($scenario -eq "contoso_hypermarket"){ + az login --identity + } + else { + az login --service-principal --username $Env:spnClientID --password=$Env:spnClientSecret --tenant $Env:spnTenantId | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\AzCLI.log") + } az account set -s $Env:subscriptionId az aks get-credentials --resource-group $Env:resourceGroup --name $Env:aksStagingClusterName --admin | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\ClusterSecrets.log") kubectx staging="$Env:aksStagingClusterName-admin" | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\ClusterSecrets.log") @@ -619,6 +630,7 @@ function Deploy-AzArcK8sAKSEE { $tenantId = $Env:spnTenantId $location = $Env:azureLocation $resourceGroup = $Env:resourceGroup + $subscriptionId = $Env:subscriptionId Invoke-Command -VMName $VM -Credential $Credentials -ScriptBlock { # Install prerequisites @@ -632,9 +644,13 @@ function Deploy-AzArcK8sAKSEE { Install-Module Az.ConnectedMachine -Force -AllowClobber -ErrorAction Stop # Connect servers to Arc - $azurePassword = ConvertTo-SecureString $using:secret -AsPlainText -Force - $psCred = New-Object System.Management.Automation.PSCredential($using:clientId, $azurePassword) - Connect-AzAccount -Credential $psCred -TenantId $using:tenantId -ServicePrincipal -Subscription $using:subscriptionId + if($scenario -eq "contoso_hypermarket"){ + Connect-AzAccount -Identity -Tenant $tenantId -Subscription $subscriptionId + }else{ + $azurePassword = ConvertTo-SecureString $using:secret -AsPlainText -Force + $psCred = New-Object System.Management.Automation.PSCredential($using:clientId, $azurePassword) + Connect-AzAccount -Credential $psCred -TenantId $using:tenantId -ServicePrincipal -Subscription $using:subscriptionId + } Write-Host "[$(Get-Date -Format t)] INFO: Arc-enabling $hostname server." -ForegroundColor Gray Redo-Command -ScriptBlock { Connect-AzConnectedMachine -ResourceGroupName $using:resourceGroup -Name "Ag-$hostname-Host" -Location $using:location } @@ -738,7 +754,12 @@ function Deploy-ClusterFluxExtension { } } - az login --service-principal --username $Env:spnClientID --password=$Env:spnClientSecret --tenant $Env:spnTenantId + if($scenario -eq "contoso_hypermarket"){ + az login --identity + } + else { + az login --service-principal --username $Env:spnClientID --password=$Env:spnClientSecret --tenant $Env:spnTenantId + } az account set -s $Env:subscriptionId $extension = az k8s-extension list --cluster-name $resourceName --resource-group $Env:resourceGroup --cluster-type $ClusterType --output json | ConvertFrom-Json $extension = $extension | Where-Object extensionType -eq 'microsoft.flux' diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index b40af2e483..19ea2cfeba 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -91,7 +91,8 @@ function Merge-K3sConfigFiles { function Set-K3sClusters { Write-Host "Configuring kube-vip on K3s clusters" - az login --service-principal --username $Env:spnClientID --password=$Env:spnClientSecret --tenant $Env:spnTenantId + #az login --service-principal --username $Env:spnClientID --password=$Env:spnClientSecret --tenant $Env:spnTenantId + az login --identity az account set -s $subscriptionId foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { if ($cluster.Value.Type -eq "k3s") { @@ -261,7 +262,7 @@ function Deploy-AIO-M3 { Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the Arc-enabled clusters" -ForegroundColor Gray Write-Host "`n" - # Get Event Hub details from the resource group to assign role permissions to IoT Operations extension managed + # Get Event Hub details from the resource group to assign role permissions to IoT Operations extension managed $eventHubInfo = (az resource list --resource-group $resourceGroup --resource-type "Microsoft.EventHub/namespaces" | ConvertFrom-Json) if ($eventHubInfo.Count -ne 1) { Write-Host "ERROR: Resource group contains no Eventhub namespaces or more than one. Make sure to have only one EventHub namesapce in the resource group." -ForegroundColor DarkRed @@ -272,7 +273,7 @@ function Deploy-AIO-M3 { $evenHubNamespaceHost = "$($eventHubInfo[0].name).servicebus.windows.net:9093" Write-Host "INFO: Found EventHub Namespace with Resource ID: $eventHubNamespaceId" -ForegroundColor DarkGray - + # Get Event Hub from the Event Hub namespace $eventHubs = az eventhubs eventhub list --namespace-name $eventHubInfo[0].name --resource-group $resourceGroup | ConvertFrom-Json $eventHubName = $eventHubs[0].name diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep index 544915e814..47a5682a11 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep @@ -209,5 +209,50 @@ resource vmBootstrap 'Microsoft.Compute/virtualMachines/extensions@2022-11-01' = } } +// Add role assignment for the VM: Azure Key Vault Secret Officer role +resource vmRoleAssignment_KeyVaultAdministrator 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid(vm.id, 'Microsoft.Authorization/roleAssignments', 'Administrator') + scope: resourceGroup() + properties: { + principalId: vm.identity.principalId + roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', '00482a5a-887f-4fb3-b363-3b7fe8e74483') + principalType: 'ServicePrincipal' + + } +} + +// Add role assignment for the VM: Owner role +resource vmRoleAssignment_Owner 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid(vm.id, 'Microsoft.Authorization/roleAssignments', 'Owner') + scope: resourceGroup() + properties: { + principalId: vm.identity.principalId + roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', '8e3af657-a8ff-443c-a75c-2fe8c4bcb635') + principalType: 'ServicePrincipal' + } +} + +// Add role assignment for the VM: Storage Blob Data Contributor +resource vmRoleAssignment_Storage 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid(vm.id, 'Microsoft.Authorization/roleAssignments', 'Storage Blob Data Contributor') + scope: resourceGroup() + properties: { + principalId: vm.identity.principalId + roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe') + principalType: 'ServicePrincipal' + } +} + +// Add role assignment for the VM: Cognitive Services OpenAI Contributor +resource vmRoleAssignment_OpenAI 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid(vm.id, 'Microsoft.Authorization/roleAssignments', 'Cognitive Services OpenAI Contributor') + scope: resourceGroup() + properties: { + principalId: vm.identity.principalId + roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', 'a001fd3d-188f-4b5d-821b-7da978bf7442') + principalType: 'ServicePrincipal' + } +} + output adminUsername string = windowsAdminUsername output publicIP string = deployBastion == false ? concat(publicIpAddress.properties.ipAddress) : '' From da54b76f033424940bd804709060cc40ce2c252c Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 4 Nov 2024 11:25:51 +0200 Subject: [PATCH 242/409] Update Azure CLI and PowerShell scripts for contoso_hypermarket scenario with environment variables and adjust OpenAI model configurations --- .../artifacts/PowerShell/Modules/common.psm1 | 4 ++-- .../contoso_hypermarket/bicep/ai/aoai.bicep | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index 2b7e4c92f6..fcfb213d29 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -33,7 +33,7 @@ function Deploy-AzCLI { function Deploy-AzPowerShell { if($scenario -eq "contoso_hypermarket"){ - Connect-AzAccount -Identity -Tenant $tenantId -Subscription $subscriptionId + Connect-AzAccount -Identity -Tenant $Env:spnTenantId -Subscription $subscriptionId } else { $azurePassword = ConvertTo-SecureString $Env:spnClientSecret -AsPlainText -Force @@ -645,7 +645,7 @@ function Deploy-AzArcK8sAKSEE { # Connect servers to Arc if($scenario -eq "contoso_hypermarket"){ - Connect-AzAccount -Identity -Tenant $tenantId -Subscription $subscriptionId + Connect-AzAccount -Identity -Tenant $using:tenantId-Subscription $subscriptionId }else{ $azurePassword = ConvertTo-SecureString $using:secret -AsPlainText -Force $psCred = New-Object System.Management.Automation.PSCredential($using:clientId, $azurePassword) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep index 20272e6beb..d49e66d90b 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep @@ -17,7 +17,7 @@ param spnObjectId string param azureOpenAIModels array = [ { name: 'gpt-35-turbo' - version: '0125' + version: '0301' } { name: 'gpt-4o-mini' @@ -42,8 +42,8 @@ resource openAIModelsDeployment 'Microsoft.CognitiveServices/accounts/deployment parent: openAIAccount name: '${openAIAccountName}-${model.name}-deployment' sku: { - name: 'Standard' - capacity: 10 + name: 'GlobalStandard' + capacity: 50 } properties: { model: { @@ -52,7 +52,7 @@ resource openAIModelsDeployment 'Microsoft.CognitiveServices/accounts/deployment version: model.version } versionUpgradeOption: 'NoAutoUpgrade' - currentCapacity: 10 + currentCapacity: 50 raiPolicyName: 'Microsoft.Default' } }] From 8e393bf5acbed23bcaafdb374d0d849944118446 Mon Sep 17 00:00:00 2001 From: Luis Castillo Date: Mon, 4 Nov 2024 12:58:54 +0100 Subject: [PATCH 243/409] Added rsync rules and true flag for MQTT broker --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index ee1304d550..150f5c4b7b 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -371,7 +371,8 @@ function Deploy-AIO-M3 { --subscription $subscriptionId ` --custom-location $customLocationName ` --sr-resource-id $schemaId ` - --add-insecure-listener ` + --enable-rsync true ` + --add-insecure-listener true` --only-show-errors if ($? -eq $false) { @@ -385,7 +386,8 @@ function Deploy-AIO-M3 { --subscription $subscriptionId ` --custom-location $customLocationName ` --sr-resource-id $schemaId ` - --add-insecure-listener ` + --enable-rsync true ` + --add-insecure-listener true` --only-show-errors $retryCount++ From 80fbcafb12389e3c6b875bcb73b9f02ab3dfba5b Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 4 Nov 2024 18:32:08 +0200 Subject: [PATCH 244/409] Refactor AIO deployment in contoso_hypermarket scenario: remove Deploy-AIO-M2 function and update Deploy-AIO-M3 --- .../artifacts/PowerShell/AgLogonScript.ps1 | 1 - .../Modules/contoso_hypermarket.psm1 | 131 ------------------ 2 files changed, 132 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 7f048aa6f3..a490a85fa8 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -226,7 +226,6 @@ if ($scenario -eq "contoso_motors") { $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray }elseif($scenario -eq "contoso_hypermarket"){ - #Deploy-AIO-M2 Deploy-AIO-M3 $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 19ea2cfeba..8d915fcaf7 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -127,137 +127,6 @@ function Set-K3sClusters { } } -function Deploy-AIO-M2 { - Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the Arc-enabled clusters" -ForegroundColor Gray - Write-Host "`n" - $kvIndex = 0 - foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { - $clusterName = $cluster.Name.ToLower() - Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the $clusterName cluster" -ForegroundColor Gray - Write-Host "`n" - # Create user-assigned identity for AIO secrets management - Write-Host "Create user-assigned identity for AIO secrets management" -ForegroundColor DarkGray - Write-Host "`n" - $userAssignedManagedIdentityKvName = "aio-${clusterName}-${namingGuid}-kv-identity" - $userAssignedMIKvResourceId = $(az identity create -g $resourceGroup -n $userAssignedManagedIdentityKvName -o tsv --query id) - - # Create user-assigned identity for AIO secrets management - Write-Host "Create user-assigned identity for cloud connections" -ForegroundColor DarkGray - Write-Host "`n" - $userAssignedManagedIdentityCloudName = "aio-${clusterName}-${namingGuid}-cloud-identity" - $userAssignedMICloudResourceId = $(az identity create -g $resourceGroup -n $userAssignedManagedIdentityCloudName -o tsv --query id) - - kubectx $clusterName - $arcClusterName = $AgConfig.SiteConfig[$clusterName].ArcClusterName + "-$namingGuid" - $keyVaultId = (az keyvault list -g $resourceGroup --resource-type vault --query "[$kvIndex].id" -o tsv) - $retryCount = 0 - $maxRetries = 5 - $aioStatus = "notDeployed" - - # Enable custom locations on the Arc-enabled cluster - Write-Host "[$(Get-Date -Format t)] INFO: Enabling custom locations on the Arc-enabled cluster" -ForegroundColor DarkGray - Write-Host "`n" - az config set extension.use_dynamic_install=yes_without_prompt - az connectedk8s enable-features --name $arcClusterName ` - --resource-group $resourceGroup ` - --features cluster-connect custom-locations ` - --custom-locations-oid $customLocationRPOID ` - --only-show-errors - - # Create the Schema registry for the cluster - Write-Host "[$(Get-Date -Format t)] INFO: Creating the schema registry on the Arc-enabled cluster" -ForegroundColor DarkGray - Write-Host "`n" - $schemaName = "${clusterName}-$($Env:namingGuid)-schema" - $schemaId = $(az iot ops schema registry create --name $schemaName ` - --resource-group $resourceGroup ` - --registry-namespace "$clusterName-$($Env:namingGuid)-namespace" ` - --sa-resource-id $(az storage account show --name $aioStorageAccountName --resource-group $resourceGroup -o tsv --query id) ` - --query id -o tsv) - - # Initialize the Azure IoT Operations instance on the Arc-enabled cluster - Write-Host "[$(Get-Date -Format t)] INFO: Initialize the Azure IoT Operations instance on the Arc-enabled cluster" -ForegroundColor DarkGray - Write-Host "`n" - do { - az iot ops init --cluster $arcClusterName.toLower() ` - --resource-group $resourceGroup ` - --sr-resource-id $schemaId ` - --only-show-errors - if ($? -eq $false) { - $aioStatus = "notDeployed" - Write-Host "`n" - Write-Host "[$(Get-Date -Format t)] Error: An error occured while deploying AIO on the cluster...Retrying" -ForegroundColor DarkRed - Write-Host "`n" - az iot ops init --cluster $arcClusterName.toLower() ` - --resource-group $resourceGroup ` - --sr-resource-id $schemaId ` - --only-show-errors - $retryCount++ - } - else { - $aioStatus = "deployed" - } - } until ($aioStatus -eq "deployed" -or $retryCount -eq $maxRetries) - - $retryCount = 0 - $maxRetries = 5 - # Create the Azure IoT Operations instance on the Arc-enabled cluster - Write-Host "[$(Get-Date -Format t)] INFO: Create the Azure IoT Operations instance on the Arc-enabled cluster" -ForegroundColor DarkGray - Write-Host "`n" - do { - az iot ops create --name $arcClusterName.toLower() ` - --cluster $arcClusterName.toLower() ` - --resource-group $resourceGroup ` - --add-insecure-listener ` - --only-show-errors - - if ($? -eq $false) { - $aioStatus = "notDeployed" - Write-Host "`n" - Write-Host "[$(Get-Date -Format t)] Error: An error occured while deploying AIO on the cluster...Retrying" -ForegroundColor DarkRed - Write-Host "`n" - az iot ops create --name $arcClusterName.toLower() ` - --cluster $arcClusterName.toLower() ` - --resource-group $resourceGroup ` - --add-insecure-listener ` - --only-show-errors - $retryCount++ - } - else { - $aioStatus = "deployed" - } - } until ($aioStatus -eq "deployed" -or $retryCount -eq $maxRetries) - - # Configure the Azure IoT Operations instance for secret synchronization - Write-Host "[$(Get-Date -Format t)] INFO: Configuring the Azure IoT Operations instance for secret synchronization" -ForegroundColor DarkGray - Write-Host "`n" - - # Enable OIDC issuer and workload identity on the Arc-enabled cluster - az connectedk8s update -n $arcClusterName ` - --resource-group $resourceGroup ` - --enable-oidc-issuer ` - --enable-workload-identity - - Write-Host "[$(Get-Date -Format t)] INFO: Assigning the user-assigned managed identity to the Azure IoT Operations instance" -ForegroundColor DarkGray - Write-Host "`n" - az iot ops identity assign --name $arcClusterName.toLower() ` - --resource-group $resourceGroup ` - --mi-user-assigned $userAssignedMIKvResourceId - - Start-Sleep -Seconds 60 - - Write-Host "[$(Get-Date -Format t)] INFO: Configure the Azure IoT Operations instance for secret synchronization" -ForegroundColor DarkGray - Write-Host "`n" - - az iot ops secretsync enable --name $arcClusterName.toLower() ` - --kv-resource-id $keyVaultId ` - --resource-group $resourceGroup ` - --mi-user-assigned $userAssignedMICloudResourceId ` - --only-show-errors - - $kvIndex++ - } -} - function Deploy-AIO-M3 { Write-Host "[$(Get-Date -Format t)] INFO: Deploying AIO to the Arc-enabled clusters" -ForegroundColor Gray Write-Host "`n" From 35a49f2f95f30b9c800efcaf773364e5fbf28bb1 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Mon, 4 Nov 2024 11:37:33 -0500 Subject: [PATCH 245/409] Update contoso_hypermarket.psm1 --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 1 + 1 file changed, 1 insertion(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index b497f4060e..1e58e15a57 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -621,6 +621,7 @@ function Deploy-HypermarketConfigs { } } } +} function Set-AzureOpenAISecrets { $openAIAccountName = $(az cognitiveservices account list -g $resourceGroup --query [].name -o tsv) From f942768c330767913697ed24f13b363b5a67e181 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Mon, 4 Nov 2024 11:40:34 -0500 Subject: [PATCH 246/409] Update contoso_hypermarket.psm1 --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 1e58e15a57..a6027e6ddc 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -372,7 +372,7 @@ function Deploy-AIO-M3 { --custom-location $customLocationName ` --sr-resource-id $schemaId ` --enable-rsync true ` - --add-insecure-listener true` + --add-insecure-listener true ` --only-show-errors if ($? -eq $false) { @@ -387,7 +387,7 @@ function Deploy-AIO-M3 { --custom-location $customLocationName ` --sr-resource-id $schemaId ` --enable-rsync true ` - --add-insecure-listener true` + --add-insecure-listener true ` --only-show-errors $retryCount++ From 3954951e30b55337d90779684613bd5a9fe76d0e Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 4 Nov 2024 20:51:36 +0200 Subject: [PATCH 247/409] Enhance Deploy-AIO-M3 function and add secret management for AI, EventHub, and SQL services --- .../Modules/contoso_hypermarket.psm1 | 56 ++++++++++++++++--- 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 9f26b68e3c..c69af99606 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -242,7 +242,7 @@ function Deploy-AIO-M3 { --custom-location $customLocationName ` --sr-resource-id $schemaId ` --enable-rsync true ` - --add-insecure-listener true` + --add-insecure-listener true ` --only-show-errors if ($? -eq $false) { @@ -257,7 +257,7 @@ function Deploy-AIO-M3 { --custom-location $customLocationName ` --sr-resource-id $schemaId ` --enable-rsync true ` - --add-insecure-listener true` + --add-insecure-listener true ` --only-show-errors $retryCount++ @@ -318,7 +318,8 @@ function Deploy-AIO-M3 { $deploymentStatus = az deployment group show --name $deploymentName --resource-group $resourceGroup --query properties.provisioningState -o tsv if ($deploymentStatus -eq "Succeeded") { Write-Host "[$(Get-Date -Format t)] INFO: Deployment succeeded for $deploymentName" -ForegroundColor Green - } else { + } + else { Write-Host "[$(Get-Date -Format t)] ERROR: Deployment failed for $deploymentName" -ForegroundColor Red } } @@ -491,14 +492,51 @@ function Deploy-HypermarketConfigs { } } } +} function Set-AzureOpenAISecrets { - $openAIAccountName = $(az cognitiveservices account list -g $resourceGroup --query [].name -o tsv) - $openAIEndpoint = $(az cognitiveservices account show --name $openAIAccountName --resource-group $resourceGroup --query properties.endpoint -o tsv) - $openAIKey = $(az cognitiveservices account keys list --name $openAIAccountName --resource-group $resourceGroup --query key1 -o tsv) + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + $clusterName = $cluster.Name.ToLower() + Write-Host "[$(Get-Date -Format t)] INFO: Deploying AI services Secret to the $clusterName cluster" -ForegroundColor Gray + Write-Host "`n" + $AIServiceAccountName = $(az cognitiveservices account list -g $resourceGroup --query [].name -o tsv) + $openAIEndpoint = $(az cognitiveservices account show --name $AIServiceAccountName --resource-group $resourceGroup --query properties.endpoint -o tsv) + $openAIKey = $(az cognitiveservices account keys list --name $AIServiceAccountName --resource-group $resourceGroup --query key1 -o tsv) + kubectx $clusterName + kubectl create secret generic azure-openai-secret ` + --namespace=contoso-hypermarket ` + --from-literal=azure-openai-endpoint=$openAIEndpoint ` + --from-literal=azure-openai-api-key=$openAIKey + } +} + +function Set-EventHubSecrets { + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + $clusterName = $cluster.Name.ToLower() + Write-Host "[$(Get-Date -Format t)] INFO: Deploying EventHub Secret to the $clusterName cluster" -ForegroundColor Gray + Write-Host "`n" + $eventHubNamespace = $(az eventhubs namespace list -g $resourceGroup --query [].name -o tsv) + $eventHubName = $(az eventhubs eventhub list -g $resourceGroup --namespace-name $eventHubNamespace --query [].name -o tsv) + $eventHubConnectionString = $(az eventhubs authorization-rule keys list --resource-group $resourceGroup --namespace-name $eventHubNamespace --eventhub-name $eventHubName --name RootManageSharedAccessKey --query primaryConnectionString -o tsv) + kubectx $clusterName + kubectl create secret generic azure-eventhub-secret ` + --namespace=contoso-hypermarket ` + --from-literal=azure-eventhub-connection-string=$eventHubConnectionString + } +} - kubectl create secret generic azure-openai-secret ` +function Set-SQLSecret { + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + $clusterName = $cluster.Name.ToLower() + Write-Host "[$(Get-Date -Format t)] INFO: Deploying SQL Secret to the $clusterName cluster" -ForegroundColor Gray + Write-Host "`n" + kubectx $clusterName + kubectl create secret generic azure-sqlpassword-secret ` --namespace=contoso-hypermarket ` - --from-literal=azure-openai-endpoint=$openAIEndpoint ` - --from-literal=azure-openai-api-key=$openAIKey + --from-literal=azure-sqlpassword-secret=$Env:adminPassword + } +} + +function Set-SpeechTotextConnectionString { + } \ No newline at end of file From 6dcc72a1e2d704079de7791bf90ca38574c38ca1 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Mon, 4 Nov 2024 14:13:23 -0500 Subject: [PATCH 248/409] update PoS dashboard --- .../monitoring/grafana-app-store-pos.json | 234 ++++++++++++++---- 1 file changed, 186 insertions(+), 48 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-pos.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-pos.json index 6fe8058f76..d06c305874 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-pos.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-pos.json @@ -18,9 +18,22 @@ "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 0, - "id": 10, + "id": 7, "links": [], "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 41, + "panels": [], + "title": "Point-of-Sale(PoS)", + "type": "row" + }, { "datasource": { "default": false, @@ -43,35 +56,118 @@ ] } }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "POS01" - }, - "properties": [] - } - ] + "overrides": [] }, "gridPos": { "h": 7, - "w": 12, + "w": 9, "x": 0, - "y": 0 + "y": 1 }, - "id": 24, + "id": 26, "options": { - "displayMode": "lcd", + "displayMode": "gradient", "legend": { "calcs": [], - "displayMode": "table", + "displayMode": "list", "placement": "right", + "showLegend": true + }, + "maxVizHeight": 300, + "minVizHeight": 16, + "minVizWidth": 8, + "namePlacement": "hidden", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "manual", + "valueMode": "text" + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "disableTextWrap": false, + "editorMode": "code", + "exemplar": false, + "expr": "topk(5,sum(pos_failure_count_total) by (device_id,failure_type))", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{device_id}} - {{failure_type}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "PoS Errors (Top 5)", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "(.*)_(.*)", + "renamePattern": "$1 $2" + } + } + ], + "type": "bargauge" + }, + { + "datasource": { + "default": false, + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 9, + "y": 1 + }, + "id": 42, + "options": { + "displayMode": "gradient", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", "showLegend": false }, "maxVizHeight": 300, "minVizHeight": 16, "minVizWidth": 8, - "namePlacement": "left", + "namePlacement": "auto", "orientation": "horizontal", "reduceOptions": { "calcs": [ @@ -91,16 +187,21 @@ "type": "prometheus", "uid": "${datasource}" }, + "disableTextWrap": false, "editorMode": "code", - "expr": "increase(pos_items_sold_total[1h])", + "exemplar": false, + "expr": "topk(5,sum(pos_failure_count_total) by (failure_type))", + "fullMetaSearch": false, "hide": false, - "instant": false, + "includeNullMetadata": true, + "instant": true, "legendFormat": "{{device_id}}", - "range": true, - "refId": "A" + "range": false, + "refId": "A", + "useBackend": false } ], - "title": "POS items Sold (last 1 hour)", + "title": "PoS Errors (by failure type)", "type": "bargauge" }, { @@ -112,7 +213,7 @@ "fieldConfig": { "defaults": { "color": { - "mode": "palette-classic-by-name" + "mode": "palette-classic" }, "mappings": [], "thresholds": { @@ -137,11 +238,11 @@ }, "gridPos": { "h": 7, - "w": 12, - "x": 12, - "y": 0 + "w": 7, + "x": 17, + "y": 1 }, - "id": 33, + "id": 24, "options": { "displayMode": "lcd", "legend": { @@ -153,7 +254,7 @@ "maxVizHeight": 300, "minVizHeight": 16, "minVizWidth": 8, - "namePlacement": "auto", + "namePlacement": "left", "orientation": "horizontal", "reduceOptions": { "calcs": [ @@ -164,7 +265,7 @@ }, "showUnfilled": true, "sizing": "auto", - "valueMode": "text" + "valueMode": "color" }, "pluginVersion": "11.3.0", "targets": [ @@ -174,7 +275,7 @@ "uid": "${datasource}" }, "editorMode": "code", - "expr": "increase(pos_items_sold_total[1d])", + "expr": "increase(pos_items_sold_total[1h])", "hide": false, "instant": false, "legendFormat": "{{device_id}}", @@ -182,7 +283,7 @@ "refId": "A" } ], - "title": "POS items Sold (last 1 day)", + "title": "POS items Sold (last 1 hour)", "type": "bargauge" }, { @@ -194,7 +295,7 @@ "h": 1, "w": 24, "x": 0, - "y": 7 + "y": 8 }, "id": 22, "options": { @@ -211,6 +312,19 @@ "transparent": true, "type": "text" }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 9 + }, + "id": 40, + "panels": [], + "title": "Self-Checkout", + "type": "row" + }, { "datasource": { "default": false, @@ -241,9 +355,9 @@ "h": 7, "w": 8, "x": 0, - "y": 8 + "y": 10 }, - "id": 26, + "id": 37, "options": { "displayMode": "gradient", "legend": { @@ -319,7 +433,7 @@ "h": 7, "w": 10, "x": 8, - "y": 8 + "y": 10 }, "id": 27, "options": { @@ -395,7 +509,7 @@ "h": 7, "w": 6, "x": 18, - "y": 8 + "y": 10 }, "id": 28, "options": { @@ -452,7 +566,7 @@ "h": 1, "w": 24, "x": 0, - "y": 15 + "y": 17 }, "id": 31, "options": { @@ -469,6 +583,19 @@ "transparent": true, "type": "text" }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 18 + }, + "id": 39, + "panels": [], + "title": "Smart Shelf", + "type": "row" + }, { "datasource": { "type": "prometheus", @@ -517,7 +644,7 @@ "h": 9, "w": 12, "x": 0, - "y": 16 + "y": 19 }, "id": 34, "options": { @@ -614,7 +741,7 @@ "h": 9, "w": 12, "x": 12, - "y": 16 + "y": 19 }, "id": 35, "options": { @@ -666,7 +793,7 @@ "h": 1, "w": 24, "x": 0, - "y": 25 + "y": 28 }, "id": 32, "options": { @@ -683,6 +810,19 @@ "transparent": true, "type": "text" }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 29 + }, + "id": 38, + "panels": [], + "title": "Scale", + "type": "row" + }, { "datasource": { "type": "prometheus", @@ -747,7 +887,7 @@ "h": 7, "w": 12, "x": 0, - "y": 26 + "y": 30 }, "id": 29, "options": { @@ -847,7 +987,7 @@ "h": 7, "w": 12, "x": 12, - "y": 26 + "y": 30 }, "id": 30, "options": { @@ -888,7 +1028,7 @@ "h": 1, "w": 24, "x": 0, - "y": 33 + "y": 37 }, "id": 23, "options": { @@ -917,7 +1057,7 @@ { "current": { "text": "seattle", - "value": "be2drih2vhlvkd" + "value": "de2u8l2s3t7uoa" }, "includeAll": false, "label": "Store", @@ -934,12 +1074,10 @@ "from": "now-5m", "to": "now" }, - "timepicker": { - "hidden": true - }, + "timepicker": {}, "timezone": "browser", "title": "Store / Point-of-Sale (PoS) Assets Health", - "uid": "cbeda37e-ab2f-4778-97dc-9d329290c0b6", - "version": 21, + "uid": "49b00f42-7d2d-47bb-b654-3d61ca9f8d6d", + "version": 7, "weekStart": "" } \ No newline at end of file From 142e7e4e3e61dc934052e01efebf27b05d66d7cb Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 4 Nov 2024 21:13:53 +0200 Subject: [PATCH 249/409] Refactor Azure deployment scripts to remove ACR references and enhance AI secret management --- .../artifacts/PowerShell/AgLogonScript.ps1 | 5 ++-- .../artifacts/PowerShell/Bootstrap.ps1 | 2 -- .../Modules/contoso_hypermarket.psm1 | 14 +++++++---- .../bicep/clientVm/clientVm.bicep | 5 +--- .../bicep/kubernetes/acr.bicep | 25 ------------------- .../bicep/kubernetes/ubuntuRancherNodes.bicep | 5 +++- .../contoso_hypermarket/bicep/main.bicep | 15 ++++------- 7 files changed, 22 insertions(+), 49 deletions(-) delete mode 100644 azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/acr.bicep diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index aedf2c6bfa..228a379de4 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -36,7 +36,6 @@ $global:appsRepo = "jumpstart-agora-apps" if ($scenario -eq "contoso_supermarket") { $global:githubUser = $Env:githubUser $global:githubPat = $Env:GITHUB_TOKEN - $global:acrName = $Env:acrName.ToLower() $global:cosmosDBName = $Env:cosmosDBName $global:cosmosDBEndpoint = $Env:cosmosDBEndpoint $global:gitHubAPIBaseUri = $websiteUrls["githubAPI"] @@ -174,7 +173,9 @@ Deploy-ClusterNamespaces # Setup Azure Container registry pull secret on clusters ##################################################################### Write-Host "[$(Get-Date -Format t)] INFO: Configuring secrets on clusters (Step 9/17)" -ForegroundColor DarkGreen -Deploy-ClusterSecrets +if($scenario -ne "contoso_hypermarket"){ + Deploy-ClusterPullSecrets +} ##################################################################### # Cache contoso-supermarket images on all clusters diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 3d49a45111..e11b4c4d66 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -13,7 +13,6 @@ param ( [string]$workspaceName, [string]$aksStagingClusterName, [string]$iotHubHostName, - [string]$acrName, [string]$cosmosDBName, [string]$cosmosDBEndpoint, [string]$templateBaseUrl, @@ -55,7 +54,6 @@ param ( [System.Environment]::SetEnvironmentVariable('workspaceName', $workspaceName, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('aksStagingClusterName', $aksStagingClusterName, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('iotHubHostName', $iotHubHostName, [System.EnvironmentVariableTarget]::Machine) -[System.Environment]::SetEnvironmentVariable('acrName', $acrName, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('cosmosDBName', $cosmosDBName, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('cosmosDBEndpoint', $cosmosDBEndpoint, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('templateBaseUrl', $templateBaseUrl, [System.EnvironmentVariableTarget]::Machine) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index c69af99606..100fa833b0 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -494,19 +494,23 @@ function Deploy-HypermarketConfigs { } } -function Set-AzureOpenAISecrets { +function Set-AzureAISecrets { + $AIServiceAccountName = $(az cognitiveservices account list -g $resourceGroup --query [].name -o tsv) + $AIServicesEndpoints = $(az cognitiveservices account show --name $AIServiceAccountName --resource-group $resourceGroup --query properties.endpoints) | ConvertFrom-Json -AsHashtable + $speechToTextEndpoint = $AIServicesEndpoints['Speech Services Speech to Text (Standard)'] + $openAIEndpoint = $AIServicesEndpoints['OpenAI Language Model Instance API'] + $AIServicesKey = $(az cognitiveservices account keys list --name $AIServiceAccountName --resource-group $resourceGroup --query key1 -o tsv) + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { $clusterName = $cluster.Name.ToLower() Write-Host "[$(Get-Date -Format t)] INFO: Deploying AI services Secret to the $clusterName cluster" -ForegroundColor Gray Write-Host "`n" - $AIServiceAccountName = $(az cognitiveservices account list -g $resourceGroup --query [].name -o tsv) - $openAIEndpoint = $(az cognitiveservices account show --name $AIServiceAccountName --resource-group $resourceGroup --query properties.endpoint -o tsv) - $openAIKey = $(az cognitiveservices account keys list --name $AIServiceAccountName --resource-group $resourceGroup --query key1 -o tsv) kubectx $clusterName kubectl create secret generic azure-openai-secret ` --namespace=contoso-hypermarket ` --from-literal=azure-openai-endpoint=$openAIEndpoint ` - --from-literal=azure-openai-api-key=$openAIKey + --from-literal=azure-openai-key=$AIServicesKey ` + --from-literal=azure-speech-to-text-endpoint=$speechToTextEndpoint } } diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep index 47a5682a11..d9e315305a 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep @@ -56,9 +56,6 @@ param deployBastion bool = false @description('Storage account used for staging file artifacts') param storageAccountName string -@description('The login server name of the Azure Container Registry') -param acrName string - @description('Override default RDP port using this parameter. Default is 3389. No changes will be made to the client VM.') param rdpPort string = '3389' @@ -204,7 +201,7 @@ resource vmBootstrap 'Microsoft.Compute/virtualMachines/extensions@2022-11-01' = fileUris: [ uri(templateBaseUrl, 'artifacts/PowerShell/Bootstrap.ps1') ] - commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnObjectId ${spnObjectId} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -acrName ${acrName} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName} -k3sArcClusterName ${k3sArcClusterName} -k3sArcDataClusterName ${k3sArcDataClusterName} -openAIEndpoint ${openAIEndpoint} -speachToTextEndpoint ${speachToTextEndpoint} -vmAutologon ${vmAutologon}' + commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnObjectId ${spnObjectId} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName} -k3sArcClusterName ${k3sArcClusterName} -k3sArcDataClusterName ${k3sArcDataClusterName} -openAIEndpoint ${openAIEndpoint} -speachToTextEndpoint ${speachToTextEndpoint} -vmAutologon ${vmAutologon}' } } } diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/acr.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/acr.bicep deleted file mode 100644 index c864f1db59..0000000000 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/acr.bicep +++ /dev/null @@ -1,25 +0,0 @@ -@description('The location of the Managed Cluster resource') -param location string = resourceGroup().location - -@description('Resource tag for Jumpstart Agora') -param resourceTags object = { - Project: 'Jumpstart_Agora' -} - -@description('Name of the Azure Container Registry') -param acrName string - -@description('Provide a tier of your Azure Container Registry.') -param acrSku string = 'Basic' - -resource acr 'Microsoft.ContainerRegistry/registries@2023-01-01-preview' ={ - name: acrName - location: location - tags: resourceTags - sku: { - name: acrSku - } - properties: { - adminUserEnabled: true - } -} diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep index aea2f9b508..879a162cd8 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep @@ -37,9 +37,12 @@ param storageContainerName string @description('Random GUID') param namingGuid string +@description('Option to deploy GPU-enabled nodes for the K3s Worker nodes.') +param deployGPUNodes bool = false + var networkInterfaceName = '${vmName}-NIC' var osDiskType = 'Premium_LRS' -var vmSize = 'Standard_D8s_v5' +var vmSize = deployGPUNodes ? 'Standard_NV4as_v4' : 'Standard_D8s_v5' var diskSize = 512 resource networkInterface 'Microsoft.Network/networkInterfaces@2022-01-01' = { diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index 181b57becc..55b1af946e 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -98,6 +98,9 @@ param akvNameSite1 string = 'agakv1${namingGuid}' @description('The name of the Key Vault for site 2') param akvNameSite2 string = 'agakv2${namingGuid}' +@description('Option to deploy GPU-enabled nodes for the K3s Worker nodes.') +param deployGPUNodes bool = false + @description('The array of OpenAI models to deploy') param azureOpenAIModels array = [ { @@ -182,6 +185,7 @@ module ubuntuRancherK3sDataSvcNodesDeployment 'kubernetes/ubuntuRancherNodes.bic vmName : '${k3sArcDataClusterName}-Node-0${i}' storageContainerName: toLower(k3sArcDataClusterName) namingGuid: namingGuid + deployGPUNodes: deployGPUNodes } dependsOn: [ ubuntuRancherK3sDataSvcDeployment @@ -200,6 +204,7 @@ module ubuntuRancherK3sNodesDeployment 'kubernetes/ubuntuRancherNodes.bicep' = [ vmName : '${k3sArcClusterName}-Node-0${i}' storageContainerName: toLower(k3sArcClusterName) namingGuid: namingGuid + deployGPUNodes: deployGPUNodes } dependsOn: [ ubuntuRancherK3sDeployment @@ -222,7 +227,6 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { githubBranch: githubBranch location: location subnetId: networkDeployment.outputs.cloudSubnetId - acrName: acrName rdpPort: rdpPort namingGuid: namingGuid scenario: scenario @@ -235,15 +239,6 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { speachToTextEndpoint: azureOpenAI.outputs.speechToTextEndpoint } } - -module acr 'kubernetes/acr.bicep' = { - name: 'acrDeployment' - params: { - acrName: acrName - location: location - } -} - module keyVault 'data/keyVault.bicep' = { name: 'keyVaultDeployment' params: { From fb4baa8ddd75df7322810282e02ff10267dee9ec Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 4 Nov 2024 21:19:48 +0200 Subject: [PATCH 250/409] add LB and nsg --- .../bicep/mgmt/network.bicep | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep index 09fa4ae2e0..1d5ed07c27 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep @@ -211,6 +211,19 @@ resource networkSecurityGroupCloud 'Microsoft.Network/networkSecurityGroups@2023 destinationPortRange: '32323' } } + { + name: 'allow_external_agora_traffic' + properties: { + priority: 1080 + protocol: 'Tcp' + access: 'Allow' + direction: 'Inbound' + sourceAddressPrefix: '*' + sourcePortRange: '*' + destinationAddressPrefix: '*' + destinationPortRange: '5000-5003,8001,3000' + } + } ] } } @@ -362,6 +375,39 @@ resource bastionHost 'Microsoft.Network/bastionHosts@2023-02-01' = if (deployBas } } +resource loadBalancerPip 'Microsoft.Network/publicIPAddresses@2024-01-01' = { + name: 'Ag-LB-Public-IP' + location: location + properties: { + publicIPAllocationMethod: 'Static' + publicIPAddressVersion: 'IPv4' + idleTimeoutInMinutes: 4 + } + sku: { + name: 'Standard' + } +} + +resource loadBalancer 'Microsoft.Network/loadBalancers@2024-01-01' = { + name: 'Ag-LoadBalancer-}' + location: location + sku: { + name: 'Standard' + } + properties: { + frontendIPConfigurations: [ + { + name: 'Ag-LB-Frontend' + properties: { + publicIPAddress: { + id: loadBalancerPip.id + } + } + } + ] + } +} + output vnetId string = cloudVirtualNetwork.id output k3sSubnetId string = cloudVirtualNetwork.properties.subnets[0].id output cloudSubnetId string = cloudVirtualNetwork.properties.subnets[1].id From 70df3a91304d2c079cfd554be0cc18dc760ee1a4 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Mon, 4 Nov 2024 14:24:17 -0500 Subject: [PATCH 251/409] add regex --- .../monitoring/grafana-app-store-pos.json | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-pos.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-pos.json index d06c305874..1d10320f03 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-pos.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-pos.json @@ -111,6 +111,13 @@ ], "title": "PoS Errors (Top 5)", "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "(.*)_(.*)", + "renamePattern": "$1 $2" + } + }, { "id": "renameByRegex", "options": { @@ -202,6 +209,22 @@ } ], "title": "PoS Errors (by failure type)", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "(.*)_(.*)", + "renamePattern": "$1 $2" + } + }, + { + "id": "renameByRegex", + "options": { + "regex": "(.*)_(.*)", + "renamePattern": "$1 $2" + } + } + ], "type": "bargauge" }, { @@ -1078,6 +1101,6 @@ "timezone": "browser", "title": "Store / Point-of-Sale (PoS) Assets Health", "uid": "49b00f42-7d2d-47bb-b654-3d61ca9f8d6d", - "version": 7, + "version": 9, "weekStart": "" } \ No newline at end of file From 03cc6bd8bd6ffcbfc38f6de700b8705d10cbe3b5 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 4 Nov 2024 21:37:10 +0200 Subject: [PATCH 252/409] Remove service principal object ID parameters and role assignments from Bicep files --- .../artifacts/PowerShell/AgLogonScript.ps1 | 4 ++- .../contoso_hypermarket/bicep/ai/aoai.bicep | 8 ++--- .../bicep/clientVm/clientVm.bicep | 7 ++-- .../bicep/data/keyVault.bicep | 8 ++--- .../contoso_hypermarket/bicep/main.bicep | 32 ++++++++----------- .../bicep/mgmt/storageAccount.bicep | 8 ++--- .../bicep/storage/storageAccount.bicep | 8 ++--- 7 files changed, 37 insertions(+), 38 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 228a379de4..9521b4b6b4 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -31,9 +31,9 @@ $global:adxClusterName = $Env:adxClusterName $global:namingGuid = $Env:namingGuid $global:adminPassword = $Env:adminPassword $global:customLocationRPOID = $Env:customLocationRPOID -$global:appUpstreamRepo = "https://github.com/microsoft/jumpstart-agora-apps" $global:appsRepo = "jumpstart-agora-apps" if ($scenario -eq "contoso_supermarket") { + $global:appUpstreamRepo = "https://github.com/microsoft/jumpstart-agora-apps" $global:githubUser = $Env:githubUser $global:githubPat = $Env:GITHUB_TOKEN $global:cosmosDBName = $Env:cosmosDBName @@ -42,6 +42,7 @@ if ($scenario -eq "contoso_supermarket") { $global:workflowStatus = "" $global:appClonedRepo = "https://github.com/$githubUser/jumpstart-agora-apps" }elseif ($scenario -eq "contoso_motors") { + $global:appUpstreamRepo = "https://github.com/microsoft/jumpstart-agora-apps" $global:aioNamespace = "azure-iot-operations" $global:mqListenerService = "aio-mq-dmqtt-frontend" $global:mqttExplorerReleasesUrl = $websiteUrls["mqttExplorerReleases"] @@ -49,6 +50,7 @@ if ($scenario -eq "contoso_supermarket") { $global:aioStorageAccountName = $Env:aioStorageAccountName $global:spnObjectId = $Env:spnObjectId }elseif ($scenario -eq "contoso_hypermarket"){ + $global:appUpstreamRepo = "https://github.com/Azure/jumpstart-apps" $global:aioNamespace = "azure-iot-operations" $global:mqListenerService = "aio-broker-insecure" $global:mqttExplorerReleasesUrl = $websiteUrls["mqttExplorerReleases"] diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep index 15ed8aad8a..18af0ff734 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep @@ -10,8 +10,8 @@ param openAISkuName string = 'S0' @description('The type of Cognitive Services account to create') param cognitiveSvcType string = 'AIServices' -@description('Azure service principal object id') -param spnObjectId string +//@description('Azure service principal object id') +//param spnObjectId string @description('The array of OpenAI models to deploy') param azureOpenAIModels array = [ @@ -58,7 +58,7 @@ resource openAIModelsDeployment 'Microsoft.CognitiveServices/accounts/deployment }] // Add role assignment for the SPN: Cognitive Services OpenAI Contributor -resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { +/*resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { name: guid(spnObjectId, resourceGroup().id, 'a001fd3d-188f-4b5d-821b-7da978bf7442') scope: resourceGroup() properties: { @@ -68,7 +68,7 @@ resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { description: 'Cognitive Services OpenAI Contributor' } -} +}*/ output openAIEndpoint string = filter(items(openAIAccount.properties.endpoints), endpoint => endpoint.key == 'OpenAI Language Model Instance API')[0].value output speechToTextEndpoint string = filter(items(openAIAccount.properties.endpoints), endpoint => endpoint.key == 'Speech Services Speech to Text')[0].value \ No newline at end of file diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep index d9e315305a..5c8cadc853 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep @@ -30,7 +30,7 @@ param resourceTags object = { @description('Resource Id of the subnet in the virtual network') param subnetId string -@description('Client id of the service principal') +/*@description('Client id of the service principal') param spnClientId string @description('Azure service principal object id') @@ -40,9 +40,10 @@ param spnObjectId string @secure() param spnClientSecret string param spnAuthority string = environment().authentication.loginEndpoint +*/ @description('Tenant id of the service principal') -param spnTenantId string +param tenantId string @description('Name for the environment Azure Log Analytics workspace') param workspaceName string @@ -201,7 +202,7 @@ resource vmBootstrap 'Microsoft.Compute/virtualMachines/extensions@2022-11-01' = fileUris: [ uri(templateBaseUrl, 'artifacts/PowerShell/Bootstrap.ps1') ] - commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnObjectId ${spnObjectId} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName} -k3sArcClusterName ${k3sArcClusterName} -k3sArcDataClusterName ${k3sArcDataClusterName} -openAIEndpoint ${openAIEndpoint} -speachToTextEndpoint ${speachToTextEndpoint} -vmAutologon ${vmAutologon}' + commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -tenantId ${tenantId} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName} -k3sArcClusterName ${k3sArcClusterName} -k3sArcDataClusterName ${k3sArcDataClusterName} -openAIEndpoint ${openAIEndpoint} -speachToTextEndpoint ${speachToTextEndpoint} -vmAutologon ${vmAutologon}' } } } diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep index f9b83d33bb..3eba416414 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep @@ -13,8 +13,8 @@ param akvSku string = 'standard' @description('Azure Key Vault tenant ID') param tenantId string = subscription().tenantId -@description('Azure service principal object id') -param spnObjectId string +//@description('Azure service principal object id') +//param spnObjectId string @description('Secret name') param aioPlaceHolder string = 'azure-iot-operations' @@ -74,7 +74,7 @@ resource aioSecretPlaceholder2 'Microsoft.KeyVault/vaults/secrets@2023-02-01' = } // Add role assignment for the SPN: Key Vault Secrets Officer -resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { +/*resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { name: guid(spnObjectId, resourceGroup().id, 'b86a8fe4-44ce-4948-aee5-eccb2c155cd7') scope: resourceGroup() properties: { @@ -84,7 +84,7 @@ resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { description: 'Key Vault Secrets Officer' } -} +}*/ /* // Add role assignment for the SPN: Key Vault Secrets Officer diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index 55b1af946e..d192bccbea 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -1,15 +1,16 @@ -@description('Azure service principal client id') +/*@description('Azure service principal client id') param spnClientId string @description('Azure service principal client secret') @secure() param spnClientSecret string -@description('Azure AD tenant id for your service principal') -param spnTenantId string - @description('Azure service principal object id') param spnObjectId string +*/ + +@description('Azure AD tenant id for your service principal') +param tenantId string @description('Location for all resources') param location string = resourceGroup().location @@ -72,11 +73,6 @@ param aioStorageAccountName string = 'aiostg${namingGuid}' @description('The custom location RPO ID') param customLocationRPOID string -@minLength(5) -@maxLength(50) -@description('Name of the Azure Container Registry') -param acrName string = 'agacr${namingGuid}' - @description('Override default RDP port using this parameter. Default is 3389. No changes will be made to the client VM.') param rdpPort string = '3389' @@ -139,7 +135,7 @@ module storageAccountDeployment 'mgmt/storageAccount.bicep' = { name: 'storageAccountDeployment' params: { location: location - spnObjectId: spnObjectId + //spnObjectId: spnObjectId } } @@ -216,9 +212,9 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { params: { windowsAdminUsername: windowsAdminUsername windowsAdminPassword: windowsAdminPassword - spnClientId: spnClientId - spnClientSecret: spnClientSecret - spnTenantId: spnTenantId + //spnClientId: spnClientId + //spnClientSecret: spnClientSecret + tenantId: tenantId workspaceName: logAnalyticsWorkspaceName storageAccountName: storageAccountDeployment.outputs.storageAccountName templateBaseUrl: templateBaseUrl @@ -231,7 +227,7 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { namingGuid: namingGuid scenario: scenario customLocationRPOID: customLocationRPOID - spnObjectId: spnObjectId + //spnObjectId: spnObjectId k3sArcClusterName: k3sArcClusterName k3sArcDataClusterName: k3sArcDataClusterName vmAutologon: vmAutologon @@ -242,11 +238,11 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { module keyVault 'data/keyVault.bicep' = { name: 'keyVaultDeployment' params: { - tenantId: spnTenantId + tenantId: tenantId akvNameSite1: akvNameSite1 akvNameSite2: akvNameSite2 location: location - spnObjectId: spnObjectId + //spnObjectId: spnObjectId } } @@ -256,7 +252,7 @@ module storageAccount 'storage/storageAccount.bicep' = { storageAccountName: aioStorageAccountName location: location storageQueueName: storageQueueName - spnObjectId: spnObjectId + //spnObjectId: spnObjectId } } @@ -283,6 +279,6 @@ module azureOpenAI 'ai/aoai.bicep' = { location: location openAIAccountName: 'openai${namingGuid}' azureOpenAIModels: azureOpenAIModels - spnObjectId: spnObjectId + //spnObjectId: spnObjectId } } diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/storageAccount.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/storageAccount.bicep index 6e4afde511..ad1addf2f3 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/storageAccount.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/storageAccount.bicep @@ -15,8 +15,8 @@ param resourceTags object = { Project: 'Jumpstart_Agora' } -@description('Azure service principal object id') -param spnObjectId string +//@description('Azure service principal object id') +//param spnObjectId string var storageAccountName = 'agora${uniqueString(resourceGroup().id)}' @@ -35,7 +35,7 @@ resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = { } // Add role assignment for the SPN: Storage Blob Data Contributo -resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { +/*resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { name: guid(spnObjectId, resourceGroup().id, 'ba92f5b4-2d11-453d-a403-e96b0029c9fe') scope: resourceGroup() properties: { @@ -44,7 +44,7 @@ resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { principalType: 'ServicePrincipal' } -} +}*/ output storageAccountName string = storageAccountName diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep index 546b7df08f..8a38a88741 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep @@ -12,8 +12,8 @@ param skuName string = 'Standard_LRS' param storageQueueName string = 'aioQueue' -@description('Azure service principal object id') -param spnObjectId string +//@description('Azure service principal object id') +//param spnObjectId string resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = { name: storageAccountName @@ -39,7 +39,7 @@ resource storageQueue 'Microsoft.Storage/storageAccounts/queueServices/queues@20 } // Add role assignment for the SPN: Storage Blob Data Contributor -resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { +/*resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { name: guid(spnObjectId, resourceGroup().id, 'ba92f5b4-2d11-453d-a403-e96b0029c9fe') scope: resourceGroup() properties: { @@ -49,7 +49,7 @@ resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { description: 'Storage Blob Data Contributor' } -} +}*/ output queueName string = storageQueueName output storageAccountResourceId string = storageAccount.id From e0ddcb49036845230aa1cb2b196d3d8d8b2aba05 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 4 Nov 2024 21:38:16 +0200 Subject: [PATCH 253/409] Update Azure provider registration logic to exclude 'contoso_hypermarket' scenario --- azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index fcfb213d29..12579122a5 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -62,7 +62,7 @@ function Deploy-AzPowerShell { } # Register Azure providers - if ($AgConfig.AzureProviders.Count -ne 0) { + if ($AgConfig.AzureProviders.Count -ne 0 -and $scenario -ne "contoso_hypermarket") { Write-Host "[$(Get-Date -Format t)] INFO: Registering Azure providers in the current subscription: " ($AgConfig.AzureProviders -join ', ') -ForegroundColor Gray foreach ($provider in $AgConfig.AzureProviders) { Register-AzResourceProvider -ProviderNamespace $provider | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\AzPowerShell.log") From 2d2b3fc90710c716a3e443351680ba46617393cf Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 4 Nov 2024 21:44:19 +0200 Subject: [PATCH 254/409] Update tenant ID handling in PowerShell scripts for contoso_hypermarket scenario --- azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 | 3 ++- azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 | 2 ++ azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 | 2 +- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 9521b4b6b4..22d7118201 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -51,6 +51,7 @@ if ($scenario -eq "contoso_supermarket") { $global:spnObjectId = $Env:spnObjectId }elseif ($scenario -eq "contoso_hypermarket"){ $global:appUpstreamRepo = "https://github.com/Azure/jumpstart-apps" + $global:tenantId = $Env:tenantId $global:aioNamespace = "azure-iot-operations" $global:mqListenerService = "aio-broker-insecure" $global:mqttExplorerReleasesUrl = $websiteUrls["mqttExplorerReleases"] @@ -58,7 +59,7 @@ if ($scenario -eq "contoso_supermarket") { $global:aioStorageAccountName = $Env:aioStorageAccountName $global:k3sArcDataClusterName = $Env:k3sArcDataClusterName $global:k3sArcClusterName = $Env:k3sArcClusterName - $global:spnObjectId = $Env:spnObjectId + #$global:spnObjectId = $Env:spnObjectId $global:openAIEndpoint = $Env:openAIEndpoint $global:speachToTextEndpoint = $Env:speachToTextEndpoint } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index e11b4c4d66..ca114f393d 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -6,6 +6,7 @@ param ( [string]$spnObjectId, [string]$spnTenantId, [string]$spnAuthority, + [string]$tenantId, [string]$subscriptionId, [string]$resourceGroup, [string]$azureLocation, @@ -46,6 +47,7 @@ param ( [System.Environment]::SetEnvironmentVariable('SPN_CLIENT_ID', $spnClientId, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('SPN_CLIENT_SECRET', $spnClientSecret, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('SPN_TENANT_ID', $spnTenantId, [System.EnvironmentVariableTarget]::Machine) +[System.Environment]::SetEnvironmentVariable('tenantId', $tenantId, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('SPN_AUTHORITY', $spnAuthority, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('resourceGroup', $resourceGroup, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('subscriptionId', $subscriptionId, [System.EnvironmentVariableTarget]::Machine) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index 12579122a5..b39b3625ca 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -33,7 +33,7 @@ function Deploy-AzCLI { function Deploy-AzPowerShell { if($scenario -eq "contoso_hypermarket"){ - Connect-AzAccount -Identity -Tenant $Env:spnTenantId -Subscription $subscriptionId + Connect-AzAccount -Identity -Tenant $Env:tenantId -Subscription $subscriptionId } else { $azurePassword = ConvertTo-SecureString $Env:spnClientSecret -AsPlainText -Force diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 100fa833b0..e7051b7c44 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -357,7 +357,7 @@ function Set-MicrosoftFabric { $configJson = @" { - "tenantID": "$Env:spnTenantId", + "tenantID": "$Env:tenantId", "subscriptionID": "$Env:subscriptionId", "runAs": "$runFabricSetupAs", "azureLocation": "$Env:azureLocation", From f61620a6ac2d56e1136beed8da46c0831250af0a Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 4 Nov 2024 21:47:45 +0200 Subject: [PATCH 255/409] Refactor destination port range configuration in network Bicep file for clarity --- .../contoso_hypermarket/bicep/mgmt/network.bicep | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep index 1d5ed07c27..823d2bf544 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep @@ -221,7 +221,11 @@ resource networkSecurityGroupCloud 'Microsoft.Network/networkSecurityGroups@2023 sourceAddressPrefix: '*' sourcePortRange: '*' destinationAddressPrefix: '*' - destinationPortRange: '5000-5003,8001,3000' + destinationPortRanges: [ + '5000-5003' + '8001' + '3000' + ] } } ] From 624c31a54925154fb561d55fb7427bb076ccdb07 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 4 Nov 2024 21:48:16 +0200 Subject: [PATCH 256/409] Update SKU name for OpenAI model deployment in Bicep file --- azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep index 18af0ff734..0938d38e40 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep @@ -42,7 +42,7 @@ resource openAIModelsDeployment 'Microsoft.CognitiveServices/accounts/deployment parent: openAIAccount name: '${openAIAccountName}-${model.name}-deployment' sku: { - name: 'GlobalStandard' + name: 'Standard' capacity: 50 } properties: { From b0fd2363408684b71cd660d10e6e16cbd8d6ec80 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 4 Nov 2024 21:49:36 +0200 Subject: [PATCH 257/409] Fix load balancer name formatting in network Bicep file --- azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep index 823d2bf544..4407ec60fa 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep @@ -393,7 +393,7 @@ resource loadBalancerPip 'Microsoft.Network/publicIPAddresses@2024-01-01' = { } resource loadBalancer 'Microsoft.Network/loadBalancers@2024-01-01' = { - name: 'Ag-LoadBalancer-}' + name: 'Ag-LoadBalancer' location: location sku: { name: 'Standard' From 4125cbff1d7a051e865a30f34dd55ca80e0ce1a3 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 4 Nov 2024 22:18:05 +0200 Subject: [PATCH 258/409] Refactor secret handling in PowerShell scripts and Bicep parameters for contoso_hypermarket scenario --- .../artifacts/PowerShell/AgLogonScript.ps1 | 4 +++- .../PowerShell/Modules/contoso_hypermarket.psm1 | 6 +----- .../contoso_hypermarket/bicep/main.bicepparam | 5 +---- .../contoso_hypermarket/bicep/main.parameters.json | 11 +---------- 4 files changed, 6 insertions(+), 20 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 22d7118201..540d0adc8a 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -233,7 +233,9 @@ if ($scenario -eq "contoso_motors") { Deploy-AIO-M3 $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray - Set-AzureOpenAISecrets + Set-AIServiceSecrets + Set-EventHubSecrets + Set-SQLSecret } ############################################################## diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index e7051b7c44..52130041a6 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -494,7 +494,7 @@ function Deploy-HypermarketConfigs { } } -function Set-AzureAISecrets { +function Set-AIServiceSecrets { $AIServiceAccountName = $(az cognitiveservices account list -g $resourceGroup --query [].name -o tsv) $AIServicesEndpoints = $(az cognitiveservices account show --name $AIServiceAccountName --resource-group $resourceGroup --query properties.endpoints) | ConvertFrom-Json -AsHashtable $speechToTextEndpoint = $AIServicesEndpoints['Speech Services Speech to Text (Standard)'] @@ -539,8 +539,4 @@ function Set-SQLSecret { --namespace=contoso-hypermarket ` --from-literal=azure-sqlpassword-secret=$Env:adminPassword } -} - -function Set-SpeechTotextConnectionString { - } \ No newline at end of file diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicepparam b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicepparam index 4778d1b37f..e2b99eb3e8 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicepparam +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicepparam @@ -1,9 +1,6 @@ using 'main.bicep' -param spnClientId = '' -param spnClientSecret = '' -param spnTenantId = '' -param spnObjectId = '' +param tenantId = '' param windowsAdminUsername = 'agora' param windowsAdminPassword = 'ArcPassword123!!' param deployBastion = false diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.parameters.json b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.parameters.json index 07cd247fe2..490b6b9161 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.parameters.json +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.parameters.json @@ -2,16 +2,7 @@ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { - "spnClientId": { - "value": "" - }, - "spnClientSecret": { - "value": "" - }, - "spnTenantId": { - "value": "" - }, - "spnObjectId": { + "tenantId": { "value": "" }, "windowsAdminUsername": { From e46791d6775390d5c693e402f3c07473d1b113dd Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 4 Nov 2024 22:18:29 +0200 Subject: [PATCH 259/409] Add deployment of Hypermarket configurations in AgLogonScript for contoso_hypermarket scenario --- azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 540d0adc8a..184881b6e0 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -231,6 +231,7 @@ if ($scenario -eq "contoso_motors") { Deploy-MQTTExplorer -mqttIpArray $mqttIpArray }elseif($scenario -eq "contoso_hypermarket"){ Deploy-AIO-M3 + Deploy-HypermarketConfigs $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray Set-AIServiceSecrets From 2e178151f86bc4d3185e7d84dcdbb96536ccaf3e Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 4 Nov 2024 22:36:39 +0200 Subject: [PATCH 260/409] Remove unused parameter 'stcontainerName' from client VM module and clean up command execution in Bootstrap script --- azure_jumpstart_ag/contoso_motors/bicep/clientVm/clientVm.bicep | 2 +- azure_jumpstart_ag/contoso_motors/bicep/main.bicep | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/contoso_motors/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_motors/bicep/clientVm/clientVm.bicep index 1a4405968d..4ab4bf32f1 100644 --- a/azure_jumpstart_ag/contoso_motors/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_motors/bicep/clientVm/clientVm.bicep @@ -206,7 +206,7 @@ resource vmBootstrap 'Microsoft.Compute/virtualMachines/extensions@2022-11-01' = fileUris: [ uri(templateBaseUrl, 'artifacts/PowerShell/Bootstrap.ps1') ] - commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnObjectId ${spnObjectId} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -acrName ${acrName} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -adxClusterName ${adxClusterName} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName} -stcontainerName ${stcontainerName} -vmAutologon ${vmAutologon}' + commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -spnClientId ${spnClientId} -spnClientSecret ${spnClientSecret} -spnObjectId ${spnObjectId} -spnTenantId ${spnTenantId} -spnAuthority ${spnAuthority} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -acrName ${acrName} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -adxClusterName ${adxClusterName} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName} -vmAutologon ${vmAutologon}' } } } diff --git a/azure_jumpstart_ag/contoso_motors/bicep/main.bicep b/azure_jumpstart_ag/contoso_motors/bicep/main.bicep index a556eb7c52..a2932d6149 100644 --- a/azure_jumpstart_ag/contoso_motors/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_motors/bicep/main.bicep @@ -145,7 +145,6 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { customLocationRPOID: customLocationRPOID scenario: scenario aioStorageAccountName: aioStorageAccountName - stcontainerName: stcontainerName vmAutologon: vmAutologon } } From 24e4ebc31fbc0acee3deaa3944d5bf406a00c674 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 4 Nov 2024 23:11:53 +0200 Subject: [PATCH 261/409] Rename function 'Deploy-ClusterPullSecrets' to 'Deploy-ClusterSecrets' for clarity in AgLogonScript --- azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 184881b6e0..2e3396db8b 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -177,7 +177,7 @@ Deploy-ClusterNamespaces ##################################################################### Write-Host "[$(Get-Date -Format t)] INFO: Configuring secrets on clusters (Step 9/17)" -ForegroundColor DarkGreen if($scenario -ne "contoso_hypermarket"){ - Deploy-ClusterPullSecrets + Deploy-ClusterSecrets } ##################################################################### From a26c7ca002b1a6b3502fc8d2179525c25f9860a7 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Mon, 4 Nov 2024 23:39:34 +0200 Subject: [PATCH 262/409] Enhance Hypermarket deployment script by adding 'Branch' parameter and improving GitOps configuration handling --- .../AgConfig-contoso-hypermarket.psd1 | 2 ++ .../artifacts/PowerShell/AgLogonScript.ps1 | 2 +- .../Modules/contoso_hypermarket.psm1 | 28 +++++++------------ 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index 9b06c263a0..a24265e567 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -155,6 +155,7 @@ FriendlyName = "Seattle" GrafanaDataSource = "seattle" Type = "k3s" + Branch = "main" HelmValuesFile = "prometheus-additional-scrape-config.yaml" HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" HelmService = "service/prometheus-kube-prometheus-prometheus" @@ -165,6 +166,7 @@ FriendlyName = "Chicago" GrafanaDataSource = "chicago" Type = "k3s" + Branch = "main" HelmValuesFile = "prometheus-additional-scrape-config.yaml" HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" HelmService = "service/prometheus-kube-prometheus-prometheus" diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 2e3396db8b..71995a534c 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -231,9 +231,9 @@ if ($scenario -eq "contoso_motors") { Deploy-MQTTExplorer -mqttIpArray $mqttIpArray }elseif($scenario -eq "contoso_hypermarket"){ Deploy-AIO-M3 - Deploy-HypermarketConfigs $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray + Deploy-HypermarketConfigs Set-AIServiceSecrets Set-EventHubSecrets Set-SQLSecret diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 52130041a6..4db9b8b4f2 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -406,23 +406,6 @@ function Deploy-HypermarketConfigs { Write-Host "[$(Get-Date -Format t)] INFO: Creating GitOps config for $configName on $($cluster.Value.ArcClusterName+"-$namingGuid")" -ForegroundColor Gray $type = "connectedClusters" - # Wait for Kubernetes API server to become available - $apiServer = kubectl config view --context $cluster.Name.ToLower() --minify -o jsonpath='{.clusters[0].cluster.server}' - $apiServerAddress = $apiServer -replace '.*https://| .*$' - $apiServerFqdn = ($apiServerAddress -split ":")[0] - $apiServerPort = ($apiServerAddress -split ":")[1] - - do { - $result = Test-NetConnection -ComputerName $apiServerFqdn -Port $apiServerPort -WarningAction SilentlyContinue - if ($result.TcpTestSucceeded) { - break - } - else { - Start-Sleep -Seconds 5 - } - } while ($true) - - az k8s-configuration flux create ` --cluster-name $clusterName ` --resource-group $resourceGroup ` @@ -492,6 +475,15 @@ function Deploy-HypermarketConfigs { } } } + while ($(Get-Job -Name gitops).State -eq 'Running') { + Write-Host "[$(Get-Date -Format t)] INFO: Waiting for GitOps configuration to complete on all clusters...waiting 60 seconds" -ForegroundColor Gray + Receive-Job -Name gitops -WarningAction SilentlyContinue + Start-Sleep -Seconds 60 + } + + Get-Job -name gitops | Remove-Job + Write-Host "[$(Get-Date -Format t)] INFO: GitOps configuration complete." -ForegroundColor Green + Write-Host } function Set-AIServiceSecrets { @@ -521,7 +513,7 @@ function Set-EventHubSecrets { Write-Host "`n" $eventHubNamespace = $(az eventhubs namespace list -g $resourceGroup --query [].name -o tsv) $eventHubName = $(az eventhubs eventhub list -g $resourceGroup --namespace-name $eventHubNamespace --query [].name -o tsv) - $eventHubConnectionString = $(az eventhubs authorization-rule keys list --resource-group $resourceGroup --namespace-name $eventHubNamespace --eventhub-name $eventHubName --name RootManageSharedAccessKey --query primaryConnectionString -o tsv) + $eventHubConnectionString = $(az eventhubs eventhub authorization-rule keys list --resource-group $resourceGroup --namespace-name $eventHubNamespace --eventhub-name $eventHubName --name RootManageSharedAccessKey --query primaryConnectionString -o tsv) kubectx $clusterName kubectl create secret generic azure-eventhub-secret ` --namespace=contoso-hypermarket ` From 2d63adc59d019ede2ba42a662ba15a95da1d0da9 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 5 Nov 2024 00:24:17 +0200 Subject: [PATCH 263/409] Add GPU nodes deployment parameter and improve logging in AgLogonScript --- azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 | 4 ++-- azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicepparam | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 71995a534c..ff93b23d66 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -175,8 +175,8 @@ Deploy-ClusterNamespaces ##################################################################### # Setup Azure Container registry pull secret on clusters ##################################################################### -Write-Host "[$(Get-Date -Format t)] INFO: Configuring secrets on clusters (Step 9/17)" -ForegroundColor DarkGreen if($scenario -ne "contoso_hypermarket"){ + Write-Host "[$(Get-Date -Format t)] INFO: Configuring secrets on clusters (Step 9/17)" -ForegroundColor DarkGreen Deploy-ClusterSecrets } @@ -190,8 +190,8 @@ if ($scenario -eq "contoso_supermarket") { ##################################################################### # Connect the AKS Edge Essentials clusters and hosts to Azure Arc ##################################################################### -Write-Host "[$(Get-Date -Format t)] INFO: Connecting AKS Edge clusters to Azure with Azure Arc (Step 10/17)" -ForegroundColor DarkGreen if($scenario -eq "contoso_supermarket" -or $scenario -eq "contoso_motors"){ + Write-Host "[$(Get-Date -Format t)] INFO: Connecting AKS Edge clusters to Azure with Azure Arc (Step 10/17)" -ForegroundColor DarkGreen Deploy-AzArcK8sAKSEE } diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicepparam b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicepparam index e2b99eb3e8..cbbb2a35fa 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicepparam +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicepparam @@ -7,3 +7,4 @@ param deployBastion = false param customLocationRPOID = '' param sshRSAPublicKey = '' param fabricCapacityAdmin = '' +param deployGPUNodes = false From 75c98a5b7adc9ac2c9b8112d0eebf4f4cd00399f Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 5 Nov 2024 00:33:44 +0200 Subject: [PATCH 264/409] Fix variable scope for scenario check in Deploy-ClusterFluxExtension function --- azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index b39b3625ca..c4a3c7c696 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -754,7 +754,7 @@ function Deploy-ClusterFluxExtension { } } - if($scenario -eq "contoso_hypermarket"){ + if($using:scenario -eq "contoso_hypermarket"){ az login --identity } else { From 100b7ccbf1821f7212fed4e2993d873340da1817 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Mon, 4 Nov 2024 18:23:17 -0500 Subject: [PATCH 265/409] update store insights dashboard --- .../grafana-app-store-shoppers.json | 1791 +++++++++-------- 1 file changed, 939 insertions(+), 852 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-shoppers.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-shoppers.json index 27314fff83..10629e09bb 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-shoppers.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-shoppers.json @@ -21,962 +21,1049 @@ "id": 8, "links": [], "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 46, + "panels": [], + "title": "Aisle Zone", + "type": "row" + }, + { + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 24, + "x": 0, + "y": 1 + }, + "id": 47, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "

\n", + "mode": "html" + }, + "pluginVersion": "11.3.0", + "title": "", + "transparent": true, + "type": "text" + }, { "datasource": { + "default": false, "type": "prometheus", - "uid": "be2drih2vhlvkd" + "uid": "${datasource}" }, "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic-by-name" }, + "fieldMinMax": false, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "light-green", + "color": "green", "value": null } ] } }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "current_shoppers" + }, + "properties": [ + { + "id": "displayName", + "value": "Current Shoppers in the store" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "total_shoppers" + }, + "properties": [ + { + "id": "displayName", + "value": "Total Shoppers today" + } + ] + } + ] }, "gridPos": { - "h": 15, - "w": 12, + "h": 10, + "w": 7, "x": 0, - "y": 0 + "y": 3 }, - "id": 1, + "id": 43, "options": { - "infinitePan": false, - "inlineEditing": true, - "panZoom": false, - "root": { - "background": { - "color": { - "fixed": "#080d08" + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value_and_name", + "wideLayout": true + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "current_shoppers{camera=~\".*stream.*\"}", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "total_shoppers{camera=~\".*stream.*\"}", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "B" + } + ], + "title": "Current / Total Shoppers", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "(.*)_(.*)", + "renamePattern": "$1 $2" + } + } + ], + "type": "stat" + }, + { + "datasource": { + "default": false, + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "shoppers_age_10" }, - "image": { - "field": "Time", - "fixed": "img/bg/p1.png", - "mode": "field" + "properties": [ + { + "id": "displayName", + "value": "Shoppers Age 10" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "shoppers_age_20" }, - "size": "contain" + "properties": [ + { + "id": "displayName", + "value": "Shoppers Age 20" + } + ] }, - "border": { - "color": { - "fixed": "dark-green" + { + "matcher": { + "id": "byName", + "options": "shoppers_age_30" }, - "radius": 0, - "width": 5 - }, - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "elements": [ - { - "background": { - "color": { - "fixed": "dark-green" - }, - "size": "cover" - }, - "border": { - "color": { - "fixed": "dark-green" - } - }, - "config": { - "align": "center", - "color": { - "fixed": "#000000" - }, - "size": 50, - "text": { - "field": "{__name__=\"lighting_brightness_level\", device_id=\"LightingSystem01\", endpoint=\"cerebral-metrics\", instance=\"10.42.1.27:8001\", job=\"cerebral-simulator-service\", namespace=\"contoso-hypermarket\", pod=\"cerebral-simulator-5bb7564f84-mmwnl\", service=\"cerebral-simulator-service\"}", - "fixed": "", - "mode": "field" - }, - "valign": "middle" - }, - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "links": [], - "name": "Element 1", - "oneClickMode": "off", - "placement": { - "height": 121.96614074707031, - "left": 494, - "rotation": 0, - "top": 46, - "width": 354.97393798828125 - }, - "type": "metric-value" + "properties": [ + { + "id": "displayName", + "value": "Shoppers Age 30" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "shoppers_age_40" }, - { - "background": { - "color": { - "fixed": "transparent" - } - }, - "border": { - "color": { - "fixed": "dark-green" - } - }, - "config": { - "align": "center", - "color": { - "fixed": "rgb(204, 204, 220)" - }, - "size": 50, - "text": { - "fixed": "Zone 1" - }, - "valign": "middle" - }, - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "links": [], - "name": "Element 2", - "oneClickMode": "off", - "placement": { - "height": 64.98695373535156, - "left": 103, - "rotation": 0, - "top": 258, - "width": 230 - }, - "type": "text" + "properties": [ + { + "id": "displayName", + "value": "Shoppers Age 40" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "shoppers_age_50" }, - { - "background": { - "color": { - "fixed": "dark-green" - }, - "size": "cover" - }, - "border": { - "color": { - "fixed": "dark-green" - } - }, - "config": { - "align": "center", - "color": { - "fixed": "#000000" - }, - "size": 50, - "text": { - "field": "{__name__=\"lighting_brightness_level\", device_id=\"LightingSystem02\", endpoint=\"cerebral-metrics\", instance=\"10.42.1.27:8001\", job=\"cerebral-simulator-service\", namespace=\"contoso-hypermarket\", pod=\"cerebral-simulator-5bb7564f84-mmwnl\", service=\"cerebral-simulator-service\"}", - "fixed": "", - "mode": "field" - }, - "valign": "middle" - }, - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "links": [], - "name": "Element 3", - "oneClickMode": "off", - "placement": { - "height": 121.97914123535156, - "left": 494, - "rotation": 0, - "top": 229, - "width": 354.9869689941406 - }, - "type": "metric-value" + "properties": [ + { + "id": "displayName", + "value": "Shoppers Age 50" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 7, + "x": 7, + "y": 3 + }, + "id": 42, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value_and_name", + "wideLayout": true + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "shoppers_age_10", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "shoppers_age_20", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "shoppers_age_30", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "shoppers_age_40", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "D" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "shoppers_age_50", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "E" + } + ], + "title": "Shoppers", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "(.*)_(.*)", + "renamePattern": "$1 $2" + } + } + ], + "type": "stat" + }, + { + "datasource": { + "default": false, + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - { - "background": { - "color": { - "fixed": "dark-green" - }, - "image": { - "mode": "fixed" - }, - "size": "cover" - }, - "border": { - "color": { - "fixed": "dark-green" - } - }, - "config": { - "align": "center", - "color": { - "fixed": "#000000" - }, - "size": 50, - "text": { - "field": "{__name__=\"lighting_brightness_level\", device_id=\"LightingSystem03\", endpoint=\"cerebral-metrics\", instance=\"10.42.1.27:8001\", job=\"cerebral-simulator-service\", namespace=\"contoso-hypermarket\", pod=\"cerebral-simulator-5bb7564f84-mmwnl\", service=\"cerebral-simulator-service\"}", - "fixed": "", - "mode": "field" - }, - "valign": "middle" - }, - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "links": [], - "name": "Element 4", - "oneClickMode": "off", - "placement": { - "height": 121.9921875, - "left": 494, - "rotation": 0, - "top": 399, - "width": 354.9869689941406 - }, - "type": "metric-value" + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" }, - { - "background": { - "color": { - "fixed": "transparent" - } - }, - "border": { - "color": { - "fixed": "dark-green" - } - }, - "config": { - "fill": { - "fixed": "#D9D9D9" - }, - "path": { - "fixed": "img/icons/unicons/store.svg", - "mode": "fixed" - } - }, - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "links": [], - "name": "Element 5", - "oneClickMode": "off", - "placement": { - "height": 135, - "left": -1, - "rotation": 0, - "top": 399, - "width": 207.99478149414062 - }, - "type": "icon" + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" }, - { - "background": { - "color": { - "fixed": "transparent" - } - }, - "border": { - "color": { - "fixed": "dark-green" - } - }, - "config": { - "fill": { - "fixed": "#D9D9D9" - }, - "path": { - "fixed": "img/icons/unicons/shopping-cart.svg", - "mode": "fixed" - } - }, - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "links": [], - "name": "Element 6", - "oneClickMode": "off", - "placement": { - "height": 100, - "left": 301, - "rotation": 0, - "top": 399, - "width": 100 - }, - "type": "icon" + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "shoppers_age_10" }, - { - "background": { - "color": { - "fixed": "transparent" - } - }, - "border": { - "color": { - "fixed": "dark-green" - } - }, - "config": { - "align": "center", - "color": { - "fixed": "#010101" - }, - "size": 20, - "text": { - "fixed": "Shoppers age 20" - }, - "valign": "middle" - }, - "connections": [], - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "links": [], - "name": "Element 7", - "oneClickMode": "off", - "placement": { - "height": 50, - "left": 572, - "rotation": 0, - "top": 129, - "width": 198.9973907470703 - }, - "type": "text" + "properties": [ + { + "id": "displayName", + "value": "Shoppers Age 10" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "shoppers_age_20" }, - { - "background": { - "color": { - "fixed": "transparent" - } - }, - "border": { - "color": { - "fixed": "dark-green" - } - }, - "config": { - "align": "center", - "color": { - "fixed": "#010101" - }, - "size": 20, - "text": { - "fixed": "Shoppers age 30" - }, - "valign": "middle" - }, - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "links": [], - "name": "Element 8", - "oneClickMode": "off", - "placement": { - "height": 50, - "left": 572, - "rotation": 0, - "top": 312, - "width": 198.9973907470703 - }, - "type": "text" + "properties": [ + { + "id": "displayName", + "value": "Shoppers Age 20" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "shoppers_age_30" }, - { - "background": { - "color": { - "fixed": "transparent" - } - }, - "border": { - "color": { - "fixed": "dark-green" - } - }, - "config": { - "align": "center", - "color": { - "fixed": "#010101" - }, - "size": 20, - "text": { - "fixed": "Shoppers age 40" - }, - "valign": "middle" - }, - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "links": [], - "name": "Element 9", - "oneClickMode": "off", - "placement": { - "height": 50, - "left": 572, - "rotation": 0, - "top": 477, - "width": 198.9973907470703 - }, - "type": "text" + "properties": [ + { + "id": "displayName", + "value": "Shoppers Age 30" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "shoppers_age_40" }, - { - "background": { - "color": { - "fixed": "transparent" - } - }, - "border": { - "color": { - "fixed": "dark-green" - } - }, - "config": { - "fill": { - "fixed": "#D9D9D9" - }, - "path": { - "fixed": "img/icons/iot/contoso-hypermarket.svg", - "mode": "fixed" - } - }, - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "links": [], - "name": "Element 10", - "oneClickMode": "off", - "placement": { - "height": 82.99480438232422, - "left": 39, - "rotation": 0, - "top": 65, - "width": 415 - }, - "type": "icon" - } - ], - "name": "Element 1730518700970", - "oneClickMode": "off", - "placement": { - "height": 100, - "left": 0, - "rotation": 0, - "top": 0, - "width": 100 - }, - "type": "frame" + "properties": [ + { + "id": "displayName", + "value": "Shoppers Age 40" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "shoppers_age_50" + }, + "properties": [ + { + "id": "displayName", + "value": "Shoppers Age 50" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 10, + "x": 14, + "y": 3 + }, + "id": 26, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, - "showAdvancedTypes": false + "tooltip": { + "mode": "single", + "sort": "none" + } }, "pluginVersion": "11.3.0", "targets": [ { "datasource": { "type": "prometheus", - "uid": "be2drih2vhlvkd" + "uid": "${datasource}" }, "editorMode": "code", - "expr": "lighting_brightness_level", + "expr": "shoppers_age_10", + "hide": false, + "instant": false, "legendFormat": "__auto", "range": true, "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "shoppers_age_20", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "shoppers_age_30", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "shoppers_age_40", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "D" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "shoppers_age_50", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "E" } ], - "title": "", - "type": "canvas" + "title": "Shoppers (by Age)", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "(.*)_(.*)", + "renamePattern": "$1 $2" + } + } + ], + "type": "timeseries" }, { "datasource": { + "default": false, "type": "prometheus", - "uid": "be2drih2vhlvkd" + "uid": "${datasource}" }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, + "fieldMinMax": false, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "light-green", + "color": "blue", "value": null } ] } }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "detected_total_persons" + }, + "properties": [ + { + "id": "displayName", + "value": "Total Persons" + } + ] + } + ] }, "gridPos": { - "h": 15, - "w": 12, - "x": 12, - "y": 0 + "h": 10, + "w": 5, + "x": 0, + "y": 13 }, - "id": 2, + "id": 45, "options": { - "infinitePan": false, - "inlineEditing": true, - "panZoom": false, - "root": { - "background": { - "color": { - "fixed": "#010101" - }, - "image": { - "field": "Time", - "fixed": "img/bg/p1.png", - "mode": "field" - }, - "size": "contain" + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value_and_name", + "wideLayout": true + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" }, - "border": { - "color": { - "fixed": "dark-blue" + "editorMode": "code", + "exemplar": false, + "expr": "detected_total_persons", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A" + } + ], + "title": "Detected Total Persons", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "(.*)_(.*)", + "renamePattern": "$1 $2" + } + } + ], + "type": "stat" + }, + { + "datasource": { + "default": false, + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "hue", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "radius": 0, - "width": 5 - }, - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "elements": [ - { - "background": { - "color": { - "fixed": "dark-blue" - }, - "size": "cover" - }, - "border": { - "color": { - "fixed": "dark-green" - } - }, - "config": { - "align": "center", - "color": { - "fixed": "#000001" - }, - "size": 50, - "text": { - "field": "{__name__=\"lighting_brightness_level\", device_id=\"LightingSystem01\", endpoint=\"cerebral-metrics\", instance=\"10.42.1.27:8001\", job=\"cerebral-simulator-service\", namespace=\"contoso-hypermarket\", pod=\"cerebral-simulator-5bb7564f84-mmwnl\", service=\"cerebral-simulator-service\"}", - "fixed": "", - "mode": "field" - }, - "valign": "middle" - }, - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "links": [], - "name": "Element 1", - "oneClickMode": "off", - "placement": { - "height": 121.96614074707031, - "left": 494, - "rotation": 0, - "top": 46, - "width": 354.97393798828125 - }, - "type": "metric-value" + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" }, - { - "background": { - "color": { - "fixed": "transparent" - } - }, - "border": { - "color": { - "fixed": "dark-green" - } - }, - "config": { - "align": "center", - "color": { - "fixed": "rgb(204, 204, 220)" - }, - "size": 50, - "text": { - "fixed": "Zone 2" - }, - "valign": "middle" - }, - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "links": [], - "name": "Element 2", - "oneClickMode": "off", - "placement": { - "height": 64.98699951171875, - "left": 101, - "top": 258, - "width": 230 - }, - "type": "text" + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" }, - { - "background": { - "color": { - "fixed": "dark-blue" - }, - "size": "cover" - }, - "border": { - "color": { - "fixed": "dark-green" - } - }, - "config": { - "align": "center", - "color": { - "fixed": "#000000" - }, - "size": 50, - "text": { - "field": "{__name__=\"lighting_brightness_level\", device_id=\"LightingSystem02\", endpoint=\"cerebral-metrics\", instance=\"10.42.1.27:8001\", job=\"cerebral-simulator-service\", namespace=\"contoso-hypermarket\", pod=\"cerebral-simulator-5bb7564f84-mmwnl\", service=\"cerebral-simulator-service\"}", - "fixed": "", - "mode": "field" - }, - "valign": "middle" - }, - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "links": [], - "name": "Element 3", - "oneClickMode": "off", - "placement": { - "height": 121.96614074707031, - "left": 494, - "rotation": 0, - "top": 229, - "width": 354.9869689941406 - }, - "type": "metric-value" + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" }, - { - "background": { - "color": { - "fixed": "dark-blue" - }, - "image": { - "mode": "fixed" - }, - "size": "cover" - }, - "border": { - "color": { - "fixed": "dark-green" - }, - "width": 0 - }, - "config": { - "align": "center", - "color": { - "fixed": "#000000" - }, - "size": 50, - "text": { - "field": "{__name__=\"lighting_brightness_level\", device_id=\"LightingSystem03\", endpoint=\"cerebral-metrics\", instance=\"10.42.1.27:8001\", job=\"cerebral-simulator-service\", namespace=\"contoso-hypermarket\", pod=\"cerebral-simulator-5bb7564f84-mmwnl\", service=\"cerebral-simulator-service\"}", - "fixed": "", - "mode": "field" - }, - "valign": "middle" - }, - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "links": [], - "name": "Element 4", - "oneClickMode": "off", - "placement": { - "height": 121.9921875, - "left": 494, - "rotation": 0, - "top": 399, - "width": 354.9869689941406 - }, - "type": "metric-value" + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "detected_total_persons" }, - { - "background": { - "color": { - "fixed": "transparent" - } - }, - "border": { - "color": { - "fixed": "dark-green" - } - }, - "config": { - "fill": { - "fixed": "#D9D9D9" - }, - "path": { - "fixed": "img/icons/unicons/store.svg", - "mode": "fixed" - } - }, - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "links": [], - "name": "Element 5", - "oneClickMode": "off", - "placement": { - "height": 135, - "left": 8, - "top": 387, - "width": 207.99478149414062 - }, - "type": "icon" + "properties": [ + { + "id": "displayName", + "value": "Detected Total Persons" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 7, + "x": 5, + "y": 13 + }, + "id": 44, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "detected_total_persons", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Detected Total Persons", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "(.*)_(.*)", + "renamePattern": "$1 $2" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "default": false, + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "purple", + "value": null + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "detection_fps" }, - { - "background": { - "color": { - "fixed": "transparent" - } - }, - "border": { - "color": { - "fixed": "dark-green" - } - }, - "config": { - "fill": { - "fixed": "#D9D9D9" - }, - "path": { - "fixed": "img/icons/unicons/shopping-cart.svg", - "mode": "fixed" - } - }, - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "links": [], - "name": "Element 6", - "oneClickMode": "off", - "placement": { - "height": 100, - "left": 299, - "top": 399, - "width": 100 - }, - "type": "icon" + "properties": [ + { + "id": "displayName", + "value": "Detection fps" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 5, + "x": 12, + "y": 13 + }, + "id": 50, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value_and_name", + "wideLayout": true + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "detection_fps", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A" + } + ], + "title": "Detected Total Persons", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "(.*)_(.*)", + "renamePattern": "$1 $2" + } + } + ], + "type": "stat" + }, + { + "datasource": { + "default": false, + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "hue", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - { - "background": { - "color": { - "fixed": "transparent" - } - }, - "border": { - "color": { - "fixed": "dark-green" - } - }, - "config": { - "align": "center", - "color": { - "fixed": "#010101" - }, - "size": 20, - "text": { - "fixed": "Shoppers age 20" - }, - "valign": "middle" - }, - "connections": [], - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "links": [], - "name": "Element 7", - "oneClickMode": "off", - "placement": { - "height": 50, - "left": 572, - "rotation": 0, - "top": 129, - "width": 198.9973907470703 - }, - "type": "text" + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" }, - { - "background": { - "color": { - "fixed": "transparent" - } - }, - "border": { - "color": { - "fixed": "dark-green" - } - }, - "config": { - "align": "center", - "color": { - "fixed": "#010101" - }, - "size": 20, - "text": { - "fixed": "Shoppers age 30" - }, - "valign": "middle" - }, - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "links": [], - "name": "Element 8", - "oneClickMode": "off", - "placement": { - "height": 50, - "left": 572, - "rotation": 0, - "top": 312, - "width": 198.9973907470703 - }, - "type": "text" + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" }, - { - "background": { - "color": { - "fixed": "transparent" - } - }, - "border": { - "color": { - "fixed": "dark-green" - } - }, - "config": { - "align": "center", - "color": { - "fixed": "#010101" - }, - "size": 20, - "text": { - "fixed": "Shoppers age 40" - }, - "valign": "middle" - }, - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "links": [], - "name": "Element 9", - "oneClickMode": "off", - "placement": { - "height": 50, - "left": 572, - "rotation": 0, - "top": 477, - "width": 198.9973907470703 - }, - "type": "text" + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" }, - { - "background": { - "color": { - "fixed": "transparent" - } - }, - "border": { - "color": { - "fixed": "dark-green" - } - }, - "config": { - "fill": { - "fixed": "#D9D9D9" - }, - "path": { - "field": "", - "fixed": "img/icons/iot/contoso-hypermarket.svg", - "mode": "fixed" - } - }, - "constraint": { - "horizontal": "left", - "vertical": "top" - }, - "links": [], - "name": "Element 10", - "oneClickMode": "off", - "placement": { - "height": 66.9921875, - "left": 33, - "top": 73, - "width": 416.9921875 - }, - "type": "icon" + "thresholdsStyle": { + "mode": "off" } - ], - "name": "Element 1730518700970", - "oneClickMode": "off", - "placement": { - "height": 100, - "left": 0, - "rotation": 0, - "top": 0, - "width": 100 - }, - "type": "frame" + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "purple", + "value": null + } + ] + } }, - "showAdvancedTypes": false + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "detection_fps" + }, + "properties": [ + { + "id": "displayName", + "value": "Detection fps" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 7, + "x": 17, + "y": 13 + }, + "id": 49, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } }, "pluginVersion": "11.3.0", "targets": [ { "datasource": { "type": "prometheus", - "uid": "be2drih2vhlvkd" + "uid": "${datasource}" }, "editorMode": "code", - "expr": "lighting_brightness_level", + "exemplar": false, + "expr": "detection_fps", + "hide": false, + "instant": false, "legendFormat": "__auto", "range": true, "refId": "A" } ], + "title": "Detection frame per seconds", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "(.*)_(.*)", + "renamePattern": "$1 $2" + } + } + ], + "type": "timeseries" + }, + { + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 23 + }, + "id": 22, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "", + "mode": "markdown" + }, + "pluginVersion": "11.3.0", "title": "", - "type": "canvas" + "transparent": true, + "type": "text" } ], "preload": false, + "refresh": "5s", "schemaVersion": 40, - "tags": [], + "tags": [ + "stores" + ], "templating": { - "list": [] + "list": [ + { + "current": { + "text": "seattle", + "value": "de2u8l2s3t7uoa" + }, + "includeAll": false, + "label": "Store", + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "type": "datasource" + } + ] }, "time": { "from": "now-5m", @@ -985,7 +1072,7 @@ "timepicker": {}, "timezone": "browser", "title": "Store / Shopper Insights", - "uid": "be2p0z52wn1mof", - "version": 4, + "uid": "7a9d9181-fc1c-43ac-b55d-a0da4d93b8cb", + "version": 9, "weekStart": "" } \ No newline at end of file From 1d57111bcf94eaa4d7e2e558ba44c39eb14482ea Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Mon, 4 Nov 2024 18:24:56 -0500 Subject: [PATCH 266/409] update pos --- .../artifacts/monitoring/grafana-app-store-pos.json | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-pos.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-pos.json index 1d10320f03..7ffd87c1d4 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-pos.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-pos.json @@ -897,8 +897,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" } ] }, @@ -997,8 +996,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" } ] }, From 5b0fbffe07c729a5715b55d7a0732c4d1dd1e45d Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Mon, 4 Nov 2024 19:00:39 -0500 Subject: [PATCH 267/409] update insights --- .../monitoring/grafana-app-store-shoppers.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-shoppers.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-shoppers.json index 10629e09bb..3d6d3ae095 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-shoppers.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-shoppers.json @@ -92,7 +92,7 @@ "properties": [ { "id": "displayName", - "value": "Current Shoppers in the store" + "value": "Current shoppers in the store" } ] }, @@ -104,7 +104,7 @@ "properties": [ { "id": "displayName", - "value": "Total Shoppers today" + "value": "Total shoppers today" } ] } @@ -164,7 +164,7 @@ "refId": "B" } ], - "title": "Current / Total Shoppers", + "title": "", "transformations": [ { "id": "renameByRegex", @@ -359,7 +359,7 @@ "refId": "E" } ], - "title": "Shoppers", + "title": "", "transformations": [ { "id": "renameByRegex", @@ -667,7 +667,7 @@ "refId": "A" } ], - "title": "Detected Total Persons", + "title": "", "transformations": [ { "id": "renameByRegex", @@ -880,7 +880,7 @@ "refId": "A" } ], - "title": "Detected Total Persons", + "title": "", "transformations": [ { "id": "renameByRegex", @@ -1073,6 +1073,6 @@ "timezone": "browser", "title": "Store / Shopper Insights", "uid": "7a9d9181-fc1c-43ac-b55d-a0da4d93b8cb", - "version": 9, + "version": 12, "weekStart": "" } \ No newline at end of file From c2e3526e25aa3163e078b00691a172d29492b47a Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Mon, 4 Nov 2024 20:59:44 -0600 Subject: [PATCH 268/409] deploy prometheus before gitops --- .../artifacts/PowerShell/AgLogonScript.ps1 | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index ff93b23d66..437823794a 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -215,6 +215,12 @@ if ($scenario -eq "contoso_supermarket") { --namespace $AgConfig.nginx.Namespace ` --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Nginx.log") } + +############################################################## +# Deploy Kubernetes Prometheus Stack for Observability +############################################################## +Deploy-Prometheus -AgConfig $AgConfig + ##################################################################### # Configuring applications on the clusters using GitOps ##################################################################### @@ -239,11 +245,6 @@ if ($scenario -eq "contoso_motors") { Set-SQLSecret } -############################################################## -# Deploy Kubernetes Prometheus Stack for Observability -############################################################## -Deploy-Prometheus -AgConfig $AgConfig - ##################################################################### # Deploy Azure Workbook for Infrastructure Observability ##################################################################### From d2f07bcb562136e089e660d8a53a82b9a1c6c857 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 5 Nov 2024 08:50:06 +0200 Subject: [PATCH 269/409] cleanup commented code --- .../contoso_hypermarket/bicep/ai/aoai.bicep | 16 ------ .../bicep/clientVm/clientVm.bicep | 12 ---- .../bicep/data/keyVault.bicep | 57 +------------------ .../contoso_hypermarket/bicep/main.bicep | 22 ++----- .../bicep/storage/storageAccount.bicep | 16 ------ 5 files changed, 5 insertions(+), 118 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep index 0938d38e40..9969847f67 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep @@ -10,9 +10,6 @@ param openAISkuName string = 'S0' @description('The type of Cognitive Services account to create') param cognitiveSvcType string = 'AIServices' -//@description('Azure service principal object id') -//param spnObjectId string - @description('The array of OpenAI models to deploy') param azureOpenAIModels array = [ { @@ -57,18 +54,5 @@ resource openAIModelsDeployment 'Microsoft.CognitiveServices/accounts/deployment } }] -// Add role assignment for the SPN: Cognitive Services OpenAI Contributor -/*resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { - name: guid(spnObjectId, resourceGroup().id, 'a001fd3d-188f-4b5d-821b-7da978bf7442') - scope: resourceGroup() - properties: { - principalId: spnObjectId - roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', 'a001fd3d-188f-4b5d-821b-7da978bf7442') - principalType: 'ServicePrincipal' - description: 'Cognitive Services OpenAI Contributor' - - } -}*/ - output openAIEndpoint string = filter(items(openAIAccount.properties.endpoints), endpoint => endpoint.key == 'OpenAI Language Model Instance API')[0].value output speechToTextEndpoint string = filter(items(openAIAccount.properties.endpoints), endpoint => endpoint.key == 'Speech Services Speech to Text')[0].value \ No newline at end of file diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep index 5c8cadc853..4604aa33d1 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep @@ -30,18 +30,6 @@ param resourceTags object = { @description('Resource Id of the subnet in the virtual network') param subnetId string -/*@description('Client id of the service principal') -param spnClientId string - -@description('Azure service principal object id') -param spnObjectId string - -@description('Client secret of the service principal') -@secure() -param spnClientSecret string -param spnAuthority string = environment().authentication.loginEndpoint -*/ - @description('Tenant id of the service principal') param tenantId string diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep index 3eba416414..63353e3d55 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/keyVault.bicep @@ -13,9 +13,6 @@ param akvSku string = 'standard' @description('Azure Key Vault tenant ID') param tenantId string = subscription().tenantId -//@description('Azure service principal object id') -//param spnObjectId string - @description('Secret name') param aioPlaceHolder string = 'azure-iot-operations' @@ -71,56 +68,4 @@ resource aioSecretPlaceholder2 'Microsoft.KeyVault/vaults/secrets@2023-02-01' = properties: { value: aioPlaceHolderValue } -} - -// Add role assignment for the SPN: Key Vault Secrets Officer -/*resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { - name: guid(spnObjectId, resourceGroup().id, 'b86a8fe4-44ce-4948-aee5-eccb2c155cd7') - scope: resourceGroup() - properties: { - principalId: spnObjectId - roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', 'b86a8fe4-44ce-4948-aee5-eccb2c155cd7') - principalType: 'ServicePrincipal' - description: 'Key Vault Secrets Officer' - - } -}*/ - -/* -// Add role assignment for the SPN: Key Vault Secrets Officer -resource roleAssignmentAIOSeattle 'Microsoft.Authorization/roleAssignments@2022-04-01' = { - name: guid(userAssignedManagedIdentitySeattle.name, resourceGroup().id, 'b86a8fe4-44ce-4948-aee5-eccb2c155cd7') - scope: resourceGroup() - properties: { - principalId: userAssignedManagedIdentitySeattle.properties.principalId - roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', 'b86a8fe4-44ce-4948-aee5-eccb2c155cd7') - principalType: 'ServicePrincipal' - description: 'Key Vault Secrets Officer' - - } -} - -// Add role assignment for the SPN: Key Vault Secrets Officer -resource roleAssignmentAIOChicago 'Microsoft.Authorization/roleAssignments@2022-04-01' = { - name: guid(userAssignedManagedIdentityChicago.name, resourceGroup().id, 'b86a8fe4-44ce-4948-aee5-eccb2c155cd7') - scope: resourceGroup() - properties: { - principalId: userAssignedManagedIdentityChicago.properties.principalId - roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', 'b86a8fe4-44ce-4948-aee5-eccb2c155cd7') - principalType: 'ServicePrincipal' - description: 'Key Vault Secrets Officer' - - } -} - - -resource userAssignedManagedIdentitySeattle 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-07-31-preview' = { - name: 'aio-seattle-identity' - location: location -} - -resource userAssignedManagedIdentityChicago 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-07-31-preview' = { - name: 'aio-chicago-identity' - location: location -} -*/ \ No newline at end of file +} \ No newline at end of file diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index d192bccbea..58b0142d73 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -1,14 +1,3 @@ -/*@description('Azure service principal client id') -param spnClientId string - -@description('Azure service principal client secret') -@secure() -param spnClientSecret string - -@description('Azure service principal object id') -param spnObjectId string -*/ - @description('Azure AD tenant id for your service principal') param tenantId string @@ -135,7 +124,6 @@ module storageAccountDeployment 'mgmt/storageAccount.bicep' = { name: 'storageAccountDeployment' params: { location: location - //spnObjectId: spnObjectId } } @@ -209,11 +197,13 @@ module ubuntuRancherK3sNodesDeployment 'kubernetes/ubuntuRancherNodes.bicep' = [ module clientVmDeployment 'clientVm/clientVm.bicep' = { name: 'clientVmDeployment' + dependsOn: [ + ubuntuRancherK3sNodesDeployment + ubuntuRancherK3sDataSvcNodesDeployment + ] params: { windowsAdminUsername: windowsAdminUsername windowsAdminPassword: windowsAdminPassword - //spnClientId: spnClientId - //spnClientSecret: spnClientSecret tenantId: tenantId workspaceName: logAnalyticsWorkspaceName storageAccountName: storageAccountDeployment.outputs.storageAccountName @@ -227,7 +217,6 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { namingGuid: namingGuid scenario: scenario customLocationRPOID: customLocationRPOID - //spnObjectId: spnObjectId k3sArcClusterName: k3sArcClusterName k3sArcDataClusterName: k3sArcDataClusterName vmAutologon: vmAutologon @@ -242,7 +231,6 @@ module keyVault 'data/keyVault.bicep' = { akvNameSite1: akvNameSite1 akvNameSite2: akvNameSite2 location: location - //spnObjectId: spnObjectId } } @@ -252,7 +240,6 @@ module storageAccount 'storage/storageAccount.bicep' = { storageAccountName: aioStorageAccountName location: location storageQueueName: storageQueueName - //spnObjectId: spnObjectId } } @@ -279,6 +266,5 @@ module azureOpenAI 'ai/aoai.bicep' = { location: location openAIAccountName: 'openai${namingGuid}' azureOpenAIModels: azureOpenAIModels - //spnObjectId: spnObjectId } } diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep index 8a38a88741..4b07c59713 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/storage/storageAccount.bicep @@ -12,9 +12,6 @@ param skuName string = 'Standard_LRS' param storageQueueName string = 'aioQueue' -//@description('Azure service principal object id') -//param spnObjectId string - resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = { name: storageAccountName location: location @@ -38,18 +35,5 @@ resource storageQueue 'Microsoft.Storage/storageAccounts/queueServices/queues@20 name: storageQueueName } -// Add role assignment for the SPN: Storage Blob Data Contributor -/*resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { - name: guid(spnObjectId, resourceGroup().id, 'ba92f5b4-2d11-453d-a403-e96b0029c9fe') - scope: resourceGroup() - properties: { - principalId: spnObjectId - roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe') - principalType: 'ServicePrincipal' - description: 'Storage Blob Data Contributor' - - } -}*/ - output queueName string = storageQueueName output storageAccountResourceId string = storageAccount.id From 8156206aeaa5f1571d59933a067fdb8496ca53e8 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 5 Nov 2024 08:52:32 +0200 Subject: [PATCH 270/409] fix: correct line continuation in Deploy-AIO-M3 function --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 4db9b8b4f2..9b81fad6a8 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -312,7 +312,7 @@ function Deploy-AIO-M3 { Write-Host "[$(Get-Date -Format t)] INFO: az deployment group create --name $deploymentName --resource-group $resourceGroup --template-file $dataflowBicepTemplatePath --parameters aioInstanceName=$iotInstanceName evenHubNamespaceHost=$evenHubNamespaceHost eventHubName=$eventHubName customLocationName=$customLocationName" az deployment group create --name $deploymentName --resource-group $resourceGroup --template-file $dataflowBicepTemplatePath ` --parameters aioInstanceName=$iotInstanceName evenHubNamespaceHost=$evenHubNamespaceHost eventHubName=$eventHubName ` - customLocationName=$customLocationName + customLocationName=$customLocationName # Verify the deployment status $deploymentStatus = az deployment group show --name $deploymentName --resource-group $resourceGroup --query properties.provisioningState -o tsv From b9892e259495667a8cf6af802ad850fde43e7f2c Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Tue, 5 Nov 2024 08:30:27 -0500 Subject: [PATCH 271/409] Update dataflows.bicep --- .../contoso_hypermarket/bicep/data/dataflows.bicep | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep index 19bda10ba5..add6503f58 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep @@ -18,7 +18,7 @@ param commercialDataFlowName string = 'commercial-mqtt-to-eventhub' param defaultDataflowEndpointName string = 'default' param eventHubDataflowEndpointName string = 'eventhub-endpoint' -resource aioInstance 'Microsoft.IoTOperations/instances@2024-08-15-preview' existing = { +resource aioInstance 'Microsoft.IoTOperations/instances@2024-09-15-preview' existing = { name: aioInstanceName } @@ -26,7 +26,7 @@ resource customLocation 'Microsoft.ExtendedLocation/customLocations@2021-08-31-p name: customLocationName } -resource eventhubEndpoint 'Microsoft.IoTOperations/instances/dataflowEndpoints@2024-08-15-preview' = { +resource eventhubEndpoint 'Microsoft.IoTOperations/instances/dataflowEndpoints@2024-09-15-preview' = { parent: aioInstance name: eventHubDataflowEndpointName extendedLocation: { @@ -60,12 +60,12 @@ resource eventhubEndpoint 'Microsoft.IoTOperations/instances/dataflowEndpoints@2 } // Pointer to the default dataflow profile -resource defaultDataflowProfile 'Microsoft.IoTOperations/instances/dataflowProfiles@2024-08-15-preview' existing = { +resource defaultDataflowProfile 'Microsoft.IoTOperations/instances/dataflowProfiles@2024-09-15-preview' existing = { parent: aioInstance name: 'default' } -resource iotDataFlow 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflows@2024-08-15-preview' = { +resource iotDataFlow 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflows@2024-09-15-preview' = { // Reference to the parent dataflow profile, the default profile in this case // Same usage as profileRef in Kubernetes YAML parent: defaultDataflowProfile @@ -103,7 +103,7 @@ resource iotDataFlow 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflo } } -resource commercialDataFlow 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflows@2024-08-15-preview' = { +resource commercialDataFlow 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflows@2024-09-15-preview' = { // Reference to the parent dataflow profile, the default profile in this case // Same usage as profileRef in Kubernetes YAML parent: defaultDataflowProfile From 4d50ac4a0e73925a6c4d8ae8a3354710522eb6f4 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 5 Nov 2024 17:55:01 +0200 Subject: [PATCH 272/409] add desktop shortcuts --- .../artifacts/PowerShell/Winget.ps1 | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 index 8cf23e06a2..e0d18917b6 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 @@ -57,6 +57,29 @@ while (-not $success -and $retryCount -lt $maxRetries) { } } +# Create Desktop shortcuts + +# Creating Microsoft SQL Server Management Studio (SSMS) desktop shortcut +Write-Host "`n" +Write-Host "Creating Microsoft SQL Server Management Studio (SSMS) desktop shortcut" +Write-Host "`n" +$TargetFile = "C:\Program Files (x86)\Microsoft SQL Server Management Studio 20\Common7\IDE\ssms.exe" +$ShortcutFile = "C:\Users\$Env:adminUsername\Desktop\Microsoft SQL Server Management Studio.lnk" +$WScriptShell = New-Object -ComObject WScript.Shell +$Shortcut = $WScriptShell.CreateShortcut($ShortcutFile) +$Shortcut.TargetPath = $TargetFile +$Shortcut.Save() + +# Create Azure Data Studio desktop shortcut +Write-Header "Creating Azure Data Studio Desktop Shortcut" +Write-Host "`n" +$TargetFile = "C:\Users\$Env:adminUsername\AppData\Local\Programs\Azure Data Studio\azuredatastudio.exe" +$ShortcutFile = "C:\Users\$Env:adminUsername\Desktop\Azure Data Studio.lnk" +$WScriptShell = New-Object -ComObject WScript.Shell +$Shortcut = $WScriptShell.CreateShortcut($ShortcutFile) +$Shortcut.TargetPath = $TargetFile +$Shortcut.Save() + # Start remaining logon scripts Get-ScheduledTask *LogonScript* | Start-ScheduledTask From c3c9b189c7d4f933a756cafb4c0933e98151baa3 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 5 Nov 2024 18:22:02 +0200 Subject: [PATCH 273/409] add: create Visual Studio Code desktop shortcut --- azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 index e0d18917b6..c2debe62ae 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Winget.ps1 @@ -80,6 +80,16 @@ $Shortcut = $WScriptShell.CreateShortcut($ShortcutFile) $Shortcut.TargetPath = $TargetFile $Shortcut.Save() +# Create VSCode desktop shortcut +Write-Header "Creating Visual Studio Code Desktop Shortcut" +Write-Host "`n" +$TargetFile = "C:\Users\$Env:adminUsername\AppData\Local\Programs\Microsoft VS Code\Code.exe" +$ShortcutFile = "C:\Users\$Env:adminUsername\Desktop\VSCode.lnk" +$WScriptShell = New-Object -ComObject WScript.Shell +$Shortcut = $WScriptShell.CreateShortcut($ShortcutFile) +$Shortcut.TargetPath = $TargetFile +$Shortcut.Save() + # Start remaining logon scripts Get-ScheduledTask *LogonScript* | Start-ScheduledTask From 73a02551705df84d19bcb0a7e37ab851a0804a1a Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Tue, 5 Nov 2024 12:14:35 -0500 Subject: [PATCH 274/409] Update dataflows.bicep --- .../bicep/data/dataflows.bicep | 46 +------------------ 1 file changed, 1 insertion(+), 45 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep index add6503f58..258b8ae160 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep @@ -14,7 +14,6 @@ param eventHubName string param iotDataFlowName string = 'iot-mqtt-to-eventhub' @description('The name of the commercial data flow') -param commercialDataFlowName string = 'commercial-mqtt-to-eventhub' param defaultDataflowEndpointName string = 'default' param eventHubDataflowEndpointName string = 'eventhub-endpoint' @@ -83,58 +82,15 @@ resource iotDataFlow 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflo endpointRef: defaultDataflowEndpointName dataSources: [ 'iot/devices/#' - ] - } - } - { - operationType: 'BuiltInTransformation' - builtInTransformationSettings: { - // See transformation configuration section - } - } - { - operationType: 'Destination' - destinationSettings: { - endpointRef: eventHubDataflowEndpointName - dataDestination: eventHubName // See section on configuring data destination - } - } - ] - } -} - -resource commercialDataFlow 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflows@2024-09-15-preview' = { - // Reference to the parent dataflow profile, the default profile in this case - // Same usage as profileRef in Kubernetes YAML - parent: defaultDataflowProfile - name: commercialDataFlowName - extendedLocation: { - name: customLocation.id - type: 'CustomLocation' - } - properties: { - mode: 'Enabled' - operations: [ - { - operationType: 'Source' - sourceSettings: { - endpointRef: defaultDataflowEndpointName - dataSources: [ 'topic/commercial' ] } } - { - operationType: 'BuiltInTransformation' - builtInTransformationSettings: { - // See transformation configuration section - } - } { operationType: 'Destination' destinationSettings: { endpointRef: eventHubDataflowEndpointName - dataDestination: eventHubName + dataDestination: eventHubName // See section on configuring data destination } } ] From 890209ba3b71388872f53237d8d53a912412e028 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 5 Nov 2024 21:08:30 +0200 Subject: [PATCH 275/409] add: implement LoadBalancer backend pool configuration and update related scripts --- .../artifacts/PowerShell/AgLogonScript.ps1 | 1 + .../Modules/contoso_hypermarket.psm1 | 83 ++++++++++++++++++- .../bicep/mgmt/network.bicep | 24 +++--- 3 files changed, 93 insertions(+), 15 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 437823794a..1fdc9a4e95 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -243,6 +243,7 @@ if ($scenario -eq "contoso_motors") { Set-AIServiceSecrets Set-EventHubSecrets Set-SQLSecret + Set-LoadBalancerBackendPools } ##################################################################### diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 9b81fad6a8..8d9060a333 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -516,8 +516,8 @@ function Set-EventHubSecrets { $eventHubConnectionString = $(az eventhubs eventhub authorization-rule keys list --resource-group $resourceGroup --namespace-name $eventHubNamespace --eventhub-name $eventHubName --name RootManageSharedAccessKey --query primaryConnectionString -o tsv) kubectx $clusterName kubectl create secret generic azure-eventhub-secret ` - --namespace=contoso-hypermarket ` - --from-literal=azure-eventhub-connection-string=$eventHubConnectionString + --namespace=contoso-hypermarket ` + --from-literal=azure-eventhub-connection-string=$eventHubConnectionString } } @@ -528,7 +528,82 @@ function Set-SQLSecret { Write-Host "`n" kubectx $clusterName kubectl create secret generic azure-sqlpassword-secret ` - --namespace=contoso-hypermarket ` - --from-literal=azure-sqlpassword-secret=$Env:adminPassword + --namespace=contoso-hypermarket ` + --from-literal=azure-sqlpassword-secret=$Env:adminPassword } +} + +function Set-LoadBalancerBackendPools { + + $loadBalancerName = $(az network lb list -g $resourceGroup --query [].name -o tsv) + $loadBalancerPublicIp = $(az network lb frontend-ip list -g $resourceGroup --lb-name $loadBalancerName --query [].name -o tsv) + $lbIndex = 0 + + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + $clusterName = $cluster.Name.ToLower() + kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + $services = kubectl get services -n contoso-hypermarket -o json | ConvertFrom-Json + $services.items | ForEach-Object { + $service = $_ + $serviceName = $service.metadata.name + $servicePort = $service.spec.ports.port + $serviceIp = $service.status.loadBalancer.ingress.ip + + if ($null -ne $serviceIp) { + az network lb address-pool create -g $resourceGroup ` + --lb-name $loadBalancerName[$lbIndex] ` + --name "$serviceName-pool" ` + --vnet '/subscriptions/2d68328e-bde2-4aeb-a5b4-1a11b4328961/resourceGroups/JumpstartAgora-ContosoHypermarket/providers/Microsoft.Network/virtualNetworks/Ag-Vnet-Prod' ` + --backend-addresses "[{name:${serviceName},ip-address:${serviceIp}}]" ` + --only-show-errors + + az network lb inbound-nat-rule create -g $resourceGroup ` + --lb-name $loadBalancerName[$lbIndex] ` + --name "$serviceName-NATRule" ` + --protocol Tcp ` + --frontend-port-range-start $servicePort ` + --frontend-port-range-end $servicePort ` + --frontend-ip $loadBalancerPublicIp[$lbIndex] ` + --backend-address-pool "$serviceName-pool" ` + --backend-port $servicePort ` + --only-show-errors + } + } + + # Grafana backend pool creation + $grafanaPublicIpName = "Ag-VM-Client-PIP" + $serviceName = "Grafana" + $servicePort = "3000" + $clientVMPIP = $(az network public-ip show -g $resourceGroup -n $grafanaPublicIpName --query ipAddress -o tsv) + + az network lb address-pool create -g $resourceGroup ` + --lb-name $loadBalancerName[$lbIndex] ` + --name "$serviceName-pool" ` + --vnet '/subscriptions/2d68328e-bde2-4aeb-a5b4-1a11b4328961/resourceGroups/JumpstartAgora-ContosoHypermarket/providers/Microsoft.Network/virtualNetworks/Ag-Vnet-Prod' ` + --backend-addresses "[{name:Grafana,ip-address:${clientVMPIP}}]" ` + --only-show-errors + + az network lb inbound-nat-rule create -g $resourceGroup ` + --lb-name $loadBalancerName[$lbIndex] ` + --name "$serviceName-NATRule" ` + --protocol Tcp ` + --frontend-port-range-start $servicePort ` + --frontend-port-range-end $servicePort ` + --frontend-ip $loadBalancerPublicIp[$lbIndex] ` + --backend-address-pool "$serviceName-pool" ` + --backend-port $servicePort ` + --only-show-errors + + az network lb outbound-rule create --address-pool "$serviceName-pool"` + --lb-name $loadBalancerName[0] ` + --name "Grafana-outbound" ` + --outbound-ports 10000 ` + --protocol All ` + --frontend-ip-configs $loadBalancerPublicIp[$lbIndex] ` + --resource-group $resourceGroup ` + --only-show-errors + + $lbIndex++ + } + } \ No newline at end of file diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep index 4407ec60fa..cc33100853 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep @@ -33,7 +33,6 @@ var bastionSubnetRef = '${cloudVirtualNetwork.id}/subnets/${bastionSubnetName}' var bastionName = 'Ag-Bastion' var bastionPublicIpAddressName = '${bastionName}-PIP' - var bastionSubnet = [ { name: 'AzureBastionSubnet' @@ -83,7 +82,9 @@ resource cloudVirtualNetwork 'Microsoft.Network/virtualNetworks@2022-07-01' = { addressPrefixCloud ] } - subnets: (deployBastion == false) ? union (cloudK3sSubnet,cloudSubnet) : union(cloudK3sSubnet,cloudSubnet,bastionSubnet) + subnets: (deployBastion == false) + ? union(cloudK3sSubnet, cloudSubnet) + : union(cloudK3sSubnet, cloudSubnet, bastionSubnet) } } @@ -379,8 +380,8 @@ resource bastionHost 'Microsoft.Network/bastionHosts@2023-02-01' = if (deployBas } } -resource loadBalancerPip 'Microsoft.Network/publicIPAddresses@2024-01-01' = { - name: 'Ag-LB-Public-IP' +resource loadBalancerPip 'Microsoft.Network/publicIPAddresses@2024-01-01' = [for (loadbalancer, i) in range(0,1): { + name: 'Ag-LB-Public-IP-${i}' location: location properties: { publicIPAllocationMethod: 'Static' @@ -390,10 +391,10 @@ resource loadBalancerPip 'Microsoft.Network/publicIPAddresses@2024-01-01' = { sku: { name: 'Standard' } -} +}] -resource loadBalancer 'Microsoft.Network/loadBalancers@2024-01-01' = { - name: 'Ag-LoadBalancer' +resource loadBalancer 'Microsoft.Network/loadBalancers@2024-01-01' = [for (loadbalancer, i) in range(0,1): { + name: 'Ag-LoadBalancer-${i}' location: location sku: { name: 'Standard' @@ -401,18 +402,19 @@ resource loadBalancer 'Microsoft.Network/loadBalancers@2024-01-01' = { properties: { frontendIPConfigurations: [ { - name: 'Ag-LB-Frontend' + name: 'Ag-LB-Frontend-${i}' properties: { publicIPAddress: { - id: loadBalancerPip.id + id: loadBalancerPip[i].id } } } ] } -} +}] + output vnetId string = cloudVirtualNetwork.id output k3sSubnetId string = cloudVirtualNetwork.properties.subnets[0].id output cloudSubnetId string = cloudVirtualNetwork.properties.subnets[1].id -output virtualNetworkNameCloud string = cloudVirtualNetwork.name +output virtualNetworkNameCloud string = cloudVirtualNetwork.name \ No newline at end of file From cd62299713c9578f56fa9e9fa7880766120edae5 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Tue, 5 Nov 2024 14:08:30 -0500 Subject: [PATCH 276/409] update icons --- .../artifacts/icons/contoso-hypermarket.png | Bin 20539 -> 38867 bytes .../artifacts/icons/contoso-hypermarket.svg | 65 +++++++++++++++--- 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.png b/azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.png index 379dae8644522f87e6c3e25150eb28d3ab083cf9..bd97469d937181bbb1aa8d709e3a4e16bbda43ef 100644 GIT binary patch literal 38867 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 literal 20539 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%0DZiV(w$Ycmiik!zv>_pY==Ijuk8XQW?~YH7#V+ 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 eilQir=RW{|?sOk2Z9ESE0000 - - - - + + + + + + + + + + + + + + + + + + + + + - + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 39dde1401e0882cd0397d6c4635963fa323675c1 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Tue, 5 Nov 2024 21:15:20 +0200 Subject: [PATCH 277/409] fix: reduce OpenAI model deployment capacity from 50 to 10 --- azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep index 9969847f67..f2983140b6 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep @@ -40,7 +40,7 @@ resource openAIModelsDeployment 'Microsoft.CognitiveServices/accounts/deployment name: '${openAIAccountName}-${model.name}-deployment' sku: { name: 'Standard' - capacity: 50 + capacity: 10 } properties: { model: { @@ -49,7 +49,7 @@ resource openAIModelsDeployment 'Microsoft.CognitiveServices/accounts/deployment version: model.version } versionUpgradeOption: 'NoAutoUpgrade' - currentCapacity: 50 + currentCapacity: 10 raiPolicyName: 'Microsoft.Default' } }] From 76275e26fa0ddeffc31900a6b150cd3a6f86d5a4 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Tue, 5 Nov 2024 15:39:06 -0500 Subject: [PATCH 278/409] new svg --- .../artifacts/icons/contoso-hypermarket.svg | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.svg b/azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.svg index a7abc7fcf2..44645f157a 100644 --- a/azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.svg +++ b/azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.svg @@ -1,66 +1,66 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + From 9107f5a4cf7b9cef65b430b83971af813f1c928c Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Tue, 5 Nov 2024 16:53:36 -0500 Subject: [PATCH 279/409] update png --- .../artifacts/icons/contoso-hypermarket.png | Bin 38867 -> 20539 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.png b/azure_jumpstart_ag/artifacts/icons/contoso-hypermarket.png index bd97469d937181bbb1aa8d709e3a4e16bbda43ef..379dae8644522f87e6c3e25150eb28d3ab083cf9 100644 GIT binary patch literal 20539 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%0DZiV(w$Ycmiik!zv>_pY==Ijuk8XQW?~YH7#V+ z1IJH$@P7f+?t2u{5jcZ`nVxQLxL*&YET=lWc#2As^4d5;@4l0;Rx7I@xq58pTFaZ~ zFxKwq!iB@kimltCs!!aKjaS9K=R8Mf zAyl(`cqGo@+cl_#`6uLdLRjiR+6`mF?YLz1Bgl`4A>+jTz-?gyKK~*QK2K+BG8QW& z5nb3c!_3IH7SZrV05lag8^}R_@FY{`j~GmxkYGxMmI2&d>37|L6|>v-obHM1@}5g| zu&KIJA)&^CM*5XU&SqxG%ClG}p&SNSlW*c>^5s(Z`I(T4E5@1?%}*Wx$1|!9-a0?p zV^#m`{#ONlSUTn+UHNhI-RI65cTWWzAzE{-z;}Q~(}&r-&8!k9nHtD*q%=K|HTpCMvo5)$x+O z&z6XFnRNg$C;q+z$9eIWrBt7zf-2=-d6MuvfNAgTkwu{?bk3f8dU#{4o}7@e=3+G z9ck{=m6|Z%r{Nd%EmQ$yX|(EwTOeG=n=VLt>E9@l2M;ZG8)-`q3CL`t-Hd&N^hKs6 z36!feitS&jj+KP>POv5@I;62{g=7D~Feg2Z_BxHFH}VL&f%JXG|3(6J;Uy+(w<&-w z7^cuPRA|S(C$=LMbfcP69kkCPbr0|Vrk>Nj6>1hHKA~1fIBoGVY7+CcXI;1QHcQVY zy(Ts6DB))Xh6}ZX$US&Ze}CeUeu1=ds(HZNm5o}g6E3G&%%ubN`YUCHD=`AU2B=RO&JnhJbVr335V@do}D3Q>Q2+Vk!w2&L>c&bsiI`0JSn z_nG|O%HpAJOq7@G=Y+dY_fPF|*nV}4VrNdH|l9WR`M z3FWf>`34RV?FmhS8hc>%=u_954=L5rGT2ug7yp~HK>$FN=}Ycn4l~9cMtC=wz!Rke z{fYrp;5tr(5RhKKam=PN-=}|Mm6@*7jgPU!?;DzL=Y}Z zmM%WnsthcIS><^0T$5xnUR9dP9b@Ea6|bg2eapA^^7NScZOZ3%ioW_VmM7+Jud{Q) zpAJ%v5Tb@(H9m!gE2p$R_rrVv!t|Qs84s=X9=T;IOK}3@r`yj~7}VRQe<%c+d%SPH zGk6-<&` z&h=*mUNI-YYY7Uz5>}mvPzQ*#W0FV8F??6VbxEyld#>V>9A_}$%>}3mf#Cgk zQKtQV*71kYWG9y<&G}rfGlu3udLF%2^rP);wj_&21}1}xsy0$O7Gm_upgYHsv|wO+g24!%wj zB(5^8mhmATedR%_pK6+kqMiOSUqIj@u5Uq~0uqQKS`!#KT9x97R^$N)GIk}{#AdLQIQ>vhUtu3D5HRT( zz%9{VcH4fxAmCGDp)pWXH?1A@5zvfjDPvnj-e-LDlOtcig9|{SD*vhuFmkN*YQ1KJ zHDU|5L8@2HCRANsB9`o0=Y+@NaHVa^m0xDA1<#Y=e1tJE$0Bkqq9L^@i>048G#0@C{C zPt0i}J#q1d8pxs3xg+_cHN?Q!1Kbi`1EM54RutNK$FqAdGeh^^pzBj>pF1kj@7(#@ zfv>GoK*WL<&L7Cst#-y$DdHq zn6p~OcyD9xv?#_+evgp#B<1}J9c;oXIsJ&=;7F%pO9?;VU@M{49N?sYfqub0sjAwCztYLC=eZ#%Lxs18C=b@7lHw#z# z0LyRZ(nK>)W<`ubY2=^xJdf6XqJj)V@l@Ay?$mYvbcj=qf^8Nd@?zYKVWR+iClmFGufw^u%Jrs zApRwg8eH}K%FFlWjeuejE^dr{Y@mEngV)i|cU%>}Heai0|DGf^{qkWdNW5%BmwP^! zy>|1xyog=b`yoEAYBUTEF4jrZqp=A9iZ^0zv-SGX01Ao^ilzr>Wz#|8BU4b3WFesz zJh>oD%NXaUuO@MsI@M52V6X{(t|X^2{Y`O$a@PFWLHvyOdlpN+`^u!}Di@#CvGH;uOjv6NOK`$t*NAItmXZMzkOV=a|uG%lrs( zs1a3C!^=t9ag@2J&PDG%2Bjrm@ELH-H?>#d zZkS07C><r zcaFImR|;`=+0d+=I_VpJExYXdt6O~9dy{DjB<3r}I4>C|j(EJ(+Z+VYJ8;clW%kVClGeGb-TKpOkV`AD3b+{mMC{`Gc|a2%J?8(rxI0b@(< ztDgpYKRuZk(I8O;7w zGPe}b6ARz`PmJQU?+gHi4nM`^%_Gf2$pLn!*7QVH8(PdDM_FCw$7M9*``BkIqtWZY^%&`JH(!6lpo#=_L`dSc*YMhICXJpD)5%V>c(g z{hFCbQ9Zl@6#7-wp0{<7cSdpnrgj+UiF{6GI_7Wz2L8 zRGrARn8%paKnrrX!V7l2-s!zbI#3of_m$XpfIX+;xsE&06_-#%nsu|Z^K;R@8wYyq z3Qf3)5ypQjC08+@I#y+*#&;lOB&BuuVq4*NJI`}1;=X3%f#82 zqKC3_+;=Uh>RqfcRx*j;GJ$Ov&U>EPCm3yzzB}G}^UAg+Lf#Zwft9xVBX$4&K(Lh+ zQi0*SDtuyIV}hrDrc6K)*)o$oXcEuDPVQsr^H2_(k^|59%;QUVf?B4Z38hU+Tj z>Rim*cZWy9pty2rlxNVW6;CV*w*1tYK%RHA%uiXRFTZ*x6HO+=)L}EW+TQK>1prM; zbSW-vU$@4?i4ZPw$}|DPrE5C{r60Kf;;*`&UIE2vgaxqE(5b8}v&h^)7;6HBfFp%^ zQgSAV_#yjD1xKy#bTWdLlwkJFpOMjj42iCpqWV;c*4b(^Tm*i2sHbmpk8sQ_*Gg0& ztH2cc0DbD}J6#IsS3%q0crzuv7FJHcH2cD(%&x}f0PKa($k0ZdF;*z<0RC~t55O-M zY$P{{j}X}tM$7bA>FuL3;^l+a7M3yrROT|LDRhD-DS6}og%KgVU+5!ts!F({7`k0n z?0mX5u~SLa4yoXmw^TJMB8Zf<>3>lP8jC;;NKOr_R0GgqoJ#Zpa7RC$hCSKghHmV2 zOBD&#KxJc;L%(M5uKA^nxXX{3S9y==a0$DF8=p+KhDHX5*$NwD6VFk< z&^>RB)%fE;6IwlEsPo`YLpKoFK{$r_$wJJfON>z)wv(Qgfus74k{n9TsuhW0fKDX` z#Af0Fk!5V{6B`8FIM>}nEU|3W&cK+p6^ukiBV$xPZAbD?57;k)1!nMg=FCZnwuW7! zOLN?4=wnKG0O%^|v~=IGpT>iTI|i?14QQGK8sSV=XlZ(MSUYr~694>5B+746;40qG zU0gzV&QRwUyB7^fxIBqkUIWcOLhsJEzDB+IO1lCf(J(o*o0Ht;t+~>D7l!lv!HR)a zw~(`7a(Di429}i5>M;Y)6e^NQRm*E8dVcUG37+5B$f)Yl1y_cDP}U>=|ItN5`mgjp za@W9Td`|MjZ-3(AiO~mHcbi`XkwU7xfv86tgSibxa*O<{jckg$X(ih8-;k#E=BjS!@ZJvVW9_! zyg{;7N_p2+9IH;1!J0a>3}{?;l-*MY|A4CG z$3pF;G`7lwf3RBQNVn*%b64aLg%u1^V53V_3FUEq?b|}W*=nAr7QVzia#}&m3}eH} zXPIh51RI|hphiFiCDpuPD=mVZodf#Vy4`(6)pb3Rol;MAP&L>gom(&mXEZB;!&K{4 zGw++qqo!$Fo&7jeT_F>==G`O_VOZ@Lh-uL>oMVDet(346244Amb!zp&#^ymqyHfH| zrNxQEC-EBws<5`G5+En@S?mfqQNZ{caH|!=3H+!hhbl?u24Nto&$h5S-?W8kIovD* zLN_cgq%g1BxK#550l2D%bWXrrpzj2LiAEF;$_wx}d<(}Ax5E6qGv=|d|7i-V4zdwx z50>!BBT$uFL|b}+Sh$-aG%7hp9?aLDOhHmkmoy~-`)FFczgQ1vvNl{-Y6X<-QwW;1 zJ?;CJ9`8z!T(@Tck|)Qks$yZ=7fV6^#f|LMz30x{ zf2DMuv+0*7FcU5ji@DUJdn|B3<^5YXC$~EhnE6cBpRergeU7{qM<=8k*Vp}66{(&x z$9N}-%YLRVu%UPAf59;=d~KGbxgINzRdc^;V;AS#d@@R#)$A%xR}2>(3n1{@50)Rw zk3DGkj${!{;L!@2w27?Ks3hoy%+uxRu=&CpMUHmIFv&koK}E}`^9SCKv*a}}TgOEM z!0vKZ8cW(aBKSRQSrGDRuIBnrTCvGQ*!Zd6$KKNY;UyJKgn}K{?$z1ualoT#tG%MZ zV*44m-IgjTRFwh{dX7+Le%MDS`RlBDEx7L9bx?2l7gry=ZaC=YApgkuGgny(8Vvaa z<_CLWOZ``BcXkH9P+*6rjhzc`U=sNL$Q)%Eq3F9-(jCmt~gqbfk4bOjPEq zD8mHoziD82e>{wX#7y5R?ylVj*uJ--pYi)bj&5Jg5Oqe)<*@Q{v^W8;dJO3J)pGOr z`7E@sM)EGm)A)#*bR#Gqz*!SVBmn1R;d1~;p*6FX7 zr^0X{w=p4gUOLGYkJSEx*WE6pY4YK`pZ`W$jP(BI)qA!GgXbsB?{*C%-W|vE6x{ZZ z_gwxdgggw{!2fWG!`cdl&OO%hl^5|}`9>qh7xPZ0L|8F8>Hjj+xBs!+aeJ^{%7h3v zVJVz}{l10^O`OJKR!g3YOjj!G)B|&L-wDh&o&9R1NYPnE{4EM_B1+d@H?H%Y+=g7u z{i!-AKj|B7jjLOJB?0@B2CD^2HMoxlsz)&?qucS^Tl*4#-CjpC1eBL8PY_gMyh%|6 zqE6SuOG?TIWov&ts9D1Z3v@jRh+|kND&njEC`Qa181p_S=k&a3)&S!xc)@Jd6;m-pS z!^&$O${Vfv^__QCkr%~=&u=<#_&N5p?sR<_6wWf>^>^#C_kW(;@64w-eiWB)*Xn9N z;t^wc=2sWSUw}8710Uk3Pym(@LvCZd+Yz>P zuXi`8d&;kP-QcXYIUhWK@dh)-lVt8uKf73UiJF?QG+yDu4!VH)zjTjD`r_|!e+p@7 zTrV6K`QRh|`fpxpq90u)+um05H=lr;m}4_|&6IxzlD=qExMl0ne}sScCZc7JwNyjl zTb*ZY`ZM9QYQj|2B56$A^+k7r7HD0AJZnIGA13;tt1jo(_UO)Ueq{FiuqQg^NTLn&)6K{DY-AVh-_%l1d7^X%CDwGOL*ni5&Q9OsC ziBAU{B#Sk(o@zB%RTvpa)_V+G>2x7i6?L05z1lA%ljGh#CYpI%?yOv1cM}k3n4H(Q zgD@G@-abo={TbSr1VYIx#jS3)mX_Z;R$@|jM& zdk*+HEQ+(Nmz8y{qc(4TZ~e!ufsgaIvB63q+aTj?84mTSp@|jkvOMvmOV^VNgK!o* z=V>ky+sjnY&3@{G_pmgt&o?+-u1Tq4$2y)bw_7AP0C(n$Y8@O2pnR+Hv?TY16)ipw z#cwq0vL^wU^OHUkRoBZ-b|P(ObbL&md!g*$EY*?kC&>_r76L6(t7G}r_lY%B7D!en z@5LBJ4r}kf9`pP|O&x9U-JwKz@SZ9#*zpb%=fjGR5f#BH?qSOEc?ARRiqDKV@<)UA z#pSlP7cAolB5sI#(|jT8doKJea^>k;Q5n*P$^EHa#oX|`w?l;D)TP|QfApkJ?BT&4)o zUPNq%y!>s~B9ecW5r!sNdc$^=|Jn_d6e3dd8^4@aI=cB#8nj*hc>dj>Y((ds1%aI{B-#mWS6BjTxX!Y=j7VX3to`H9#t651J@*BppG1zznGnByxffc z8S_b*?_r}?__WQx;cd>tLO-qJ@fVyqnI%F0-O8Kp{b`e;8U6s9(|6?URgw9IQBWO7 zDB5$_p=-<>Uk+ND>v;2WIqmE0hF1@gC(U!uf0?4i>Ny|Q$m_|W%ro(2jbLb@Xwhlp z6Dbx-I_Cs_P9E~C;!Y)*b51I6B8lim<)B(!satW!pU>~^i88Kq=7V3YF~6hspk-W3 z&z`)uP|C)$u?t(Q@f%uew0AmKko9v!EH95El1nqEO zTS3>wKuMd$d5u~B9a%mh&|^Qp-;Wi)$0ul#lm$L!mKD!dKUW#Q@jDFg-ZyZtb^p6Q zJmb(yqE&?G>_^TvUWnMQ%uB%sSZgbq$BVaNM8O}urGe6w#L~r))s;rIQk0bRI3D@I( z*YU>Eru_8@d^Hgdq8!r!Hq|zjxol6e0?VjnFC0!!N>h!BYpBVqRR^!vV_mj4>RUVy z&+aR_N^8T;%tg?-e`9n&OuaE%KxcKrsDf(v__5zJ_ZSJtXLmhvrOOMGXRybTZ6TQ+5kfAU4(cP)k=1VP(GSc#bt+dP(HCrkW%* zEJy7+i4<)i_dN-!~{ol-qTZdh|;k<;H0TORX- zWqGeY0Pn`*?0P8mPfqh?b;YM&9P4K-$c_7pQ}cy+d6eaUT7*U#h7{HHa7sGD*7g!- zdytmB7I$zu8Q_wShj+e72sD;#(YidMHP)AjXnbxUM{r~3A9m}5I=#7vfd);xvor?0 z(B=5n>Lu4$>6%CxB@Sq0Xm#!*H2u7K*ff1Wh-6sc!@}$Tq=5(N9$6rO`T1*y76Hrz z)sN|~%-v2K$y?y6j&YVI#ne(YGxl_`V1Z_%KU2iAgf}mL_>OS$P=Ck9wc4g2FCs#n z1(Py*fs73$+4wd$+$$mI}UQXcmqO9(|R(!ME<#e6cQrt1?$5;Ph7FS8VK( z*sn?2+kE>KVh+V=r>>x&T>w`hA99HU*MoU zIaN7PATbQ)bUl=v;!qY049lq;yItXnXua_DIS#K;sqbndd6FUW2HEC2ZOokQZ7$g; ze9;^k5ImpLrIyByaz~WeTqaGvZ1ZtMEVKm|FqeMS;3X|PjVCie!>QlAW@ZI8CT3)C zsU7P!xWxspx~`fH1ry_Dv*jR@QzyBE0llj$EOF~-^scI$?d>)?Hmj)$3w1Pn%CNQq9n$+OpTQ^f zo8C9vGU}eMZ3Nhy zSyNo_`-@vmvhppG@$BDcsKXZIZ4Hyo86dY>LUA${x!4kloXz=Q zHX=+VgYjM!;*;5_@PJ`{EzWycF=07kU~Qo!Ojed-izGht^$NBa+lOvJrUk=X&P;tJ zL(l6XSOdspAgH4|Xu(|Xja~?42%iR3Z@Aa0xgh|e{z%0NNeCTpv#9J+YCP*W`5RMU zQ!i|3tKw3t78CMLv0w524fZ(p8?6dR_5%zHmgw-~Axw9mJ#kyEj8eXDr_@82P}dhQ z{G&9`5`we%{bp6n+`TI?2RqW^&L_whJ}lol==b)-!Om`fApyP>{%AV=)L*Afg>)OM z%sUhlumy__OiW&(gP`SoDgZ|Y=q6>q$L|PotGF`uo%Rwica#GY8Z6}D6l@mM3(UQc zxzeAYkV!j@%)dnJ#rj=7GHCr@0n!aE^6Mira4uaSFa$$fIFv+7~``ibMefD4W z(LyLG5RS`d&)cJjj-s|rzTX}}k_nXBU&Jraf;|`zE7vlQ-2f=AMc-{?_M80pyvfnm zZ7E-mPcF|peBi2Ged%U;KTCcG*t{=A4uV0X6stf!dw`bVk#4@9pj`E8h0RsiB5+Uk z^$H9KhKp3BI)>)m0tkL~fS~XZosQjrAt;`SU@tKcVjDnmT18$N#<5>)Zj# zMW>2)1V!nCS^yTDM}Sh`%41~AE3+kFhU+{mk9a{kD-O}a<9AZ4wV;#jOL}@{q&MsIXe_ zp5t&gaS?UTe}-e$Obau+oS5XiFLiB7CuZ>S$G`UR+wcCici-x>Q~$51x8X;icI~_U z?B^Z}F$Y;6a?4FgcwN~(q%n4S9tFdwUtA3mJE0~3r7x-gEI4EVNHCa9yG@Wd zw$7yu#!+qI))Y~E z^tUy*0>^=7C5+Ar&%F%rXUpxEuTQE92q|0>$gToH!ux!3B z+YydBsJI$J76@D3kJ^eY0J#rZ3K#`NE%5A1o2fI=*Yo25UthQG-k&{e-_-0;3jp&_ z#-i|qH}BKr28T%aM-y*J`7Rtz28L)+bI2tBaILoXsIacD=BP@@QAw(W_3H*UQ34wrIieU{GQ(Pf9Q=6u{SSgJ=HmW&eq%ya9n_~~o9Qcq3KnX1SIU`zE5LK}uT1q|v#N!9Y#BIDFNW8r7Sha)Z( z6Rc9poh;kzwNI1O?sTOx0#7sS{(Nk+N1EhGpcnuXp5gphJ`UnhP?SEX0-(^yR(ywf zmv=JxpCq|GmmR^<3z_5hM^*s0@@*0F+^71{Yw{SgV z+wbMip|jCz8=7X=B*{kD6fhs*`2)Ls-Y&22mfZ^N746B0;&SPzxdX~Hk5ESP(VPjs zT{Op!-%IT~R7(JGu&53>2Ong?L6FC59Voh+MR8g5+Q!yWV+ucY{_3;OpZ)UY3Ml}= zj4kW?9Cwo>gWaQM$a}eKa-a}T04C@g?|t2mUUSP@K@lnRX20%}AN}g{4-^7&Yu$#B z#Sp?A*+X*L-N+j-AlpYN3yFD|uRW`|`AHz0eqas(MG;g1P@T%l>Q6~1n2&T5`%2lY*Y5Yar?^^3DHCHc38ap-aq{OCJFqo?lX6O z!zmf}ciaZ4mow$UK`hQ%zj|m|U3O|;?0deHLvdU z`reXB7ju6H+y0FiYCs;8hWtdzKAt{Uo{P35qzmDD`amW||l)_fI!71EF#XXE2vqp6hO6Q#i zdOEHit}aNH1NYtSatKFgliTm*&42cZjm>@&903&)dcOY2uRp)@r=8A2kTb#n!$;xQolt+* z7ycocf_*Tc<$le$ghd(d!-fHt$5rLpavjSo}X zg2Yw~7Qfg9AC9MJMu|TgC8Mos%aGT29Qt z*Z;vEZM|SHq2E8fpJCmIErH_^%ISjrT47~oLUu(Isc?gXA$<`b6i#9tr1U6IO5sPp z`iU#o@+27i z*GAep)bJm~0$?%EH{;PEf;~bbqu?|yH|&4Kyre7~SaEU#RqcUhaPcIGT>x=JK@s~f5T*O3l$K}?_mtua zxQ$(#VweLv%`$tny#9O6yl2;ayPlgB{3S3&oCm90PdZuceuW*czY=E+>Q)f}A@)w|QcA-G1&A=J8x7FnNb8+eia${L0z4t@k?$ zWdqaz&rw!F*k|qskrKSQ9l40e&kF#80q{xXA0KE^lE}5p=a4AxBUmWHY0@bBR#-o@jsmn_$qx@@qZhEu_phssJcCWkHR@1y3_cKJep?%J67%m|bw`U%bs0(!zgh zLUOk?HwN1i_t;$>x;Hn&{!-HULD$G#`ChCZp$9LF1a9T)A9>T;8pj=plz>xC2{68D zVOIcF9spUkhUCf!n0?pEo|O!fBwT$Eu;o=E74-EhHgWHYpfW-n}=vJ7x09Pdt9HiFrm}x8%ZJL4b*LXQu4Cm*03u z!hK_o$fNr^el|k95|lH5vJj`reE8GP9rEoz{ko@{HiI>glGNqhcgF~DBxMng;VdUM zJF)`gyUx7(mUBNe4_S+HMbg)$Ks5m<1sVge=sW`Z_MT}bXba&4Y=E{k7_8*1;6|;j zgtPz(U`vWoqZv}o#LT?lT-S9BDf}`RH9q+7hqeaViA`uCg4}TIWw8XHN%g?9PygZP z8*b4>w{q&1Q;vE&aXwg++1rmSow|1IO&9hDZL`e&xAx4Pn^#Uz)&eBw-QiOwJRft* zPrC!Zf>QX!HKFAs#ESqA-@3Na=NJ}R=ud&w6YGAFgiZJZx5=qr*DLbe!Z1r3(&mctIyZnNuPJ;OsS43()<%%{h>GjfBfAH@wPkn-Nu;*XD#f-JI_3QWpnSj8>b*4 z<>?8xpU2##J?$=8+t24wtF_$wbx;&IN~>3tDe=Q!_^ln+q1L_d=DR z+93OA{K4lpU8i~x*sCwa{JlbP`xD>wmUEyein8FS3qYAE-r>vsQnk1|_da(8WHuXO zJlY+|FLD9XH| z3V<>d-tkYiAE?Ry_AmVAhNb*`#N6~BzQZKB21AkL(eqe}s!r7Fr6`Kx(I7x&D%d5w z{M7&RTjwoB;~U&hC~(e#lsYw11c)=ztbtpf`K})vF#4a72yU(-bmq-n5;^{@iEY zd|{|s1UX!m-4sQ40E+5%ilQirDgeq<$Pn&2Vf-@JoG%Mzs*sj6?>%JBo>=$;6gBWm zGqnv}OkYtHWscF|kTO-?{=3_0W?}gh_~L#0pZ(t9&Haj^D2k#eilQirq9}@@D2k#e eilQir=RW{|?sOk2Z9ESE0000yFUs_h5| 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 From d8d407bc34b74d6fb4dcfe1c06f568e0576cbce1 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Tue, 5 Nov 2024 16:55:07 -0500 Subject: [PATCH 280/409] remove unused svg --- azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 | 1 - 1 file changed, 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 index c4a3c7c696..57d583762d 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/common.psm1 @@ -887,7 +887,6 @@ function Deploy-Prometheus { # Update Grafana Icons Copy-Item -Path $AgIconsDir\contoso-hypermarket.png -Destination "C:\Program Files\GrafanaLabs\grafana\public\img" Copy-Item -Path $AgIconsDir\contoso-hypermarket.svg -Destination "C:\Program Files\GrafanaLabs\grafana\public\img\grafana_icon.svg" - Copy-Item -Path $AgIconsDir\contoso-hypermarket.svg -Destination "C:\Program Files\GrafanaLabs\grafana\public\img\icons\iot\contoso-hypermarket.svg" Get-ChildItem -Path 'C:\Program Files\GrafanaLabs\grafana\public\build\*.js' -Recurse -File | ForEach-Object { (Get-Content $_.FullName) -replace 'className:u,src:"public/img/grafana_icon.svg"', 'className:u,src:"public/img/contoso-hypermarket.png"' | Set-Content $_.FullName From c0fbf836c011dae4edfcb70fd55f58f65b1bf75e Mon Sep 17 00:00:00 2001 From: Dale Kirby <32211549+dkirby-ms@users.noreply.github.com> Date: Tue, 5 Nov 2024 16:05:14 -0600 Subject: [PATCH 281/409] Update azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep --- .../contoso_hypermarket/bicep/data/dataflows.bicep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep index 258b8ae160..176a682a71 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep @@ -90,7 +90,7 @@ resource iotDataFlow 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflo operationType: 'Destination' destinationSettings: { endpointRef: eventHubDataflowEndpointName - dataDestination: eventHubName // See section on configuring data destination + dataDestination: eventHubName } } ] From c312e5e2164808f53809f5b0b5e8aade18fefd66 Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Tue, 5 Nov 2024 22:49:17 -0500 Subject: [PATCH 282/409] update store insights dashboards --- .../grafana-app-store-shoppers.json | 1015 ++++++++++++++--- 1 file changed, 868 insertions(+), 147 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-shoppers.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-shoppers.json index 3d6d3ae095..58769982ed 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-shoppers.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-shoppers.json @@ -18,7 +18,7 @@ "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 0, - "id": 8, + "id": 12, "links": [], "panels": [ { @@ -52,7 +52,7 @@ "showLineNumbers": false, "showMiniMap": false }, - "content": "
\n Aisle Zone\n
\n", + "content": "
\n Aisle Zone\n
\n", "mode": "html" }, "pluginVersion": "11.3.0", @@ -84,18 +84,6 @@ } }, "overrides": [ - { - "matcher": { - "id": "byName", - "options": "current_shoppers" - }, - "properties": [ - { - "id": "displayName", - "value": "Current shoppers in the store" - } - ] - }, { "matcher": { "id": "byName", @@ -104,21 +92,21 @@ "properties": [ { "id": "displayName", - "value": "Total shoppers today" + "value": "Shoppers in the store" } ] } ] }, "gridPos": { - "h": 10, - "w": 7, + "h": 8, + "w": 4, "x": 0, "y": 3 }, - "id": 43, + "id": 57, "options": { - "colorMode": "background", + "colorMode": "value", "graphMode": "none", "justifyMode": "auto", "orientation": "horizontal", @@ -143,37 +131,15 @@ }, "editorMode": "code", "exemplar": false, - "expr": "current_shoppers{camera=~\".*stream.*\"}", + "expr": "total_shoppers{camera=\"Aisle Camera\"}", "hide": false, "instant": true, "legendFormat": "__auto", "range": false, "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "total_shoppers{camera=~\".*stream.*\"}", - "hide": false, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "B" } ], "title": "", - "transformations": [ - { - "id": "renameByRegex", - "options": { - "regex": "(.*)_(.*)", - "renamePattern": "$1 $2" - } - } - ], "type": "stat" }, { @@ -203,19 +169,7 @@ { "matcher": { "id": "byName", - "options": "shoppers_age_10" - }, - "properties": [ - { - "id": "displayName", - "value": "Shoppers Age 10" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "shoppers_age_20" + "options": "shoppers_age_20_Aisle_Camera" }, "properties": [ { @@ -227,7 +181,7 @@ { "matcher": { "id": "byName", - "options": "shoppers_age_30" + "options": "shoppers_age_30_Aisle_Camera" }, "properties": [ { @@ -239,7 +193,7 @@ { "matcher": { "id": "byName", - "options": "shoppers_age_40" + "options": "{__name__=\"shoppers_age_40_Aisle Camera\", camera=\"Aisle Camera\", container=\"shopper-insights-api\", endpoint=\"shopper-insights-metrics\", instance=\"10.42.1.75:5001\", job=\"shopper-insights-api\", namespace=\"contoso-hypermarket\", pod=\"shopper-insights-api-7bf8cc6578-6gdth\", service=\"shopper-insights-api\"}" }, "properties": [ { @@ -251,7 +205,7 @@ { "matcher": { "id": "byName", - "options": "shoppers_age_50" + "options": "{__name__=\"shoppers_age_50_Aisle Camera\", camera=\"Aisle Camera\", container=\"shopper-insights-api\", endpoint=\"shopper-insights-metrics\", instance=\"10.42.1.75:5001\", job=\"shopper-insights-api\", namespace=\"contoso-hypermarket\", pod=\"shopper-insights-api-7bf8cc6578-6gdth\", service=\"shopper-insights-api\"}" }, "properties": [ { @@ -263,9 +217,9 @@ ] }, "gridPos": { - "h": 10, + "h": 8, "w": 7, - "x": 7, + "x": 4, "y": 3 }, "id": 42, @@ -295,7 +249,7 @@ }, "editorMode": "code", "exemplar": false, - "expr": "shoppers_age_10", + "expr": "shoppers_age_20_Aisle_Camera", "hide": false, "instant": true, "legendFormat": "__auto", @@ -309,7 +263,7 @@ }, "editorMode": "code", "exemplar": false, - "expr": "shoppers_age_20", + "expr": "shoppers_age_30_Aisle_Camera", "hide": false, "instant": true, "legendFormat": "__auto", @@ -323,7 +277,7 @@ }, "editorMode": "code", "exemplar": false, - "expr": "shoppers_age_30", + "expr": "shoppers_age_40_Aisle_Camera", "hide": false, "instant": true, "legendFormat": "__auto", @@ -337,26 +291,12 @@ }, "editorMode": "code", "exemplar": false, - "expr": "shoppers_age_40", + "expr": "shoppers_age_50_Aisle_Camera", "hide": false, "instant": true, "legendFormat": "__auto", "range": false, "refId": "D" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "shoppers_age_50", - "hide": false, - "instant": true, - "legendFormat": "__auto", - "range": false, - "refId": "E" } ], "title": "", @@ -430,19 +370,7 @@ { "matcher": { "id": "byName", - "options": "shoppers_age_10" - }, - "properties": [ - { - "id": "displayName", - "value": "Shoppers Age 10" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "shoppers_age_20" + "options": "shoppers_age_20_Aisle_Camera" }, "properties": [ { @@ -454,7 +382,7 @@ { "matcher": { "id": "byName", - "options": "shoppers_age_30" + "options": "shoppers_age_30_Aisle_Camera" }, "properties": [ { @@ -466,7 +394,7 @@ { "matcher": { "id": "byName", - "options": "shoppers_age_40" + "options": "shoppers_age_40_Aisle_Camera" }, "properties": [ { @@ -478,7 +406,7 @@ { "matcher": { "id": "byName", - "options": "shoppers_age_50" + "options": "shoppers_age_50_Aisle_Camera" }, "properties": [ { @@ -490,9 +418,9 @@ ] }, "gridPos": { - "h": 10, - "w": 10, - "x": 14, + "h": 8, + "w": 13, + "x": 11, "y": 3 }, "id": 26, @@ -516,7 +444,7 @@ "uid": "${datasource}" }, "editorMode": "code", - "expr": "shoppers_age_10", + "expr": "shoppers_age_20_Aisle_Camera", "hide": false, "instant": false, "legendFormat": "__auto", @@ -529,7 +457,7 @@ "uid": "${datasource}" }, "editorMode": "code", - "expr": "shoppers_age_20", + "expr": "shoppers_age_30_Aisle_Camera", "hide": false, "instant": false, "legendFormat": "__auto", @@ -542,7 +470,7 @@ "uid": "${datasource}" }, "editorMode": "code", - "expr": "shoppers_age_30", + "expr": "shoppers_age_40_Aisle_Camera", "hide": false, "instant": false, "legendFormat": "__auto", @@ -555,25 +483,12 @@ "uid": "${datasource}" }, "editorMode": "code", - "expr": "shoppers_age_40", + "expr": "shoppers_age_50_Aisle_Camera", "hide": false, "instant": false, "legendFormat": "__auto", "range": true, "refId": "D" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "shoppers_age_50", - "hide": false, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "E" } ], "title": "Shoppers (by Age)", @@ -620,21 +535,21 @@ "properties": [ { "id": "displayName", - "value": "Total Persons" + "value": "Shoppers detected" } ] } ] }, "gridPos": { - "h": 10, - "w": 5, + "h": 8, + "w": 4, "x": 0, - "y": 13 + "y": 11 }, "id": 45, "options": { - "colorMode": "value", + "colorMode": "background", "graphMode": "area", "justifyMode": "auto", "orientation": "auto", @@ -659,7 +574,7 @@ }, "editorMode": "code", "exemplar": false, - "expr": "detected_total_persons", + "expr": "detected_total_persons{camera=~\"Aisle Camera\"}", "hide": false, "instant": true, "legendFormat": "__auto", @@ -747,17 +662,17 @@ "properties": [ { "id": "displayName", - "value": "Detected Total Persons" + "value": "Detected Shoppers" } ] } ] }, "gridPos": { - "h": 10, + "h": 8, "w": 7, - "x": 5, - "y": 13 + "x": 4, + "y": 11 }, "id": 44, "options": { @@ -765,7 +680,7 @@ "calcs": [], "displayMode": "list", "placement": "bottom", - "showLegend": true + "showLegend": false }, "tooltip": { "mode": "single", @@ -781,7 +696,7 @@ }, "editorMode": "code", "exemplar": false, - "expr": "detected_total_persons", + "expr": "detected_total_persons{camera=~\"Aisle Camera\"}", "hide": false, "instant": false, "legendFormat": "__auto", @@ -789,7 +704,7 @@ "refId": "A" } ], - "title": "Detected Total Persons", + "title": "Shoppers detected", "transformations": [ { "id": "renameByRegex", @@ -840,14 +755,14 @@ ] }, "gridPos": { - "h": 10, - "w": 5, - "x": 12, - "y": 13 + "h": 8, + "w": 4, + "x": 11, + "y": 11 }, "id": 50, "options": { - "colorMode": "value", + "colorMode": "background", "graphMode": "area", "justifyMode": "auto", "orientation": "auto", @@ -872,7 +787,7 @@ }, "editorMode": "code", "exemplar": false, - "expr": "detection_fps", + "expr": "detection_fps{camera=~\"Aisle Camera\"}", "hide": false, "instant": true, "legendFormat": "__auto", @@ -967,10 +882,10 @@ ] }, "gridPos": { - "h": 10, - "w": 7, - "x": 17, - "y": 13 + "h": 8, + "w": 9, + "x": 15, + "y": 11 }, "id": 49, "options": { @@ -994,7 +909,813 @@ }, "editorMode": "code", "exemplar": false, - "expr": "detection_fps", + "expr": "detection_fps{camera=~\"Aisle Camera\"}", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Detection frame per seconds", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "(.*)_(.*)", + "renamePattern": "$1 $2" + } + } + ], + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 19 + }, + "id": 51, + "panels": [], + "title": "Produce Zone", + "type": "row" + }, + { + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 24, + "x": 0, + "y": 20 + }, + "id": 52, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "
\n Produce Zone\n
\n", + "mode": "html" + }, + "pluginVersion": "11.3.0", + "title": "", + "transparent": true, + "type": "text" + }, + { + "datasource": { + "default": false, + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic-by-name" + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "total_shoppers" + }, + "properties": [ + { + "id": "displayName", + "value": "Shoppers in the store" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 4, + "x": 0, + "y": 22 + }, + "id": 61, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value_and_name", + "wideLayout": true + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "total_shoppers{camera=\"Produce Camera\"}", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A" + } + ], + "title": "", + "type": "stat" + }, + { + "datasource": { + "default": false, + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#57a1f2", + "value": null + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "shoppers_age_20_Produce_Camera" + }, + "properties": [ + { + "id": "displayName", + "value": "Shoppers Age 20" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "shoppers_age_30_Produce_Camera" + }, + "properties": [ + { + "id": "displayName", + "value": "Shoppers Age 30" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 7, + "x": 4, + "y": 22 + }, + "id": 62, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value_and_name", + "wideLayout": true + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "shoppers_age_20_Produce_Camera", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "shoppers_age_30_Produce_Camera", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "B" + } + ], + "title": "", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "(.*)_(.*)", + "renamePattern": "$1 $2" + } + } + ], + "type": "stat" + }, + { + "datasource": { + "default": false, + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "shoppers_age_20_Produce_Camera" + }, + "properties": [ + { + "id": "displayName", + "value": "Shoppers Age 20" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "shoppers_age_30_Produce_Camera" + }, + "properties": [ + { + "id": "displayName", + "value": "Shoppers Age 30" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 13, + "x": 11, + "y": 22 + }, + "id": 63, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "shoppers_age_20_Produce_Camera", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "shoppers_age_30_Produce_Camera", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "B" + } + ], + "title": "Shoppers (by Age)", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "(.*)_(.*)", + "renamePattern": "$1 $2" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "default": false, + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "detected_total_persons" + }, + "properties": [ + { + "id": "displayName", + "value": "Shoppers detected" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 4, + "x": 0, + "y": 30 + }, + "id": 64, + "options": { + "colorMode": "background", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value_and_name", + "wideLayout": true + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "detected_total_persons{camera=~\"Produce Camera\"}", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A" + } + ], + "title": "", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "(.*)_(.*)", + "renamePattern": "$1 $2" + } + } + ], + "type": "stat" + }, + { + "datasource": { + "default": false, + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "hue", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "detected_total_persons" + }, + "properties": [ + { + "id": "displayName", + "value": "Detected Shoppers" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 7, + "x": 4, + "y": 30 + }, + "id": 65, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "detected_total_persons{camera=~\"Produce Camera\"}", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Shoppers detected", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "(.*)_(.*)", + "renamePattern": "$1 $2" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "default": false, + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "purple", + "value": null + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "detection_fps" + }, + "properties": [ + { + "id": "displayName", + "value": "Detection fps" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 4, + "x": 11, + "y": 30 + }, + "id": 66, + "options": { + "colorMode": "background", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value_and_name", + "wideLayout": true + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "detection_fps{camera=~\"Produce Camera\"}", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A" + } + ], + "title": "", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "(.*)_(.*)", + "renamePattern": "$1 $2" + } + } + ], + "type": "stat" + }, + { + "datasource": { + "default": false, + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "hue", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "purple", + "value": null + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "detection_fps" + }, + "properties": [ + { + "id": "displayName", + "value": "Detection fps" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 9, + "x": 15, + "y": 30 + }, + "id": 67, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "detection_fps{camera=~\"Produce Camera\"}", "hide": false, "instant": false, "legendFormat": "__auto", @@ -1023,9 +1744,9 @@ "h": 1, "w": 24, "x": 0, - "y": 23 + "y": 38 }, - "id": 22, + "id": 60, "options": { "code": { "language": "plaintext", @@ -1051,8 +1772,8 @@ "list": [ { "current": { - "text": "seattle", - "value": "de2u8l2s3t7uoa" + "text": "chicago", + "value": "ce2zptqpjpibkd" }, "includeAll": false, "label": "Store", @@ -1066,13 +1787,13 @@ ] }, "time": { - "from": "now-5m", - "to": "now" + "from": "2024-11-05T21:30:03.000Z", + "to": "2024-11-05T22:30:03.000Z" }, "timepicker": {}, "timezone": "browser", - "title": "Store / Shopper Insights", - "uid": "7a9d9181-fc1c-43ac-b55d-a0da4d93b8cb", - "version": 12, + "title": "TEST", + "uid": "5d29f483-58a9-4d52-bd94-87d00d223aad", + "version": 2, "weekStart": "" } \ No newline at end of file From 2562d72bb3938962809c548ddda31ce76bd2e3da Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Tue, 5 Nov 2024 22:50:45 -0500 Subject: [PATCH 283/409] update store insights dashboards --- .../artifacts/monitoring/grafana-app-store-shoppers.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-shoppers.json b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-shoppers.json index 58769982ed..cfd7f168db 100644 --- a/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-shoppers.json +++ b/azure_jumpstart_ag/artifacts/monitoring/grafana-app-store-shoppers.json @@ -1792,7 +1792,7 @@ }, "timepicker": {}, "timezone": "browser", - "title": "TEST", + "title": "Store / Shopper Insights", "uid": "5d29f483-58a9-4d52-bd94-87d00d223aad", "version": 2, "weekStart": "" From b656b13756b189c6355d24087180f85bba18ee07 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Wed, 6 Nov 2024 07:25:19 +0200 Subject: [PATCH 284/409] refactor: update LoadBalancer backend pool configuration to use site-specific names --- .../Modules/contoso_hypermarket.psm1 | 26 ++++++++++--------- .../bicep/mgmt/network.bicep | 12 ++++++--- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 8d9060a333..2318596ab2 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -535,12 +535,14 @@ function Set-SQLSecret { function Set-LoadBalancerBackendPools { - $loadBalancerName = $(az network lb list -g $resourceGroup --query [].name -o tsv) - $loadBalancerPublicIp = $(az network lb frontend-ip list -g $resourceGroup --lb-name $loadBalancerName --query [].name -o tsv) - $lbIndex = 0 + #$loadBalancerName = $(az network lb list -g $resourceGroup --query [].name -o tsv) + #$loadBalancerPublicIp = $(az network lb frontend-ip list -g $resourceGroup --lb-name $loadBalancerName --query [].name -o tsv) + #$lbIndex = 0 foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { $clusterName = $cluster.Name.ToLower() + $loadBalancerName = "Ag-LoadBalancer-${clusterName}" + $loadBalancerPublicIp = "Ag-LB-Public-IP-${clusterName}" kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") $services = kubectl get services -n contoso-hypermarket -o json | ConvertFrom-Json $services.items | ForEach-Object { @@ -551,19 +553,19 @@ function Set-LoadBalancerBackendPools { if ($null -ne $serviceIp) { az network lb address-pool create -g $resourceGroup ` - --lb-name $loadBalancerName[$lbIndex] ` + --lb-name $loadBalancerName ` --name "$serviceName-pool" ` --vnet '/subscriptions/2d68328e-bde2-4aeb-a5b4-1a11b4328961/resourceGroups/JumpstartAgora-ContosoHypermarket/providers/Microsoft.Network/virtualNetworks/Ag-Vnet-Prod' ` --backend-addresses "[{name:${serviceName},ip-address:${serviceIp}}]" ` --only-show-errors az network lb inbound-nat-rule create -g $resourceGroup ` - --lb-name $loadBalancerName[$lbIndex] ` + --lb-name $loadBalancerName ` --name "$serviceName-NATRule" ` --protocol Tcp ` --frontend-port-range-start $servicePort ` --frontend-port-range-end $servicePort ` - --frontend-ip $loadBalancerPublicIp[$lbIndex] ` + --frontend-ip $loadBalancerPublicIp ` --backend-address-pool "$serviceName-pool" ` --backend-port $servicePort ` --only-show-errors @@ -577,33 +579,33 @@ function Set-LoadBalancerBackendPools { $clientVMPIP = $(az network public-ip show -g $resourceGroup -n $grafanaPublicIpName --query ipAddress -o tsv) az network lb address-pool create -g $resourceGroup ` - --lb-name $loadBalancerName[$lbIndex] ` + --lb-name $loadBalancerName ` --name "$serviceName-pool" ` --vnet '/subscriptions/2d68328e-bde2-4aeb-a5b4-1a11b4328961/resourceGroups/JumpstartAgora-ContosoHypermarket/providers/Microsoft.Network/virtualNetworks/Ag-Vnet-Prod' ` --backend-addresses "[{name:Grafana,ip-address:${clientVMPIP}}]" ` --only-show-errors az network lb inbound-nat-rule create -g $resourceGroup ` - --lb-name $loadBalancerName[$lbIndex] ` + --lb-name $loadBalancerName ` --name "$serviceName-NATRule" ` --protocol Tcp ` --frontend-port-range-start $servicePort ` --frontend-port-range-end $servicePort ` - --frontend-ip $loadBalancerPublicIp[$lbIndex] ` + --frontend-ip $loadBalancerPublicIp ` --backend-address-pool "$serviceName-pool" ` --backend-port $servicePort ` --only-show-errors az network lb outbound-rule create --address-pool "$serviceName-pool"` - --lb-name $loadBalancerName[0] ` + --lb-name $loadBalancerName ` --name "Grafana-outbound" ` --outbound-ports 10000 ` --protocol All ` - --frontend-ip-configs $loadBalancerPublicIp[$lbIndex] ` + --frontend-ip-configs $loadBalancerPublicIp ` --resource-group $resourceGroup ` --only-show-errors - $lbIndex++ + #$lbIndex++ } } \ No newline at end of file diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep index cc33100853..d4b50fbe35 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep @@ -32,6 +32,10 @@ var bastionSubnetName = 'AzureBastionSubnet' var bastionSubnetRef = '${cloudVirtualNetwork.id}/subnets/${bastionSubnetName}' var bastionName = 'Ag-Bastion' var bastionPublicIpAddressName = '${bastionName}-PIP' +var sites = [ + 'Chicago' + 'Seattle' +] var bastionSubnet = [ { @@ -380,8 +384,8 @@ resource bastionHost 'Microsoft.Network/bastionHosts@2023-02-01' = if (deployBas } } -resource loadBalancerPip 'Microsoft.Network/publicIPAddresses@2024-01-01' = [for (loadbalancer, i) in range(0,1): { - name: 'Ag-LB-Public-IP-${i}' +resource loadBalancerPip 'Microsoft.Network/publicIPAddresses@2024-01-01' = [for (site, i) in sites: { + name: 'Ag-LB-Public-IP-${site}' location: location properties: { publicIPAllocationMethod: 'Static' @@ -393,8 +397,8 @@ resource loadBalancerPip 'Microsoft.Network/publicIPAddresses@2024-01-01' = [for } }] -resource loadBalancer 'Microsoft.Network/loadBalancers@2024-01-01' = [for (loadbalancer, i) in range(0,1): { - name: 'Ag-LoadBalancer-${i}' +resource loadBalancer 'Microsoft.Network/loadBalancers@2024-01-01' = [for (site, i) in sites: { + name: 'Ag-LoadBalancer-${site}' location: location sku: { name: 'Standard' From 25d8df1fa373e01bb429149b450b9f855c07c0a2 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Wed, 6 Nov 2024 12:16:52 +0200 Subject: [PATCH 285/409] refactor: update LoadBalancer configuration to use dynamic VNet resource ID and improve naming conventions --- .../Modules/contoso_hypermarket.psm1 | 18 +++++++++++------- .../bicep/mgmt/network.bicep | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 2318596ab2..883a849d96 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -538,11 +538,11 @@ function Set-LoadBalancerBackendPools { #$loadBalancerName = $(az network lb list -g $resourceGroup --query [].name -o tsv) #$loadBalancerPublicIp = $(az network lb frontend-ip list -g $resourceGroup --lb-name $loadBalancerName --query [].name -o tsv) #$lbIndex = 0 - + $vnetResourceId = $(az network vnet list -g $resourceGroup --query [].id -o tsv) foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { $clusterName = $cluster.Name.ToLower() $loadBalancerName = "Ag-LoadBalancer-${clusterName}" - $loadBalancerPublicIp = "Ag-LB-Public-IP-${clusterName}" + $loadBalancerPublicIp = "Ag-LB-Frontend-${clusterName}" kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") $services = kubectl get services -n contoso-hypermarket -o json | ConvertFrom-Json $services.items | ForEach-Object { @@ -555,7 +555,7 @@ function Set-LoadBalancerBackendPools { az network lb address-pool create -g $resourceGroup ` --lb-name $loadBalancerName ` --name "$serviceName-pool" ` - --vnet '/subscriptions/2d68328e-bde2-4aeb-a5b4-1a11b4328961/resourceGroups/JumpstartAgora-ContosoHypermarket/providers/Microsoft.Network/virtualNetworks/Ag-Vnet-Prod' ` + --vnet $vnetResourceId ` --backend-addresses "[{name:${serviceName},ip-address:${serviceIp}}]" ` --only-show-errors @@ -573,16 +573,20 @@ function Set-LoadBalancerBackendPools { } # Grafana backend pool creation - $grafanaPublicIpName = "Ag-VM-Client-PIP" + $clientVMName = "Ag-VM-Client" $serviceName = "Grafana" $servicePort = "3000" - $clientVMPIP = $(az network public-ip show -g $resourceGroup -n $grafanaPublicIpName --query ipAddress -o tsv) + $clientVMIpAddress = az vm list-ip-addresses --name $clientVMName ` + --resource-group $resourceGroup ` + --query "[].virtualMachine.network.privateIpAddresses[0]" ` + -o tsv ` + --only-show-errors az network lb address-pool create -g $resourceGroup ` --lb-name $loadBalancerName ` --name "$serviceName-pool" ` - --vnet '/subscriptions/2d68328e-bde2-4aeb-a5b4-1a11b4328961/resourceGroups/JumpstartAgora-ContosoHypermarket/providers/Microsoft.Network/virtualNetworks/Ag-Vnet-Prod' ` - --backend-addresses "[{name:Grafana,ip-address:${clientVMPIP}}]" ` + --vnet $vnetResourceId ` + --backend-addresses "[{name:Grafana,ip-address:${clientVMIpAddress}}]" ` --only-show-errors az network lb inbound-nat-rule create -g $resourceGroup ` diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep index d4b50fbe35..05f6e3f81a 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep @@ -406,7 +406,7 @@ resource loadBalancer 'Microsoft.Network/loadBalancers@2024-01-01' = [for (site properties: { frontendIPConfigurations: [ { - name: 'Ag-LB-Frontend-${i}' + name: 'Ag-LB-Frontend-${site}' properties: { publicIPAddress: { id: loadBalancerPip[i].id From 295c64e09c9845faa0dc5e63d8a5135f2c6d17bb Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Wed, 6 Nov 2024 12:19:08 +0200 Subject: [PATCH 286/409] refactor: update bookmarks for Chicago and Seattle to use backend-specific naming conventions --- .../settings/Bookmarks-contoso-hypermarket | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-hypermarket b/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-hypermarket index 3445f225f2..ddb7827726 100644 --- a/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-hypermarket +++ b/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-hypermarket @@ -6,18 +6,18 @@ "children": [ { "children": [ { "id": "4", - "name": "POS Chicago - Customer", + "name": "backend-api - Chicago", "show_icon": false, "source": "unknown", "type": "url", - "url": "POS-Chicago-URL-Customer" + "url": "backend-api-Chicago-URL" }, { "id": "5", - "name": "POS Chicago - Manager", + "name": "backend-db - Chicago", "show_icon": false, "source": "unknown", "type": "url", - "url": "POS-Chicago-URL-Manager" + "url": "backend-db-Chicago-URL" } ], "id": "3", "name": "Chicago", @@ -26,18 +26,18 @@ }, { "children": [ { "id": "7", - "name": "POS Seattle - Customer", + "name": "backend-api - Seattle", "show_icon": false, "source": "unknown", "type": "url", - "url": "POS-Seattle-URL-Customer" + "url": "backend-api-Seattle-URL" }, { "id": "8", - "name": "POS Seattle - Manager", + "name": "backend-db - Seattle", "show_icon": false, "source": "unknown", "type": "url", - "url": "POS-Seattle-URL-Manager" + "url": "backend-db-Seattle-URL" } ], "id": "6", "name": "Seattle", From 51b665e0aa7cb016e8f46e2fa966b86b28c0ad63 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Wed, 6 Nov 2024 06:33:06 -0500 Subject: [PATCH 287/409] Fabric updates --- .../PowerShell/SetupFabricWorkspace.ps1 | 20 +++++++++--------- .../artifacts/fabric/Contoso-Hypermarket.zip | Bin 103849 -> 0 bytes .../artifacts/fabric/Contoso_Hypermarket.zip | Bin 0 -> 822001 bytes .../fabric/orders-sales-forecast.ipynb | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) delete mode 100644 azure_jumpstart_ag/artifacts/fabric/Contoso-Hypermarket.zip create mode 100644 azure_jumpstart_ag/artifacts/fabric/Contoso_Hypermarket.zip diff --git a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 index 832f45e56e..c27e2c83a9 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 @@ -520,17 +520,17 @@ Function Import-FabricItem { ) # Search for folders with .pbir and .pbism in it - $itemsInFolder = Get-ChildItem -LiteralPath $path | ? { @(".pbism", ".pbir") -contains $_.Extension } + $itemsInFolder = Get-ChildItem -LiteralPath $path | Where-Object { @(".pbism", ".pbir") -contains $_.Extension } if ($itemsInFolder.Count -eq 0) { Write-Host "Cannot find valid item definitions (*.pbir; *.pbism) in the '$path'" return } - if ($itemsInFolder | ? { $_.Extension -ieq ".pbir" }) { + if ($itemsInFolder | Where-Object { $_.Extension -ieq ".pbir" }) { $itemType = "Report" } - elseif ($itemsInFolder | ? { $_.Extension -ieq ".pbism" }) { + elseif ($itemsInFolder | Where-Object { $_.Extension -ieq ".pbism" }) { $itemType = "SemanticModel" } else { @@ -544,11 +544,11 @@ Function Import-FabricItem { $files = Get-ChildItem -LiteralPath $path -Recurse -Attributes !Directory # Remove files not required for the API: item.*.json; cache.abf; .pbi folder - $files = $files | ? { $_.Name -notlike "item.*.json" -and $_.Name -notlike "*.abf" -and $_.Directory.Name -notlike ".pbi" } + $files = $files | Where-Object { $_.Name -notlike "item.*.json" -and $_.Name -notlike "*.abf" -and $_.Directory.Name -notlike ".pbi" } # Prioritizes reading the displayName and type from itemProperties parameter $displayName = $null - if ($itemProperties -ne $null) { + if ($null -ne $itemProperties) { $displayName = $itemProperties.displayName } @@ -566,7 +566,7 @@ Function Import-FabricItem { } $itemPathAbs = Resolve-Path -LiteralPath $path - $parts = $files |% { + $parts = $files |ForEach-Object { $filePath = $_.FullName if ($filePath -like "*.pbir") { $fileContentText = Get-Content -LiteralPath $filePath @@ -600,7 +600,7 @@ Function Import-FabricItem { } } else { - $fileContent = Get-Content -LiteralPath $filePath -AsByteStream -Raw + $fileContent = [System.IO.File]::ReadAllBytes($filePath) } $partPath = $filePath.Replace($itemPathAbs, "").TrimStart("\").Replace("\", "/") @@ -615,11 +615,11 @@ Function Import-FabricItem { Write-Host "Payload parts:" - $parts | % { Write-Host "part: $($_.Path)" } + $parts | ForEach-Object { Write-Host "part: $($_.Path)" } $itemId = $null # Check if there is already an item with same displayName and type - $foundItem = $items | ? { $_.type -ieq $itemType -and $_.displayName -ieq $displayName } + $foundItem = $items | Where-Object { $_.type -ieq $itemType -and $_.displayName -ieq $displayName } if ($foundItem) { if ($foundItem.Count -gt 1) { throw "Found more than one item for displayName '$displayName'" @@ -629,7 +629,7 @@ Function Import-FabricItem { $itemId = $foundItem.id } - if ($itemId -eq $null) { + if ($null -eq $itemId ) { write-host "Creating a new item" # Prepare the request $itemRequest = @{ diff --git a/azure_jumpstart_ag/artifacts/fabric/Contoso-Hypermarket.zip b/azure_jumpstart_ag/artifacts/fabric/Contoso-Hypermarket.zip deleted file mode 100644 index 5c32bfd6123d9715333d87615ab664c7c234f010..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103849 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

@Y3$ebmnqkm_|~ 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 z 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%0D@(NUrP|_4wOyBL*DTf2 zmudZ%X{#^Oj$fudzD#SqTw8Ftw&QZ`^5t6c3a!ryZTbrB*cIC2E3{TCwFOpc+pW|t zU8%jZQtPowTWOVc`iZ?XC4%mkru78?=KqXm@VV z>TT5K+^B83Q9Ey=_UcBh<0ftDCT+h>+HIS(qRraq&D#2#wNo~0Pj1#)Zqer3qHVWD zyJU;@<`%8%R&A-R+J0NLo3?5>+qA*kv^BPACvMZ8*rv7IuFbby+itsd>2~d%?OLxL z+O!?okvp`9c4&=vYV+*Ww%n;*xKn$5r&hB|o3cyWdzW_OE-iPrHgvbP)^6?O-P#ko zwHAA{`Sxhr?a?mXqrJ07>$O*#wpTlHulCSht>Hdxu6^33`?Rz6X)o;4%J*v%_iKCZ z*RJ2MWgpN69MD!ipdE2QyZ3-r@1QpNptkWr?aYJP3kS9KhqOfwX*(X$EaZ4$Xx)xzOC8bnJEGlqL`y%a^*X98e^fi@sCL^?t>Bn8?3lLZG3|t7 z+Jncm`p31A$F;SOYsVkg9y+cyI-$*ZLfhzscJ>MFl@nU^No~oK+JPsvdroQ%Piga< z(zZLLU3N-KKCSgRt*v@mJK?nU)M>5!j5g(rw*MLJ?lW40v)bHewXM%;mz~w#IjeO$ zr!99*JLH^p?>Vi(d2P&jZS(Wm1?RQb&ug77XiHwu4!EG*aX~A&sLgp%+x((-`bF*0 zi&}$A+Nev~nwPX=E@}5((h4tYLoRD8U)B!3tle~3OTVJ^yrM0AMcem^cKsDC<*L@> zsy6kiw(C{x;;Y&#nfBMT`LAhPUDM9Kraf~_Yk6Ip`?|Ktb?vn4+LPC{<~Ou?ZfINF z(9XS~y>LV8@U*tj)7sWgYiB>LJ@d5I;-)tDO>NVg+8H;sCvR%aZ)sz1X&c_sPPwH$ zdP{43Tbt{)w$W|vjN95Xx3yMxw0ZAnTiww;fEpQ5cy(T=2O_fxb6RBbF(+k&c{N7Y`Z zY8`3XRGPLgO}mMv<DCpcOQt~M`M+nTFg$kjg0 z)w=SuWq8_wJnc@NR?OE%^0jsO+Npf)8NSv|pe-)Y_7G^-3$z@eHc+UoD%6e=Y7Ypt z1|n?^k+!i&J4>X!Akq?IZIW2qQ>@)6*0LnpK#8`hL_1cZJtEPXNwxW<+743fa;cW0 zr}fm+meVK{EOTwJxwfXcc7nO~gt^wtLYv1z z+sr~c$3lD2LMyk_CRl2_TWZ%>YUx&5A1iGIEA0>~?M^GL$XXj^t*vLRoocN;W39Ee z(H5}LwzbhNw$a|S(Yn}b%i3xO+iG{(YNdACNIPvEJM9EJ?NK|esl7Ijy|$ITc7eV2 zlD*d6L7U$p(?L7eL3`05Q?4y2*S3>u=gYO1(TilW@@% zbkR0<(N1yEo^;V#yJ`!&YP-5>*STt$ZrVUMZFM*8WH;?`H?5_+wxGMVqq}yMyO!>u z4fN1f_RtRT&~Eq8@;tR6p4w`j+R>ic{hnHVFKrGlZGA886ff;@FRi(^Hm|p~mA7`D zxAu~^*1<N2M zdKA4Jy$*dA{W3j@QH{}_(UWnU@iarm3})tG4reW4tz;cy$=QzV6t*76grnwE<@DwV zxGHWqw=-DBMFk^mn2B)O9n`WOU6oE zrB6w3OBs3`Jqx`Ay+play&ih~^k(WU)H|&w*YBv`Nq>?4D*g5PTlH`0JIQj$hRTM^ z_R03kF3E1oGzOKS6O4uPa0BQh4T(#(B%h#_rnjXppE-#v|!pYYcm@#tyt4p=Il831vZtV;dpU!aPo2rajI~tacXjQal~9xZUJsvUPoR( z-b&s{9))kscjG7W_wkSNFYvtt`2`gOg9JkbqXahv7D9WWhtODLCR!lcB4UfVVxHJq zY$py72aETJ4~ege9V9s=4JEB5GbJOXE2S5tm!)#Ou6h&nHt22DJE7;H@24NFUqZjU zeoy@g`jhlIvH)2t*(ljsnbg4EKxGhPP!ih1XgC8)XeVi>X_shBdVYE;eIB(C1xk_+iAN^L zF642vZM5w)6}=3-IlVXCfMLZT7@mwEMi?WF(ULKVv5Ik+;mnL?)?qecwqrW5RrXwq`NRu8BG|i7@Zm284k=KrU}cQHIj9k6~>Nc?_wWilQ=?- zm}9|-=H%g|a>{cma@ufuaprPXa4vCfb3D0)xplZrxi`5rcs+R|d7F56hK zKOesie;5A*UoHp{j23JWQbjXFD@DV__L6W(c1Z_G56L*mB*``@U(Zy}N-tioxn6I* ziF(uZX6dcd+pM=;Z?E1py{Gl)`V9Rx`cw4{WahGbvQn}%*=AX^L6Si!g9=a;ro&Fy z4OS$75}Qn-bLmcW7kX}b9AgS&Dq{}g27|<;GHsYsS+iLySesebSX8!v?Zn>67I3UM z9-N$Xu-I^xWy1Kg-i{z2(vu1I^1fR^V3Uwc`!tP2$bw?cp8dS@QGpPx5UA{(>Yy4M9J_0)bShC-f1n5DG*tqUoYt zBC=R0R*8#>i;FvpM~J72&xj=wm1L-7m_#j|A)O;#AU!R;E@kT(>*du;)f=UESns-? zr+%=0A^q+8dNOZWuq?lX1!k{)ZfaWkB4uX)BjU*ro$s+O| z+EJREuBHdkThRy5C(zf^^%!OhJ4QZ6ImQIWG{!>42F7;ANyc@C39|sR7&DD2XZ2@| zXR+A{?7i$$>>F${$D9+zDa@(PX~7xInZ*Ha5H}yU6t^Ll!875R@w|Bhd4qX#c{_QY zd^3TCAWBeNP(m3L~&y_$MM^ycfG)4QqXqd!)EzP_W(N5(QRG4L=*F(_>i3sqnB7|IyKIK?>6xXfTM?U^o2Z)PrL z0<#1&o!OY#jM<$zkF|$IX0zA^?40bIY&mBLXB1}+XFX>d=O)LRYs-z{I`9ZyG_MG+ z8*eyo3-1K)Dv!x$^SOL;egc0nKShu#s3T|~Xe^i}*d+j=NT?KU7akPai^htsil}0_ zSR;-QCyQH&TZ>PM^GQZX)=JMvZS@@WitClrYp6%k7wa47Tj+1rm&&4LHDt|Y>t!2c zJ7q^@dIlB--RkD*thx1lphPOs1OY$;{5o%Ph{U#H`C~&+NhM$(+Ml%-YEku?;xBoZ6h$ zoDH1AoUUN^+)K>&?n2dGJ9E&tdOjwte4Euz{$YHAlRU|K^{^*s02M=9k`Li zWGC`;+6vlA+HG2OdM7%SQJ%4jA!WKUOEJqZN3$lfrmzmOjpvD!lObE2}Sy%Iid}sZ6b5Ay?B&(nV2o%N&+R0(v8x6Qk7nQy@GnX z_0;ccqL2m65_g_EdcI+;P1 zlb6%Z(tu8(+tR)1e1-|bmyw6jfpL>z$V_G~WL;uiWpUZI>;N{CqtCJA_;ZeOp5|2M z*5gun#dt})O1$N~?K~mhp6|fV#;?b3%s<8_3%CN2Kq{~jI0~Ev8wF$`L&z1n3g-z` zB8_OK=&(pn>?=Mjz9GIT=1V*!c_kGjEhXI~<0bA=Lp>k8NWFo2!}Zqa3H2@YZS__9 z8vQ)_&Gg&pkJ7It>n>X?yC`ECSQ^+E_!{Ies9?|zy2C0s30xA7bdv;R3YkORNxMqB zLAyz_pgYrp>FM-o^ab=o^wNwrjCPD+jHej48MT=8nJt-}ndewcwjMh-yD`MDGxo#(|Xz}w9W;IHJ{3kC@02u=$w3HU-| z;Zwrp!oxyC(O%I-k%8DrTt_@cJW0GkykC4!Tu{?8x=7ba_4M5J3hRy2+ph=u zR{Bx;+4W=fOX|varf^nqj&u6*X7Mib%=n@F2K=r3ZTwUGJN!UFNkJ{a z7{N9HRp>3;DLf{WiR22K6Osc$2*l|{AxsBx{m_6h+b_3+VQA2fBuyjb4&olirR#gT9b{l`du2Gu#<9 z81)&07;6}t7zY?J%tFkD%tfqqEFN3N_Gf2jA7&eKTseW9+?+w2rJTi_6C4t^I@gq! zi>J>g_$Bze`N@J(g6e{Kf(?Ql0wbZj&{r5NTrJ!qJSBWuXev4=qKS>gwZ!wp%f%PP z*TwphI7z%@v}Bd^g!Gd1iqt{RPp^<(2fev^tMm@)UDCU%=c}JXKev90eh2+-`V;kc z>F?3Ms&6H$Bx^4lAloh5BRe8HCA%(T8)P>qX;99fFqDH1&=F?9EZ9gR(;4&v^p5oT z^wspk^h@--j1)#KMq|bT#yN(VY03;_7G(BiTCmo#&a=$eYPN=bmOYI4|J)%RR z%OXc{m^iz5t(Ya@Nh~FV#8na@X(O2^-67p0JuJN_eOh``s;?KIS4;1ZUb_Ae{cZZ^ z_3!8tG7njpEU&DxY_BXk6o8qq7>)ynWI!?}k;vv`E3%3lK(9sbL+?jFPIqLuGJKdd zm|dBZSW*tbapzRv@VO*jATNZM&TGh9%3H?s=7;bL@(b~A@F@Z#0U_uvSSZ*dFcHoY zE)Xset`Qy*9ueLY(nThs*`lMO+aiiMRa{2gPrOQeT>P|{BQcUxl{Ap_lWdXhmL8HG zle*}o={43Hp*LF3QQt+sul_*&)A}YdQ<=NWQ9k{uvB9@7> ziTjFIicKVyBnEnw^*ZW3rDvn>uAfi8h<;W5_WDQlMY3wLda_xvMKU7;Q-fSE29AP0 ziAkPB)2GYm1?h?OF7%1?^K>pl!8pNSF}X~F8NjT<9L74#y26sMi?KNz8;&ixaGJ)UN&BFUU^Qc&_-I_==b;ag+o|3Q5XJT1bXSrb#AC zd3u(5c6zaTjr2O{P1BpFw?j{&uhb9HFQ;Em|B^mW79#5_;~E4S1R2B{6g4Od<)IBs z0U()?*3tNM5nVzrN>8BAr7x#%p$i!vj9iQ&jGBzPj4q6`3}dDpGlJQIIfONeb(VFR zb(2M5yRd!OA?%{;L+m5$`kZ;3g`6WCDmR!L$<4+s&TY$O^Xzy^UNEl|FO64)*MQfH zH=ehEw~Du!N9W7=3Vt>IT0T?27UUI_7PJ*~7Az915Udmkgnq&e!t=s&LVdB3*h8Eo zt}gB-o+92P-X>N^JS3$g7uIi~-$Q?-{y6=e`f{0<%wJYQ)>Af9wn?^Cc20IxrZ9*!C~RNcL5J)LNNus1uDpTrFno?R)I#Y&G=1@*iZc`XkBdR@B zL3N~hP<^Pu)I8K;)Kb)n)SA@V)aKMS)Q;57)M3=w)IHRx%$dyD%oWTH% zOg2lvGGHB~y0Uy(VXT6z(yX$qimb}4>a04fR;=>us_eS#!R)E*RqSEhG2HpwW!!Dt zgWRLsCj6%S4*aS7+5B9>`oaOik-|yBBx2>v@WR=sViv=X#!~qX)$RX=`iUWDV!WfEB+Zb5EM z9zq^No=l!Xot5b4PKX;;!Q!=3eBsL_YVStU6lIV!m+(U;muL!xOlz2)}N;ygeN*bj)r9Pz{r4OY)Wguk=WjbXpWgcZdWgq1nvzxKo zvB$Evu{&@Fawl--a1U{hb5C+FaJ%sP^JnqHh1rGqgvEua!ZN}N!ZcyJu%2+RFi;dO ziW0?$nu%J9dW$woc1ZR}j!AAwY^46uAZesDkF>C~gtVHplavXj;02)&2K7kwNexI% zN!>^zNi#@GNh?U(NXJOWNf$_$N!iFb$uZjR-m?~cBOWs z_N4Zq_NNY_CQ^4$=QEcww=wrJ&oZww^;im4K2|YSC01=#T~<9-TUK9I4R#myK=v4R zS8hMZT)XZ|H_HeswVUYIPbBy1)O5@i=9imHifi0X*yikgVJin@vViu#F0i7s>3 zN%l(4Nv=q)O2|?ZshN~b_mk$5#z;#`+e_OC*Dzc28N<~UDN>@rh$^gnp z%2di~%5{n{)spH>4W~v>W2r@`b*XcytEu~`qnHz!vzR-W=a?E+0agcAcUEs!Q+5w_ zPxcJ4sutU|0JtVC84 zs|Kq9s|l+Xy8*iwdnS7wdkecacPw`zcO!QcodsJIZ5xIK0g>+R?rsU`?v`$lZdgj` zURb(osaJAAI#jw-LIGiEP-0mSkoe~N2fN1{Gjl)pd0y9Wcj88&MTtbQMe#+^MKQ`5 zm}!{lm|3sMuUQ@Ob1`!9axru9Ymk2@z9z&aY|L%Q^nm=%EzVYheqHo&lXdfTb8<6u zb9bY53wGmo3o~$8Bv=$!bX|N8+_`*ECA*2cu|r>ka)fe)iiP6dq1`dv zVXbGtwUR3LYDlU`YDJ*!)$O%NC=HaRdIPFg=kXu0Xf~BHuSTQ1=UY!LTICXr64jE~ z;;HcD?$qv_&<~;6p@pGo$0L(pCnqLHlAVlgjU7ZCMV$ie0v*0P{&mK8;CF7e^>)|GN!_gLhU5#7H_wZisbAa!HMejL8EDcr!dQXdsqZ^HBTxkIQ=RxkU5W z)IVt?s9_uQX5DARXN_j%W|=^4Ai$-|44()c51eQl*Uco)YKBmfI3!E5MjIp=BpVbN zBrKK)#S5jw@?lA^0>5IvLce&0>K+4s{VRPSXm_H2;&x(wB6)&- zqI?o~vb0=egq5aJwUjTym!?ZRKP|9~sF-fn zBJ_p)GvEVV?ArbEk$J>CViE2Z=Njjx>^kD6-cHmGX*XzJY=^ZY+OgUv+qr;;Bd9&T zeH8d(&h5GFEA1WaI_*vEXYF+D*6myEk?l|IJMEe6`t2eyTo~VRxu};#>Kq8$Fd8=V!`$<-KEcF#2(RP$LChUFPS?)8wOK=rH2cIH5)cf<(k?3@-?eqMFk<^FN}m zeURb!@PhpUt@+&P^+TQSuS0_jqoX2&0h@i&EK_MbeSAZ(9@ubBkKdr#pk9P3O_6wE z+LcViqVOT?^#kw^CfXO}&NA8BP1+gT-(!5nc~5;SkH!nhRde^AUoWo(eu_1QC+-i* z0D&W~`61g6@`8)*O4>}?tTSw$te($6!#w!)_bln;zSO=G)l4bX0WIgJ9=q}xRnF(A zNV$EYkq`I$UMeM;R`=RRlANcZ$N|d1lv=`#?qHiCw|UjTNzRAw#&Lh*WGe~u>*_w% z<+;|mR_&Qe|1H%1UL9DCTb)+@M^iFy3*%t)YQ)xhbUFFt%ZrM7M<-@o80e=7e~{#br( zfp`H;E;;wlbJVI^)scA<=T%4GuDl;z*x=l_-tZphUY0f0Lx$roU@pL1lnq*!ji|V^ zAvJ268r;DBN3HfotyjG_3j~SJs>v+9=b#FU%%h6j3-QDCv+`s1!$*W5&=5Qbd&GN$ zFCq?nVyAOC-k|6vf2?#2)Ds?SQz}wwQvRjCVlI4#Q2mqtrMUP`Me^i}?i65VZFWz# zKMZjhSrbm0?(-i`$0(Pxmy<>EMUdyd1U*_kD#?s_Ecnd$>|kbpV4~n1$%N!V)YNO2 z%W*1j9(9jZ5gs_A{GxI13g49$sx&HkKK9;SH6`5WM-|Hknx{R{-Fnyt@87_0cJa3H z4$}{H;C%3=1M7Q<50JP&v5#>>vGSFbl_L5%;H$%m$ajfSzi4l-=Qf`1UEl))bnduq zV!fizXxAdwV#aUVYSxz^uDEWVu7BKO+^XCHaS-z-lrQwkU)7V>%ek?+J&noy)}2+J z)%8*-Rk2puQr^;*)sR&jP#VxV&^OAC&V~+-eU0Jp=XeuI^KJ1tH5U6w2Pl!CJIRe>(YrBm#07Ee6I?O7`k-wTS^1kx%z6hy1wNc zμ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

KuSH=e0cn&0_HMc*{*>GU9|o{)8QN*$+h z*Gum6UobQhH3?sT9Sm=z|6Mg+tVZzh6RlfaZ^knD5GE5Eh86|Rt`T~-kFW`gS=@dI3#cOGPPTT^ zweqUwnntOMITCdO#W%lq(>BCd-c$|}2D)pxW~XGui)zEPWBL}31Yo|BU=#TnfU&o2 ziOC(1B8xuA7Cr{10eSYgAC*oK*zkIDVC|NdR9!puf2V)TBrQB|%%cVRO$kaPRQh6y3dbpX;617Nu@WoJ$pn<%>C2q4{Z` z-DESME$No-dX5MT(PrCqO;yYP{+Zk^h-~{FNBC_^a{iM2#?!08OGU1-DkX$ntLcUqY$B z_%Ummot(X*troGKe9bA*Qe4MO*9>SGCd_YR9UxDk3e&gv7t!1T zK&)B@m0xd8exAeOIB1AaPPo=Vs=LN5gfK#Lgt5_ZXiNfkKZpi$bh!RFC~W+5T}BWd zJNf~vTBStLLDm3|0T^-vuqH^05aT2i1gSBN^DsluuZ3mH)=`9mEugnNVxV^p?DTRr z(#!HT7-W!Ln00il!x)ksriX$+i{@Ra*XQcaf=bKoLtN(yxEcBX%kXA`Mw2du*<%hd z*M~;Tb)%x7pMh|P)Ij?K`$CK|=9w09xfp?&stSLuI9DF~qL;7uj6`{Tlj&}UK(r@> zUGKSG(eew{j@piY2~V&agh!WZP}g9s0|bbu0@4TXl81fufHz%W2aZK^SPk_x@G1WR zPa9jbbjf@yH3SVL(A=FXF-;T1dA`ArD@J#s;tSecT z$gg-CSQ?vte>TWEj4gvaiiMnYsi4}D^-B8Lx`t%xwKq%e7WVVMcx!oTNo7JCl7$1V zhNH|L?>&NF=zlhl+0}j**SlL^!5_A+Q-V%)P*WT%{Dbb zFa#JaN_~}q;T1dZUgEPPCs`gT?Q|xzco_Y$fitr@{wiD|K#It;&m6Bu7VHETSRLCp zTit@4?c?e)K;FJ$Nz!350o?7}!x$hzx#keIi(-fUSWqazjeGkDBqI2txdYumEw$@2s`-wrz~=zhJ^yUJvW#$6@y(2f>HelhmcWr>FvUa=a$;|2 z*5>O}rRcLmD)+nVA1b|x$37d$)u?Ba%uC2^E5POe@$PDg)O^RIeL;vE%p%N6)SNb= z!;vGfULto8Q!3joxv$bG(!;rlL}XC&P(`nA2BX%H>%+!WIuAKrBsa$-coLjcXSny5 zVzEC4|4VrhSxQZPjq^9VZF|Q~ehOfxZ*^dSvpF&OYTa|?yGmg!_DQK)h2Th?MJYrM z5@Bjzi%ro%=k{YBm(ne=h!NId^x&)8EFYMh>pqizF1}^;bAv3C7?7mlpoCiqJi*$Q z${tVK3}e)r1i~aYk=!GZe&(vhb18C?Lg-Jva{Drhd7>OY_QG>NX{3}{wv2;ny`C*# zKXtrijS9AI%kC)d&E3jb%!$V6ApY{R^|-eE4d&0r^CQsXf#13^|*s6;dUE~VnHMR)jS_E zZq7T%lMLIJ2H?hRs9_!<6P%|Ba}K8qdvk@QMQy1vgg2EEd%_c-1lG^In;ET@oL6^) z;s6Xlp=oYCbVcQlVu~n9si*0?Z_~QKz z+h|?|**GcZ)EL5FR?Q@y8g>fOh&SQwO}Q+8+uHdk*zEiPa`B7~ONV9I_9f^M{LcKM zjpCU)<>GG*@D^AfnuXXGK(*(;I{dQ@8JGpXf29gV=0NZ*X{X!G8V|D7 ziSl7rr%^`qXOy)6>et^#ES8etkuz|B0>l#WU||J#8#WS&d-ixPj<-m7+{*B*sTs9h=s!#zZx9H-6@wHS4{ zfT4bkK|BK)=xvHw5JXL4T%pYKvQ!#!a1}f=gIuVP&?H`;JEQ1Ro)4Bz1Ugmo5pD2N z#!>;YCDV^?9NG7n?>gE7mYvKJU-<@aG%rZ7VZzbS;<+qnCXET zgYQl}&SsNDC6u^SY+qHogiP=TGsMgF80MMT25wYii9Z9rNPQvwrv~XfP7#)Zgt>@e zqXXSyJ3sUas@R{Cr)~k*4Y6v9h&H=7< zSYY8(!5y31_-HwzSo;+QbRrc8oqbvBxHBI+znVMQVTSF`O7Kk zv#6h;lDbHgV&Onwp>&N(ya>k9k$Q>gb&Q+udh6pM*rN=yIeq4D8Mgyiix0LQm77rI zDwvkF-p>L2-RI%g$|dp3i(z$3{H?45-Bep(eXv#IfLQ{n?yy)IocBSPRrYqZaP?vh z19~0Z0vm&RgMI{&1n2?w3%!o^s82gERrfH8RIsh3G*l}3nT6B! zz}N&eGbZ+_<+CqSt&v$<<3o{jUsu> z8m9f#%K*^cvgO>48`-ERb$QjK4_Yugz0m{9ra_fzWF6fO`+=5TR&S0aQ3q{X7qutj zq&iYIbWK;Cqoek#jH?eTkp#VF2EI&KgZGw3XZ++IPS@mrfhwHqGBpVl)fvep&eXOL zo2n}OB1>Ll=^RqZOpBTWencKCbJe8d>p zcvVVc%9J}RSHbX^w5CM4&y-Z&eScD%%*una0Jd71N-er!zWB&2leWD7&eXc8ZpUTse|r3wl9flYAHR4j zkt3G3QG&I}s!c=fVtN+{gbISjsbg?F!1(w^BB&b}hQHd$0N47@3a+QwIzmhQ{s z2p!{1Gp=E2s4rI~BFicF2;yy(RojHukSuWsK^~2pY)1#{#av4>^EOkmfe=Hhl!)eN zE)WT{S*0q?T@B9|d|@LSAlV}6%%~Yk+L4`=wFX;J^g&6$ka0Xg3?UjxJT-yn+mu5* zAt-91DR_c0SoR=rO#*TyK>h!p7#Nf!ly?aCLXZCw=_ef*i`fJn5J@RxecJ(z)?*ih zejd!^GJzX!nQxkYgncUG8A|QfRkJQ)R7yd3)Era};Ez$GWVU5Z zNZAv(2{ZJ-kpdf8wp!=vRTRg(9wrZ5@HMWy`xz|?fRQ&aaDw{;;}$*~-C9;6QNMe=cxNuV@}E8G=M zBmbtH0~X-tbz2>Z*tKmzg4rV12ipd#5_>di(##jiY>tAFUGZE*kpQhu(I%boaZfz= zv0A)QbgJ8dGr$5i*98-B61p^%d)|>!SfnKk!EiVx!p2{wL0NgBKd7T75fjF}>Yd#C zNfQ5=s@=Ygr}+uw6#upQTy}-1TzxENTU#kXd#>H2NM?l7=Zf(Vztl!lZ4-{}M*0n69jtEtE~3fnWIG3 z|L*6mnxEB{P!{MUHT$gxg71{=Cbb(?9Yn$2I%C5=?qJq%opASfK(!2pQ^kAl0E?q> zP+Ub(skwbE*;jcJ-Cz7LyU>oLdeC05xYnVwe1G)*j=>!AXB!&+Tp%=)VAXCw$peO; z#jx_7scC`?c%~q6Fr-@?dNAny_kT-eoS0?IVoF%^q|g3j`6| zDuX1oj%6EiAT}SnHnD5@ZG>*L<>(`8SDoiY__b)~?Q`a$? zDX|?V{wWPN1tVuMJqhQu%d&oztcQ8AY0ecJIf5g6+4j(%m{IjLgxx}KJAdQOQE#<* zpzoSMMVauFW-9)%&=8E^zWs#T%0!DdW4?GG|FP}k0vCrtk_@wr0Ql{##*IItXBAFS z&>Jom%h7v->YStKVbFkppKdZ*TuLws7$dToyMon2m%df!wDaHLal+3R|9d6|iQ5UX zG&^vdV9u7@@NIm+NBoKZ;$J|B;HsniFjoX(dc1YFIu5X(kGzECBIpgV`_phU-gYa8 z;Frg%QV1qE|1Q_xYcMnN^ptqxSdXc@h3Amy^y-MZ-!)UYFsU%km7=KJ{;VU&?P9FvUZc(?O^fLUVKu3LMKpu`0GHuu>%En!}?=Cgmdvk4YulX}M*&T#Y@fW@xr; z(p13FgD%op`fI|DMo7I#m`K!(JTpU+U5x#eJk{dX+$13-wO~gUq}Gt?snMDegwawG z`r!2OX%NI3;uq)_XyKuW0KnxhZdy>rC-=ZDHox#Q(%LD1uoRo51K`f1<;QK$Xvlrg zJ;wS9T3=8Njnc?{AStTGa}@ZsR@-m%w1p)WrX88xcAcp=t1yxs*`!kh zu=yAi%l}l-R%|=!G&1l;v~LO}~4e zWBn9rA^}@cW(cr{u8VSTQn2SK7nEnq?UXB7S5bMg^nIyb!3HvTI)-pkb@vmYHNmmu zEpY?&_A*+2#%)iA-&%2c%39Dm!cKR(eaG_QC{l3le#zLQ>*Ilcf~qie*c(S~Cr050 z3~2iwT4?2$XC&h`LS&DjVmpO>XuIN9*ltl^+!3IC}=ZrLxso5)&~oFB5x zr)s}cdd>!p5PuxV=*mI(jH-{fY|)aZoSf7dcR|g)&zm2@Kd(pT{Aj_1rJ7pm{%hwV z9Kd@c^&C$05!L3j+?)0}s#fOuwS)b23^NO*CKUBtXgqy-zw#V99M`_#V_NKC7cWN<7+bVu@j*I;#p-28PVXL|0IP}>7^ zMC6f$_C=Ni>R*IA8^1*GQ16ffos;c2-aUH}RpKGLju^GX%S*Dg#hj+6}`Np-(N8^Y8~>`m^Dgj#g3+!KTF zD55L;o*MVGU2|l1`0dy}86J6mucpV$+^WZuuvHe&Se;9cC1X#pCfM}H%Bm$WSShR* z>F4{{=9P*4)YiMtOzD}A*{1$!hlfgD_pshdux$IN0*OzE0BZ#+-er1kr-pjJSXIBJ z^HB4y98f3(^-%<(R{dL#Xh7T0!4n zm^Q6K+6;7S^?Vsfy%wc+noZ?HEmN20Sy&p{Wz|RNsHGubZzLj zTuudN7{2)xeHleB&^k+m5f(Gfm)t)YPa+e9TRry5xzREy^TOY3+9Hc%G1} zZ-`=r21PcXw?B@Pm)uDL7C^7NVd*#G)RoIOQTI|hpBbb=^CiA$){@$1lZE1%d@|j{ zCnQD1-KOkzS9rlv7Xs4m2GF=$O&tbq3yXi4aR|n?yrNEKI-&cxs&(ixj~7x^Q&yFlC_LLiN+~4AJ|3n)JWN| zsV4c2N=BwdnApRBEtxM5Vn_-5ihYHRe^LiLj^an^6zFYiH}F3MCcrpZUeYTBi}vUb@g z+DG;q4zZ3Xb@<&Hjwt=XJFFF+=%ECCnyq};_=-=LLlLX#d?dLy#x-v@B*I<}tkI#m zU=;al+=C&oQVtqMs=6zX2@p6nlAE<{adwKtlw_D!GmkTv8M~X@1LsMx1-d98)ew8wd^&&*X)$TCxqT%8HEwaDe5W#&t_dfC4kW>?vzqE^BCqZ^QQOY+!} zv4_c5W4ZDAcXg(sSNh2MAbd11k4?6uvq~b&$WJOpI)y;)mKfT>97p8Q<|Le+hdN1}4rVF`|=~?XYY%v=>T4xr3Q2I{ezCkp2 zqjtd`!P_F=U0%f)2Atx_{p9U`^2yS~Ksl=mb$eEK_U;%E6mcb|nB~!fy-vo@@k{^w z*njxv^PP<0P|sQgAcbpY5f3TAdby%kusN z9*Kn;o!&=F13AvG4P&&kS1O?}9jvo4Xvfy)w*&iJt^l~>Z3k&jVh2!xsUp9ujTDc+ zoyZ-*vXm@54X}R=ng2ZY{a5Sm!19b5sCPI%l&#!UI-9kZ*@Dk(<Qk^EyT;l5mA}UhSXd9RC*JRr^uImkr_5Q_Jwv3YWT8sjGAG#$}B86~L zL`(T|1saY$C!9o~-JmsN@8A^TY@lCcc4P4Q0tTDjP7p?~N_&caTF{=Jhq{i_l`CSh zcr92BcueL2##Fi=sVv0|#;}8F3(14|`?-xsjku}Io%8@0&zr%nNjXgxbA`Mhu03Zv z)1OwCA5QY*ZRI{i&Bi%IF2B9vvQiCOC7eh(VQ`V8l#Jz7;5jiSQZ(#}Y-ehDetEuzHI{b?E>KGwoYcEOCG<}V zE0ZtKCQ{FG%E->}&#_d(GI}ngQ_|DI3LHW{O)$-JclMQ!P4r7P%M$xKSRPy@|m+i4s0tw@!*b2*;Es?s`?JnSHf4Xqv{ zjFT>uv7M=-sN=X?iMNzSsmJKg>nvVIwxL;(n4Dx@6G>kFT#hq!E6G#H7F6bPCGFX# zg+Y`G)U(n$l&Vs`tT@e6Se%xNe3Cm~(vcs+aNsEz`#CoHx%7-#iL4w(yY;T?FNa)u zi`jP=g$?!!g`}F&SYe>7vr!B2E$#?bUOJz?)2ORn1#UChQksyYXAnuLz@5qsXO=SF zD_jn-!tO#Bsg3?A$tg)~!Fb~e+@g|ER38{cUCho$nk;GvhWrx--GycJdvfSTosGho z=UC-L#;gszSfPuwtKN9yP0Vtl4ZPiY-GxhOHu{H2qo_qCE>aii2A)iEN-~N%lU$eW zCK$mIlI}1fDZBM9PhIQ@%Jrf>E$VDESwx}~l?2KvlUsQJ3S04H z5(Rx4Yn^x+s~)4MxGw}tE>JF#Y^7VMDdcmkWa<{Ojs6*4h@dVfjMI>`PMpY`Nh&H0 zYu1a&Jkpw!_7>8%$wprnvr5_<4!iMk6<>Yd@$)JugP{8N%Y7d|6_ zdzQ0>yjHqS%;lWa>&Xr-f14^x*3j3` z)qJ`zyWT0Wjcg}_#?eS7vs!b)NL38>in0ksjFGaujF$AF%r*4>yT2 z>U`cr$}pOgy@^qX6(s1#lT%#zRy+eiZsA}miA3es6eQC|@OH4$Nv#=2c`8mE&&QNg*atdh)>%H4#%8&SWSmXxT!K{QA+TePWe#RnrNq%U(}oHzah6gRaW>P+Luc9+ z))|%+%w$HfchR0EONBAK51JDB9;^-IE4)QaJ!S*`Awfa%8ZwnUpM8l|fsw$t#B`;V zfP(x>B4@e{C7s%s8^paSsKDsTZpU<`E#WU>dQ?QopoXO%Hly=M`%!$G%_S57Qj1#0p?qt?b!G0!{=1t|( z>`9ks9R)cV!#Kg5a}*O!I-?GKji4ay25$u;i8M|3bqY>gs=o9TriBrW;CYQk=O8f)T-=-)H?KZ zk}Fe8n#-EZy3HyG&qPeV1!uf2eP|676Uf?!h4(25=dQ$U~33?EH7{`@ggT0j7 zld+pyf^vZ2N*>IX@?6RG>~!8CdQIA3;UR7fb~fPCYy^i`n|L)yO=;=EO5B1pK5a6$ z0lzt?1dC5Q1XK=*x`P$U3uWYCrjyD8U$l_XlTGKliYC*W2nVy{;1ww=-gIUdc{9zD z-&JJA+d)fVm52UhGukmuOUSkCkYo|H71eu%q?y@y25 zrR+-_D(w(7hB$E@dJc*e?B*_F)}sVbx{CIYdQu(9HmsbabCgwZh*FSqmY)lHGHwbS z$$RM=*i$(RsR8Wyyh|K&Xuuf;N$fqMAYLPKXQ8(+O;U-pj(&}6$!{nyBk!PQ7bf$8 zyou44TaX#bT*XNjjpfuAPNW#I>rq@8g}6YjMytu#FBnas3Wm}vk&^X#GY(Ox6cr~2 zC5gR`8Apwx%ILG{w}m~aOz|c?rJj_&iQ&y1OZ8%!QaUq6@y1e1anG;@Gh74*gtu9> znQghngv+=`X$#l_CXKO-yIklm9xrUmoy?37i6u%XEH1;GNJ*2V(2wvY3l1?a(XB{) zVFYEPXd`I_HMdm78BJM4wPrUX?I%$M<>^vhG4eIGic_08krGEWBlqA^DPqztno>_s zG@Eyc-kugq*3d5r^h6=znxbpm+JXqmav_5&<;~-kVfLi1B9oXVoR+*&A~JVB^Cp!~ z=1`}SjVL>)dLkD=G2w7ANw9-6SMrum!D@v2ZQu*}3Tn}y#eT~Ra z=*5)Mqv>YkYP4n~JLtxtQd}7YNt+nEB>L3z)Z4-&ff2=$(Uvxhq2%WkG^S6KoP#j_ zI(i#+1ly9I%#Y^OqZ|@#;_u*?aHP@*%27&5k`p_ZV7#y<2w6AS9R;m9u8aikD9$R@ zL}*4*i4{T{R&9zatrbibOlGzgb9t^@Gx8l&7Dk4r91-T?CU!H`te?dZNPQ3CyzGeZ1V#-Qr>V{mg6J zW~2bg8FB=BCT#*!ObKN+mhR)}^G&4FY592jnSDi6kwQ3_J6|}MZ_PFo`ilokd_^|G zYwYs$9h^gyO^{bGn$ng#l%CFZWenhM;@bh6VMQ9u-K2M$Wy9J<$;T^8J4A8i))XD0 zG!vw=3&3viQA&AU5N{2o2D2%32USc_@&_^kMB{}md6P+D{IU`gDwkORin4F84>4`X zjd@0t*-~#t6@FWqtEi)3k@x_#VXH|RdQHYm+9^T0h$N`Ung|DAlb$^%lo=t~#E+m9 zB+aI;WyNtCP@|}eI5`zJTtOdKxI#)1o4Uq&#-ndq;x6o3MZOg znQjBoJSk5h^x$^n6l4}tg_ z8m%_v4396A(WjEzlAjXr>C4z-shjwP$@9rQS?fqjMl;e3r65A(z*NJ(RwVG>k8Y`9d}OY1&kB9On`}Kr)a~n6-jBSW-f`kyJ-gSbQ6T zc%`^kI6Yb8g+aVz{!@ZHU_u>AkCsk^2+?kFPKG7_RT)nS4p9mVkJ5}N3EaM1@R7#f*A#-yxO`GS$@{b4k!5Dt zO>EscFfh-_ldJs5h^LREYtc@ix> z#IkMYz}Du28$HU?a7-C}fW1M#8i{Pcm9 zx_X?^-Q};jyWUJ3e1cO4(dV~X1Ax1U;f6CXY}h5d6U~2rRJ$iIOWcpywWpLv8t?j zlEO`6_H;~f_pW7%yN6U6BQQ^5!A$&QkVk437lNE0DWtt~eKNlM2@?J302O9M$9`Ur#2C++1W{fs_1} z{*%MKVhPgOWtU=4SEk?yq(Xa+P@x$~ms_QMSI zWHs|Nk`h&`mUqfs&#`~_Qx)QK7O||AZIJ7M^x8qHa(RlodDP6~Sg4TVyr_F^sl~#$ zqXj-laP!z-M^Ueyl%k8TdZX{j9U1_$K;z#l$xdavy=x|m!FekI-6OFP zqe+Wy9f9stEK<=+QqZM(FrDR>(lYyrT4()+7c}Y|QnDRSV>UBsRoQK6XZ^&2RId}Y z>NQ4_n^C02%?9|_D3jmgCbxKKcsa*Hy!tIH#`{IbH#E=hv7^>C=W?#2NF7_J z*dz%e8+P={SuI=7LL3**TV*=bFX!qOGtP-4sHNzWFwLitQ!d4poRbo+`?L-UD_YLg zgXP_HG*6y(I$z(4>k2z2Y>q4~49$J3%nA`ZPbFFr3!XhITX;F|rW?%UX?=<|V;a&r zcDz+-np^omUj6ccQ)-O&3omC>E~U=-HW8-f1G`YWP#p_(At`J>w-aT+)-aMokBg(ZrDqfmP78uzupVO@}g%T82`z=zNR_)e0bRE51%LC5s zO3o_3m0HANIZf7Ma=ARzp~j{1HLPxzvr)6Bg40TGOWl)yeVIP|vb83cn_Mo?s!hx> zv%@iZ4&^(gHr-!CoU~7L&CRQR54BukU2}a3J5PHv{~}Lyzg4CZEnGG-XUXh~9E#f2 zD6`VKWNf%>m17R>(|L~Sk@Jpqs8?`jOJ4nQ&9>wmR)1)vR-W_oJ=J|IF*4`2QmL(L zlv!CjHrUE+bC;TyO278$dkP&bNi%XX%ICD4mTa&qWPm@fK1YzPCr7ZstZm`r^{@Nv z9@si`qoQH;*x&*Fv&!ErcBQnj>3)lrO+s@YuV0F^qgIFdJ6o=DlvJn_a78v%*-~j( zbf`i5^fSVR`sF*72na7%an#nhyk$ppaVS2y@`NZ8dG!KaQ`1W1ZxdK$a=AU^$>qEh zz512RZfu%jpM&dPq;ygrPW$wJ*7NiE3rF*2l@Cicb#tdo^BK)MTGC3-tNy&$%bZ(+ zilfT82C1)m@>>f6h8mE1pAjx@7TIuSqPOa7^^uXKg^>+ogQ0!Ljur(Jb$Rx;ZMIVT z6rI+gT+0Fet33}m7p}NoZ>4qVr0r>S0*;mpQZLOl)}i94U~jh^d<`pGV~-t#qHf99 zqIP@o`xn_7x5{z9#YV+wUR=_8J?olQm8v)!7WEen$}`^2u;`5lBT7p3zdxBQ0eJBa>+F}cAm1e7O>}KUssr~SypHr{cQCl!La&U<5ss_ z+$^6{y@G*NmKCyTF_U$)WDm8tcwAD4`j?ZN@tutFmYp#|={GXxbV4j1IYmYt#LbS zX-1BPsu!3@Ua#lUfzdp>@|;U^v!{wS^;|5pVBL(_)_r17gR;JIR{56H)ac>t9O9L= zLTm1*n^@n(&!xk)#s~HFT2UywlAkJi&V>lP857&Bfa7iV`Jt6d@w|E7{(|v^s^nT( zYm=m#<^0gm?KVkn#+dkp7awYK&Se^p2#oD^!LU#34XSf4-7JYfyY$#@r*qV6T8q># zO-$dLZG54;No`vQEG`%h$j>UDH)%L~I6Gg|-fa6dH)9U!56EA+lm)9Lb!DwN)lcWB z*l2!em0agsdN6W`^F?ipnp`8QR79h4v~w;IjS4G{Hz-FtXj89Jbgm(dSJDO4!ipGU zTVLz=h(_y^ZU!5wqzQ6nNw4H`Wz1ciCf6{QY<9d+*w%MJd8h0--C~RjE9zAeP#ffH zkgrw!t$MBMFZJ%=ygSV)dlTz2=8h@UrW>OSRSojZYhF#wHIp+1)QYv4x%c~5ti7fV zGj~KIV@dv^ZBpAsM>I-o=9Hc7IWoqgqEq%oaZ`&WHmg^uRsEACIymEpAETw)>SltJ?cW&s4lD-$8Di zyFk0?(fL!1iuTQ=tnS`qSYc+UrL48vuK1Z%cPe)(bE;=nC2|@S6~*?kZJc|jvPtb+ z`5WhUW)w5qRJoypar4skO63*WH_kmhdSg_9b_$yv8ql-*794_k3vax7foT^$BzNzx1)XsL34KJmhGT{oj)nbhE zr&Q0cX?Mu0B7ak5YUfRr;{ucEk^Le)(|eu^atN!)7rM=BUf+k>d0(x4wUX&3eyu|s z!i2p|{6_Z~-KRHew7ZF)us1NHi<}FxNDQqxy3evQqx(=*N=kDxjYDTUU(IC0eNwKl zcx3O2zTMX4oM$<&d1t%vg$i4zyHwPEUf~cJx!sa#Kkbb!4nL7R38gLso8Im&6_lRw&+OB$R=OHNrylSh?)M-ea zuFq;_+-9V2TD`(KQerlwm$pCa;9Jhb)24l`hP@N75%LlzVr!7j)CmgRS*;;;sE|%? zs;L&AuPVRjv@&PvY%(XrvV_Amn`&<6J7U{Akyfa-s+~*W9Nk*&w%TnqPBNmy3X?uO zc?tKf-Q8)0#4U4Hb}4P^Gr+5~{dE2PIg8h5NZp?^TZF`oR%nws+u6_HVw|6W0k^iQ zGy6pB6rUJUy!|15^IGx}ifU)dclYIhxi@CYnbG2c&VIw z*ilQKqPF9ZZ1NIg8%^;Ev9^mVR@^QwDr#l!9U*H{@<^+)(vquGlb3*K6_=+7v1ZFA zIHWYK%8Iw2l~6cGxO>O&+K%&^EmB^s-=t(IVp%|yYBy|45v?tDgiLU750jTraR<7s zD<(_G6?Zy$e(aw3b;XL;*id!6a#z3+W^j=WRs9{EJeheW6N2cm%POm#s(VrR z3rbE58R&L8nO(YkMce$fO6X^+!YNz8I_Q}B4hQ{gUGuJqTvzOvc|XQ>kzIxBp*j7S zd7kn%tgfHUI;d!3_p*D-&9(00zb5h}X<~@K;|j_Shbff|t52zJt2t@8WUsau8PCYq6r>Dju{&9oAZMg>OZo7=8O4jOxixKL@s z;8NjNRoRPg)pRvqEC@I5YQBklqtM)TrHjzmZX!+ar#xwGhsxa`Gi zl~`)GRg+ALbe@$^-K#~&@W4=Ni;!d9$)r?+S|xnTdB;1raZ>f9whUgK8-=F3RQIwo zE7D+g^}PHZIm)J2_hRL$YBjq2iP$O}PHJBM$b3Z_Eb}WB?$>yk-%`7kWr(EF<@4EI zRV^0yH7;GGgkyJi8BsIlbUnYus~h&Ibt2ZNK(FLb>dG?Ni&x>yu1>eC?v)m`F<)JI zQYG(rho(!b+b^ouhBP=jN^N94ING7qtrLk z+K~KmZpk$``aHuza;2e+2n@eoQ{;2Z+>X+{Z1EZ){;8#;E;1t8E-h-RNxQ~T>Mgk% zSlUrUK9g+B`-Z!p>zGujLhP=9>HTI%iMmaDpX+$cJTKp=d;`mM#bm_xh-2o{`{nD9 zpKjH4q_5QFDXMpTGto&|>(;hyiMq$ks|1mgb_J{}cAjyiVT;awIaik$<7#9*$!2i0 z)a9`KVf(TL_IgaRVdimYnyO+1)JT@3h-y_gyj1zZ+4|`5EBf5=sS;$ELT{N})S1!2e}$e) zWPC-N)UKgUrMBiN9_^%FRPIhuagi=*AzfNmzEz@B`AUuYxE84{kjMg?Q5}^*;)TUK z)mp`!lVe8Q9C5C&kTjRb5sGHc&UttpZuotVne6hP5gt)Yth!eDIQx(py-3G;*D7yy zI+(o4Z?N0V;Hkpt@(6R+Y&k=g5gRCR6}FeD+5qRF1-Gw(>e#V6ZgiCZr2*1|KfyZ?!h9cAkSFZY8ow0*y}4WBf|`m-OGp?JPAj z*%{cgnOFLBx2IAYrymyca$fNsZR3|(Q4~*_R=06_vs8MNbFycx+&N}j46rgIiFhrQ zg{{Yz_jl=8DcKT4izWJv7E7KMtSq}S!L0arL2R-8d7{V#rCSS+FE8`XV|%kiHOrJ> zivk7?%%nla`{;>`+A?O+QqO}FJHOk-9rAJV>NgSw`Y{eyI&Zx{j|;6}Wx02IVUTT0 z?=*e45m@A}LRv8c9)pj0v$4=XNrA z*qTTq{RDm+*C36u^fc)SGg(ZqnXmUjN|T^a(h0M1^^f=)Q`2KE1g3Ja<5 zc-XAQCeprn%a-u1nLxTpnVCeZ*E%}PYo6IbbT^Qj{{v^$o|%Rren zP#IP#Z)|iv6KT;_E`jIjE(<8^TF@nDqe^nm939%NS9h#wn5TEK-L3}WUXrtZiVlHx zs*-to_sdSHTbR{bzQ|AB)FZKOn8Y@Y);iiIWKH*O9dG1s(xP>>xI&vM&dKGPeP-Li zjRxnhYFVGWHF8$T(QMbk9PwzjQPS>`lOs+Q*b{i0QKr`E5=E88M3y$E83rW7iUGdf zp6x5_uQ4PazeHd6mer5cX{c(FK0dc$#koah>F0^Iv>_;a0;58owumcvwZeq*%Tm;p zHJbXuQij2e49Q!(#&N@g>n7|eHO4O3daL=?NW+Tk-L36vp3HA)(~L>av%BQx#A2eQ)P|xO1qO~W zk2;!fezDGj2m0h^tc-7LYS~s|vodUL`|@HJyW*`|4|KOY7VX56*xYQq+rBR;XTxKX zwpC7cn9X03t7qCWmmtSuHV3M^#l=nNQ7DNzCHsyxfw9NQCe89YZeXqq+hEw8Lr6~Y z&*zLU$E;Lwz$W*0MtSSbDY~Q0by_yL?Z-a@}eqk5`4_3|@j*S8AYptw%Y z-Kb2@P40!7?Cv3|QJxf^y|SXQ+A1`xly{-Q8h6Vhfo**S);+zlH7L$Xv@`cS-)vAT z|Dk94)Moc|aEs%nb<~?yQkb}|{PIz^11q&}nBb_2t{506_LxD$x;ECkW@S}1d(|84 zRe{~jc68WVsJp@buKhXl6f0;9J(Cn(4ToBBMM|a`bh%J^Rp5-qmEA_CYs$Aut|}U1 z+^WQUvjA*BlfM{mz0`AV>GEq<=bF^$1f}{Y?E1EOw$=e%0)JW!-PJzT$Vzk;!UO;FxcXPN!1RYj+}*uAD)ZOYZ@P=TRWs$lVQVP=&*O$57Y1jg=cn9@Ekb!qLXk+9O>v-k5Z|j`No=EEsC@m92nR-)%0qKK#6TGwz5d> z2C=8}$1_A~W1q6&hXp3-^D7>(ny#o?X;gTPelcb1rWuuEO9LO_ep^DCT7IBe8v_N=wDNR4>BPn+oXCA4_N)O4m7;~hS<|qIb+H7} z{K6Llnvi$9U8SFkS(eX&dZ1|I=Ea)KR2+657Ti2nwyG7CX|B%2g`!B8;d=Q>2X~qj zzsI>pj6+CtQm-V!v~Dlo?CQEJ;=@P->lWj#t$(a|SdLzf!-O}~5mD7W*a6PPcUN0U z*<_NR=GP#~qo7Zs11V;SN}4Bzce&!G#8&!4%U%xLoyS^LsIz^Jnz_81tS#QntG@N= zVlgGtJ6|fi%W|Tbsez^Va=vvr&%64@M@bu$olz)9uCvN=k%QW}P8`dMtJpi=6iGdM zvm9m#l_|~VEu9oPw^F{D?WI-pQj7bK3tgu6tD2OS5ZbDtSd#6wfT(FpFLrRHlwldtel!>`{5vDTDc0j>%6aQi_)o*5S7DN@?1ziO}qZWv^Pt zZ0>j{Us4e%FI(lwN!uD%Xnd)pXNYTPNvrCSGs{XMwlzLvP$}2Y2u;Dry2ZU{c^9?l z9F&|GsEo6BZDbP}SbtM^y&!H*S4U=zJvN=|kGHK?rg~&@jx8y9Wj1NF&fC*xRq7m+ zGg4JNe@tZErZt2)4h1)@VHD_EAS$$dgDol5ixjrC?xt63lgVV80;Ji|-mR^>Rqa@{ zPE3h2#k#r|_nMq@73-3GlZkihNWDY(E|nZ_>uPkxY=yjes9Thtm>bV8UL$PuKp;-_ ztkf^K=~ntEi?hZC4H7knCe2#6u^2O$%{CyQh zS!{6+%yX&$Q_*?NIc3*zp(P55duI<{A#Z=Gr?S)PaU%mJw|Kv^IxlqF)!50M8{cV2 z@9bn#eR}Qc{*!>HsaL-2jiF}?Z_c}*%TtMm^IS=66W(Lu(Wx7(CfY5oUq0kiPi5Ee zCez$p(z?<%c8K=4GHgNe7NcpLV=edhQFc`aMdWTG@#Lho>QVDbq3h-YtWy)(T2Ako zD`FbQRUPhCLpF$T%g<=hw7NsN-DSJdY6gv#B{p7=$EI3ELT-6EkF+m~y+gRa^7@?X z8k`$3T~e>NF#GL?y?0$!tAZ9=FnS^+}XTFQjeNL6}!uJ89QAPo3C)wA_gaH z0;>)(s#bO#XLf2pc`Mi30hCe^&7PHEJ->ViCl ztC)8rcWP@HRQGmFC6>3cOh>k_c-X0d`}_2*INW=>WI$s}`56;=`v_-8=bOoed+w-g z?G}`4u+j0l1Gp}YRwh1eJ-cIip+4gp^g5K9L=HWv0xmv!(OaD~%3w7P3!r`81;^lDtzcLKX?)uc8S zN4?69;iO6JZVqTXYGAIVB58kDBX$WX?_kO-^Zx0w7X7n7+Kct)r4mUIYU7|{DT(;Th_xi!jO|5E8n4UbFu)XZzwT2;DC zKTeQ+6;})Yg#3B4m5zAImq_c+swBHuHr?$+emmD7`#scJ4g&o>l%Ad|ZK1|0o7v6F zgxeIVU4C=D!g>k%b8{{+_90u^ZjFhv3lWa3c*3)O>`aI0uC+_eP-nAW5tK7xj{Z?6 zJ?C7ZM+GBu6eRbEZ{yD?Qzd_1i&<73t*c5G7pq&OLH5}uHT-rO_Awt`z&>CU{f7R8 zLb8OiIcj=ub&c`wZ53qRD1h&6BiU)FP-r5~$>!)A<(fxbZxkJW)M>6z!5MGYFwCCh zk$*y=qk^YnD>+`^>@YWy?j?;YT_rzP(cJP3Lm9ZFa5-)_%Q~rv$}>fKI#n^^Dhe5cWu++s`R{B~@#2l$S*%u7*o2Hu&W=~~XRIW|7@~kUJcRErz&A4d|gGg7q#G=)U z)J~aMc5*43#_IG_RX15(5{-`7l+algXjHw3)MHa=o5sDlmm)UA#l_XmHaTpf-3s}# z+|sCdaZgDN%bO;`SwIsFOr^jP0dH=I*16sQJm9IC% zt%^Wea-hqi7BzCr%Wf_1nBd+<-alC{y=LF$wL80Vw^o|dXltc$76w%s8(+z_D|BD^ zz%IQ#TcDtY$Hu7_Vq1ux`J=MWho7dmMv})Tf6hJ*w(2_K#*}=FlFEJDZL6iL6_;L!DMfJZ}_E4i|LUW45Vv`@#Oh z1{j~z97xy@khi5ag#=CLKF;9YoojMkT$}ec ztC&2!{kr((-4<2u-D-S2X2LO(_CBi`?;2Xa={(n)!t_CbWu&2=1#i}=-*g{m*U)*c zs~Q)ktdi9?G-$M`OY?5?28^#4S$iMHK!0{(eZ$_ZT$`KZHPCOaxaNPe&fwlut7T!^ zN?3HBH$Yi!*UcTW3?NGMrRV?g>ld3bv*Xvw!di(r+H+30bZxOw7O$+;Ts@+XG$rFhR zLwSv-nXQXYjO~~IQufgaMw56&7v(5l@Oaxr_M@AXFIb+xF5b|1Q4arx>)1)vc%HSA z5^0w!@jU&6@m9|L7F90KcVb+wRH6Rpghe^BwYuERuHr5)|KX$b3`-mfzTBfgFufKjtHYoe`$H%KjA=M8WWJBWcAT*bD`ls=7}_vMyxY4mZusx%ww zzb3j*7xzjzYBXpijh$BwY27Zk%7HPvM|JOHTZY5rC#{LTLE9gZvEU|vd5PMXrJO@Pt3UL$&R>|nJhPpwOnt`;>(6spu`n{!gu|Q| zY*^xC{Q3O7yj@n1i%koq%>-)cM$Ot}GusiL7(o?#)@;Q-3F%$mFRM-nJoYO zV&sB?$)Y|)xxg|z97Fv!rB9}fP8eDJOz6$N8(UFB{2R*hU(jdj1;)63CD6W2)5_?I7Yt&p~FSH%uiFbtZN^;r&Un*V9loFJxveNj#K0j{E;2vH%6|kxvzGaIh&H(rtBEJ zu=E8!FWR)Dv$9mk!qWLiH?n_f@sYTejZXNuHi^w!ort0w%VykrZuo^swhhkM$9u5I zI|dJTI71rlklyrIwjo7^irN?Q%UQ4CILo%y-a#hG-+fTPNwe7jpAXbnksETSs<`S69z5L{Fp8q+{8x=+|rL zId&7N@zAa=n``;x?=s(6NvayrwO#Stta^dzO}!H*QJVJlPBd>6YB{mu1%Ah9&#@fu zB5a$Ka|Lfj_wH<(y-EErlWx<3iRjML%R4Jq%wIVAl+*F$XYAJtCx~0tZBwCb=@z!l zI#$Ym!Y6{~-n)IFHWkj0Mj0L~dBW#FxgzWfEYGn;TO9T~Ty#gjl{H;MYBbK#E-I{4 zNNN9lwMT^RX?4!vP||w$w$>kH`1I>x6A)0N@%F?U1J967_#Dl3J!RWi_o_bq&Ka=H zu1&Z);d*G_mUi(C%a2Yg(zbkauM(bRk7ctRxTop)ZcIi{_tQ$pL95gaoW?bNx=`_Y zeOqp05uS&V$dl5WHjC-gZoI6HJkZ<1cUkld(pvLg)t_3twA0lIjqH8%SeMT3W8v%E z&Z|V53QIfHujAUJ>Wq0s_SGI!t{FeZt8?(>x;fh2Osj9Sa~3mdt+`*$w$|HN(Vgk} zqr$?)BNtxaudLZ!J~w=SwI=n481Jukk($(c8>I_%{?Q$z zU0v8_0+alsJJGJ>zc8u0{ASugyQdZhYs?4lX`0>VlvB7&Hl=8bs}r`&>FOCjt5=gl(&Plh3&0z)}_Z;nm3wPWP+F()nj;!fjC!C_i&fsG=m&#&6~GTPHR=8 zZRxze{-MiDigWeuY#kL$bdVMt$Z-qwu9Ux@X=u`D&BD>0XdLeo4aYU686PR2oVKuZ z8uy&RkRlD7j%8C$ORPxBd&XX1lF+q|{6wI8@7pcTn)>uhZ|YWmYIXO5My4g}%v7xy zwkTws^AV5wg}QqM+8PWU?9jQ{ngX}=Rt)Rg$AX=^`cP7|^oYlT(w&U1IMOIWa5fp*?a_f8U*E{huURiUi_Xr8MT%5y zIW&8%n3%le0fS01N-VK#PbwaGwN{ZL7M&R-iU%qz6c(*~!Zhtk0%5I~E!?qf$OB^X zIw#(-DN>|s@upSuDpW7WC^5UsjiR%=1n2N@=v1d7QK;tpLhHlDt(W(y>vFVxn8rC# zmitE08HP85dW0w}x)whq&5>4_KfjP)vjI)^=8VZ}9@aWrY_egQ5!GXp8}s5~cUi75 z4bCA_H?6q8Qew$&>D3B2MeVXoW3?!f#+pqZQGE@&bF&5(9c>b5GUmj9z5ErXQ0uc3xaFe1_pv zWm(5c^{kv{7;bmv2dN8hiD1Xksp)0cu;-S_=kF9nmaQ-)%PN=*)4QH)QHV+YnY9Co z4|a%_Hmyjlxg{cv)xd&UQ=|^}K4Y6e+tYZeGN3rMrc>0a`VAY!CLhgyp-S#Lvsx7n zh>M<6&@ESG1G`dYRdd&2`80IwTV#pJ5)=JK{go}P+K2ZoLW=Cc%w4CUW8nZ&aiaM;90ya;-_ln#{6^Nq)g&L$;7x zTCEZA+skra)MRV9%MNNZbhP(e6`waiEpo`vtZK8yQ{8V^Z*n=9?O--JgWtYl%|31C6dW(kYiwwFQPa0b#VXXA z&8hk!Q%dA?mKL`O7uD&)s6`sc-q9vc>%}>ylqhPDJ(rw2MzK{tHLttirtgpjO)OoM zX7z_BZ*n=>zB!d^eaJA#@w^Gwx_!{8_<`(NT>uwA=)cMsJ4IbDaMO3GW>-a4pngdE zpoxv|meQv0iH(o8AD&#X${|CW@RFX@%_`^jkFHpS)NOH& z9c?zbq~_HRaf-5&D;w47Qz3=cO7>I({jCk{E7h6Ueo%DRLQIS4%htMX@@b=J%qbzcCJ4+K@gGSdz zt}{NbTH}0c_IizX^`|?A6|`wFu^)H0`>#vNsi8?ekWf3>=lr#p5UU|(s|c$1o~bJ3;+ zM0K6KRj*K$vy?hvOLLeE*(}r4PgHN!Th_K{#6)NP&hmmwhUA=AXJY55b4$9?YZhry zhcwe@m{+^A6ruj@^#^huX&upcn!z$luXcwxBRyqLE%H8UZfnv&pX!#kMv#e3KQiY` zp=%@adWyQ&>O*VQH0}V;s)|huwcg}#%K?s~z1k%jgfw$7bobWGkCw}PTf|C79h|wD zG$7z)5pjIUGR~#EJp{6K#`Ov)LXsDErC(mqtaGOU{kI+9UCWc+W?@YGK}XGR%}%Va z!hF4^=;W3i_jNean{Jk~-lp-@ijikrkxvd!OR{TTcqMIGTW*(r_SB|v?JU*Zf=q&q zugFbm%6xOyyCRRX7Ak8LZBb|D*v>7B6&}~htDREWxup-MU5-&6an=pgev>FyA4LvWF30 z5i-$aIG@%^AiFs%z~#`|1GC5+-vs^6B}cF8v#xM-*AZS$T>@MNi^jHY8W(5XBW!y> zo?5}Q9$_t02aDP!dGchw-qlZ~SxjGS-7sHWN`;h~%^P;_G@x(Lz7B`hF7m!P%%-0> zaK-e%DF=qE*Z3y%4r!aTAlAQCOWSyEfXm9&bL73o-I=XA%loKsZFxZo7MCx^k&k-=SgyK}%wUI$4 zE6i{4Wlv3V>e6opX|rsS(`wTKRoi+hLQHDrD!F{nRL3}LbvJdly{XChecBXW=`plA zW0#+1escb*uBi>i@fVhd`cWGKag`w!g&&(%xrNj&kA#y zZ+e^L#nscBjtVi#ws2GqP5muBRxz*okMP>xo^IB+++Y!r|GcWZrbK+n(b>k_UVlOV z0MDl1-qbbDcWQ{b56;~*u5Y=6GusaeX|`$nMCY2#M_Bg`*_)~e*(*pIe{klQgc?Od zjFK1c6(r{$&R=FZ)v-q8Rsa6d4NbcV_NdKD%qh6KaP8bP_-7#6WQg&;xOj6$o>{Je zW;5(g7cVW|CL5EVYQ(j_oREXlL7128PFbMu=vB&b9ebZ8OV)Y0a_^jq3&{eT z5nQtpH-fy)1vY*xdh*k8vs|y_UFFo*D?8BE*9qiY;Ezplq4sb7QHiKMFu!P}Y zU#Gyic>UDPMI2cP>^}VbVJv!y=-bYiM5_2PuOWv2&r2y897 zl6P822Zxs7N6mU_Rz)o}nn8~D5Zg8IpYEI^qIT{TKIH@lvQ-JJQ-DiR7V6+Ih?m=V zOnx@0fq!-SS&6&LZi;d4(qeZPpKKihr-f9~q=!jeuh=rI2QzPSJ>^3JdTK(l&tuMH z)ivFpYgN=8%etoXn1gt$qCDm4v4M)+lw=}z_^POQkJ7>6Io2ANR-6cE;NLrbhTTk7 z3zyAB7}om?0yvi(hqwfA_QhSbFfv}k2$2SwZLv%a*=IAuZc}`9`X%ckhSRgfdkoIE zKUeFx9GtQ-Z6&i@M{u`NSJE4LSvedqvLMf}+g^}OIs@n8>&Q1~0^Oa1{R5whnZZ9? ztZ!_G=n!UW-|5a*EpjTT%pGm-1DoNiaT2G~aR zCP6b<-Mu@w?$0H#X)5mS9jxpSy((%?feV3oa#XT0v@m9eWREv@EooMQo}ACwmd>!A zL9U=bJdU1xEqgn1aN)ts)}lMA!^Pqybxj8|b3`}?C(?|=hh#tI^i<5nJYI2wJu7ME z<`qP?E}I@3=zdT&-}rJu>$vkRik@NYbxC-)BR@{&GZ^VsVNO(kM+r4#K6`k+YtLH1^Vg@;x+U- z<}}#zC1-_?u{zjutk3D@9^fKdz`1Lhep&5i76naILCJuR^|Cyg)*-hnZ?y~Xe_rdpPb}xCG=dUf5tGT zz!JS^|A~^h$-#at1qX7h({CvddbSj(eO72%3Oa^C?6&B>q6@AC3)*JzO*fw`C}}mDw~t!UqO9dLzxst*8*;r?v5MPF&v7hhbj(fP(W2gZ=OC0g6x=z! zb^cwUT(9XlnimLE9t$dKc`jf!uVg~Wg#LNfMeGaVdL5#av}&JkS7>#!<^`&o4UgRx z7O9~6oCBe!&@(x)bA0=Jg>4%fzl1e5-bI_2eI3))@f69%#Z$d6q`Q9iysIL+>(AzS zs*jO->kW^coby-^*XtCicbtLy@YssQ(u>wFv@B}8@K{jU;@$HWw%tY_oIBZi5vO{Q z;jy8_Axgz!arR}4U-Fo2vnj_V>11cu+?Od6t8TOp3FRMsJF{l&5q2rLaqRHo+znSK21VB@b80WI<;a zSHH;tgb!NqJ(hV*dcXrw26lW-vOY=<5+c{U~T$>o_ zc9Th)V6q^NGdVC_<(hqyNjk+fce-o3O3I7NcFBK}XB?-qu)TR)wj;b1@=g3i-|+k< zoKXFt#06KQK)&HNW4_^Bvc5~p2z{4C-?nj`mC+ibzzeSZ^8{z_Ni7|JjmynB(9GX| zr00f^B_^BrZ0=~vP+~OYN{~@tO-c30v0=T#l>zO|yL%Z0*0so=&sjFxgU#LL;NYC- z%M7~U>hE9BYC}jtE50GsbuKwnUlZL~sSH@-K9`*CGhSFydL^i$db}`yzI|>brAtgs z7;TBU669K-u7$sUYSaN(6k9#gs-S~&YScPXZYG<{H%yIkEwIgaV(vf|o9k|)@3M~6 z-D^WgT(+Ln4IvFx7hIdu4nSYg#N3mK!Y-%u7p2;e3%f-7A7cAPDV+)nXBWJwF6$6y zAD3;D9@U^X<7RAc#;y{bgSZi=yri1mITl&OQ9GM8rgKZzPAcq@?wT%YEN|^LIp^e@ zvkUs#rRR&wHru1NX>wv5)t3^TU_-tXRy)wdFkQ5Y6>Z!(xppA6=p`%PvZwSfl^h*R zEqcnUb8@mtYq!DfCdD@C)efBP;p%5nEID9w%A(XmDy37jG1X@>(>KbsIM-%!&d|Jr z-D?N>Mzt2(*v|G)#wq!6_S}fk=DiudcD)t5La9Z4qZXxJvT97{Mx^KCk~#;KrPVfd z^(#xesdg>iTXBf#DVsQ{!A_sikIhv!lfIC|;vTgK+mn^`4^k zExfwK(rUeu4>(?F*i3Yu5!Yi~v7}1Tc2iBdq}x%tmpyD>yoQl=h`&SA#)gdz$17X6 zF4*EuY1_7gqnq~5%a;+&L{m);IG*cR%gM;PMdvNK>?nEpsik@)=jEU7ImXr0c%<*F zZXIiz8Xq&y*I~SJdcP=jm7vs8BA*o%PWMEEqbtN-Y#D7wPI65h>6@=Zv>h`~buVj9 zEvGHH)K$+2IN5WVEvi@D>wsfjd9WPQ44$J!h7?e!>Iphf4h1zc07 znhcKaSi5iGdF5A_v|?;BFPvkOdA_Q2dRWDlg*z2XiLprDpL1(=0V}^{|F(^ryx%Uy zoruk4Hcm34L(a;U0$ZP3RqzYlLTzdsp9bZJLuDSD2i2xJ91T?Pk6W=`~1gny1xk=hBM7YG%{^tiu4W6(&Pc z*v{d`Y4u!6pLJLhnX~fEd@iL+)gF>!DX6W=S$R^xILTRu1RJ*VI7!RGM{FBXbD7QR z*3M;dSexdp7}+8kQspJwy9R|y+-%x=23aJh)tepMkh;k{!N#V&yu|*TrR_JQcXzMK zs_od?VtUR){HUlywGZ*@1$QsYmd#C1qLm`{#2?}Z)SaHQoy+u`{cL>8wBX&a9Yr3J zZGN-bjsrc0Wb?|;mbKt53n=TKt3vLED|443sN3VszmtJ_9|HXy*%-_2(%d z+B#^0LxtGH%3k>gdi1l2w-@@A^{)`SCw`M@V?(yj3_i(+sOu;rKhYtTH(IMxkTo z?saOF=w5bRv1|hUYz@h4B2OnDVHPxydb@~S+BQEk&vubvbqb%tKbhl9 zEvbvx#5J{9glp;!hsK8MitP%xnKoWo$kjDe9PTTo0Y&x&F|YQnOCPxbJJ$FjO(HDXjU!{ z2Tp3sg0rh{k1#5bvu&H^JB#itIz;T?W>lbcrD5{xp?UfFY@?!%T90W`q`@$`cYKis z%lz!j?92-0kw@Q5J6*3xgDy;E&0+HDUM&lHILxljNj+W9meI1{jBKqdC6mJZ&x^z< zGxIo>IU2u6OcGdxnCKyub{bBW>9vzDja&P#@uSYRb4Z!R%2emJ#v+|l@{oTGWnIXBgXS=6Fl@{5e! zu0~FN+(>!d_+zo<3!anJEWgHOYpK?4h6%FAJBjv_xrD2eUW=iW9^qF6hZRM$Z^|BS zy}_$zzA&RMRwt7AKGz*{RX>&HQ>(Ks$M}o2YQ4Yi#T6d1jkfg)b;vH2X-GHN5VDO|qRxZkoe7hbYmfcJA&QL+0n& z=zYlHPNnkpTMBnJC|+n=x$c2E%O*iM#`=pYy1HCSklIZ4wUJ88r8}f6F6m#&dx^bClkApWGS26c^QEYC{mE{wy%B)$|hIqFijO;(eOBo}JTx>V_s?V=)~1=Afn=jbe(T{4W7BdO7)pg2l$p>)^u9G94vXp^~@a$GV`*N=<4ub z;wL;p>t%QMs8v+aH9bTwEm$)byF?%7Cgo1~TGkQO@-ym~Ta~R=iCkrb4TZM+N(<~< z!uM5>I*#=^YaFjnRn@4nuL8elQ-{31jY{^f>B78OYITgFj6rg6AxYjOFS0`uM`=NJ ziMhhI?0z1{{SA_1W952>YAiHwDd}n^<1hDa5W3f}6}Ll*VQgYCex-(DAJ#(iQ3Y#M zDZuQO;O(@e#?W3H%FCMeAGXD33d_IWR?nLa5<5(dx!IsZ^$xKWmG1eJRy}L%iHc5d z+||;kYBQrGX6eq^3pR2sJu`WB-LyQpNnWy^(T?%{{e;ywQS;?;&)3qrS5+x-AWWFHKNcJyXxLkW86*K*KJqHGNK`K zXfGmoPOGErbGfd%?5N$hk8#E7-n+@Q$`6T~ku87W>JfYTkF9+s?W#-tynPKTD!Ump ztnF^|BSEE84dWY!|^7 zIhgFQ-(+^3v^(Jhe@543&(#xWZTz`pyui2WM>R5V&T@cWW+(VfKos8UFBU)yc26ir-(_Cs4 z7qBf?*|5T4=kl&pMU5;s)mSELnlwlvV4BE!E1<-hJeP8$ zCyX?ktf{Y*T6t)=^j2kSnDi`UZ!Wc35l^zUvteWhpH=SOAv2kaj3QWTXy@{-j2#?q zlA;dV;MS8j-jkevSb=OI5iI-gp00HD;i8i@b7`0Cxb((0%UyFC4%W0TvB8a?_g3Vi zZX(*c=LyXgGBBW-hdOLP!9_te#qJ5qWOn3=$+M&RW;IiMi(ikQpV!W&r+9$Nqj)4KArDZCmOJ){Vbluu|T-Vy+Gd$|0GbM>!{|?jZ)v2(H zZbh46?l8jD!_T6S(8RxE>4W6d@MglNi8Za-8f>YsJCB_pHGEAgdSXq}LzVYY^Mv}; z3XPsvyOQf>_T^;PkeluOEW%4E8zoh$8_t{214(3^G1rHAu*>kSv0N1`WHiqFmB*?+!U_?q#|) zBEN*8e=_nm<3_o#NVQkJC~0Uu_ope5difHTIOHi_GEf;%B{{%DZo3TX$E&T*JKi>H z?JMD4G_Fznsr(dXo5DK{1`JK$bhTgy)aMyXoej3wCyKAzKdo0ppr|w^JDZzRzqjg6 z$i?U+lbZC4MV(vMtahPM{SFqQbw+DT94d9kf~#i|)Hv*@>zx7}D^PNi13MMD9kfP2 z-gukTJWsH%GTVr3c9PrVTve@0l=SFQx@}5Mds8+$Lgsi(T{q9ET&bQD3iP*(jf`^Q zgtfQxcd*J`!EG_$!Znv*Tg76u^NwX1?F!dU=N36*vtHdZDAAZ4ShLzBub>KJRPDpM zDW*7PH*~AC#IZr)J8lgam*kcO+Xa^inN)P0M+sG_T>PBL+0Qfh3_hc8R49*Rf7O4o zh#fzZbVjh>alU6W@6b4Y&Su_+?1wqk&26M!VUg2!f??y}+ve@w|nLO%@rr))sWn$K}lPK2@-Au~kW{OxB6d zvC4YHDI>GpbiV1l%EW;inT?uSQ6(ffe(xJR% zcD3V|W$RY3rSpm6P6m5L-3spZjG#NFO8wmP*vOV!AGWQa35{DX?8)8j>11H#f1)^< zR4ac~(-sAUi6W1BsB3?Vtu|FnOPNH_FWQBv7P#kSG&XDL+#$Sp z{K4qF4EH=Iy}G-!DB!775TS9SBXj5NZ?V8Vk9w<()USAaU3MPzZcqO}G6@{=GOYZ& z6-;C{HUkGIgNcPpgsk;Qa5Rpsl|P5kot%~_nt+9Z<vGuUxY2&co&I}WclsT%UY~DW!TpYF ziX1c9>376(pYu7^A-lDOPZ(|sy+A#~+v#_nzTa`D-%*Q=xz`px%h{Y`YsA*bjj@}f z*XO$g2Z;UZvz#s2RwZ7b9F*^IUsH6q=Xu7)+?U{l;YHF>i**H$SnYA!5VtXQkJ|y| z1=>!(tr1%z&NDXTU0e8oYE#a&g|-K;O4{diK)EgSlw?cxZJ~$kcLbiNA2r|Yd4aMi z<|1iL(RBrnTC6R6+-R@sDe*bh`uI&TX9VXNtC9}ctu1ueW|#K~gHz&j?2F`!zx)_1gIBK~!nOz@psPLPqWE6}cAX?VdkP?xC_Y z>#BcR=*~S14m`QqD!?;meTO5K%g77!?$5J~9Fb#T-l6%R}v@niX zM$W@N<1|Tn*QUvy^q~`morW| zeJ@)`0{4n?6&Xb>Tj-{M7F3UMJ2tQ=)3t&_$?Ufc%jIkSiw@6yZ1y@I90K2qOhW3lm6azeCYuyafAr-+6GnN`@NU2^eo zW+6+{<+*0*xmQRxXqh7=sv}=dFPF~+Q5U1J`c>mryLu{v!%G`q3!frd!D;I&3F~6C zt*k3qnRkLR%ymIF%g`IKMf0~#Y+PiB%_duA-uNhYo;;5==~#gz*%jz7TkYStNd1Bw zfh&2G!;XSu75M@Mw#%g^CClfMNQWBx+S*4pB-mDL{&=d=hOZv0Zy7qruVPFt`?T00 zHcd+wC}|&Q8OjM%hxj>;r&iKWb@z^|S=xc`?9emxxOvI!MjwXh? zEf0GQv(yqpqZ#Fk=Fb-x={`K4rKD*7maH1_CnAjF9PN(B?4{-M$sSxL#Kb7pH+!kc z*(0oiou}ns|HLBUZmA_k`&MwcNgY5$ zx@XJ2nrC2HlQ~6HB(!<_29E`*CfT-=Ru^g>U%y~IxkTEa&}?qe{3TRVz4Aol(LWwD zIlH}OWC>Gs8)vpvy1|wF=Zr>_8RsvOICJXevaB*WyOgBN+gI)?*Vu2e%_pd&U)Fny zXlQgbqwUT;a_o*=knNDTX#R3J7Zgp9PcRVJE>N9z+hp4##|Dq4MV-PX7|5-#3qL-}D#$rv2CdM)gg}aTX4$n8ZsDAPpdubIMiiKs%KA04I0q*+O}qv+|i%%QYtuZYzYj)v}6ja8dR~ z#_3cFyC$=CekUh&NQetx(a3Nb+`>|o%!bOU7B^MKqQ}(OHsZy;xFJw!Z zeznfk9#gHe>k*SCrR7#LD>tW~t36OQ$DxLAbGqEhD1fgRTQoSj9Dhu;amw>aZZXR$ zgc^+vTUMcqaaVG#gbEK zZONT0VW6z3XLI_UaBgAyxb2LAvYa(*TF-GfpR}cnyT?|qnU&qm6s%_E_HnU}<@oL% zO=D|XA2GS$G`48b(2n)?DWa`jpZBjbI*`>&4rg`&y zw97UrR8vD%XgJTMp|fXXZ8LwrdixZ2EOXbmY-8TMg54lr^X3C(73|ECYIPjjs8%^& zVGR4S4aV>Yyj|d1{AKkz4WF&ZB47^-QzLDvE*RWeDtt2O_x=e zmcFb)ThqM_HsdmO8i;Gp#ebwG!9 ztS))#%sLq6)=+ei_WDE&5GA@F{juEbg)*qm^X|L=+H4JHm*U6wL!J> zZPz-cT!^Z8t%;#YvO%WBs(9s{NA6I=z&_NgT<%lSrV@vGgCmz!uxr{>;+6MOgJ_$A zjoQ|~)L^H7u`1JKE=e6~6eOK*KBpBs+qSTh#r4$eY)7n)8=D#~t1z!|=>olr5YV#9$#Z}MK$;C<* z?@(hwot^##NiIptD%5hU<;V+JS5WLWhc(f5bwcR^wH)o5((lfxqREYwHGF*3_FoqS|~B^ zWZ&q}Ez>4W>yvcT`re~AoWyTIO9h5K zDw#LyuD9C*X67DnhsZXns3pvtpK4*X+hbMs6`fn>46M^Mjc(&@QNLNK&SUa`>9mNA zElbkPhUCgMz&_A^-N<}l$#qZJu9Qdv8svzT#7Z26RvkCkPnVkwp$@xNt|os-m$VpO zQa2ZISwEs<NcXGET4CYn*5HD(<@r1I|^52Ut(B<)^L0U`Fi&wQS~R5jfyiHlcz|vuCc*E z{djGwbs#0zwGlK;BN#vFsHR%~eMP5^POqUZ0H)3ARZs2EP+p8~V;Y=LxtoikY#ECY!hyw#D@C@;%UGwA z@!xmvRUtJh)Vt7dsK%e?*g;x|U^I;{l_NNY zm((=gYzVvKxN@_Lm=!gwUynK2H&@re%@3B^P-m!SU@?Jv$%&@129cYsbCw(1%4qua zntjZIdN@`Y+}yI@0#fO!x1&~6SBt$%6w%OaNZ}2~ds{3iZs!T6-CRVhiIT0I0y!sL z=Qb^(8R<2YCN0#O5oC~iK+%%(C~VOt+xmgb&aQ@WW*b|EmL6El#LcDd0QY*#j>&B` zWAfz5Z|B*tU_#|>C5u#Z6dp;pOY&{Mt#SWe92K3puV~o7=+M$l1{NEtS<}EN`BJ!A ze4V+{(ZZ^aS<#YV15Ja^C9A_A3-v{;t-iHI#l3Jx7lDnxOv-Z zHQV)U5@&X%OVjv}8bLkA+7+P%85FflO0-W%%OEF*QXd^tLb?(lp*Gd(O#+I@X`KYR*7|K4x#f|lO)qk*NKuN)`>P&AxTceWcNqi3J!Kg4B=4v6mg>7 zUiZ01)ho7Z%$3g2*E8AczOBZUY@Uq*0-M$@Ubu?wdPURPl`Q$iriepB+jz-J%uX1b zLz2`#Dp8MBXs^42a<0*c*ye6KoZEOccUxSlsHnNy?mA1YrWGlazgJjj=-9luV-}jt zOPQBafLB!Hpd8QlY_z|@*t|v-4$2(S8>q7_w0y||yczoaqiFf|H>hGeMcl42Lugr{ zLG_mPWhG3?^i-xWV%vABP=*@YzOD0g)Bf^K71neZl3Jm`T%#f_b4X-rlQOaGONW}2 znQnTF)}VT+#zRu`wP{ejLW9%66@&5!*T(voxS7u>cz~HZrl;}@d2`NbMcO)F_bt`9 zU#T+Gd~HNd$q|lL3-ei(Tqm+BxjCnI;R(g3o9>Uy*T%bWbe>{tH}j)mri4sA(c%~_ zLjQEINtx(8GWD7ci)3xmc4n{8AdhgUU2?>b)MD&T6_&?Yl{~=A-ihW>s&OS!Tjx@Z z9a8eOS(q<5qDR@}h-OtxiO!DHY76tp)cJGxmfyjO_qipr%q6T;sbB*^=YZ3#1d+vS z=dj-4JkPgy?NHa-r8<|)EAFkfs$RmdX4=7QW8Dlq=!_M042vuL!=^*ZTSWIC&M7ILZAC!aI*RH9sOT+v&y6?I(V4U1QF@(pX0u%gbmqRYru)o;nh z6+PYRvV(!gLCZe*LOJV=1d%na6Nh|CCqfk|hjxIPYK;%X853RHCp_pL{2UVNExL2rCt@-9XSP zW?GJ&jdvEx5nU`#$ugm?VMPpE)J)6QWpwAD-##ptL-6&5gX{OB8e;;~PIX!tWsCP_RlAX+*7qfktRl|HByB<(;&kE zWoC04QL`tvXBAeV8+koR5f!#sj1(1gFK)fL=+wBj&iOcfJmyi-@{I8fGHf0;EZ3f@ z$82ZlOW0Qx682MNeU#M$tprb%JrOgaW{$$etyhJ6k_Ow9@;M_mEWV~vZE{3~Dthth zwaUCAvxi5arR9mJa7Mf;oUWm3AmqGXw`^7PZpl(>SXJ+zXksCB|(!MiZqq#OZ?^%(%7zDr@H5~GfP-S z+FzIv=O}ZO>34E1!LL}C8{nugX+m-xI77d+P#SAU^lW*vNa&c!jeBMkxUZY5! zH@hDtw-)MCy2Q;M7FWkNmsN#z)f*@EuTIU=rr3P1+j4P}bko^3)AGeJaz@m#OKgy< z%KQc<<4&=w$~tlywBI@6X7?lcuFzw0uBf=B^C8Cyt=88oVR5QWE%PpMxvG@+UDVFF zSEuG%Iydwgt7@Uqr`(9|JfdZfl}SE>n?(5x?wKpDjvH-D=ZM@*qEsn6Xz8Z2otlt> z{pK{N>Jpc|NK~ZxK+QElp`c~t+t%~zE^`Qr-d4H4PtEukA3-uJ+C0w8Z&J1!)LeQy zMe#<{T;ud-rOuJG6nTqAQhUc%P)|{oD7eUfTn?e5v)@3?VA~G*?j*gC6(ObMR~VzY zQ&XZ%n1x~tpO(cK4!4pTPA_#qes*JJ~N7Tu48F^$9u5tIPXa|&VK4V zZ365Hq@*a~gM4?E<-{HFq6e05Qi0j5vR#4n8dsblK`UNagSnUyaV&B{(I zs7OiKnxk|tX?po4!v%TebyZg0>O7jrsjUhHnfWE!OlZlM&aM+sf4G%vSa^4O;JmmQ zji=Y2=IZKPzR8$U^&JCK^O9HboI_PLn@h$S9u6JveVh|rtCQ$#@w3Ipd(VufM-6j3 zOAL>nE!>(dsIr0E)bcsw*VRch>f}4B@GOdNX}cWs^d{8`$nyqyiEbw!WnRs{#wa0J zCf%Tto29ngQc_`A*8PBgtwO9YI=ddfZoQH@BT4%!uB&5VII6HH&EB?}B0R#|p+T+q zob1%iwKvqSWyiIkCNQ>?qQ6DC)2FYD%g%iqxm=p#~;(2Ab{f71Z;*VKKLq3YLj+ z?Jq=8Q<9pWaXA&pOd8O=m|H+@C8MIUr`2SyG7&8bwOrzW`bVa{)tLl~Rv>K~vR%)z9(7kxyi3@m^iHmL0Bmv=v z8l+b~TOldHn>(?QSJVByHg-*^b+$rCo2_JLVU>axxTTsj4sRaX!8n)gdiU1d#&!^^ zmRED~^K`Ap)i<*9k1McCx*#95>5>ll9G`OEU6V-2*4EBnMyX&loa$VurOm*~HM3t( zMXS%J$F&mipK{+=>x8R)fu`LirlgvO_L%Nq=YOFcuYpgKj;50vo*>DX3|#qbfvy#PBy3LHDrYwFOpwzTV6L>{d7Too~VL}HD+tb7B?&N z8Z@`q$~@lry3PJl=Edt*oLSV%)I6emqO|O-SsBqn8Uwt(#ciw!Cd0I>)d3M*2W;LE-S*rdP zV;d`f=4k1_LgZxkxCJp9uNjPb-Iw$lEgjZYU9qO=*$xwHGwQjOU07pW>cBz-y&r2$ zt6Zfc<15HCMV7msP!~;XS#x6ZgJh3N6=b8Onj(s>tWBTfj%-wLCf1 zYPh#S^Tu=|%bKQcWvz1?BwtSML$%Ossn9ErkIM=5rrdI;b=Bogxk{5bp|uD577|7m zU(sV4f2?gjv%$q<*eYxNYKpGTMtNe&rPUR*%vP4v)}X6}vQa~leaWEU?Co>g&n_^v zMwTGg&CN8?oV3lvpu67Ly4=CM9M`yOerd-Iy|PzdrK)P&DW!edsnX@G zSe<6o@*X_JF-%#)yMAHs;t;nujBhi)vxD8{vH>>3{5tSO4ik-zm<5-OtuJe`&^g$v zgh5}6>D8{f*KQGSb=7@(wc0Jrix#Rmjy@(izH|40Re@W$`RmMRTcOcBBeR@|;km1i zH7r@KXl@x(f4YA7oaR@vuZzha)6$`4qp4hr!f_6)sOH%MhO~F(sxHM1%rP;1msjoq z%O#rw_DIT_jd>m75{!@7K5tK9AK z=?g=rd-Sc$m(ML;iY}y_h}Gj4WzE%FTB?t0Gsnr*>oazFP4~7`dl;KX))6f&;@~VV zD@@!fU#sreZ}b@UYkryHq$a_I&P(vTlC9j@#(YzMSeieA?MWx0=Uom}g~@SHL;um5`w! zQ(PxU42|DMB#<1-{M=Cw`2PGDm?&Il1iKMM_hPucE-7HBrQknCe@({>%)~6r#vIJW zJj~A$VBuGyUd@Ks7@J^IY=+J8SDISQj#z`8urqeSuGk%WU{CCYy|EAW#eUcy2jD;) zgoAMi4#i^K_dz&UX)9D`$VZkz{y#e`~3z==2sC*u^Hic8>6a z%-wKz+ynQ-y>RcWKDh7wepv(XFBGg9hKJ+lN8(X<%vZ)`mS^Bucs8Dc=i;ZnvdFT$ z7O%tW@dmsRZ^E1LmaMIK8{YmEKf&{Ud;lK=bO;~DNAOX63?IiQzJlU7pT`&QMSKZg z##iuFd<|d6H}KP$xA1LzC-W;q8fO_cAR)tF{;N&_zCvQxe8p7E`N~<@ny(CLjKA`v zW6f8fY0l`c95#pka&qV|r*~hR^%c|Eee+jzTH~*f49j0R=;Z##D@FgZ3@PBt)r`MF zq8b14MMVL>5N`P^2i=yxLhBm;La_3Tuh1~%Mevtv9e*W@bzBbrLUZ!3h~(t;@K>_n zcIqewWpKBH17gFa8UcNWW9O6lI7<8iVT+gVxKTJ4~ zY;l*#TjpBh*Pi$D6?@CUVI#WhOJ{ABeVe1(eedMJ)Ix(z?ANX;c5jF({pl{c=h&gJCZkC|7rTbDljaZOId_r1^N>ZUY>f8U$8N4ML+@|U@B)OX9-?s~I_>-eXw zewpvI`c+?VOX}9GTXN*vfw9Sb4(Eiw?#6nk(kmi$OQItfncr{hP3ddrjonj|cEMvX zId=vOl$%av^0o~b>^WLj<5AD+Pd>K9kn^K`Ywln*pBQyL`J_Bqs^j-f%w}Tl-5jB+ ze$ngjs4}|SMrE~u)6bupJuuaW+?4Jety{9wQd{4%PjzrLzuV9?PgU5_n-}bn*~o?M_x@0)xSs}BCfm2)30xw>(DlkCEMxK3=%^V(84qgUoP7Y!sgndu3b z2G^~{Fi`U^SNp$ut~T$tAyCu6NAh3spP`@s@WxN`E@t4-FzD_SG{l@`2F#xf4!WN( z`7dvod~kx`%{gu5V2yZjwZE=CKu@!m>r{?5EB_kYlGi!T{@tK^)n2`O9RG_@j(>H| z<7bbqM|nSHtFk}lhSmC-As5A_2ozLIciPkxw5YNHPcFX{rv4`bm?cG#+UJ4eS~+B?`eba0`+UK7q6-+3+v24nWMRPWKA)2i>QuAc0bb%g2K zjW4^mpQF+~oztGZpVb|aaP)`l(y2i{Yp#y}@2P>i%iL4}v%a|un0GxHW2ItW`d8PU z^>57tlP4-RH(b}g`GCstTh=Z#hz5d)^pS7x{K=RF9A+hYvJMOL; zw(RVH`Q)<$hBpof1L}B(U!PmtvdYeX^46LH+i!a<@BT{HR@G>1zPXp?4a!*abjjJB zvS*PGe;ru5r}LavT>n?MY;mNnU6`vXTsr6=`{Sp%$h|DSXx|tH{(P z-|HG@Kk7%l-SHa2>Ud3>d+1btmn$(w98>(XSKV7Pg`E+@pv$X!D-aej#Jw^IGul`;?CU4Sf*|TU}azm%= zQuNWZlWj2>zYDiGCU#G_YNldu;HV~c2wwGMJsOzM*%>qCk=8}W_q@6ZsV>U5#qb-n z?%tpD3qJoPJ1Nq&|Fx}#DBM<4u;IJq6j{`3S^UDajOuDnxzpO4pZfPcTcArH{uA}P zD;5v#{br;~)@fzWj2_koukVRS=-09aI^W%h$+jObe6Y=3dyd+xw?ua5<$ia~*#7!| zx7FB=ty&XqqjzXuOG~8r&DGbeRklVEF2?@xa(6h>g*-G1Zh7$ZsFi{JN<0OYYImHs4qPJ z^L0#d^+0ESeQmewgx f5voG1+i7tuX|-7`u0uz`LB1%oO5)1GyTUvdd*Z-y`@if zYp*W7@3AUqQ(xYNNrMymx@`L0t3LJ0ZY|KYFV7oX_k77?)wmD65$gBluDbN?-)a=y zI(PqFeR+E(tJ2x~^q0)>m*K}x$CYabIveX_KCK-zJfaV|Ex#frTm2j3vUad@MSG0n z(>teMzpEOq<3IG(84B|U*P%DQ{gxYdSKW3v5US*ohF{ShHGJ+iyBF5RNxNw;jj zz9Mdjah&_9#9>$_`)l*m;9 z{Lcd zuKnp+J@sW3i$3kBiB8wMJ-?=P`}g|a^6$2tqja5C{q;S1D>VPg+xT*D!q?8ZdZT{t z&D$dz?9tY%g1+_UEt5IaI`>!&+zphe0v`T)((gW9+Zoe!WuWtFeNE0v0BvObVi4;cF7)%M6LqO0O>2FY zyZQe~lc{q2Cs{a9KXez4i5t(VsI}AIRXuB4dL4`^2RftcYZS}YoBe-A7U-FJBsYHW zo70F#cVo7O)Vp^l>ecEX|Nc6?T+uW3v_7~`(x>Z3s@uC#RpdXn{?F6q1s{)YQx)Fq z)t^#T&GhE|bU(bveZahK^PJqYF*hFnY1n=&=C@_7gA=+tl7H{JJE!#-bFn+m%lX;enCybqkjz7E7QZ*n&%7S( z_ucaK@WGyndoiAe2kxF8Zglr}`JK(|^ohFm1^a3WT6C5rLk1^=>8GBkOaA?53~#qy zXy1qtEgS4C{aT|i{_ZY*s;fu)2G@=2ki8AoB?m3;pY7ivOVw9>J7kmeUn3Wf)GLe$ zI)29lUGj*<@6Yw0$r)Vd)^Sd&{JOP&FZaUU9JTDy_=j6-qB#MNA{4IrOO_TrEzP7m zZ;v#OQ3Y|6+0h0Oy8lj6XLr4ytPc`WRW<6(Bc+#aE>{M&qSPBP59z_qH+RWy=|CrZ zJ>DHTaQDfxnfuiL_SYZSJGic+U1m9UVMYzHey_^$Q;)3uzSWk(4?SBpiB;?p`~TgH zAJ$braj)z*&D>3PyoqDANJP|%dW9~-M@E|zkNoHt#+NauKi0^jctpr-X}A@UB;~( zOgFhR^{<40h3S4;*|&;+cBQt!@PUZLf zb8d!5|9`_Te!_Wv?Kd13E|8eHJZ3} zo=11QZI78ewZ`_`?e{&QSFKh)ofN2-7m~4QGqtk2mb&DPZL&+p2a{9VWO>J(H@jBL zKi0g+)LEt(s;V!Q@%HrO#TpJyShgs3pfjw`x7prQ9}CluoVU>>hqcL^%|$ob{P}Nh z)#T_U!Dx-8KJ_^l?5?q$(Z4s+Fo{t-n<{eewv75e*$M zOn=L5bJSDB*nWqz_P4=bMW16HIu3Lm`n;!Sw$+bz^X<=G3)gwQ8Xg?jvtppL`$o(s z`%Nr;JQ`SUb$RDG?fd@W*R$HDW^J>|&#H;`>#tw6t)|ttzkcbqnrPoxKGsF7K~LZ)yrW^~t?+a9z1JCc$&i@LF1Z+m!y(2ZIMv z4g@zoOk7uEpi2+Bai)7*L~U(e6sZb$zHw%&p(>#Hr;_x(3G@lXxRBm=fG$OcXpr9n zx*RcPBwoq^FCoNPL4z->yAKb%Ad-f%I-t)ZCYi(sIB;43;WkjJ?^p?CH-J8lp8pPI zPl3LIm>DE~$$^am_-X~V-r)Z`C>ueWj~D|I|H*-qLU<^F0zatg)*eHQIf<8X;F%DP z`a;zb%!u*tJj#znO9-U^g=E0&U>Fk&n}gw?Bi`qTPdVa)j-&ioWpY-TcSutPRA#{1 z3`h=!n__A?Pd$>Q9K}+O3^|(t_8EXOU~2~4$biBOmj#m00_SBeNtJ zpU!}10(8`uCAC61S>mTWyokkk6SNglW{My2s05bOhsd!)5^E%}LirMuZ;kS89NnG3 z#t8zQpxPM!&0|`4%u`;q6Cww&&*qN}~8ku<3rNLb0zJm#rS8&iHx_)}={ zNn=XpgkOci=1lluh5GymNfJxm$fNU(8J-g!849skaK{Qw^Cj|sXUSjk=pth#$q5I9 z!sjfoutpv}MC2k?+21_+nlTgVgr|o>R2Ed)pbsO7=4Gt1e|Xw5V`iiio)Zcuv-BiJ z(cVN=B1`#_H)i>EMuHa$D4$U8SjZR&Pb7GWfbrspB_uBkh1`Krv0xetb7H|O77Sxy zYAh^^1#T=cBr;K27P^^35fztgG8M*l8TDOYwy6vEHv7NTs@N06(`WVl&E)%q*lh_ zv3KBCCi-D>{Kg#!&U&nj#m09MPK;z+V)5fU5SxkaSdp22oczTC`E3b(Xe1+u#VvOr zB@sf~<~=@qID8!rqT#?dg_|sD38D5yN^hjehpK~6br{y=L;peO zKMbrxz&Z%q52<;kc(N(}Fx+K_0p)3mgNDQR>A*h(W+QJ5huhQOk7+P_I!wuj{iBe} zGD7i~C4In>zGSI)8&E=1{CqfknFfdQ!P^TZEK7TS5LU}kR}!JQ%~GE;pvIZvt;3;q z8iXE#%#ld4l91nH(d7n=nJGRs9G*;rqQlT2NBK($c|D8HHrQ~VMPD~yW}D*9;ov?U z!Vf~J@AzfYpy?1K$x(9>QTCKYA2wh_rg+S7;7$Y4A+Q~V{8tdlzggN$17@Bn{yZEk zr-SD~i1tENO9*NtTYZSoOhb|)m^KG;UEv=yDuFK@#m>nmx(*U`)6g_MrlW>w`_f(U zU#>XI6<>43_syu~d~E_>J#ylVB6wH?o<(3^1PhDcdJ$|Xf~`d`z6cf-!M-AxRRk^5 z(6Q+#IiKk8X7BW2@AP83Eaoek&D1+xsgZNA*&J+A1bOHPh#2h@f2!2gNoI`|Q zi%;^OcXyv?Z>W zSMZhfX0sX~Ar3seAlnKa2`HK)9YyBkqpriKt^qP1z_bRK_5eH{KvDxFJ%EllnBoN& zt?(T|b-rVS7x;NWsu#$-I+k;^@f0|x-1qcT5YAbZPoh&++szFSGMZ%0P1o8<&%O(zkxLm(7VH=_egHS zQjzAqt@>gB6_|p*z5%-iH2R=EdUCtsM4DP#bzT6qG6j!)1DhY9ABRbSFIN&LlHa$b zGXt!biR2G$>9hbQECsi`fs_XH<`5aQL?nM?OBV((CMme{4Y)r*;fKl6k=$llRQA}G zz7W8Kr(nA`aODB|dRQMgx&FUrXCEYO{U$j#pc#kAf>B)mWg_K6TWxs&GdBevegmlu zsLles4IzUK^#qPb(lQXwgPkK_u?27}Aj1NNTR@RTT?4_i63pMkym=5A1s*E-wK`S0RP2E*-U7+vqvvQ%KL=2 zl+CaWalJ)X37hdT#P2P@&jVJ>gVsu@ibYg8OBzKeJWy9I2&O{rFnr5|`p1OPm@v&I z%qH1H4w+|;?F0{%0tpe%vv>dKW&hcV4%2ZqD~t|O`M9SBC&NQb2+{140)yK@KVeb1^q?gP`jb%jf61L(IUwz%2 za&pJR!(l`z%%6`c&JzjoY>j^O1#>FZ9ghu%U!@9_J4WHK?F?khLz(4-B%UpQ%%}e_ zXT06z84E6C5Z-CG*I}GEVW*tap*5cR45FccG@$ zT7AHWTDA=PHo@{U==nUd;u5Ee7HS?_tM~X&e#`LDCb(8Q%V8Pb+N8G+3XMGexCz=z z9}iuIU7O%ZDT<3E8!AITm!daOq{jtLN5&mG`W*B|glEW%xxC47Gt0A=GnlJjq-_;%3;H1h;%)whe5y zfrCO^EiA7@W#>`ZMWienpKJp+In)wTn?P!lNNpmiT|{d2&3ICrM2c6C;zeXmEk~Ls zq)LTUf$;t^GUpLTtrk+VZ17MUyx0bt*fJ4bSrHd|KZSTA)~Oti+rJWIfOPtW(ATgBjpb{^f4i$ zpZ=aN%vlaaEzod&e9Ce-T0VYH668Jyj|=17mqXKYD7`S=CJB6BK+;9jyofA&!J*Fy znJqSWn=kB0g6w9ny@>qdNaf!gZH17TXM;cccBKg!9~*pfxn{Zze&Gv4qo91mv1UTC z9OYL+QWRVtff)-b$xwQpo%5XNY9YE_5OqmNupDJBN7Ir}!*Z0Aggz`sW|gpg1peEC zx%V}|FA8QxfkPCGi^33vrBPTMg%wd)9))cyVPqv#FGsJF(Cg)>w}mjPV7tT_<}5bM zNitO2u}~L`pw>s>DV1G0x=yEf$`U1Oag`uY2LVa!orHaC+61F8hrlatpN^nX-q0foTO15N~ zq5Po*eRTxGio(BD!ki=&_ksvoVpzsl(1jzI*->~&CDboR;mt(pd3NMV!?LFq^raEZ zmM9!t2|Jdf>}JCDBHKUCP}ypsJu!k=8ig-Z!rSG@^EnZHkzKXIP+4!G6~(0%M7uhjMfw+2Y!cjZs_dsmE7TiBVQwvHuPc|oV z%btm7{bb_5rH^xEtqYDk}>eo9xpOtDks@) zgso$+#-3ViBt6f~c}{k{ASKU9Ned}?K}NoCirNSpH^NPOYN?UBlB+z=?JnnbU*hu0 zxxDjS-bF6&0+)A*yR(eDvw~X}XCz*3lv8UjZL*hM8bdAIh&O!&_6Nj&L7H9Qx~wqD zN!&Z-Ik~@_>k_;7zP@sSTTB}%?%Au$$53-OV(YKq^ATA;C%rFn6XN#HZy_u6m3Sk~ z4SV(RF;x7<#=G{ya;_w4Z^jEU^8z=J>r|Uy!yHT>nHPWrMx8Vhpo>Bd-4n&px0P&&eEHa1ntw z7m7%zN4OoNN)QLYWV@UO#4yMz03?Bs?+^K-A#$|ToeMTxh~mN|E?9CQf(w3JFyg{W zE{x-1DHqdR%;RDgE>04;JV(+zlCtMwe=go60=6CS1K@=J|B=t79TZJSokmiJNXmzc ztwpfL7T%2pZzYvw3y1u{JB1oyt60XxzM|seBo)uao+5Z@3mXEUZxwXC2YDT$%ScAd z#fwC6+!pSPhRjsR*Mj^pqRUApjEk3wz{?im0-#|Pm0|~P0>DEFk?)|a0nybY!{_1y zA~PqMB9ILVL_fU|6wa1rgyRpyX&ov_`Oa^fogAgk(7PzM}M28RHA&Q?l^ z#Gc$bJ%(}XWRut(kgi83Ozec)9bk}*7Y9%V0o2j}YF>bwGk5ZzWLPeFq8^ph&GHGL zrUy`V0VOhSf|Q%!!cB1FCJg5$xKFa{0J~0D&wwLAbi%I=AUj}N2LyLO zZ6`Q<m?^cEB7xI^jttT!v_#Y7v_d4+)JQg!Mo4F&oDy&;1ic({ISwu-q4)$$ zj)1Va5H<%I!=Q04cq_nrE>z5hig2iyqZaY;3_iB!*Z>=|n8^ekgydTxe;Q14 z(j*bI2+98kkra3gfp8O8#;Z6$1@iDq7PFAhN|7=j{C|UjVerrxEP1Q9!Ma0GHC_zZ)tz0G?Aiidf1BVx0@R zx*x_)fpNodjfqrYAU?+8%^^bE(6RmScnU6d~?&3rB~)CK*qAMQ=T zX2U4gVbmd$x#2|ET%s|YXq-iO&nCRXiHcc7#ayCd4p9+7tX2@K=Ma4gqHh+_H<##( zAOy1s!K`D8rr>>3uzrP+Q}C`S__rxoKc(vw@3{u@1qSk91Nl?~dCV>gH!R;{k%?|)3+ff=XZp&qBfvlu)} z!1EM%o`x00u%ZO&5@EMBF5=L|C^8WWt*H~7oMLn$5e`~g6{E~X7@i1oeDFbQWj&YahvIm8BEFr7mn7l?iTG(E zzL<#DBw}GAo}P#wB;t>W_(&pNkcfXJ;^0L5XCi)*xO%)$IaR2fB&3pA(m+CChq|&M zdJ^n%!i~n%8y?-kqu=r9e|dB#kABai{E1>aRA7q=>`;&`x@wCy*`fhEMA#z24yD|f1t`N&f=8LQKr zs6$TFWhcsf5>CtpA6t|dKs2sl6~E5^l=|CtDO6KxD3BweoB)(R+A+l$raD8qDgN7ld2GNuHK-0m>-^EW0LK_- z80U<|&iKO&csv6F3gGu6kQ|6Q)(|dT+jsk;q5f$9stE^PNWGS8*sLz{H zbDVM9jN&X)D#{suol(5kl+sT$egW(<|;z+mL-2|K$n;@tDW(|8E~Nh;sQ}n zCrkd10lm+Z`P~^WnE}g=KvMupN+y~=u*#kq&{s?uk#oge11&Zk-NjPY8Q85M{M%T{ zzYVmdrp$V0Tt5Sz6~NK8L{%qCdDj5{D_~MM+CXx00qQ%lZ>twR<%O%gaJm;h;{|O3 z^=ghHfb`cRkgW12*ZGtEdIXTHfaCIbvo?XaQ;_q(N_xeMnh}p9<8j(UNI!y13ec25 za(@b^SescAK!&AqirWN=CsyjCUWp$Bng%O%x)(Jy9{WCok4MmGe{yv)r%T^)+e&@f zi}H)d3m?MfBj`sUDOerqRG_~LWM(QS|ARn&+loHq#dyTyfQOKB1RYK0x&So=l1ZyM&94PzPp#-3UW{ive)$l79zmkfr0rUc{~Lj_)k<69#XNZk zsRd}VCkQNIt0AsqQy&QFn(?D77k3eKTbjoL_^<$iqTy;ZY+3*V3m`2T(iXsk1#mMO zZZ3c!(Qqsp%CA7k73feRmkvU4i>=N#q*http_X{ICoG8ux62TgjEdh8iU(|Uh9Nb^ z5_3F@4;oTaEpd}4d|UvdFT?5-)YV34p0L$% zp_bnDY`V~p`Q5Ujl}-O;$Rt|gi=Oa)0r*x!(puE~jwpM=ruP~$V=Xc13C_`)-z@PQ zPk6fkJTI%4d4gZG=7}eSML>o-)SKgWK9kDUq_A_U3CU$bqA#xunHsV9BcE>P)9?Ax zRJP(WQ5=n;^;m#{qS2;kG!Tu_qS1tCG(?XDsQe1ip=8(nyZd!C;#U!7YbM@~p7mP< zPCg6f(a7yG5thuJoH}uCG%Bek!cy7AZG1(&x%#L(wK)Q3oQ14tbf}7`SjA3w%h$Xz zSO4iw#Yf;3XJO0&^rMRCOJz&6e0j4uUF^>ABJirS(7pf-uOg-;v-4l`JMQg4R``byrY-HDXmERy7K_j6$l>;uLb{ z8ggd}S@)ik^GImEhIIMF$?4)KZVJ_2$^)x9oSOHI3q38-~SRH(!72aGy9&3ZAwu0|v zeQ+R~KXA$(2jf0>M|a+;b7?x_%%3L8@)A{C5MVP-1Cq+)R@ z=B47vsb-y`oR@aelY!KVR2=lFSRF_ir{a)QJTw*0{sc=}(fw*NOvx?o5aoOlDeCRi zX9FqIR2=sS>{`*~Dspwoq%o~%Lp9mAmMhVUU&Ok<K|+~#+pvX^#rO(26(@wQK} zqZOU4BBR%EtJ<U!nUmbbkZhSK##k?+ft0!OlL|*$X?rLR}{kzenP?Nc|w+hc)kHvcSF~ktsB-sUmtY+hvXVk*hAF@ zLB>YN`~vwMNM29Um0V_yJs1W-(|Sni*1t=mvKEp)&1HOz@Mimj8ZLv3aIihx9RoAg zLBUt3>OjgCQd`1hrW-+t^Re}WJP7$8g`k;G=!|cf-U~tvdW=D(K`3bq>NpDgnQ+k= zA9u#5o$+C3e8m~>aK`_0rqs?2LhlCD@mZhN*@|XE z={-Z~Q$zKBOUg=yy=7tbhU!X7%1##ckD+>(B{fHe;}*i1tMGh1s`y59ePC;D8>&xR zQZr?E;X>Ga6@IKof^I_cfh}(^q_q`VC!M2tTiaXd|-yGU4tuy?0ST58?lwt$b*x-EGONkwJ+c)Z5^8 zA@hZ!-AMATqV2C>$Vxcqhxhs6Gk*ApAHL>?xA{SvP~FE-e&claa(LYwUJr-&nX|K- zv$K!0vzJr%uTcCxt9RY;tFK&M*+^^rsAGPV!Ad;)RdIzMHE$*EeFf%M(cgMpLnZ6T z#$HbGN1@`bjXK>g@n50lj*a?HKgw?{QVu(IN|4Smj!F6iFCMewmA2#J|GlDi!+d*nS zklJ^owv!aUCUa`J(vwD%rvq*s3+p$*>rK%6T}_OI^v$rlAIv_Z$=%51J*jxeRUb2= zmN?+VvG8;=B=$pNFG}bjHMh9xY9q?sp|Od3@f+&u*tX$2^nF2+4pQFCrFR-JatCZY z7LIR*JKteiH_CrU%3pHnA|uAb0SAnQshc7ECnWWv=1*kV3od=mh*{-;pNxfw&2aWR zwDzH@&TT7dh;~EjGn?)ok}HE3miVoqw1=(v%$E1E<=@z4z3j5D6DzO7*Xtm<4#_c) zF2l!V$-QjlXLfftySr!Njq6Z&9Tr`Oeb?dqby#&BzHdhS@5gRl2ZQV2dL7I+A-C_u ziJwH+=ZQX>QQ}Xc@iV*lKSND}rTU1B;>O^!*Wu+RborGKL+<) zhbNnmML*%u$ByjSllz14_%`wMX4KSAlzw41cNvzoSkmWY%-9%AUWXl!swFCZ3?bJ5Z~};Xk&( zzgytx0F?YhjbF*)cCJF-cin+<8i$Lvz=#33{2lf6kzMb(ntzPwoes?8arpce_;Ub? z`q8v+WPTf0UT;Jnbzmlp!+&i7_g{Lyq0%qG?|(t%5A@+H+1$=8duBw}I56YK;o2>5 zcK{ytqv&q3s)MV1X{22`4t9^j4GzpL2d2@1X?0-!c3_@6Fij53D~Ef(P?!#8=)hhF zNC)F}(58cZI;b8%z5V2^pQKqIcXBV+8!C*b1%%=f z;G+nx5wL*^eFo5F333;pmB8cxZbJ}Dz#R@u6F|NR$bEpG56lO^-w{kDAe;k9B51aN zGIyX;fq4b^7lIuGWOKmQ2>gvfIU2Olz}yDxj^Gjjlea?g(!J43ck zHsPr)d1?oq)Q~0Tv*eL7)uY=yZbD&Z21d{(g~PccrcUL>WCQ&_YWj*#dw zo9N@Sy6kvzxtNZWGQ|{Lx)nYX=na?f;ISfYcx8cNdZzTbC9iCpSgVjSk0~6x74DK~ z2A3!hvZ~B@$^fx;zLd$L@JSL)9uEytm?1V{qn+DeS{gKLgQRWnAq_rkgO2eKBF3Y6 zj4O|E;(ceKel}up(RMZpVWAElQD?`>8OKvA#nfXd9yQ)&1W%nTroKqA^>|p52Jbki z(U3@xur&TW^?EUNSc=zuBM%`FY0oMf z&7+r#nIb8^HXfX}!9y;J77$g|Eae!UHdM@bGdaDomIacCB)+=c{cXj&R-*oHjP zQ0X?b{|3CH;Vs=^BG6h0#A1P1A`n|=-rRlP$wnhif<&MhDpAjqQ+sIKbOY?t&}a_1+K?lW z2;}|}I#SNm(fIKVXiq~$EHcPkARi~8$IItS1ZATobcB4gwLlpp(T2#Gdo+G>1Ky^g zPb^X~0g4@=LJXlikg+H+Ar&BTI!LyIBt!Z{3@^m+Qw&2`lsTamAx6N5)c9JnFm{n>fN>!HO0!?sbF%6QE=}gc+h@b3zfwQm^1q z+r*77EcF^5bw!L{Il`|Az)1&z2uUmm`4ASpn8#F!v4JDZnE*vQph18lB}ADwi(bQH z-iYxCM+gjtwdwFdG=5_+d`$;i0rEE?ls+u&1|IWK93o=V+X>|aR8C_?I6tfY!?&0BFIeYXeMH|6?kbOcm<=lbRx){U*=*)uW@;9wfk!Z@xh4g zFX1bPnrS0lm{SVuRS0i`(b){5Rlu&Y<1>6xn}ND(p|2JeFM{EVplA_)kNeFtJ~Mj{UaONhA&OodAWS2?Ch8?I+NJ?xta!&z0LBi;t{%sLFxe0OUD9D^s z<|3fyNtpZc3O4~gUBWz<<0Ff@XbDp&$EJ(mbCFge(%Or(#v-kiNNg(-n~1~~BC)Y3$H}&n&#ki) z<@ni3$J(kXf9kOkpHSlcN^H^wf89j)Gsyi$++wjP$3moVwpB0mr!FY5ZyS89MWfTn z)go?}iAdvPtKR5O{inoR+F;vFl#xzm3b_&ok$jjfJ>Q@Cpv3Fj;Bzg?%^*t+xREy5 zzT3$pKDXIgROV$%NBA?Jl=w*-MAV|QJIEkAkuuO0+iop3hEg6ZWML^mNs!tB(e{Wo zN3@y8zG&<+Pw>QW*#hRR~d~FDDTpp~T`ntesh` zI#UC&rGY|fB6T&92AHTrhEmm&@$P+aUL_q0EoTc*H(< zF$Ap*AwFcYnk@~=#+hj8p-kaq9J>!rI-!RlMD%V}m9+u0o6v?J<#AXy3(8#-31rTf(OT8bO>6#o9MD& z%cXo;Va8}&@V!|u=NJ@CL=D*!QjS6HBvhJ7MB1>+9QpKAGe+lv+h;-EaX1@_qW2Ke zB_thBYUBRzk3r(aq<9ILvzU}OaOguq>VS|LX@iH`;1pljn*-)VtE@npgQp?bP6UfTlC-ENKsTk7EwdfNYSXE*srS~V%eaei0Eb&6cJs-vTNDhUq0XG`9074 zG4Gu_<;*$foip>yy&HmN{>G<&T1;51;5H+ zxi@yRpd}Wxw*?(&K?hmTwic8jPf-{)EQbSfcqE5Ca`;n@6>_YS<2*U;kmHqI(A5S0 zH7KPTrPQG3HE1l99N5E}nHM&zOBw4;y_VyQE?C|Lr8THNl=RML$&GkwHw#6mH`O4= zSzTaVg92udnY&m+0-oC0Lb1l1);4e01^a8z(Gc=ZKC9fAHyZ0r=gXVDEM!}}=`uN9 z)diEQQC3*Z^)8rEjUq$H%0gD_Hd{7K{=aJ*lK;D~;lRe;Y&?y>q>`kynN&Vpw1P1! z$hU%es}6fMUdD$bR&dQ9e$9Z8myp+qirv|rrKD&LAOCFy%nUH;L{bMfb;=5E`9pLD zlyo4e7n^!)1%eESy@#akZ0fC*axEVp^_QNp0{0APzJ=7bZ0e>JJk5ZQ_mFx5n=ZD3 z>lsjZ3rT$0^bISB$$&d|ep)&R*{*E*k`?G?DBAqh_pRV|1~hgcRREiQX$46cu<|Za zxwGlrR&X%`tnQ(72R41n3XZLV%3CPigH6|2{qM4M{~eS*nTg^`%>N8y7E@qXjD zJ37+w&eYRN;AIfrcXiZW&eWSqShbF5zOAEnai$(s!jud`uR}*7aki*1mL){uE`QWM zz$h;_mL*2wdH!hWD@OSdV_8mQbAWTAHnTVqNBDP@RYKA_V&!ce)f8v?UL}0XAgnre z@dp`xmBt!*B;N0j?!98PmKbZoBO${B!aN|}nR{y0nuS4)%aJ z5BMt?Y|caAI+Q&~a5{3QuR}|2Gm9shQ74kY^E_m{BE-eI3YiB^IS=6jgt$~!vC;!) zoCnuIV&-p5=@c{SP_kA`D^;W9L(sBWZ0j9 z=KRK#IGfRzlA$02x!q-|0?p|BWN64hE45&X8GSDq*z1s0Co|pKjNX+D&g)R+U1qwc z89kT`kJh37JIr)vGw@+yLsC?T)O%2I8wj=OCY0ZR@-`^H34U#meFL)F;qNxs(FOy% zP=_UHFm5}y4NMBq%-v{a5fYn|Qd^cHMUNU3VpmV-NrB-T&|QS&=A_z{rHIg@o(S=0 zPq@4ozP5p0Arcyr5+{~yrJjWuDY0eA67}dpA^yb^erN-?Jd|KXsvKCdP(AvB5Epqu zQVN`Hhn0I!uOX=#&ysD>qfZI(eor`-0+BZr1)gwVF`T#o$wjEuluVz@(nRWki)mB} zQl5hT1eoTAy-g|8f;lPZjy5euZYjv*6x1icu>^RO0KX*+SQii}XnIOivKw_J0e?RQ zZ7C=^1%|?g3^%$Yp;=@qTjWMpC*ZbIFnckIZ?BF!1uIgJ?+s#QA+y&? zSLJ9bOLC*T67c?0aBMNU*G}~3F61-0k#2T_EX4pz@rosT#nKG0G%s12!LV)p z@M}Mu?uW4R=uQUN`;w))&7%fb>76`Hg(Yo22`^iXHT__C9-SU!<=y2O9I+JrxEgOe zkMajt;=`6A+euXPYMg%_)xTsZ%Pf2D6%7xv^jIWnruF%&BS7_SeL^}$&mCg@|aK6cQ@-un9nk>n03+sCH8^l_XG*y&?! zCdLLH1;XkaxHJZT4))i3d#oC<$%!#aCn8prEEot4R+0e`az^T z%vLP5!2vliJc#7QY{e{_Za01EU?6N6gO7JfiCCXj2g3C+D7;Ndg7oPdfw2FBmIz6S zvp)Si5Z-)%mG?-Mqki9Bwrrsd4$gtygUD|$TN7@B8*<>pAZk6#)`Z!7%(THzazMN` z&qm9Qq^1pxz9{zN({6m)i%+}qDI2yTk4!Hl(|3`hh2&^HIl7x1Eh0w?$k9E)Xf4>T zg+*(@a4mGLg;Q(c{0nKa74^&yZ(a+zFChOWs=a|q3P`09Tk6ACgjrDqez8$)>lukk;wvSRW>$!4>iw`QyV#_h+S^1uM*qH z)&|nU+1TejSia~wnvI*@!^P+5b9>D{@8Rd?Xm>klwTJCzsGsg?qnQ&(KhDM<-h4U!o4(X%D)s3*w2YD6clD(crc!6V z!`m@3^WJ~Sd%nZvG4kUreTif$t@*Ac2C}eIUlKHx){f=DhnmMmvT{Z_pG z3wrp9-CI6Rwqh&(=L_2XitTr3oMz5eyzUF~c*$-p8K>E}HPe17-Sizw2pMpZXh`gw32`q zT$tkllFL9>67Yin5)!n7K=>0Ad`+QuA!xD@HfH|sOE149(4--JkO>`3BxWKx6Adx{ zcN(~aiB@unUQ>otn*<>qOccl^vIUG$7mk6{fN9F$xN{7m3`D0zROU3?&qU942@@BN z^n!?bybVgZM6DS^8Ep_Zfg?R8qAqU(o-X0-%2C&fsN36M6_?0#=cvz!Xw5dL;Sz=J z97&6aZr%oGxI|!_fo#Dv+`>c;%^1B22C})+nlFmzQ`_LCE>Y>uNxveZ+qS_0F3~UM zq-#qKZG+nB@NqianGTiHp?^A@p5CD}z-w*c!}R~1W93bU-MLVyi?Yp#(eVs}1dgcD zfVwgr+H{eF2{F@^Q5?-tgxF$kF4PMMWfVsdX^Su9!mt@3Pv9t`Y;k)o1PF+s`5eU$ zw)jdeuuKVIG)I1N!ZBsQooBO1PFwa=7G7T{6Lp zrE<}eB?+koLM+x(c<3oy^fa+Tx<-P3SOiypg@1FS5*A^rT$CYT<+Asahq@3hn}igLXZ6_pT9^e5Aro-^~MTin-*c~T$H5+3xyi# zBCR~=gej{vPKe_eX2?K*)Z+=oLI$nk;5bA0W(OXj&|jcX*ohlC)DlBH5(*h6s3VRc zI?AEm*}<25FmWZMmpD|KAJ?S`fs;@P2a!UVM@GBlBfAs$@Hol8yN(qb+>o-1MfC!va=wWo zG739|q6#ynJjz579EEK{qkgZ3e+mdaSFWT{Oz)@$;{sxi3s=%2rbnt_T|RMVJXfU< z)78~bP(U4(+uB%c^@;i^uG>1);Sa{*!H&P~@g@TGbvJPId;qK-C$CLvrF zLW2-1g}7CS7kR>m6v%3Wk~T;#K-nhb=y;Yvw4Nx*v!q5yC3|9`4f0J$alD?WN=T)6 z;*u0d%}24WEa`b6bvFfg`KZ~ArM@Dh9;LwL0`ze_OHwPO3sbaALng%P$>w?DPi^Y< z6gZfVR=TiM=Y;gN6u6m>DqVNp6Oeuj^)!*55ca=d$ibDbm}_+_pDZ`||AEUDKZvrT z;;g6`E4s-K&sYmrp95+`+X~1XrtCade(@PU>cn$+--e6|NCyFXrUzeo)Q`%24zJr# znt-jGZ`I?%m!9;a&OC>v0Htb(s5FL4MnD+BuSSsJ2m_HIE(fVM61gCe4^o5>)Nuy( z(t%WCsCNYKnIPYXE1aNt77SH_+7T&|2x<=lAJ&0?jNq#?=!JuDA4oiqY%@XcV0gPA zSsFq2Gw?AZc^YSmSjiY3&Hbu!3-m`+nK1G$?!YKNe?pAq}kD*^u6}O&@8BQfYnA=qC=H1 z6bBfJBMi}OLJ~gx=qxCk1@W_B%mLOL;Y~((t`U`OM1>epnMTwJ2fTR}eAy3NXXN0B zY8_C?Y(iPWkUHupHX2by4!Ca?tltmAj>vm9A>YeT+v+H07!4m}NbGcEnMQQ81NNT< z>-IyuGisbgBphU@Ty!*YBl?sBJ~Inm?FSD>l>Ec=4f{ZR3!0a}MlY~8$EAAoY?gsD zIpj_hF&}spjsH ztb~1fsz7sDoEN=w33k5)N&8WjGdU8$^4q7E?rpAF;zhq+g4f-G1N+elN3wqwOH>Ea zXi&O9p$SBB@d7S(W6};xI*>^_G3g*Cb(o-PK^_g2F~!TccnudXsmS6|hfMHB7buE>iep-fcGqL!Oe}nhg=4YsDi-#{!k@92j>TGj-ODxjg=M_oU4N`JHovZ@S96$HtJwYM|dX_>(CxLw7U*HK}Y1OBO1T!&TOK$ zj3F&yh{6eZIFVh#81>LGkQ#}U4pjCm+_4Y*!-)Y8o#JB-)RldZ8?If*bc(g*bq=oc zjTF(daGE1ZD`ChJjTAYvu&E;oC}RvI8!3`z;jNBnX9+`?Xe8S_3;*KS)xQsP!>ijI zQCS%yVV;pJZWiuwL=Q_C2}wq>Ewk`jN0e2@=$&h%nK=s^JEF)khF_eKCVWRvRQ zs)MmILLAFgq`TmKbr4=kC=_Oi8_o#X_zu z(Z&0!34J;mZqKd~)InAW(L0YT`_Tml*TL=*!Y`4l$#%g7b#T}tcQ)#GVN$L|es!p| z4rSLNMjcvGw>Nb;T)f|L${TN54twsyvpV!WyawL~!#Y$QP7ZkRiqCmd*X~1TIBDX} zD^9jh#4g8Uby21FwR$IGC-9`lys7Q?;qGj**`p|+By4_o&AU3}RK_ZgwUBLGj_1`O z(*vx8XbblVJXMP~ed0d+98Ow|=cS+ZrU&oC+;B44otJ*u8_w&&F+I4dhi93?2QM&9 zg~r>^djO@2Nrfw^NoLU}^|)fvAetq*pw~H{B|4!;J@bOpPDMs4)R!V<6ibn1jxVHw zMHw2>g1P3nD;3&HQ29KTEZ!W4rb2ufN{D00)|+FWRPZfDy$e_}?Q54)VfO)TB*oIa zp0Ko0oQnKX4Ntn^1@qwgX*imSN>Wj5Dhj+!WS25WU33kkrp!_%XS{B4jT<#*9_~F2 zIi19S7GHIvuAPR^P9oM-SK8!86`cm3+tn9Rk;MU~Jl<51It4Np3W5jS1cF*o|kX*keHB)jOQx46-V zPD5h`RA<2H3^+Onc^Ocj0mB(HWB7EP6`tV_|78Fggz8RoqbxY5vx*pmeVtWCgV0$* ziWl+~@&5S2pmci%+`WyO#cXxG74;+o$WEj;{^#}sWO)K#mgtWk4?kK&8iHdLAZ_I(Loc|qz&B}ofV~{n7x(88mr~RWbZRcp)ZF0a>-yq3G zv>_)}5lDsS;ON1q$7A5rNp`#GOOFLoPsiX>XHD23swiR0=i4YEaPa1-TZ)F!4PBT!@9CL?m0n#4ZALAs2p#g9Is(r804k0DR{{?*b(I zfr&{0@Z-TR8flW5SXTfi=0a-}(kx{{Mkr{5{{8uIRDkZd5(#q|>B_tTfi~JCLgE=6 zQHG+qp*T>0#^M-asi7hv6qn?K<9H%g$&ntnqXzTA$Cc===ctu-R6#yycLN`_;G`Y( zUp|noL}3$0Qe{UEYN>2l@C9U zCn`^J(wpq6wHzEv7{n39v4pCTA&b$W&l=%sBV2EUlN{l&Se;-^1yt$MPsans%hpj-|k-VkX4Q+ZS|OB6{K z*P@vZVB`UmEQeulxakdld1KletG%(x8;^S9a&O$~jV~>SFZW^J18JHC)#i=EmxIp( z7_LR$GfDYgmfDG@*kVB)^Tw-}!_x=SBi{I@}nOdSEsXCMUSkMpr644&RSMopDTMlt8gO4x7elb;KM>63C=+ z_*xutier|~7sw*xa84XDjb$c83uN=+@ZC6cHlEqLP@oBk%RK7}brw)#ffW|G)dFwz zf$eFqvj;{RY(stEW*R)MM>pb0aV$@f?Slu>#4Q%or!-h!U-hyF`r^nTDNnK3r~8Zr zbtDb8G@!zImgI^By(10wH=sN9ELF7yU7rR|>e0%REY&fsai+n~^{Da$E4|8sE=q&$ z;k-C&ywIAGT2s;1bZr2RTMti$VR#sJ_n`0fMi>20rlYHrg z0P6BEd}<)QPw>^X0aU>-tg0tJHu2S0186)9+v{thdQjM0wlKz8mbf09_jJYdpqFv% zg!$I8#p`iI58}tO{gSOU^7Z&b5Auj*w`vCxP2w1mN+793lD@!#D3Y#Y;Upd&wE#~a z=`#y>?*n6xU}pVK(P>apkEBg3>W~Gvr$O^^q&~}{E?U5$6_DA0)R$SqF{Dh!!^?f( z=p#soCS^H1T;!vEXaSQ~Xe|M$&avn!3z)G2idPVlG(weTw8fat|H<(hJ-SMw2(!Gf=t3`S%5e8SFSS3?>+>|<$2t_MUb3IdCWlB9tge__4 z<4LAOWlAd(;XxX@)5KKOn$q_ZVMQ8Rc|7-Q579ecS0i)B!7UK^i13Ti)o2^HY=Oi7 zrfj~e^c`#DX%K*4vs(k5^K3JDVx;64t)xLB^A3RATN0dC(MPK?_pLV86 ztCPI+Q@(J9k5zoExwb2@T@Hkm~j!#_)fZSmy zX(Xjb`BYl~#Jz!TB`H10r)mO}TB~`u9xgnb_H-CN)|2XUd^#@xVum3wjxAec-Q3Ej zhXdfv8(7&$s?PK2&jIjl7_92a^h-y|3-I_2F>q2>TJ1qSz5qRMi0%em=~WM^<^rr5CYqac)yF-C7nsRr&d0y3M~CZm zRZ0)K{sLTlLsZu5rl0blTQ1}!>f?F(c)mW}YJ-&xbiqw9ij(iZsbD+GN) zo8Q!EzJl#1l<|_@UBnjXb-zQZk*=$SGYY)Ha6+2s)Fd3U$s+AS~cpY*9Xx>`ui*( z&jN&#AYBfc#~@On&MvJrgY*)j!bxnzgZmbcnFi`6ME%8r?G~W71|(HlD+5^+i9hkc z*B5%bK|_%^mJ`#gJfTZ?-kZf)saM?ONnL4&HVd-WJ1o_bto30jp9&Sz7UQxa z6yVDmdMf0t){|WFr1RQgu_ZZYrJkhDlWuN@GnV9?ReCCwC*9W$lPzne6rs<)tlr;+ zn%C{H!GbJ42tz(d%YK?J2Hl{8*BHZpP7oC#%{0c<5nyx>YQ2&82}6-=jKd?~eg$|h zC)ABP)IlfMQUM>=5Rz6M`fn%rRsqQ?iP21Bh>n4<82INXghil%2xJn0@{U61QLu?X zmkttt`!YvYa19=sh)%muhmXRS3SwZ5c0qNa-XDcq5h&c3Def^*B*x&K5y--aDep6p zCB)z_5va_Ynee-bY+Ve#9DzPhVz#PHaJSytgD9^8l}{p7a+a(|kG^6~$tL2_rLguc zL|35Ll`QFHbE;@56jdPaRV?*c^Wi?d^($EF8guH%Qg~5;=B#8%>dfhFOQE0wxvgNO ztIX-T3GJiuyQudrDm+M*`><7Me9;=drprn(a~vbpQ<)4M3rhwb;&YJM6&z0M!%m{7xnGfcS1gkwy& z%EYZqFFBIkC+0PSYRylZlOUu8^41_}Et8tAi!Zpta0|$v5sF}4yxJX{TA=(PA)BU) z>)e6g41SLZO{OkH&xZKfaJdXlmqD33>Q5pV=NKJbMxq~Q<8AIJ|6E92A`!b%r}&wX zV&iOV;f~T;81e^3ilo^%$h`}f!Qw<>&T1XWIY;_J86+hVBg=KtPdn13W$?o}hT<$C zJ4-rB4-+Ob485;YIi)GPecPNn8j+Y=#+pu9uLc#q&@MbZf6ZEwZLyx(N zh2y38FvZVI712rf-&Kg!!W2F>m1QR3Usj=|=a}UWOl7G_c>OAr)y(Yu-Bc5s zgwL!(9?eYIIa1wBrY~n}9`fmP*3_KIxc@DToh8Nne9>`h>QENA_o3z$Z1s6->OdC! z^8^*9u_Y(0>F-(c<&*L4w;+CtLf)d0C#3iZ$!KPGJhl;?m_l9o47q(|$x8j=XEuuP zO?db%vN*?<-?x!TH{q_gsJ(?<-e)6=--P|&qK9YMy=oiTicOiyDfF(-aG;OuU#?HR z2KpT+9wF)>qIwX0p2VBjSiy&D*1*kznXf@wMN&0&Qi-+<%-N$=qQc6S6+N|GMq z!}!V2_$R39NctTg*ps31HKbROaMB*D>~W*L*9b?}Wk}cC<5e>tX9mR0z+=|PHIt$2 zGVFQFQJ=P_4(`^rO?({TNNViq7;9v@fzhirl+B%iYpjt+7Nhm4A%3WXpXkskW4zWG zZbo)oG^P@qapfW4W)jM79Ywe^?mGk*vWTG`9a*R|wmt;>^@J>wCCg%IGQ;}s!OlZy z&SWxS1FNIQTtO|v+YX`pOqRIMTy$z8_4uALaT(rt2qk8*Eab;Cij`5OS)9D8NNRs>NAn@2~&|{hOf+ruN#o? z8B-Q(hP&pgW9EbD2GrZflqH$r%k$yh2Gpu%(r3rxOXG3<_>2**rbi%3nv0X?ql^uq zx8|ep4NUn%fnvs7Z^d}}#t9gIky!bfo30!WEtYuRBzUtLvYtZa1(cmha)ww2k9dM% zmbAu_y1p9RFQDdOmimMxtzHf5E~1rhS?R|u>6X=S=N;UC2Nmxi=qZ|hv1argL_I}g zS#0s|+Wp=J?DP~Ru4fPRSr^-TLhiUv*|O-SQ4LTp;r{LB~cAeuDH7 zr0F9?&1@<}ACF9du}`4vAr%q&7)?EkE~DBl(D)4ohPFq4gV@)k^s+wnGzfTKL2rnZoY1E~20_DD zSUEzfTJ-6vAb9l^D*q%!Z**n-W_0}oJbNLYz6H7d#S}g;lWkpyTehIAkIdeuW}3)_ z@NH{H(>VO&RIJzvkH4XT*KDbB9JO&O?)yi2U@JWRhCaS!OH||NlC5y&D;jyn7QN9| zjOZIY9w)jomAd<{{Kp@m58yTeUlKO6VZa)sIY2!^V9W+LD^RTh`Vay>i2_+f2%jPL zGEh9F@LCd;=`nh}4P?Jl_&SO1@fodt2AYS|5+4qoV}O4X;k50L$RmclIf_3;IBq-e zc|@xZ=e0gdWud3>6w+%X_&*u;+KvKvtRY{a>@OLfydB;784~zNv=bQmh+|Et*K_Dv zTX?V&+{O{AEDrsLEi_j_doY@_lgQR*axA#To5WO~6bA&O3LaA!Xd=5I#g~K8Y93Rj zN2)D%&iNT-^GJ>bOPV31=|!-8Cz>N`osD${D1I1+UoKLNOr6UNz`z5v$zOLe?e6jx{K&h&3uC z4Ln(*o5GR+mf}|-wp|SEMJQn^OEW5juL*GE6u7rnzgw)W$Sj{|DtncH7cWNg7jWYR z+_{MiUcdlXK&Zd)ZgR+z|7jdswc3ilyOz^#fAu{ae}O6r*+Y|UWCPh)3(oFl`%SXZ zJkQ2hNBlbjKQo4VKTwmLAaDwzd=2TvcGNGs;FB}qUBOXrvZL`XXr7ffNr%ofqSOvp zuphGK5PktVnlT65upd@O5(Yo8@($@0OUxC&F2OeYk!fVuF(;C96oe6o^9zx_j!QSW zz_l3U6v6cK6kvZIp2VX(dGuNfs%SY(Ifkqbv1ESMbY=kll-ay709LW^Miw=shb<;T z`&~$wN@6c#9AJ$7jWr!}pwkT}p8@V2qI`<3>^C=j{S5rQurZ+Q2q|65r&a#2;uWks zLW&OQ$^y+qDIT~h2CNSgl1jG0WPL?XAU^iW_P`f-`ih)Wsju1?M7J=(-;^kv$5E}d z#c%DfQ2{b_W3@I5sZ$Kib0fH%3Kgj^b=!u2ze%dLn(p?$_QmquW)~}w zj@Kzu+mB72A090!K4TNQ*^`*kx#$<8%L!3ny@zOB{;9tt0ZzCNmzq)XpELb=YQ45~ zJYLjPAKKSGw%yvtGxXFm`BC$+QFd?Y?o8ho*D5El2=+hKj)nrpkd@hBsUm|Iun%?& z?YJ+@nW#T8uqS^>`b#RSaqZ)!Uc!*UHw)YCcy*G3k&BIS50It zm)XW3dWlE%%;Ix!*yR1~+MxwAnXxagSl#qe69H+-rlAIT$>V%tu3yg6>zMrc`~zQk z@LJr$pE-9gdaOiF7E?Cd;|V5)UdZRl5C6OFo}G6$r^`Wn)w<6%SYLPIQ=J8cV!Z9o zm{TPAsmeZx-L%AZek76Ur>kFW4p1GUcT6Rsb<~6!jRQp zQaV@rTDB~z`e}1)Wr0m;mWn$i{Oqy+t{cp1jb7B;x!_yVzRJ{bJDlbzj-{wmENdIY z^Xw+ZCgo>6sov}5J)Nmmb6#g8KD<9+r}*aPQ)Q2K6}hUUo}PVeGxl^Ys%Bl5?|)xp zq*M`8(l)FSe0{jb<*!YhXvfZu$GU=v!TQE=ZRQKC&b<5UpOlxU-tEIgHp)HLJZd%W@+pb}hB(qofFS0MCm z)HSM`CZ??1r1&spPTTARxxl#SWz})3*!lX31_KwjuC&W*s+MeiQ83uGWnrV^)&@mT z!eL#-ah}BicFVa?oi?d8+hp&KvD@oQ@||4}$3FHqf$V_JzFZ>qOvpJq>6G!-bG;X5=R~RV zzEn%rwVqQfef+x0Xu9_!mjCl>d@$yzYZw+U856>qzg_>)x9V%#(Bc5y7FqSSz}SP^ z`)X0G>mNy0W83X=Ani%@q2nFlRr_NbGnnPewmBTmOWpaIrPyq$49<$}O`Ng(?=q7% zZr3z&z#;5*ggQrOIE9qC2J3{wmA(82>6h6qeuGHnY(o+3TOp7fbiX^qK5o>V|MsV- zAY73pPjTHR)~poh zaDQc2&5-bq@5}bRpF=Kj2#cNT{fzN?#O(5`7gx)-f2ylm6}zNuy5XD~16Aq#0Q--5E45q6yB)mZ2d1A2X5_q;?%xJ$ zKL^aYmh?6%A5{dyO3x5MAY}bAEVTaf#_jjt*^cj3?4Qk*rww=mRX{e+-tqmQXu{1O z{dGRXbUFHOzP+tPkZeLfLhsy_^KLhGg>8xLXZH9``@=?Fyam>lH4IR%M zYSxPoR28)=a|djW{$bjRPK>s#d`(Boj}kr;*wP|uaJ=o!J^rHN(erkYHEtfL9Va;H zxxK8;TG>2f+fg0$%*C;B+xiaL&z=(7YxBiik=3+!&WF{m9=mllqwKljnYTjLo68q1 z4)NQn>-gdyX7PO+cXvYe{tp*|`Fm7NL)egNqHB4n$?hBRe+jKm3Ph7^D(t3hVJHvi ztv9J+`Js!w_P>I;5p3uEHz(jTZLu={QItXMF78D2T7LNA8lM)FomSFkvCAi*d;vV} zdt+g=TQ_WjTPDx?*e&T6!_GB@DUKcO7N73VSh)%8$>#HBuJ3l(IBuM9Z0i1>zLamD zu;tX~g%<_uJFAG=o54TC%@D-OXRf*-y~=sZh4Mw;qG5|kz^wMUHR@I4n5Bu6PG;S<6CZ@A)(jmTGyl$G(P{k#5}+u)Ur|P zliX)cttKXfl{EhJSAoV4_1z6^eyO}W!|wZUfm0QB5WK6Rj=U2!yrey55zKI3zh&~| zOe40x{lt}j?sh#m98%<_pR9NCXpLm^FS#7Fk-M;G#$G#zMtya1({{&OU_YP~A8w49 zaN_XEHM!i^_T(}L?`h|r!oK%SKgo|8Z;TyrKlJC`a<<*bJ<9&|P`S`>-u@zk8PzrB z5AtgU`Qo{u`1X#-rR6uP?S1pg%rqrUkUcf(l*Vk{TXgjK+s)l3Qys&i(fu5=dbDJ2)v6YC*CcP5&N^^w4x5_-XCEt=U%Ct@ zTid@F-U`?6MsJ8Eq1`SipN9ZjtIU<}hM*YEo&xJ@n?=kl>j$JWTA>TyalZOSXI z`Xd9#;O?W&`B@t$3HG$dt)1c4*0Xj|a;+)N67&~%op46o`)V#b!r0X+2lKb*cVOUj-KbG3{?t z-T9Y)l&qNS@ywLD{N3KTFY1|-V<+i|;`qOh>G(G^+Sc2J9WIj}wCO*1|8)71%z z$?P>LRd?rj@BjJmbH%@Qu{%#*H$V0O?w4M0vKJXBE-+8?LVeu39wvkPN_AzRvY=^q z^yp^C4BzS3y_F4~X)m~{-x&+6uB!g}H}I11Ra?#IlH`aTDM6>{`h!x{RuMH%H&a9? zDg>?zIEtSx@80`9gpJKv$`dR_o#*D;CBOIx{Cr`RTLzO)LP`{hv8_vx9>AZJ%sym96~5sdW218iZ)P{o@0`wr_*%ME&r;;&E7DW7@d=M?`T zY?8}eKax8z!Swo>F7+bU`WOpM>vNk;K{K*SZd;hYoR+$B{l0t`3;euYITyI6Dc*EQ zagW-?iKWA5n3rFhes4}@MM0&XyvE?|t19#80k@EdIcig#{FZ6nk1yWpeRYL*wzle+ zazeOK&;d(@+S!Z}Eqe1>`K$9Wzl}TdXK=f`Y|fPTkaEL@ABlo*>dAc7=7L^e+P@g};Zp%rmx%!k)t~33VT%=RNc;=Kj@g zLh*L|R`kL)ST{CA|JjM3M=K|i4%bd)^KW$vwCGgE(y>0Wek0|o> zHt`e7DWV)$*?Ir2OYg$`dmOd@x{?@upA8J@k1Gou1o~Twbl@ss*ZALS_MS#!KAeyVPjJ6XP-)x|;n%#dq*z`*; zwM=fn=e8y9E%>f?!uB&e_WisuTsj$jP4vndpUV=fhlio`nHsP2Vy8S-EYI0{*xI!e z(mSW!l$V$G@YlpE;&;l+EZ$Cl~)J;3+y}V%Xgjo(bMhUZgO4Vj_u$7JZB`b z(2v`v2p~#+*m-|y2B&z3*#Kl){McZ-tSDa5w^MmxV)WCib5k?7r0?IIwyxO4(vhq7 z^oU;O_+m@E^28PX)nciorat`9v4K#N$quuri&pQpgkN7kH18{rdzH-Iadci4_p5S` zb-?&w-bLHv#+wU*Z>4>1OWycy7?^P#XM8UxzM6i%v}OTbaaO)`7Ixwua`?l4F*3O~ z>aH98Fnwb4OzvN%C5_ekchbdVM4dg8{dVyd-I|m*H+rpQ=9Hm zqYb;0BEii#Q_U0jhR)vx50ex-#CU$ZmdqR4I%2WYYx_FRt#0{^gH}W5pI)sIoT+N( zMlJ4IU}=3%etb`1sQ8)Qr@hq?kwbmX{>7~(%|UO76ZqU8*RoZ@DCS>crv7bx)o=V3 z7d_QA8)ivJYLHjx-%UK9@xO9b8P>cx3lGMPl#*gzSBijIQM0M!C;g@WkD~K_r}}^6 z`1_pW*yq^Wk=-HNvDY!qA@dxg%o5^cgd9>vNA@0B8Fie4PDrvsNcITl6hbB0ql8HN z^X>Z&+}C}*uKRvIpO0VeSGFv5T{k0V_~UQ~$Eo#Ain|Z7ESL9)$Lr`SuQ3j^3{(Xn z=V$-1ir$Vy>fAh~>jy*7pi=iz`paX6vz|sA-6MHNbbIh+1GdAYy_#C9D-g3ojWFZ) z;3D4^y@4_ln)y=eJ+T7(L2%26%$86^1n6+H(;F7xtfywi$)JrTCuhT#f|2=ESj~ifV6)ysb?ko!VQ1L=RYdnd}y$=)Wa>XmP(Zz~|Z&@p&pycOc2?@%G z><3bCF}&-RAs1qq{D{kaRj?N6nW5-P;k)@|iuF5&&2nm%$@NG%BMCvl-*JdSFH%ic zv+%R%nU`j#x4#1%p93hD4O_Dkhcj^cr;Bsl$hs zlGrGiHNAXsd<8mTT~a1)$1nRic> zJw75scC4cuBI--pLFRwD<1}dUVK;Xj@tYDXBj-v};agv>QWRg4Hrx0u#MUW{R$ytB z7r1LgcX2i}Vj`Ey1y&%)WG(4OVBwvtoJOedc5H6Jfgq%sd*CgUe58X4d+^5-V-_#k zWrg|cHq-=DAuULM_y22T`$C8VT-a{uAP4SPj=ch43iYx5pUrUZ#1P&&>gWO`Gq$kx zUaLgM?8vMH>YjnGWw+?=`;!5OhIMni!vdk z39Y>4oUu=<{ff(DEBor7L?RlM&yH?dQOuNGrqHSq+tOzjgjkg<^UOlyC)rWsPQ|K-vxsBc1L9_;pN=`}3a^*}vMq$tEg;e(gtl z&U&nl6_6dxM*G6>W8ePejX3h!k4_2p#}|+K1}oAPHMz4h%bN28tCJ{aI zUp7Ez=~W+Q$a}Ea;@~3yK2!OT7x=@;kb!puCo#hyx~oaR>;4^&jcX!B4%OD1w_ zT&U$62UFT|73mx8sN9$&;sW%IOSsse0}#Z5jAtFxs9IXFj{DUV=Z|T@$+8Q;*4#h6 z*9e-yoO<7E?g$~`K=c>55#;x+>6+6Gy^ja)=pr++d$nS!E`j{MV_81Ugpq=ZyHc{^ zF4GEGC!NXIl>HTy@80yWGUs2P!sisAa+4Cxrl^WODKOn8r1Q4X;Ca8*VKY-|#9?08 zM1qRzt}NoBj#)cz>l@C`d6c1ZNUu}b&F1I*Xo+CS_uR=H5NDk@9oY37+=)R(x@ML< z;MU|!XI>>VuZUnznu6%Ou|>D<9E)?eJ{mv!G%fuS!152$%ngXHDOvA8<7GRt z(2_WEpEKJb51H>L@_V-WPC?l70$Re#P)f!b3(%*hW;Y_pA#-VX!0V~`gJNpJKZNNA zu@`R2IK@t@g^y0xphrb$st7h+f&hot2DQ<%)hVliiO_3&jpsciKC*BZbKI864*Aq( zDU%6Nig$weWFy?=&2?O8_j&Y}ldg*G3d08eEJjm=pFnAiJo;y_3k^X3QNHhK(%rJ_ zCgv}&Tv2!MIR$_K|Caq_l+_RAtSlQ@2r-{}Z-N1A3duq57t08l&kS-b!JTdTIA z29+2Qaz~8A1}hh6(j3WJ;EvxuzaQB+7H0}6US&QJY;ABgZr+r3iX-CEYUe4v8Z$OI z7Adp@cFFfvsR|t*R7Hzkt%3NSy)nN$v#;zsp4g#Fy3syrVA2ORXsu#GSD2k<#)3JY zzS810s4I1T{C~-62t;+2xArwZDHda&h>t^Q#Qy@NNceAE zDYx%OL6=J@HND99;>kk*=MzRcTMF%t@az+d&0}1Fa-H;Rb;YTJho{1AO z)}W>ED@Gq2e62AD>AOka5hnG95|)FnrirF8WLEUZskJcB{GlLATJY!=ob5^Yby58h zvw%{K``nt@WH9}^ zA%FF-hBw%N&h z>;1l>LQ5Z9)NVE#0jgf;>rqfR;|RgM7T!~)ksMFug`qf#e54^fD+l-zIPe)2rYim6 z@qZCjQpe-ezf9e_HA~Y)9Fnulo$IDWAv_Pc>%4Pw1ff<@q!=E#Gr5qRU{ZG>@D#>q z1xOWwVWGAY&HhzZ@;(PRCYDJJ^svv&OK{ta`Fe1k74wO>^|{_(f9G>k+MO7+%z(}8 z{z@tF`DMiwSgjKzIl1`5S60I;9(A&zy!=Az0#NuaOI*vi1UBf z6jdC#CC4R_`7!ZutGo=A3C7elAe$8-_i<FdBwZ%smS#Q_i>g&Z-PnRPoo z*74A2{1R!L7l`;!DviZXG^BK_OuIx4YBJEwhwGGsU?Mi9HvNLE2OlthZH6L_jx-BM zfkH-=@a18E(-~*U)6IWmS$tR`{AyC`+y;Da%Y}igP@N;Cx>EI$v#00p5_216%n5^5ceL#(GCI17b1?Eo4Q5CKsVtSiIm9@-bLs5gA zUWexOlMFhN6mhQ0RssE0A}w5P$u}wMKw7iaKBG<%7#F6P_24c%xc)lK?o)c^hl_~= z2Lhf{={^Klz{b*PX+Pnux@zBLkLvTl^0w0ZPfbGT>zb{vxQvc{;ykkoPu}=A7!I+9 z%h5_i%49HdpXgWb!e56g2?pF)#?PaIG;7~|xqsOaA^DX3I2anXfM*e7hln>@#@%6% zbhJo;5=rMgBr{!!GuYD)qY1?bdrfm{)8wB|^Ic-Vo3oah;`?V`P6rl8vN;TV9kg;F zPt?g$uU>Pe$)Ybq*%djK&u$4rGp_+k&Dit4K>J%VG!w5HP-&%M#u8pAf`0ld=bY=Q z?S-n&<`~qf{hV}nLH5liI+L+t_RFWpf?vE16- z6!F+Q8EScQN+K=jQm9NTHf#JNs^RPJ3<&3S^xPQj#@q%w;c??=w4$ipPd}Ey`dV5u zzj7-Ea+y}iK8t#lu6|Pg(cU#TCvaK1lx}%CdCS^{^e0EPU}rY3-1?2-EhP7G3wo!Y zP}?&#QzFwPl@SGY4QSBJ{<1k-bD$@l*z+V^*jw>b{xL(aDo6MY#OmCxsOVL}^q+23 z*BG>1t#Q7@6#pATAlr7##t%lY0pg)wX5i9^QxyeEXi=@Z(&)=6PP`@1K9W*8VtIbw zDTP)d3{%IbcNEEW)wZx-3V7Gfgmx}&?0PyrzsZi)#>|?7y1E}G%&_wW9!fHJ5wFeL z+$obeRy=q)&C~#DR+^kg-c7f5+lmU?`md7_eTit?h8gkOUK@y z$!Lzbbw5MhQ|M5GH4ku~`2pqZiG{V7&2Uu;tyK8)HFW)w@am+dbN83OvE57~Cc@bd zmU9eIrC+7vj6cSk#}Io^T@eoWuqX$=;FOA3JUl{{g9#Z>$R0y;+TCTg=W zKoVsN7?u8*(%UQo(6n&$4I63?d+QT8>8bl^_9P(b(%Vl!)f^$n5M5AdKN>=JiIWXO zYjM)mxJZ1V*ZP!x6hwd8J^5ugpIKu&W6JI=Z!ybBkK|GG0XI2c<7#v(pg^}JR0mRth+kxt4w67rL>XiPIJ)w|{yWYdb5-}#@r_(G3kb?4&Y?Fw%hlZsPVERA$Z@z2Bs#PA1@sj9^PI=ia6OwRkJ*ytO?%I(C5h*siG&AQp~jQ7}9uGY08=3 zo)-9}`$0Vimng-Yeq)%p`7P%-QuvOLI$Mcqs^arm5X+-PkVP?4S-g+VzCO(?8J7te z&6Fji0r&Q&-&@dn)D;y>lOHjVaYr+1qzL;HHApIi9jLCR81c*cQye*o*@-*NjJ-vx z=vx-PfY`{t$+-TN*)<@g;5N??ub#hoa8Pv#A9@;VDbi8G)Fwn`)|fF%x>hPvEOG4# z_Rn#Cl~J<>nyYhmV*foVI0L4ZoZ*k7yTcXxu}(~*8L5ut5aN$Dy}a=ls-;r9l;Czx z4QS+d2m3c2Y*lGU_Tny8nSExFd-5DaT+IwpiC>OEMzidtZC>K2c&tu(kvbfv*ysqL zgLByhK#~TMzxYYX*9Ol(={DiHz1$lxHM!kD;l9fgF$GCMx-!QjwYo;;LwtKBFWw7p z2_j}cN@{9b^O9FR5wnkw(ROnRHYh#z%BN-wC{P+2w)`oGB}^sgl{3k2Ge(1I2=Qh? z429DXf`@`+7f(MaQ$41wLZ0S4^6?{JFE$v`=VS`JRmSzY5|^0W{<+d8?t0cfw-|)n zYScNT)ETR6|L1zp-$YNP3GvjAS6pQQ;UUcVp;0@Mps3UnCS?LM{gX12Fi|OeN0B)B zwQT^O08A>{ZulZs7V8Ric1sohel~Ow5KUMQl%Ew~h$4lHrh30m14!_Z-2=s-? zXIDy7b@CWP_c=Ni&cP&YlQ-tTx@0qfa?lL1+p^IDVt6?_YKR=EjqK6wD|{+QA9!kQ zeXg2kQ4t%cIpdj8ea@tuNP)X&bp6akZxG|hY2Wli)K>|2rt(lyIBe=yD&tQB(7 z-E;ipKn48z*cYAMI5y3-jnuBY)V;5G%K!xRqoGf0e(uWyGj+<{szAr+XH210xpQy9 zoF(rEP=>pvzJ|*Q0#}Eza(gk_WeNHlDN|HCm_J2e1%pnH0(B@^N6k zy9mq&t)%<=&S)@ukC%&XDeO(JQ=!FH)wzq~JR`V~(GK5pPa1H>8h_^bH-w~D=)oS& zk2KH|Pf>K02#8uVU5?kAJZtphH{Ph#F>Pmo!mLrL5cz>?v;Qq&6!vzx3&CK8S?^_7 z{o64S9i>E0R_A80d&GZBFEyFH^I#g8=G2fccQcB&swFa}>yqNux3WOZj#Y-(t*kRX zr8{9*?_#O;0X{-n=ELYliL#$_!VJjw;*>0d@8Ie(s&o|)qI|K?PyAAPRDg06wBume zV~9f|_TYu`yRsB`Gab}jky^YOE=^L5oxyOy_;=9H!DWx$M#3!K(B6xc`y8pSCdWGbB}l{VR&Ja%da;?ZAN^qH9vvZcevX)r zxhLBH!A#?fMQ6Xi#mugX@4h4| zdogVJ2KOycn#4txzR#2Vl2AW^k@gPBjWq7c+$kGSGaKU^#3GF$&PV)tz6bXs9^?sJ zq%3Kcuv09LUUi}R6oxXf4It#Dtj12Vy1f3`5uGPo#*!ANZxEDYSx_<0K;$wMkC3b++iS-n!{2=sEl1uD9qC!(Lh z@;^kc9h_tL^c-M0ka&j-;^|Ga^jRiwmI_d`k>Y)ymn&DVY2>7{j#jmRL1yD3Zj#MjCa3X z%ubINDf`Y0UJ_sfj+Cw-fPon6r#CMhs}Yyjj)hYzDkBe*JAUak=@=((d(LEK+q2=A zxI*&CPr#^u@RUe}9~MH84w8?pN6+1ucHLxBYc&n{3U>YHKcc^WeTz=hSqx5b{{gAE zbq6BOBcMFhl@YP}zC-pxT2V)ay5etgo*wVtGghUe&96VJjB$7q9t0u3=Yb;!S1Ung zwz!Z`l0ax!-`$s{3-h!Gz(LE74bB&2T~sA1%^#B0e3pKA0T@~`?YraKVPbzJD@*)e zw^(RizR`FQ5H@dmdONxptTh#wQfY_NyH2Xr&DH5s()5$y3>yYlma^xqG$fvzPsmne zqeCmW&T~ud{<`N{VwhaNDpfj!ej64KcGF_n+8>ts)N|rdvZmC=v@S%B^Cvvu-?O{o z<`u5gn4P;~@zS5_z71#=At~BjN5x#?)q`NqW>b48F#2ulTsSENPVjUiy&LR#IgcP$ zD7Yh-nkK+@{i#IE@J*R&Rnylm>DLr?e3KoI@G=HOiA|~f{h3Av?Gw@ZF$AIX=|7;a6cnW`Rv7EK0h_X9ZE1|g)*0u?) zj+SR#iy)6~)I&;lMXDmW9ADDa6bck@9a8#RNqfS(NQ9Wlyg62uxz60ua)F@4@o0nU z?uj~^rOS15ONN8-6#blb8wTKR%`v<+c@6TY&P|iP|K(9n^krb&iTq ze?){fpo09}Z)N6}R_QyUtdm7WssgW${<4FUif_4eRo)M}v(t|)az&bQHkIc}A2EuA zym;pvm=h43 z$xx>oQYWhKo=LTeG0drPU)n0X|(_)`$vckQpI%-u5x zBaC^GT_d`V$t~0>C|KdT|->)mgt;h70ZBQTUvR zJ=zH}^ljem&8x6*Pxu*ShP#n$J0@I%I0*{TLdO&Wy1}?V{d|2>oFXY;=Ue3ZE!}fmTHMlH=FV1Gws!fw{CFjXp%Dth zM%FOvK>>)Y4}bcxhS2H0g>Vx?-jWyj9ic8jT+!aAAEBSe+)8Y@y)s^*fb8s#ONIBe z4&y!ENxWUD>kv?RX&$MEbWP%qT_dMjvw!#l#I{nH^Doh6jwM^qZ;2{O5N?07##KOed;sq%)63aBA%N%_QFY=! zN#NHi;(G5n;PzoWB4-wxX9rw$0WJPdvFL;FH$lO0D(_LH+2qY zCoZo@CZt~$_B$|NwwtsX2jP81t-2CzA~dE)y91(R;$eKP_-kBuo^%lr>` zMwjSlkpnPflG6K%tfv7rE3wAFr+=1}?MXGSF2!=4&=<=)D{98WI^XD`B3eRQnaQfU^3%%bhEr-=Db^c+eF!^|bj3Xpxrb=|A~& zupI}BWCOh`9B2%!CC#~~Ss&muV+vmbMKW}!6n*T_qdlGeq9(nmRF+F7hM*4|WAiE! zeGIr4^7f}w@5;TxEm!Rr;9E?Bv_2)0{**p;n3|1`WK(=4^5_jYRG_uN!jsiGl zTlr=Cb@E)Qmx=SEwXkYwVAFY>$HmY7100n29dS^jNR>+>AgJ3@p3~E$sXZdLf3_m$ zjW5@`XX?#F3%$3H!W(>`tXj6M+lh^*KIL?kQi_*=`Y*eRiuTVx078Q|nkuz+vN!c1 z7I)uKIhB5QI`^D0dGoq`chkL3FbpT5-4_NbIKY+v1mb2tfD!CK>06l_3Z&kDQPWGD zL$Y=D*nSxJ%S)VKZ=+kXeC8ejBEy;YwN2aJf!xb>)DVy3=}ZncC0`injwWaCu+i;Q ztn9VoXoXg!cja45t{kPKiLz>OBju^HEM9Y-2I>t?z!nX+WUb!(^ z^ml|ynDQylYMEMfN9#O?xS735enQ__V1AplQHZ&b7OEa{jeKX0hQ2`DREE*Bn$0dB z;kBTOL1`H@P_c+qf=(Y!6H)Wg-Q>JPNgq0B8~N`&n(2{o{BmY7*?D6g5BffFjOo!O zf~qe9%e9qLYq2=sSsjB&jTyd^fPD>msY~GCz(WauP$joa5pb++9#KQE)+E*D=#N&) zz394;;s9@560Mx#3Y&w6C~=0(Ul>7t=lSy5mM*SJ(smQ*2j)C_kx_^EmWE3|M=vBP zmRB(xo%`4^+f=}y6`S(Py(%K-1NgAP$!`tEQyF6ex%|e54mWI8TfCCHD8y3wnZ#aV zv7HgKpmCZsabgeyn)zGGd`&>?*sm%**10URE0dvYy!e4na`>#}MG{Nq*w*OuP|fU> zq|wl8-b-gp`cw>N$ZCC}F@COsS6C6$)p+}@CiTFTl;5^^5mi!#KXQ(Xd|&U76p)5hl7L+Nie+c@ zZK+$Ga=o9E@!|Rlia$^!ez95v{{vLKDAlt8le8vU3;* z2Q1Wmcc(&GjFS?N&8g#N%x6DZg19;-9)6m1JgiT+X2PYCI2|zL|HGThxF8Haodfuy z^ndq1^Z~pO|38MO{%?2>a?G8G$|77nr!v1zFovF@_IYeA>#uATupX~c5jP13iJ6gj z^|lj3ldnm!X(KiG9fejtVw|3djYSTP7tkslE$ll67k}ihb!R>-{eNs4e=RIu45jGuG5pL%;WR8VR9o#GD@r2kzH0BcCDYfsj^Qx@Q)h6}ID_ zwb)64$kXyv$3t^&gF%6=-M^A+OiCUXfmaBC%UL_o$$4i&bP-&3S;?M|t{el6x?i@Eru*7UFynLLV2##7OgL5)GJK zqR&8^e*N_%dR>tS{3eM_^87LC#pS{;?P$|Fe}K{WldA=*1r^?~gk+Vio4Ew%-B2fG zz|)G8`q%aI9TIomokT!ggKxX`0)ICM5v=Iunw(eRQi9e26iEri0n=~NexsH`u)JJh zqss}*TT&lDfcXatbQ8jU#HERp!hR0pS(J0xQ-K{P9durr^juuo3ey}j^fliaDC2SG z1-OF}^s!|AGYIPP+mpwu2l88FCd?7AADanLd#EdFxk`1La=Q_3eS;*ybghmZ&4Au% zx+8vUg}JSxMX$aB@Mbg43Xym^8~}70G>{*h_tw#Jtm7`*qN3@BH7WB8!8`3@F`|9= ztNLy)hw-mIsAfI*og?M19UyI-4#Y_5pf7oNnY@EkqA($GfbB~j9ij0cD&H)O4&zY_ z1UK2OLS6$j}`j($O2TEjY0S|Gov+7K zv_I8V1nU#pRn(ulOoC_Tm9v$}n^v<}9y9PU&Vmltm{?I*BTrzlbj$nCH1x#Imy*dj zlbYH11TQ01*7wZvzN!be4)as$qZP4Z254U3IOP!Wb;j$lPt~RcHnMGw2FILKYPsRSb5mMu*e^ z75F91*=rD{w-o6Ed(&qJPogL1|80_?h73 zUq13GS-;9 zOeoSsXR(zbbLsc%2RuehF$<%!qA%_^ct>@?HA|< z2|ix{m0l9(@56>LrA?U^$~}%oO%cDbTD;)Lcij_%zkb!MGjmk`pPkW z`qu|*4eYRV?W4xW+gajv^foop8GTH@sE9Ssiyo*}{jWc7iKr@Rz$U#Q5aQ`n^}s`F z$3vlS*O6(t&Zz57R_*hegjUx8z~j@$oVrr!3={W&oVgTGMZ1L)1yFI_Ruk~B#@T~> zMsZoJmD*;-yu@H7$KHH!Z07xXr-nXY{;cHr4No zHBP~S1?pMD{#;m4X7x^lW{iWH7Tg1Fic}f+%=B^E6;gQ5As-lbtupm#o2I_U@i-w4 z$mCr=zj1WsHsO)*KcwZ4tLClx`3O*X7ja+Ji`Qsnp|p84wd17oxd1!eQag%J#aZc8 zwf7}#neF~92-g_gKMV-h=R)i2W_7PyOM`VW4v^f~ zkPy1+qYF+w$QKdf@j2q}4NQ|yW0={<&b=``?J1tC0`dNx!WNwfkv{hHLn1qy1x$a>h+QLQ;7;?vnBUFOU5!=iq)|b8qt> zMNYk%eCSHZNOElL11YPaw;KTuTiiMb7^vLC>r4EJxSTV4g9c#{5Rfu4o-?0Krn%dp zOq18_Kt70zNki)lCbKsm*a531G>bVfzQr%_xE(!kOqaQNeiS#J_;VQf>`Y(Ab;o6^ z`wb}_Jld2h#}4DEA#;}}Pb3t-)pC_O$by-+-4*YN+|KZz{N({2o}&e;I4>~|O+g5| z4OH1+JpdLTlyTnptJ%-Q+Z~dowkEnf zDAoNn9hsodpf4(kaQx6@D61T&AjrX0$BoE zEEAJ_tX#&&g`0=BA=&f(O!9|aY_}AEHF1#!#RXUax+|H)O#*DZ+Dp?(>H4e;TZuY( z3|OkbgUox=$~)11n~Hc3nz8>P|8bWKzU|I#oCoV$5RJ^S?EH*-QUsV+e2IIPmkDpd z+beX*qZ^rlw-%$LOxby4nK{B!WB1Fsys#y^q21<SY&6PV?g4lKSTgK zK*YZy`s27QDlvgQjG>`Dei1_6&fI&dqTuGkMcS?<{3XU z-x#&v8d{WbfcWjCSq+D&-jw<>J^SD%j&X&(*^feGUc{Zs?h?8a{*}KKlhb_$G~Yu7 z`F?%JKs&A7hp{#A80e55DJwpOdN+LS2~O2SU*Pk)Q#JU_HLCP!n{g?EUm)wMtK>)+kWrNLDh%#h=yluk zB|}-E%Qy9ilWwimhnJa|M38$P!Zp>P5aYiQ5AO$kso&>^k56HHn5_EDVY0Mz;Qh0c z+ZZ+dpsFB^_IW90?NcnvTUmrVICubJqV$B!3~k$x)Dx>=qhnOY&z~Ysc;r@9Za!wN zO4OyX_8se>$XQR!&xfCeq6N$?q9Iu^iI9k=zdBoX{15|Y-NeO{pI*zCQ6U|Ny*T-O zpE0=<6S_1HM-)}PVlNC#%lQFnPuN?_~Btp3NbT{8B2TFM?^i8K!>#1S7d?a35m7q|4@4G z?xZ3KjwKZH=?7(%-2gf3m|wUA*eLNt%Gd2R$e4de=4UEy%NT#tH2+*Py2#$SwcGsJ zJ(SWeE?0`}0;dGzY)LiLf#;i`Q8hYqV ze4~5h@9CPzsLNE8VBH@{&i^KQBPBoRd^7(%$-|aA*p*Qc`HH`&gkpRRI4BpDgnjQ+ zobxv+`Qnz7eb|JPFfNG5FA-K=r$&b0qhLRa{63YRQf@WZoB&FB^&?&gk)P;^inFQp zv%6%Ot`eaFs%n_zYT6@ZG>3?F2_%m*zfz3U`7lQ#?D$uH$JU<#6#qEZUa5LnMn#Bi zh+ufi>ndy5Z)GOHOO;7&QR1^QGkpw{t(b645tly>*hQ*CRZpNapPWDp_^92CjR6=L zk0q3O%bIV*M(jG|)Ha#ONSvF_t}cE&C1kAV$#hOGGvrXjIH z04V;Kv@k8gq#1%hp3x!-boXNulHK}UCK|7_zf6ZfxS@OMIVDWoizw1~{l=TThFm@Ad^xJY7+ zAYL^jJ#T?O$9*;p@??6mO6Iop?vzlJvoKHwu)dXlek0$(ulGfrynO&F#8H;Jfczby zmZ=3$hPzC-I_VIue|C7xS{7xd6PNd()4n%s5YWqH)cq1Vu;7?E&ovu~hJ3IF?WMTM zh3C`(wgO$Rfk!S>wvfEc4GFoAZRw+$yB>DT0|ItxrVothAx<-@Op;5yMPoUKZo6Aw zH*xgmi0fgt{o5F$y* z)8c@`79eaCigP`0_(3mI3Ol5XQ#RtinrNjVdk$QoW${KF#4fh0CJ@vl#kT#LPK@Q7 zIMC=ueBe0ihOc2<9mT`PI#|71Aph z-QAKuBsNz=JuzwOgGsgljxl_{p1bk|MhU)i+JYmRmd-!6WCl3=pa50yQ3HYZ#WFW< zkcyLX@K0_5K*G~CCe}97mI%mNGX}DX?|%Q(5AL>lAQwc$oob5$5iVWJRo}mN|IBBv zqX?}gnY&xU5ElW8lp%jG>03r#90zI}#`NiPAUR6W>p4oy(T%FEmtT@SC9ZAxF}g-; zu{yWF6NljAUr(5e(||4(-j^Nx#nS=eQ}!o|o6Quaa>D4=JYBw7H_z_DWP=^~J7XIl zK4dNTy4)3UP&JqR51IVr97g!=uk7$e2uH>JbY{&w6Cpc4nRfn1yyS(A(PIQt8o>oV zE14IG0DRl*3!35#Uv)2l7@~6o4HbW`lCk2fD4NpAvgD>hQlb%Lpmz0KYR+*E71>a=Hca_faOq+d2$Q#kfO{@9Vgs`1 zPP*l6qANLFWt7+#tV_0_AFLpajt};?-8paqB7sOV(~UGrYDXo5Jv%3D@9V+r{fQUv z|3oO%KYPV+mkabbbsRIn@-tH&5Rag1q23)QaM>SW9qv|H-6F+pSRt}hTqUpQc3piq z!0&nLL;ur9IGebcnp5aEI(o|&?#%K##7hnt>5Ud;pF7XQt%$ddBQYbRMRU#5nXrIpzeqSdcB)wh2383S{wP zGozREKoiuoc+DCxUw>w_BVRzVA=hdTP^dkTg>AlY{FFT69nr0oS**qV_>JWSX+(Uy z(yy?j530fMO4+vvAVT93ecOc+{)%z~_O| zDWw*3hcUXc9_gvn&Pwu5>Gl?fYhAgHNNP5v;obFXlvfWW|^lKd6Cn-5lTDu>mKHohFmTNBiKjC@E9Wb| z+qg?EmS@8mTUmq*l_3RvA@o@!^aD1Z@aS+74_yDXDHJ!s>JnjQke&aID^lallPr~! z%eqn%0vB~K+m5Yoctv)1o5Q&R^S&HM`qKRx6gbr;E(C~9tE0{Ftch0)sA$F`W-?yt^-Uz^k5911E6%;TJ5hoUAadm)kw)jo-%pL;fd5@Ml%$ASM$q|tpX#{k> z>>hH;=!;sL_c3=&Sy)CBPO~5y*_xIooqm69`(p@-eTln^CdtpEM9CjL#JPj3Qh&1J zq2|tZoMGT(onOz7D1LwB_~2YOjH`dW31dkDi6Y{SZ}BQBy*YL<0y+EB znp73Nb8bWMb{vDbOoV-Vb|#pP1)C3Xk{L6Oi#bo+?^Ov{hMWi)yQX}7O?MS6E1tcZ znzFKTla|b#tc8L04p}QQ(MK=5IhBLfYM_sQqII`Tm5Ndb>XcIHxx_Z@QM(jT0^t6< z2;8E%ck<#-6Nk!x`J^85T++Mmqmc9cdoYl8T_oB8oJMaWzWjy(ZESf0Xgo)&9Fyb_ zFYF~e&nJ835QKVSzLX3EzI|@so62_6{q}|%IpHRO25T;;nu8NMK-NxRt1M!5+&KZy z(&Rcdyc$>0Iyuu0XuhQZebw&_B>wt54&i*!rAT#EA!%r*ji&C*Z~I|&IA$@h`Df_?9!19g_oc7CAu1_atEK1%n zq%|n(pX07s+!aQQEJ${7-Y_7aV;(h2R}rB&sSv8!7MBxL$|&2$R+s)>Rc!Bk4z#$9 z3QQMEpO;b$P1xzV3-2SGq0g-T8#8wu14SMd?>Hm zwn{j>5%Hx&k!FYG_IKww?QYQdk=F-u-MzerP84G;K>r~iI%{g(2KQgL=+*A(Es}X9 zOtn@4U`ww6r>cf1UDo>p-ViKWaM@Q8 zp9j2m#Ed1A1udk$b;+CWK*EMN-|w@~2dFJl2434r7FP`YBr)aCt#-~yp6&UsMlJfw zKV6florJkR;h*tZlbLrt46n7A*E`Yil{Y_D>*!xfv0i6tYGI6JweX@YlC&r2!aRy6 zlAN1Tbd>qpI%}Wy+$H(OB%6=1rKXtp4z2bLN__AjFGbpLumM6okq4{2iKa5R9hw_#@R$lagW06R_pdnu&|T%H~EE$Qg+%oWz0@nJ+Atw3bq9 zY@L}uER%l*J3rDQ9Vwqe?iP?#3?yCTfchB4)pJT3Z`xFa-$LdM>62H!Pt2aW;*83? zZU5JEdH*I{aTxoWY4j(I<;U5MV6gtzVKDcY?$W7cvY!4O22%&n2Nu_d79oK$89#@D!{MazIfAniu&WG1 zN(>%{CF%4zYgQjx8obPp7I*xY1rZMYm&1+V8Ua*(kp2tIf*jI?MK^8 z6(8fzw82d->ap}yH9Q&ve7}4s7r+DjnloA=itxp0GeiTxdyLmIXf?6XIolCxYRbcj zS~Z<)MrNVk>{Q7Iw$elb{}yvOU!DLp4T)}VVm3qYn+3q}(h9mXU(}ob!a9_GV0t1+ z$`;f&T_;03p7PvoFo*-WuMR*!weQ7ltccBLC3Gz-WCOZg(!Rd&q&sd;F6XO;Pgk4= z9jTdlRMKI-GyPoInwG_Sz&Y1lB z?Y?W+4;UQaycT-Z`mixx7vFKgv@OTgNI#18orLZWjg=~xiE7T6Wegu-CW%y;XwD1C z)bQ(`+zvEmZrUq6@16il)7-bAr2($U=~th>Z&AOR%{V0Qh;7SqOpgU-uv`+;4@|K6 z*zMDro?CX_Ttd;gS8%c6Rl==Hs4sszd1=c%KOH4SeX4?J-^--RkXV@zypBj+9hgQ) zVn2owR;sC}cRz&QFDg!9^Og9gEH^x5=PaKkrO{aO>Uu4Q3r*#jcAP=pd0 zm4C`KzfGI)QKVw6z5Ykhx%e~vzJL6^&E|Zb)0p!)XLCL@hnbw(gd9sqOU@BF)SQ{K zP$bP98bwHwq9Nzhra7dXRdXnZB2?ecuiu|=J?{IyUeD*_ao_i4GX#O)Rg#(nXmle~ zWcxk3RG{CFq#a10UNpJ()SY*BDADe8{^jfO-2zVyF@oFIYaBRY1IQY^)>1(iH}bpbzTaaLV%0R zd$fBL#>Y8^7ZTTf5}2VOqwYvI$=RmMjpbq*>=iL*HGzipb$>PKl;I`xBLY{^N4(0= zC3e-z`Q2Z@)C*}sKR_L=@7wZ31gWWIEu-1XH6c=KTGr)Bs1Gnfy?d-&$>pKhL#y>i zu-Ps-T7m)4sD|dlA{$ozf0X^K?BgVA3sO&;4L2dpAk|FrEtYt_pm-@0t^#9$DKJ~I zkcX+=fVp764&xf64qp4fi7vsJkiT~>LG`{6G3=*i-B_A+mq2eS&g?ziR9(-%22k#v zz}%2he8?5~^&VU`3MEYrDi6Q$E-|W~HnD^Jqh1(eu~rr<`MwlT;bok{660SkK*|3l zvSyFJ?tSn=p-5a2KX@M9A?S-$MA0?m=4dvMx{(7-HX4ssHrKxvsJ|tTdp&FlSUb~w zIT7E%bOzhgeKfmM?26s=g_rzBL$$i=H)1tjo4rsNHX6opFI6ipe>Mg#0WVeWpA5-A zVAV<&09r%TYVMGL)NmJYcHA^x`P}_|cy(s(ie)^1_-hPymRc&Xzf|Mv8soR~J+CAd z*kX2P<{4!uh@B{XAxmm~bqThbG&{z=bXosi(CTuRQFv}olxcMi_sVBuftkK*t{vE& zaIWg}TuW+Dga;qlFh%|BKa*zaa(yr2_42Nje-26tV|-=<`tC|`Tx+xA{)xAqcCv{< z-hZ9=7i27II@Yh|>45nV#lQ6$Gw{J)*>?0$^qex9eYfscQIv%*?~Eop?z1MZQ`Z+* zWbfm_M3xsX-<$UZ3%4y^UV#DML;uJO7atN5x#Oxz#QXnl5}S@K&95FepYwCf`oUH;Id zTN8tY1NRmfXh(JBWnnMKuIZzpGf}AT?vf1V&dT}^%_@+u6Al{3d;|Zy54#iA5Xj?; zPF3f^5qZi)FH?+xOX(L0OZz zyWAPvz>ehykkvY`&Vtj7jE>EV?ZT%vGeOh_gnvH6g7Noj>c>qz`tI*hsn-{4|27Mp zN-OWQ8AZgrd#j@XjvSS4*5IVOM!kE)3!V+Dxx$LC6)ZW0J9(nCsc=jcm-EQefCg4r zTjuc(O?8?Fjot0NOFHrC>;)M<(?RQUFe*P+Txd-Ny_jIteexau#89`1!NVqzu?K~R zZ~yVkwfGvXVAcv6wVDs7m+~<07rd70D9;dGS2!yeGQ;H;&Ae#fK&j;NyMf~u^;O52*zK1b-t8P3rWl5C9Nt&G5y$c^} zybi0Ro+Bt9T!626_$M_iS`S0X9I}1*-08>lP-b<8cP>N3(&0T8%*ahYD~fg|e=EZm zo(_@q&1bt4kump~eK!1;X7DRbgp!Tp=aC_Se0#-C%AiE%g!Wlt8 ztG~00(jXdJx<)c!j*9QGDn8(?t4u~-%CGU&FDK95w|vM$l-QN8UG`uAHqvXkHr%1b z=Wh@(*G9T^Xz;`sLr!wHZ(d$FyjC`h4H>I?)=Tdl=(~o zRa_H=$*8B2q==!^fp;^9&x8L2#Kb6`$jh(tGCc@raSXvyEW6873UhEqmfp2l)j|O_ zO!vGE9}0KEh!?bIkz@22jEYP!5*hv!NBbUwIys)6pRQs1rS|G}9WZF81jvi1o`n)c z(%+VHWA16*C-*F?>zsNYq*fl zzdY9UkfZ*k@Ulbob-8+Rv<17LO@DX_;I0wlJakGDE^o7mq;o--SO{IvC>lC@CDq|N zc=qo4NU*ucyM6`=1r!cVL`L|!q_^+lKXj|kBxnU70EPD$qJ zdP>s0UTBL7IDM3{G6~#<6Wp$&^3Zaz_)_oN`MKzek8roQsGj95WA=D(c3#mNVPaTj z_z@6au{rxAzulo2*La`1;oYG1#r8amJq@d9QR8w$H8UiD!bRo9}b`oE*V$@p)_6n#B{U z;A$DvTu=ZBpUw+-9b9s4eGgI4sI8IkGI~gUP`0D_PA@tWVDph5Sf^G!aVgn#(h9hW zJENv2(BGqGl6(C>>uHHUxj6x^M$~>i`@+WY#Oi8vt+-E+7a}Yn3)0JVNXDW9BvXAg zw@<-Zlx=OUQ?ud4>Gu99dz&@)4yfs%%G2cLOqOe++xZ{i>I=DNR|mT^zSA&YXQ?4b z;5njKN&ezg9=7;eSc!UjutQVy1ZU=M1DVO>Oi>Qx0JA7uSf z1s2pLu)6fo7hX;y{qMB=>}#17ib$aOQv!HmD$|+4qiXwASqsB4ZS?Q15xYzwTT{Cs8yUr=Z%UxKSGpLKUW*WSTw#-XTPKcoZ%yAcXv{`fc#tT;0SP7+7Im>&JH)-ACRuPKzWrII8N3Yd&X zIKyOkP}cNVk)IJz{oX=WmGvfB5MnTVc9-W^r))t1z%r^rWC3R8y%o@Z{~i zSDE<>SLjLl#PMZcCqCV=-S5`yA05DZ(|Bp`XqBv>Ruk~&hJcEdeSkgQ{diH z%&m)rCsMTKuO{^21MOJj_zlNqAhQ+kCmJ${eg2$UBEIzc-ESJ_`Vq)*R_;X*Q8fCs zCMV9fMtI;0fQp*lcU3^Ki^bZ!ZJ>^ziJUH`2i9SR>SNX+$uZv9@*AMiGqr7bxyea9i14(eRiI&RLy`09Jn&k^2dEHqz+Soh z4}yj?Vle5j9Y*AtQXkS6BaG6?Er{C*$bU8_Jgne%Slilb)7_b=_tsclppr%)8c`F~ zOMUs=Mf?))fMQZwj>l?4mo#60cTwtmubW*>5GPR<>g_Hj;;|SAcghE`g40~qtdhg< z+X27?GG^<@8G-5-pNN5Wg{DSlfjg42Ad6Z_YJ7c$qH{NHYVl8eC6h9#-Qrwb+1-8#WZ5x6|R0YbO(RE>3<2IVcBX0yg3n(!GGV6A9d)Px`OiifaDTMzl|tW_0T^^7eqhg`_;&Q?t{;#Q$8_y98J@U~AMOn0L}< zAhhTy&(kQh0uSz@QVC*Rhc_-BCvrAX_BF4-2e$?dKAt@$GIhgGOns4$;6jIY) zmQry@z~`xptA2lRt;j~HFl`hjhyj@+i&O>IM`KG91w=mAd>EqkvKc(H)Bjm~HiB4k|7S`mjEW-vaeG}Szlor> zw2UkbLR7ctXE?Lv{}a7BB_X0~#ofcO)JOHpEM2~etX?;^HL**!Je}eo9iHrE!;Oak=Ls`=c?iBzd`J?y+TYYV!#_g zAO2!a=0}{0#&^j;Q;~@V@|p7+S6k&C8u#7~Ex_pcpiXELdyyd?Y;BhPAiW2mx?Tpz zPK2{b1%2>^RS6F}3v}o*b%hrG)@SoAhE%_D6(w_|TytkDQjb+;APrEMV*Z9@Mq76B z_?FvE+V2oam_z@4*YXQNREb~_{jlEaNn`bEW z@Dpor?#O=F{8(Yj%R$hftB0!C+lyI-%cpJt@895mwE=u@O)Hnn_E8N{fM`4YlqEV* zYa=k-Ua0hmFsay7}jb4R%8VcfKSl0_=z!1oPDj5hi=!R?|hGb zF3@e7m-bhaH@@?Ydj5&MVi~c)Tt={EyPkFKYgV38J9DP^d6$HAUf4R-T9c?b`#_MU zG*9qE(ZsJXm0`|_ju6i&H=ryJC#XWy9I{`^@~)^IPXTN+>2GmFM!9K~V2Wm!y^`IJ zR$G~Gq7=S6SE#kxF{2KzpY9;5h_#;7t5D(uoBBCklZW)`a>BL`$BttGNPOReoukXN z=Hd{?OWaF|N^vfoS)tfM+q6e9r3H-vsMJCiR*kzg^P|u_!^Xs2b@X58<;YhRIi6?E zuFu1_Mu#+lhOj|eq~<)tt5MLai&8XkpO|g|noeRzn>hOS>1f%oeOr7)EO9N#0%en( zDM6VIfXlKQUm*q;qT{M!yf_T|qRl0^b&%)3)C^Q5eyC0&-op7Y-!zK# z5C%`|X7me}tvSiM&uV;Do}bH|@U4uvjFEqXXGXYuWaCZmRH- z=Xz4}EUfX#jV78d;AJMYR6NX0{bR~W5PS!iwlCQ-q)AOi!4^=~%y{VwpKJdt_y=Q%8XJ-2C{oH(4-&dK-ecLX7UBlto0*+GWD? z##?bV%6kHGCoJ`*Yz8y31F};GSzVmq^%rXK373i7TyEX!L|n$FO$x`;f?}N>arGY_ z?9_S_axZLTNW{N0$Hg`30;1ai!)NZ6op#87$M`%y5b+?fH1FY!#ydmVZi+X~K&0gP zoBVTakAS9+>xxLM3Hg9us*F`BmoNwQui~8BPHDMIska0|uA-Cy*|C**R8m&%9}`xq zz`ZXuoG|;-c_pC&*vz_QK;3j*N91eQcBUVJU?GBRO8YZKND?Nh4vRfGZUjR890!w= z0gX5KRbVYF#UTr@^`_k6AkIE>^^f5etGG%Jm75!}fz*$gd+x85p+nX0XQ21aZtVQ{yaJNn z63`U6cY9M&BowY_8@u>3rMgv>cq^^tXj(~Wvxvu8v_@ozn#1NN z1B={s=8N38bI(N9TakRg{YOQE7+T<--soVSkB7xR^E%89T z^zrVnfG9k-q3H>9v3ZAA>JWD?RK46LU4gk9BXdR*PRxs;x7tK`Yh4qISp#0Ghh+RVaG)U#Z_JF0{3sBc$n^|3BP}Lt-kNo}fA=bM2Y0<5C15vXCOOOsHRo|s4}*#Z380Q>Kx6u0DAoFk8F{jWPGzm$f z$tYlRl9D1i0%{%bp26*&(`^?d4<3&=r<>lXx$Fw3ps(}(;~|A!W{=Gv8X~O`!bbbO zCT^#gq|b-E`4CdH0Rw3~Lw}&qj}vzj8{?bAi7M!x{o*o?&mGpq$0JjG&G9NwW+k3} z!|5XVI3^}Ff9MG?y$jliW|SrXu}sr;UA}K^mkEr;X$; zBzGu@nMRUK^YCUki2JhN_&t;ZSQqqmSH6IrTp>{w9Ni3g+{p$ zinV(_PC}()LVU1W?&o=BM<7?;-xQVj{S}-0 zt;qQTvGEt_G4gT_^_beD8KP#x7e3Mt_mfId-L4}(tvv4_)jll1D-6-l!(bMcXiiM) zarb|w^&*3UMODD_6TB6MjZw>i+|-z(naQ@{zfe@rn4P>RWruN{&s58L{)o^lU8!Qr zs{zvLO#^1zy!LqfoCl(csZT`q3hbJj1ugh^pI{`pKs+7TCfoQVZ-_11%`)lUIA5wXDNdp^Pokav^S-|e_P zwjCXt3pLcX&lY2^Pk0e{g`JmbDx{ds>8?lA0_hDc+f$j;RB_ocxL|}lIX)}>U}?bE z?}2K3v^3GBlX^prIVO!!sR2hL$M3YTMWU>~rvUDnG0HCd214@OXM$ugF^;JJdbJ)b zYsMq0^RF(Y#Pcj9-Q;@vULeeUQ%8h<6pEXHeSUFX=C=rhn)7Z;5 zdV%6EghV!nn^_QXOs1-D-ke%-jv!(Iy7b8IABFOKCz@Tz`fboYw-VsR8_B2y0^LyMDLAc5E7 zA3}&8!w`64TXNqxxQt=*#gLV1NiiX-!&r(beBzY-0@WfwR-Y9lYdNt>_`z?c2a^f^r_ZA4%;I6Ko! z{=SCaAkDGY?OagIbQBDYO{&gsTD@S*1ilH&WpGx?GWu2=fL;f`MI|G2U2{v#^3*gT z*Rttr_S(?MDEm@@L{Ypk5*b9bEBVYoZu&#G?-T4i*hpcaI#{~!GUVtn&^*t zct_64D+QnS>Hb$bwvcQuul%leI8`Wnj{1K8BNltlW)5j`3fCvj0OzMwRNkov-cS-BRFcRhN7C$=Ow}}BMh$!MEPY?O9K>_Vlo&*D7m7 zDB_Y_CcwKw$@g05CSN~AoYU@ncYmBea=~ThWmm$voOc1b;VHk&2?b&~#VNp3BkP$# zYLf)w#9vX4fpeav1(~Xh@7}<0Ono5S`$GNZ_6R76mvKR4BQ#yPt0uIoK!#?2)$iIL z$N5v!?RXi{%6{y{=c-u}8*)9j@jH5Y@@LtMcTe&D9LfMq_e_Cmeb(&5saL8aCa~AL zR9{(kE7%$aQ`_JZ8=OVsr?Bhs!?*R?-~4vnDETG=9L(Qr(nE_Wg}8Hn!-3qIveaLt z0lW$UbSX)u7GHBaCWEWC{$RvXf?V&5Z8UzvtrUP4pow$G7{Hy|Y+opV8hq9Xc0w}G zqwuBT&C9j*orEHu{9*-#c|w0$W!Fat#5XIS)U(fntMiXD0({N{tz>Xj)C8swh=b3v z*UPgX79P)04)ol-p|~Lq34ZA8dfj;CrNPy`L!p9!|IJEnUc5d9_Nk-z9HFio1i=~%0~pT zV#t14SoRI4rc7#QZv`0j>o+(wHEZ$J*^8y>Ab~%leD)JbppprEHI6wZRDrFv+l~a@ z1@j^<=LJ6p`(DRFjI?evhK*elo$Iqby-Nr4A>^$;A5qJsH&kprkRVvE?og+giZ;)? ztmCg91){*0P8#kR%HGp$>)cB6WP!Nb`Az>^2q^K8zO1fQ%pLfwa+(0PFT(v1Z^C+#s z9i*u4cV3qt{nyBhsQU@_VT3-tJMzv;<#N|?vY^(O_0%2J(yXzoMb_zghb$6kPh@f6 zUECknOA_;cd~P!z!P%JufXQW?lEzic8E1NzfZMF=?dNT{8_IfLYK-~hbLh^}|4z1` zbqC@jiJ_RpvIz3sxS>^*o9Xhh1~jZMhK`bCnu&0Vn4TKcPZqdPFlI-#_Mk2jfC~K( zJ!#tJJvb{?ZoDk5lanE5ewOqpol1d*kmCx2*%odGnjySxF`&;NQ^8-aKYyaCN_)U% z4>Wmqwqk9c=Q9Gti072EPfC(go)j>4jpe*6+{Xb6O>03>RcHRjP9m$u zcDnI8x*U4wG5yc=vU%IfuNJ4L^?w9rFUMR8+CqSr0(1D@fvMY%Zoz#$NS?DiV#97p zTNAqE2P^u&;+CAxZ~V}^mD3W0Hw944m-gogf`!rZGZSiEM0Q%a#zz1+!Hr53Mf+Vs zju)-+dflGDYxN|S6o}m{Rz11l$mwsY!+^n>hA@e<)NFy+u6Ge2or4LRx>G~PmaKoR z{!2w47!prw#L@_%&P5q@q=cUH@bGbkKTRWyk#Z=ig0<#mY zLmnBuKV=$>V^lqQZ(NdM7>xr zAU4X#U@q_0ClI27q8fqvdk=0uwbZL5Sw?#h$>%F1(`miG&v0uu-X3*8mDMg59(Yf!`ED0=-aVa1+miV$M zLNJR9Qq_T7y~S8cRIj}uP78J{ML=7J9WFWe)QBg;1G5ari(Y_bhXg99AUnx*Rb=9& z`PZU6Op*5{1VPI|EV66F9O<7fw0}7h(UU>UH@^t_vyhP2ux^gf3d%fo#21NhO=88| zska5^zO(Ig=pxMF$k)HNcm$zgZ@Wn+R_Eizr=3kj?e2bKl#Kz9Qu|iP{Qnf$J;Su! zOs<@gq8$`oCfDZEJK6oB1g703hQAjMT#0lst<1Z-d>jx{@OV601RIDf^3e-9F(dIq zmbfcQNJdqX9t;8+@mY{xp25^^_(X}qRU76TPXGJ5W2;cyB+qAQuGX1TSrvzkkG}lM z@;5UL$rxX9n3ee|T&tP1_MlMfrNIy^Mp!6Z5~72=*&J>?R2znmlh{yYUy|5Rgv<<~ zu{p+)1#1e9TCTZ_B+HVGS_`k=PWVP6!JT4@pTbvZ*%HJ$X+0P^pJ=s4;0^iSrWxZ3V`+!gkl=o~N z8|!k$N-e0{Tj8NGYFbqH2gK=SYoj=togJxs!Ayjdc!`vIB;xdFq_RZmO~BF#FYJz% zV8{S=fEP5Ejqg@6ZGMo33w5wd4FL|+QIFKrm#Km9Bny5T+J`B}Syo;fq6G9WiYxH( zj;{fUPxwOU@qwtf!m@OpDK1-04V<-VNJOIoc31Ev;&K12$kf(%v zt!c2QMlk9ZQfGzib=jt%6fG>k>^v^luu2CXs#^0;CCTby0@S+0Q-WDFJ%%G^uN7(x z*X|fg<-J%+=@R{(SLTfWT`blb z81vp>{RmC~IDb8ulU4e+;r>3UEW(`$wYIq!rLd)DJ)H#i5zaqaQxhG%v&xA!vPqK% z9K3r}CE_1|T$hiOS&!JBwpqdS+|W73cB<&KCUFIyv#8;<`FCdrFp+{u`6TN|dC_cv z+``OGtG5W`hcob3Qy{-U2+%&SU5)(QW;bR|rL>TjyMNtX4w8J`bAJL9tAjp95KD$w zME3680{-lYqk0nBP6K`j!~-Cy7~AZ(J9KrmJrPQ{CS7VcB1H{@_bm^18E6v(o;Md^ zufZ?pJ6#2>J+m5K1vz}Ec?tyyZNfsXwtV}>g`u>St~`PL zl^RdAZaK6xj4%wjB}(WYP6CV;?iW5d3*PB{{7^6W5=3@~Rt1DFQdEs61ZiX9M~T2A z9n9C%;-1eILp1m8cSC($($|V8$>5FwsSH-l^=U$nWylng)_00sA?o}m>EA2Y%8JJC zO2ucBz{Y0ehnztFqj@zJ(??2&`2)DK8_d4u+eKiLbk@PX^_qXguukrXfD`Fnw+(0p zk(`fCV@$sP>TfJ7a%ij#a?;B7-C|U-0Yg5BJ0k|%Arla3rAAW-WknqGsogyW z7T6FEax0Ag`|G(?_%1+FxheC5FH`8ZJGk|%{H8h~Yj57|&3L}l&fv=t#7TEHiB&mH zzz7+G3Vf!IwiNE5BmG+&U4of9b{HkqHwfNoY`R6X&Y|e?VZE$ff?G#bYW4qIuU7q) za?8v&HH5WBCJCO2oRJ5T*x_DW{#0<|IH<07FlFbX36LHUOS8Q!(UcLGhv(yrHp0g3 z=t4I_vz5(i>Ay|yrmQcfneW$Yp(T6a1`i$soY$#sYzD&Q%TsuhsaI9$<04iar>~*g z`0T!F(7#A!2c^N*F!KLDTQt{$+Gg3b#z+6-%u5h+#c6UOc8O^pqXhcwG89#viK#)< zJPxQKjQ-zQ^T+n+L?pee1ejl#1m5S%#>`sJ;CAKoJFp}V&l>e(!b@bgmQC?@YQwsP zL!ZT~QX|!}w8PLKS(}VS1Y{rOV}s>h90b(u?^$;dQ~}ltY-z{t_iQAm{|z z@n`W1mh^f_-tkCrohiwEJt$K{6xm@l&JB@@cZ6IEzecF%LB?7u3cG1@G`G^*zFy{G z5(`|~8Em57@38w_gt-7mK)Ao;Ucf-lT5QnNY2XV#-_j=~JO;X_k?YGDF9Ghb%{{L>+`mw#D^)-(XXPNKLjb3Ma;bg*0nsxl8i^OUNx95W0`yO1X zS_M{)VSwErC^Vk@uv+H!6dU%iW?`E^Jl*rizAE)sV1-1J3g($calWOu7Pd3f)M@Zx zl$bf^i-ql!_feg8EYk7dqhEh3B$V)s!ppLb8Zg$8=8N86w=XmZR%+Sln}YMEJ_&2S zayxz?FFE)GXD*}moQk=~w7ahTL^H2p`Nt{1K$;Z{)+YYp&%{uQJ*d$Ru2X^6lz9fAC*=kI3vKSY5oNeZpp<=G52OT-7!jLYW~jkrO1ZP>vR z5L9Ad3J0(_iEDkxC8A>;2P5mcuyzDG=1&b%jejLWC9Y30tPy&F3cB3)1Zt$cx^)8W zbeZZ8og{$Wzll@a4}R2eMqER;wyW*+fjX&mJRimwR*;Sph>oAjjcCfF~E ze!g9E5kUkEnK}$%d)@p9BHYb?k95Ol9v@CCsXaVv$(-Q(u6f6c$FT#=f3MT3Mz4bb zYDS^;O96xe^E8A$DsB)3oxQXd4qG^`$2nZ>b&DeiaOYp7aLJe6E8N?t8L|$#OyapI z4Ki$Vl+7|SqxC3&$zx{7$lzjL;w_%1XXVc*xVfiQA{5xq6IHLi=C@VSqz~=_ptrxs zKOiQ&8M#HI!qNn4hk&2HRUZ3`k3d%luFMixchT;j)t>QkfT%Xw8Z^o8_N*L*e*lqI zO`qc~Zh3M{CFMdSd8GiDgsj+E)S|7*x^a2Nm|ihEzfx3DBS+35p_#K=-s+47?xY2C z99A)UE?t>_Y)S9@hI`Co`M}&HYB`c32Bscn!h&xq$uEBZ0nau5!T6DRX@1%l30ZyJ zkg$|FR*gp(AZ0Mp&5u@6K`O8IE5cLLcB_pZp!crhrHMkn;>6hO+pynULGfH}^(a#c z9WTT;UeNw8T`vgN*=yR)^9VTRm1y9?EY?^6{pUY@T#sI4TRd|0BoFx3t&wdEaObCT ze`Xl$0)yXTlGgzsj@$NaM)XIPB4?rxxjn)qYDquljdG16@olo&CS&XOC-%D!0bdVF zv@_1X{H!D(ng4xgW-d$C$nkY9I>m#K=mNh`8|dWgL>e)E1AG&c>t}N=l`V#Il;2Q8PKqnjIAKk4wgWdUp?9drLdq5{2oKz3zo)oL;3w`k zjC^3fyQwH4qtBkrw7K$#G5yc?;*z(q%R^2bc_|Kyi`jvZSGNiZmtBAPur#!#h?jE! zA(KiEKC*Pmv75E@{Uja((}nOn?~4`}3(SAwP9&C&1G4uOh}F972f&>xq(?A_MpS|k zizlOht;bw`a%okVzjMWNL+?jL;P*T zQk9_hQeN~O^741;3$-S5uC`b$$o9aEc+R)ESneWSelk^;lqe8VK<%=>N_<eG2eaD`H<^=6Kkz2=nE)Ru*=rA`a3~4R~u_aXS6;*OeBr7D5Mmo@B%tR*qUHZa<^B`+%zAY%@NB;B?l=Y(L?4Ps`EtMVKn^hle33 zf)=}%Q0-tf{={Xer0bWMg0YD=s46n)Z9Nh#&8xS?rt=rc23J2LxXfsJz=%e*@ED;4lwwsHZm3#UMz%$~rO zkIt(0MM) zYVqs#5+;-SOgtZjiE>54|8rGtLR>6bkVFXl60=VG7Rw8LF~Z=4Ff|39K0}`>2K<`O z1vxogfSBhOuKLA)OAC(YswO5%P=W)PG&uC8I4Is<&eB8J|3Z1o@wAf3W|a_BqDB*e z8awn+lz296^EYE;NK_;l3+X*P44PK@#Ia2?+b!x=Jvp5bWG*j*K4}(o9!A`4fPKH` z%a9X>i*n#LEd@y-Uh;TFw9Sba12c5&6=cJzsWBf`f}*%ZAib$$$vve=Z^Z$gSBT~6 z#djGmE+6WgOFg?{9S`Q72%?0Wqf*o4?^06l=N0Xp*me(c;=_n&GB(x$k$bU2KK$;Y z^4vD1j(IL#xb9qfQjK zihKo~7K5s85gp3dS*KnS#xMZ9)B4NJK!0iio|T!_ zjuiBN-zKr!cm5Vth($l;q4R>5vTI!Q+WL}(dXsO;TBh?p@d!F4!!$%2VN`3NmH&Gj zf8#nY@w>X;ttgbrSh0bcGIPneG+!17UEv8cxKaM>?@W4!R7sPpv}H9+VPypg=YDPI@B-A8KYuF-tvXldR#h;*l6rn4Qe?#TTl-cQ_2dm* z#S2#E@(V0tVw=%iM5ZYlB>Uz$h<4sB&`+Tnts!a$8)jBP3{odgSG7@$V(YqCHz4r= zlo6nkRFoRzX0Ga$JT7}& z_|?}_Hf~_@wwY9XK})Lf?scb^eZW6|YHME3|OaH1VrhgSBxbD8zl z2hm!3w|3Jj^*3_I1&a2uxi@=vidTEc(5tpR^#c_W9OOP8B8zt4g#2{fB*zQdMxk>j zK^|(a1~tZ0!hLEhp+(GdDyQNDJS_e+XI2`BoTc@=a*J+~WB0O%yv#%XWyeJ*g%c~H zJ32MSuw*q6L2RS&-)NxfiQV@T0LlXwsx z#gapS9P9hKFDl;g1Y4z8-z&pz>g3-$Br~5H#pJpeyJN3_I5(l~U5ICBOD(*r>SFRq zNyx<5WF*~6G->=WBm7?mohS;7CB~PzltiZK5H-sqBX*M>A?M_68bVM*9L~G{+G4@R zXlD%XpJl8IfTZ*rk!tC*_BIq46sXOuwWX;35+biBV>Xci* z#_FR0vrznle!ypeNxM+b_0+(6{u7Y;WFsC_car{@=TmMWR}`L4f%q+8Eg;j|fr0cv zoyp`IFP;;a|IVRK&3_$r5Xq=Op7|`6oh2EbseW)SrDnYIla{m`L?ip`8G0#!k4a@3LghtJFZ9W}3 zXtxA!V={LRMk`03b_Zrpv2-{Kvti=DUD(r;<^-IDYX3G+JKR(*cYXY;=*xa9Qs`|# z?coS1m$?r(^sYic9;N6)&zD!A9sAXkmB3zVugQi)4$P;9DNbYJIF*h+Uriz%rI6q1{{YZV)9RssgO-W+D1cON}VS00m`kzt1(bQXM{Q^zuT{ z4bYpH|2@@C_W(SdSP1p+8{9ZB)(+h9%zA^s{DhbvNrUx>UlJc-SVCg#Av%4YDr&Q9 z|8p0TUp+v@(GgxbT9S}1~4&6UKk<}Pnhna#U^(Lwf99N`)!1csbw4@Uu%;xsU6}+74l|k?IF1@ z4SvyD*rGjH2tCnEuv=UD*Y7h7HFfD`wn!c8DL+u>T{7-`=|?FwFlchYKIOVOZ^lxK z1}Zy8=m|JVu_a^5Yxgh{T6uJ`qHV~a_gh>Fl6-powR;<}3Skqn}qLHYi5OdcZz`#qrGs?u$mijQScsxWzVpZ0u zKgCnbRmXrI9pw`vFHP=1R(iu_AEy;Cc9q45AZ6-hfXJ^U2^P4R6O9Gd`l^k`5Q8qT zk?lX>T;Z1iv`{Tcnb6GUWkR-#$WO@;+iC@_?s}?s@6@k&ee4?1yK;q>Sgnqtf@m*| z1pL`b?aZDSUj{yGPa(|#zDi1nCE)raLYEW9f*0smoxV^8Rd38X5CRf+1F-PRj|Nal z+%f~~ub5JyN4En)@>k`#*kc7LCfkR!TcJ5Xd9PJ8^RX$+H;R7&e;FZ#YLT{EdKVT$-{MkKyeP{Li)B3jgS7UyIpHL`@chWc zdbbe5KNX<3lcXDCjWUFk|8}izuW@2lr}#Z2C`yR4<2iVxiYcnp6Q#Mg8^~#~OtNH? z16iQF$S21y6kwj()GM3^w0KqE#oHE`LE+{}mgKUx(tpJf?CjuP=I9iEaRL7zTz252 z^i|8nfrq~yIJryR6eWk7cL}=;bxOcS7xp1FP!r<^cc5)#2cxwwG5NP+IqHhb1*?7PTYqK;6@EQo#A=qd2j&`wnCcSs&N}h{ z9o(U(0r7X+PFJH0zMpm+@qlk|h?Mla-QyXk2dQMK(sfR%|gj6&kE!jj`Ei6Q5JZ2<`xpqo0dUn@Ahem1Ed> z1cEn@g*iaG@EeJom)r-03}2>@uDZffG_C%6PkdtNis!o3XMBlXj7Gj${GFis?b-Q` za25jVx4WeMJH%i+dnOKoyCYB6tW7*ak*PXMYO~nDDEk``J zdRc&sY9eIleO^Fz@2e3Kmw}37VcMIeKS9CQ20!*vDa*>;`Kv^!DEi-pRbOtkz>GgNea6iAgQi6OxJkG}uZo)1Bmb z3YfX*V)4XMATZXm^(ld35v$Il^HqumB`Is0m`S_AL9XK0`)(~Y9!C|H+LLjAdK7JG z>3SwCnfSx<1=|GOtU5DmF*m`Nz3fzqk0&;wT%})xZYJCjntt+boTAPNdWrFgffE7M zcDBz5DkTMe-gatOL792_cDvS{g8IF~OhB1Qh;nm(gMX$MDGU`0E94QeuKi!DJfDQa zKHh?=5Yp`;0du#mIZ<+x=@vf+thnq7-M&lm1CP?tI?h0tB7fP}aMV*)EGLfO{92atB1;2|Rgsz7%Q06>0 zb*P(chSS0*P_FXnpABR5@g4lLb1FwmK`^QGt2Hb8D;!Rvb-oH?tS-R@oHz;<$f_!;x z^kDETi(X`5^~zHxgB@;eyHk09iX`Ky5YdZ-Ekkz_S6#2!JV4bxEk3G7qMFMn{PN5R z$yrO<*@9bJ^+PWS^=s0ND+0W^E0XTSyi~vFv*Du{|Je-^u(~R@u15I&j7L{?ssAtV z_JcPNt}B2*E>os(h^ zy(J1#kNLw_BTkj+vZwj@qRwyL@+C@j@h%b`diCFB@JdOlagyro`LEh>fnge`-FCM1 z6M6ZM1sD)Sa9!%!i?|X}%OA*t%KFYTz;%tuW=Y^}^Caj6^lFAyh=OOc#)MJOUzbY% zcbP=u+Fi=If*-E!597Irm;6SzO^h%W0zBchNHV=r1gSAaxO_d4Qch zJLxPTg|&+|76QkjHd7gi1&eV=OI2r7*+uxITWIrQV}Hw+_v==aweA% z!3z$GcX=7;Q+wMO?(V~a?0@dWhs{rRX{!0!pyWo^Um4P{v z6~cJto})D&$fua|!=rd0O0Xf>h5(AwlQ#2;zVz>;M48b|lscMtiq@TZzH(q8;a56g zJZM8?Q2Nv$Bh%QB{CEJ{=|#v96X#$kEI-;?JbiK`G)c>`YFcf3I5(Gf1R^<#JSFz& zfvtaT{X-rViXuvQ`0);nBhC^dDS}E} z0n~d`E$k=krVpWfOL|F&wUSWyQWUoFm&6)A&dah9nWAP3``U?x!~pu?aXUvm6&sn- zO(A(({dXWgWdny-!|4ATQPNZTxdhR`m-Ex@tmnZo1aBJ4)|Qip&k$4BF71rv280 zcs|*L)jYKaFds)LTtF#9JVr4zIPTsxyW8PI)dLTHmlUP#;d@D<{;u6^p$FV~buK_2`8hg7dBj=+Yn3p1-$Rl0gZuXo3Q zG6@$ph)U{qFhV7;WiZ%jp!+f*m)&fCO$e|ESabaJJLtlOknrU;9ORhZDy2_SsFW4A zt0~h%UWeIrzcy6#vxEvC1tUhK(8S8DOr&hTmvR8xRa77X>9Y^MLQ6XlbMod*2v?+l zfWz*h_#D8&w8I6K?eRgsHVGIX$G7tdwYs^_JLhVot2}3Ep_7a@GA$FUP`2$_4MBsy zf|J(&%Bq>=7gQ3IL^mJbfKJrGA^Y#@nKr=+w%zKGboIFW^tT_e4;MB8gBWjH453#6 zmAz-tx$3C-HAH{%K4Kz+AkSNVU7p0(@`Z<-_zdCcu9i*xR2(1=-jIxFP5)hPHo$46 z=GbK+G38b7xu-I6^4aO0#1mLv%`V$vZU!4PP*dw;%7dz{j>Z7RvBD$Qn8zobx^hxN zqbE-rsU5SaO;B;leaXpqTheC0|NO%a81%Mgbe47cWdS-IA8aLbOZ{!7!Zi!`o2Wc4 zd>1F`ezytZjqzR1$o$&q3+DXK7H_x3zzpn@dEIt@3V~<6Upqj?J!Jn&8EactWN^{y zVFvnl1xWNGHUp{upo1rf`i(326$Unwt!y*g*>CuQmil68Nfo&AVT$fF84e`AQ87>k zS7H8`f#PqYhy6_c#RvRbV)=?u(I}ljDhC%)MV;*)eXza37`0!m%J(ZYQQ+lw-ZS39 zV2cCsu2~ZWjR;eiJZ`B&DwCj(iAYW4X?(&JvJj^s(~giC#kY7f%R5-n&NnMw<`Ytf z1Ic}ptorV1Vw0Nq*65-8iN@SfBlZau!0a9aVBbc`ZWPb`rQ{k9K=<@;os6#hYCuv)> zufD2$r|tsa>59lY{44PbPDQ0B=qLZK?d`@5ns6w&@R%yF^`sQqe`_hX zhxgbDb_RL9nLAo)y_uI`zaCOH!HMd$W(pZNl1`SfY&8E6S=uHwSuiH<%xI~Lyt#osur-|=Ho^#5!*`~?^>pOAz znM$8&WvacOGk#W69$zKom~QdGqo+7LUO=K}d~8E!DKNb=-Idc2B**x5HH)J-ZJ7_HQ22>Q&l7_5kn*;1FQDmyW^Q^Mf%k-C3oyzu zVyp0;=z9tMPxz^JI5&L*`&@IGp&)&8k!^v6=6By)I(p9>JDvJ!7q4tCcz18p2T)$9 zOij_EERR_c+Tk48P_M9zm(M5)4+vpbLAQ9bu_4Sj1EtE*j+Xmr7nvpUq6n3e$~}2b zcjW%>TYLC(kJ;^Tq*Hb0#(rLLjD#PeC7+Wux7LhymEj)qZO)xT|XK%yj!lN z%}G|or6mH>OtTv?W&)2#UgV2`8Ah}KNuNvi63*P!M9NtU&lhE>j%~wnTbexd@qexw zPtOE|&Ye240<>gVXGUxxKQ~JFV#aX=#v&W=Xx`G8Ut*xR5iL~GC**Fakog;t!y-yp z3NWZqL{J2#y_HL5RjM)!g1W%MuZNST<;((e$L!+D(jTn^?^`q-*!?)E3ra_6g01;p z!VbD<>63&EUA^Ivga}!b3#S2`ck&@|CvA16gcr3cpD9+bR$q`wkc|w=Lq5lCwr1}% zq;Uj<22@@r#ZTgnIDoK)Wx(Yx0sQ=i;Hb--T*6#@E(~7CjZc6E>%X>F>(4A)vXEzz z3b9D)gCK)oE^t*sRY!f3faK1Z%^pTS+NR2f)+U(oBJ;0{pp$pvN>U#kLCXwm?J2Z0 zCD&J|3oo^EPbU)E_{vB3>82W!r!9yy-llD$w*K(j&u$%N!BXcbXPvq#vOF*HJ=8ExOMSvSu>&VEPL{L}{|WKTHiD5$4)TsU^Tr9tKhVsbnDQVdZT>yh z2fP0CVAs`L$YrP{2Kw@?kZ?Sc`<3VcOPdjl?EpS{meh&`nD?i2&EDu^1XSmu(thu{ zBESq*LcYNB0vz|Lu0fW9&ydA0U*((oPO!SrDLoR>`K2~0+1Cm~B-IL9x96h#L%zlV zVo@Mcy_mwU)?&q-U;IcJth=ElkzKvCHp6xOJmna###dYk-y}CaTdX!5(#F_(Z!oTw zIkw!H0}RA=nF`a>xEAOvyuwSecoB(!iQJJ#+(kZI3$c}Q6A0WO&wG{ZvAOzW3`Br9d@#vFtB1sT zLj8 z@76;F>yDjIY3j=Wq_1cU#e08hYn5M8H^nzkJYGB6vYhdITevQ-hM2C9&*4)-l3&XU zT}WNCFA};r{lqqMW#tE7B^nNW>1_y$EHQBilcOP$TeTc2$2uRCs_$yxK|on^Etb@ptzQoKGAKk zC{{HMs5fkY06RA$h`%=|zt@fteWh#xm8IIVl6=jtEYGt8Zzl!3aEX;w`pCN5jcG~+ z`ppje#$kbLX+EaKzqz@S6jgoXP^v6d=d!;d>W5F7VFwC2LYG`;fc2-zyWJt;+X6sk ztp7pkI_y+)^@$TRVvY7V$BV&DSxM{$1AN}5P+Weo%OxPsI2m-)QRjVdmWt#WTBUl1 zcR8mXW9PfgifXx{CHzV|)kzXpEd;j2x|1cFP_pmTfJbG$;bq2iL75-Dv0gy<}lA<}+2N5x*eSToguElX{H=c4?qBGY18gWQ+m5a6K0;QCz z=AGDTnXJpj=B)8%NbjaXlSPR*IW80w#L~Ktqm=j4Yqr5L~2kLcr zFD=R{No0)Ty!lHc6r$MYCfNhqv4|^U)KnH9cYg35(_T-y8s^`Dtv$=Xd6ts}_o*gx-3>LQh;>Rx=7w;?Kec@Xk{9u!f)*(LZFpuh_K^KReosuFichf{UbQpSO9E;>mjbL?@{=;kqD+rW$S|%fh;i(X;a@kn;)L++u5sDH7 zsakX`4*ab~Y~=?Q_N0?j0)RzqMdZm52g9oHbSx_*JlPEvo6O_$3T=D@SUlVS#b!Af zUJ64c8y(@_O}z$DX`37WS=;%zbKSwrQ?1*op&-P>R%q@AiB&%0WBpG*0|m$IUz-YH z{GmbVT6x7;Qa+m2w>UsMYbmc~>mLRZ&Ow{OBRju=tWQL4Vcs|xn=$4njbYCDQHHhc ztL1S-Ra8s8;{56S*2nspH=kT5-Ah*ezEY>HWbZeGt@R=($}~n#ejcM;7l7Y~ntVG3 z9k;P}UvA+EwBJXsjsw)+xSPfXZ42!-4}Na6X(AP@1>I>k_>l{OvbRe~AxvfBI&gmngSz%)9pP1bP0D}Q(*G-fvH70?FnL=FdIB1b2` z))D@oz=MP0sytRAoNW63>_Trti2otRdG|94JS{@=H=yIf+?7}ZQz!DuQmagNZXUL{ex|iv4vF*{CnWK(y+}c3@8QM;i!Q5dY&T{J`Srf`yjJ?i<5@_S zVLz?Pbn8Ew{_f08l<=iGCXV{UaieU-@A>{o@lu~_158^i3_mMU85h}JK? zrD}60lU5=oJ12Cf;XC*{P=)bu_L#quuc_gklq9rhLEwHqVAnBaZ`NND2iK;r^?dphZ}Ohi{v3@A z+X?}p<=Np4X;kksCPH5ZIci{>msOD4PxFT{csYc7ivb;&3Sw=pejxm8rxqhG9n8<QA^i3icv z6QC~v4pbxC-d1Kh9N$hnbu9EL3hT!#C_u6Cy|T7dBvb$`C6r=$p=l}lPiGcchpRb7 zRwvbZovpYXAWj}+fmJ|_|GSE~j5a{-uzl(38I;98{9YV8mO2kH=NTM!4XWh|j4nwWbwj*a5 zo!gB-^Oa6mv%-5wVkLDkdZ-O;RSE=IjzIiItd3>~&A^R)oU?eSJbGy@yEUs-73h`N z(t&TEx8I#W2&!%XJfpqW-S)=36dzy&_vLe>n%r2xC9p&QARV8tH<*7ResqH@@PSY# z9?QlzqwhIsw*|nh^twKr;jVrs-?^{t?fg*p0Z&~6<%C&C5NPG8%}5p zpsF`i5QxPKBC-7BVL#@5L7&}rww$PlQSanI#%V{U3CH5hab%_5J2rMj0$JQg79;Y~ zj;c;G`3HmTyg~_Xj%KFCxAXaenXya0@>_pCWlZ9KyT^1*K|Itr`JBi}!jM)0Glzjs zsSF=ZcNLC^ZnWq@Jtr^G6fW9{p8RRofVJL3Yl9EGduvjp_AWO+L$&O^4hLs7x^5Qw z#7?^E>Isl_f7<inSfZFuWDZwHg-`uEUEp{Gk$PJcWufoBz#G{0@MMRM z)V*=D496Aj9+|qAwyO_mx)n=P*o|EYw&+{a(3yW?sc2=^p-O48S&@a{>IBF@Q- zF>d;T(CPt9><3+&ZK8`YDH^{ZlPbE5n(7rBTB7 zTNgyxbp|;+Uh%d)=gAPUt(PPQWoRPRtnb${w9b}our7u+30idKe|h`LVd&0`pl#ly znWb59j?>q;V7=C~Q`aGFPiMCwW&bLck1QvF`p?_(RnH+anY0>?a>M_0@8vVB)eP?o z9Y>i6Vd}&!6-+Mc43(s3(5acrm{0TU0a|TrPswaFaXtD?(30-r4y-xI!!EJ3&4_8T z*;sTC^;P=^tc-04d@`S2Tfayrbg7Q1W27`EUnkOfHJg-QTP-JFlC-y#_`I#A7oQ6e z3rve#wJu$lLLr~C2Uh5sZROH#(N3$NPWf96Y-4CgX_lF^Vc1z=lve!}jX`zC{E59$ zL|3z~xAK=SlLbcS3OcMGzK~5h`B=wzyNMmS!@d}nxoi#bIs5)&sz8Pqr6n2IGNEvs zEgG(t#GO9Ebcc%W0wS@DX#S>A+XqsUvJ(~#PwV$7f8!UX7}2TPD65M?{Mn(tvK}g^ z2uH;n7D9N2$U0;r^zNW`u(8eappU`18Vws{m`@ZqasgL((*^Q{^dTVg)QWt9>zi;t z-e)U97EA}40#*rNMqOnWx_Q1zzE0@yRmVtgZtnVWN`lU}AB6twT;*-k1fxe7+V%t zc++H!2KOq}(3f`2!oSz8TQtcxwI&bf@v5EAGZKNTER#!#;dgDWbMxE6io)|>J_7Rf ztb8qi)=H|WrQJCaE1ay87X>*=Yjjr(lygZEf3#BjgRM0@1^IXtmMQ1$;Abcd-a!ql zLd*mSr(s>Yr++VR9kojXw?AxwX$ntNNIPm;Q|si}g|1<(3>Wrya8e~t?n@1GfIz~VneGDw{bV9dBMbq`lsS!{h7n10Z ze#@(V`saqy)pj|xrEI5yFK1XkXFXaz7T_S@lbLhu+;HrqxzRo!Rn1(;4QA;2xH^3k zQ~YxRPF7yg{0k5{ndTDUbLHFFN-J;P5GpM9FR?84>%vc)wdTH9d0Ls47K7LU5zCGO zU3OqyDCy_%ezsGbfXQq?oQ9wUeG zm>ngZy$0%g_nL}dH^yct((W14M~n@3yDtZlX5GIE!E1lHCcV^@Ec<2eJp>;m9li(Q?}>awZE|rY?Q%$ieZZ+!zO=V^WC->`*(L(_~kH2@HwY{t{GD! zlEH)6M)-z-=&&756{4q$)e;Dvmn6UcPlQiaux#vmBD~gAL6dL2{lcvcVd6a;uurel zhOCH29Ak4u=d`UJ!n2jFFJm^S{2f;XA;a+|5~pzjWbsH}etcQ>J26y)ger&ZRMv6O z2JSF*U;O0{9V0&SUP1JTPovR#luE5kq_ww8UKaO_2<|!fS8NY>How~x zOgHi-yW$BqPgFXPK=Z<+(=6{Yhi=yhfUBMCFg@;kK)3qe81Xa#OCrzS5 zhS4;PK<>BgX$O9VpWfljq?A{TY9V}%Dp-Hsm7tUcxf_J>iKqeS56h_61=<;0@1J26 zya?oE?6pOl3f{vC)!b}TC(MQbOm!_qg1*5Fy014vaV3l879odt&yAE4GbDg05P zbd6J#KI}$^deEj2x9z;~Gd1(t%+>=&3=i^L_S_QBEfv?F@-O-RtAyJ`s-5J)NOg8# zs63u_Cs@h1xqUp@$oC$TrgUhyAAdYr0hem>=YCq5>6Q_6@qu7sqIBqgcp=XGC3Rtg zg>%tFuw{i}D9L2-P4m}FMnHZq>_dp1&D#xECc3q5MlG=~24|}MfC?GCy>X<`m7kNj z$57-6RY2z?xqI`*iOBmpcDeG-cENWq^Ku9Lb^Y+BHozfvOgn9qrRtRM4I1w6En4m@`0oIdGe6($p6GJ!0ncjORP1vhdl8 zlwa_K)j@~R%Iz(n=MKK#Xw<4cO)Urb7DWWTR{AZqM8FyyehA-%xWeMSuo@fjdR;AA z=kvV%jN?C8Ec1OA%PXs)HTRsTWriI$28jff;5|2mfKT51OQP>np|1!Z7 zco=6>H?px|0CsryZe?gD@YfZT?xOl+u0L52eYSMFv#&~)_t}-e+H9_my=%VLwcTS_ z+H|oQemHKyAx;!lWHi#GccC}+l{29 zY+;U)>S{*kSSLB;jjz-;EPDS1x+n0R(SV>j^O|Jr(Wsal?43T|nRPh^A7(VCWmO8N zm7D543V4omX8s3^#f1ZpRD1YHgI4auzXS6lc1sC`_%?ZEu$^0A4a?!%MP}1W&Vq4c zuhh4M&U}&GcnfaHv*c4(4L^iL4$A&YYZkkIA2n6gC;(wj49n=yw+n{LvYi( z(pURkJg?5P-5hCbD=L^*q_qK77r{4P>xNE<$`+=f`1#)qhl^dRY=MRF&??ws<$coR zuAhFFSy-E}T4UkzG?15HRDK+#d66k|eZnNZ$w|p%6z8WIwJ|g;w}vq<4vVwc3iQ$8&%3!4 z=XKZuSCvJ9Q5`q3iZ$^mI~bmND-qI_R0@;5i^zJO{T#);Nf4AVT%_K@Zsdv`hOy9z zzeSeaMCi4s+jlA9H<>6lHkemP&Vvz3@&mJr-aLzu*=xrsoFjxv3Di)vWOTqk*V?(q z0csn)l?7&<3>8a0xr#a;!aqT+yYeqRI6OwZ@VwQ?wb zV?f5OL55XlyH-d{?=S`Nc>+7_MU#^`w=RE5p$nbw8IQ@oltdry{q=rAC z!m}r1$92*A!yA37O)8iV){yw)kE`>u&UrkI*s#lv^S~~dbTLHy9nglW|H)R6HV6$N zxX7ZSIJ;DY3c8r>T--A3JsY4LQVUxffmav*DVr9WoqNcV{afUFMsQMUW=DJRan4Us zxnrhVUYU-Pbenfq9^Vn9L(kg8!1yYuD|IS!TrG!~>4~_q{9j8oJ^7kV-$<nZ75Qis?kh@+c26@=F?YhQO=6*R5ILQgeK zWynHsos+N7<(%y_F*iTLsTltTv;?LXBv<;*6B3?XZ`$H{d_uZ=rG964!}P+q~z4G zW-DM1eaJURDvjKrYg(`c;8#N|%YFYu=*ipk%nxwAo%oGr&z3!6<& z!pY_A0$6gOI#EdiyxvM)oI`_n^9CcUQYFGo3$?>Fu^`;8T%Yv41RQ(ewdkKMy3tkx zhs*f*;~&e|0u^mL+(GpP*P<9zQLxwhp*djmzlG2$_APZQX}d|U{6ZCP4<_W1jaI98@_U#^MIN!kqWpzd7kp&*d>Ff?r(!xg0#c4y77FX$}60b z?yy(oghY~_{!Cw0Zq92+AuN(VN% zeMtI-1bLeSl=kke$vEfjnzZeB;WF>lJGq}?dB$F0{XcgLlYR7TbE6Ud*2|R zJF{VOHBk|;HjW*3>=|XVUC!~O)mTnRutx7p2t^zJb}d;b;p)0UN-T$u#{4_|H`Vqu zsQzHI3!q0FuieAL#uGbX)b(LI1(fe$@jbQ)T{N0K^h`$XR(&5Y$4XBmAg?SX^uzT> zfG^M71bTf7V(`C9D&w#6UM@QxL9~{oGA4C@Me)C_0mQto%;PNGx<)z4wc^N4gwC)e zd>xnxY*83)!SN&uMP|Kuf%8%ZXOU9%XSw@P*q=SzQtyN7O*M#Mp-)WlX)`)b$;XFx z`rix`UTZt@xDS`CPgG_NeCvy>EHJdTXw0UfAen>~!QOq;^%Jk?cSkqAURT?W46gsH z!R+A&R!=((zz$$L?bb2R0jZCpj}+BfeuxyW!Ew*IB61*J=h8x+LBiXobDsXp)<6$n z329=ViWD*^B>Y}o0P$nOWSWj&qcqCHuy=<4$qgtM-oA{6I`u-`fL!xPr^ThkX|QH&mIe$wI-g0qG+w;CDkXiw=wsA9qWNeD7E9*E%%q@ zMU#nZnur^+XG@oXKaz|pJ>X5$1=*G;1LU6&1mV1|e4XWfJgn`S8*IS9tQTv2G^yzz@SS> z6`1+dzdK?G9k0!4$E=U@?UKGKRRzhY@Yd{pZGfb#rH#=q(i3G=@ zqUoxaPVm08wm#p{=SAZaym5fDmAtnum>w!0k zL2w2y)OghjSpF!u}utb!SQ;o8ftc8!&r`~jeNL4jH<>=%3A^??KrNCW3%JtdW z_t;$k|J>XG+l-|f`=%kIdIqLLJKi+u4rvs>$?_Gb2Y zK0k}>jf|Hc*QiI~A9L;o>Gw(9)WLp=Ymdad3=+bScs7Vo;EN_VnZ-oDP8TUe+W9a= zzcBiTg-y6Qtn^A{IYDES|W^;V51%3tsLL@=NH~mejg)R~DcbrN;-?pD<4*s3RJK%cDrWX4IZH+4m-`w&k-| zz~7FP0gl>-Ww5<)z9=M${rrFQTP486fkSU-rIvH`s80(^;5`^`;_|r}>B3bq&Isuy zRqjCvDu8fF71J!#C=U_u_o2Hx|NmFit&vfWRFW?x^QYN!x_&hBbCzn)^JHH?Ech}S z-^@}jLLQlh2zZ#8cnFa1MqY{+qARJpTWSOEPo7^p=P}YE3|!!yVgh$hYl!t&yd>RS zhV|%#wBg%;h#?+yYlupHH$Drx1-%e^_ThUS)dqN}sR4I9`7Fc_t zJJNrpG|E53i#BPZVDO$dFw->DfdAaZH|*EAgn|cA78}_URxi8=FJO-55@BsGU((zK z$i2{2bS&^4_)JJ=8Vste}g9a0yT@tH1e>@?FD@RC$$ycz8cAg;SlMYn~@BZA5 zG3=8m9CD2D@EhmiuApvB;989N$Tk%$D)&&onkaU{KCYaLWQS)e2}xH$SUfF0#$W=X zbPPr;*|tg6b{}?n8}$PdRdTx%&ndF?!WPq`GQ#$WPvMe26Pw6;;@Z}L;{0uqxj&h# z%^^pVM#qCs3&?s?^j+R}4;}RZ4%Kp=VpV^65I@|P>QP!8Q?}PLvd?FRI!tCf0Cb}o z>4Q&ywd`hV3u8Wbu+m8=PBmah{`7e6nyq?3xT?t%H>iU#hC(uZ$x6k5;D;r!oe-YJ zdxP5H3JO=)H5HD$qn_4ddhpPVnZ0_NJy69)q|)zE^$X%PLFTl-P|& za)NHeDN%BYX_W|v4pYD|msKnvM1b9Y{cBPT~ zgB;-#wnVL^;E>bq<6-5=@@W4^#XqxDRt z_4bsh?w3*hDhM~FW3LqDf5~tPuZx4d{(R}FviHW&pF{JminLofIBv_W`m9X0fOJ6* zNb|xLaN@2Vxc2@0nswR&6Q#)znsuCnBS2?XLYq4M`7cciNX^9Q@mBMh)Jscx2@p=r zXM=me^S88e-Rckg8PkQbASM^Wj71%P4XCNcVFfsF(*hpq=~c7a9}l`U7|p*B5k*h9 zG%um@xN(}Nz}hbj0D0PbC7M?RIcB3OFZ9%Q_7E2#7prG;G;9}=+u$lCrbO}c?v;8Q zMC(Xvy?nJ4j=Xa_tWGBB2|O}KGkO>?(H2!9WqCGr)OCo!QS^FGy35X5)xrNDsd@*< zXvU|Q1NX!6C`~_cw&LxL1F7($VlI!1s6U@y?D;jnxamTsRJ#iepjDk3mMKA! ziu`gsGXAf|a^k)n-0v6a>tx6O~F^I?6)UE)|m?!{TsqN@2ygnLo*i|w^E8I zLfty+Uh~UwxY^d0F*jmDl&WcN;FK$wKKce?sGCsi+V;C&jFUis3h%vMj9B}VSBlvK zFgv&!(9FUt4IjYiw+^(;o<*nZ$qeEO z&}@L=vD~N-M^*{a{ZIAD8lfC*HmY>D;sZ|MW7ZKVJtm?pLG{scp`+Fgs&p&J&o_CZ zpA+g|hitT+SoS72%&XA9`40JIFYLJGB0fp zo@5Vp958s;tK?A!!34&uU-VO=VG4JA-u6WsYIi*M@nWIxNO9}rcVMj#i=`nt48Bj7 zut&}eu_!Piq<4I^pF?7KnwRGy4sLFhn#ck4J_qI&uE!&Eu5dySlZ^~ExDQ?;X4-5; zng?|sUCIf}%q-{=uLK8zMl{IDzkRIcrde6bnlt4oAs2C65{B2wYdw8j)6)-$S1XKjji!{7jn7DE;nc@KfN{x?`dvFj2lMlXRVTKt#+XkkX zoiWrpW>pT~Xc7*kUMmdI7(U$X?*KB`YI8K8yImHp%D~P=#*MljWa~Xvuk-0V8IYR6 z4t(~VJXI6cFGHVuvH|A@*2d?wJM#N`fXMt;f!#lW2SFY-q8Fs=pGVf%Gz{i zUmHhYW(hobtlmDht6wqnc7ieY`e0uBO?~hVd(h?jln{cam|0K`s|}>4z1MaJP7wJJ znVv6gUVfkTlq=cQ+cS-!ar;WcShA>Jc8X^(Jce=Eyj!?;llDUBGDPd#eNE1yPrh5p zr)kyVTVkwj2Pv(Ie;F_YWGgf?#9{IS1<0x;?i_9W>I)zmCllU$LOgDFGeg$ftW;4( z76iW9VgFdpLaxsJ@$@pjy%K`mXc8;ew^nHQKZ?#hoay)f9b902_YnjRphLV5h^+6RB}i{_5Jnx`~LI3ujljexL((N zy#~BNg`<2-768d(*sB29ocf#W^r(1aDX&u|$sXJ+j{o{fc7n`92C$A*l+JwB>t>{c z%Im@0+T2Y`-Qj;NJ7ws&s{x|WrmtE&vciUz$Gxg7?wDfvG~r!_?VC@4yd(2>H!xaF z{BbY(oYBB>@PWg@J0h80@m$yOj8Zi~F zd~_6-BA3-ut(fBcPq~cKdiq8Xnhw@BjAev zF3CS?a*h!R>9u8g<4@-zcAT{niA$@zNy7T&7C?mj45vV-HqBaxXVv5uI1DP$I)6^*sbz?xo zRdL4>I?9OgAwBqVVE0mIWz{Jza@XRT(XOwYin)M!VHQ)-98Jiy>B=JcMF*0;oGxuZ zl4_hzMwH5owoVwndof}wbvK3wdOYWoZM;r_TC!LI7p5lk1oHdU>#Is4lk7;^Zk-pk zZEd%>@W4zSL)QoY)?1}<$stx}E?aadJ+@Sut}0g-l>Pg@YOl!cn`hHE%u8|=d5;3M z>bP)r=jTS!I=l8c@BJF#a(x=Kboar4bGEk@Gw38+G)anmph*F9iwFG?BKt#&O%pe` zhMD5@hPbK&BZ|0`bl}CLs;vX*T)s~6%|jfo8UBG7Ch@B?nC?gsOhM6}HaAihjXeHD z1>S|g#Hg?Rh;!^|!x!%hbs1bSx>w-8qbpKLXEo>69pXM5cbak*j6iYU6}V(kcO6qv z3HKv1sl9{>p6DV&l%=?%d}hF@i%i{A?R{ z(og^YR>qUtmI)^S;TFux7KoxJ1T~O09!3}v7$9c$qG*=v{=%b-XV2jhneSPzj{#kqnHUSvf4fJMrXghIDQ<=xu7 z>=GOsq94{&oEEL;{KCj?F9_bzuPC1NZwH;hvQggW<#~22p`VPnu&ZPzp#_yU25PbDl9!E`#r@;uw6Boi}X!^hxAm#kfugI*~Od-G^MW zdsy$*@wP1bmS{sVLcOR7L}xRcos{H>*PAW_=yA=7uV(o5qTWXa)IN6XpxKI;YMe4x zwz$fsIw=iB%6i;l^>cngriz$;N*Ood><<843#L9e$j&W+0+QdDNAkcF0&OrX;aesi zBEl^jYXuo|6+m(D7Ev1IOWz^$Snu`N5ktFgf5w`9SrAGnN(pIUrfmR|=LlY5K=+X} zw+>h~>ero{Sq2y0IZX)c2;8#}S%9N|JFi z6A-B!v=#24Ju=tlqqNwpWs0pBS-osI(NOr`-xrU{?JXYftPjz81oj_igw#2g*km5L z!J8tffQTohK@WHwhD%!{w4~&p^r7?m7Cvv3>9gT+r)8Q`GjW;xv#K`H1}uE`csls& z1oXz!^dhF8Wc~pjbNv1D@P9HADfe0|`nVvPH(Vh(old|DnUCC9S1sm*Ag=tWQ|Yoo zg!Yh{&F1020LSPXTg{?J-T5v%tmFO2h|uhZcwpK|w#)`tW$6S-r!ggOSlipg%#G7+ zFRG9n->wm5kpW3T*3>9B^jmtnA8PMa+zFA0(bIibHTivHcwSdWLWR|Xe}uD#r*IWJ z2ckRkxtg3gxS-obAkoA3VD|<~FHi8-C{~iyP13`;-;NlmM$5ju!f{UDtmZMrTaS|B zjnK11pEovNG>NXM?0ZH2hJc~;gn(~G4Pt87N7jZott$2aEk2P8^vlY$61!zffLEwmPSJZZo-0qU?Wd<<6u5@e8|3 zxJ+>0ZHw2(bHWVj4L#0?L747Q142wIG~4?=A%oqwUJtpE^?L-@&8a%zQI;ih_xY`F z4l9EPO$=#e&t9t>6WU8@I_Y|XZ#E4~*R*_(+n$(lcD#a8mO=VvpoJ~Jef?J_JX%bF zlPC)aV?vBvr9tNxWW@l;ogg@UYECEpVH3k!d85y&#)Ou{v9ekt5Kn94ThX;vTRc^g z{iy`l9V)Wt1p1Gc^*K23J=#MJQ%q4OEWm2DoVW@?HCZI?k*C^eQRbxlYv|LjqwWDg z5!V2!A=kbi6(t=qYVkLoR>#-u3D%6V4*no(%!6b=4qvW%m9^G?k^_{qn3-Q`sfHnC zT;xigx?-4N6ENc2uV z@+61H6Fj+olrFuv-0?fbMAFtO_|d>)b-)qodr{Cg6VBWKv-PY%ZXUMOh+QGJ%c}qX z53d9!)VGxrDL|6fyofsgd>|#|8W&Sf+EW#K&l2?-;EXa8Y`u`2EQzan#z&X>SzGy? zjYsR2te@NyV-sCbEuP5vi&aqr{407>hTnOWmX^l?mIwA zQ0|l<$~C!O3)dp;H$z@Jh#CARps~j(@px2fPI$AkhFs-qt8OhuK>rQJm$E~b3OZ^* zQ|ove=JAInd4N6z=CmqYGLuw&GBzs@?l{3IJ9c>Q{(^8UyY&BRPi$VOAZ(`0dbi4` zz@0_sa)R**C^7nw!2ST|ykE-3iVdY*RY_WQ#L3pD{Ms#^Eq~rZ(apMC(7}s^AYSiC zQ{~DLOk4*6BoW8yY$&Z?MwJ5pXnPlN8f5Y}2!_)5VvR6TH8h`8|}I9B%;it#JW<4m#Tjx2}#t{n%rh<@_rY z=u!$qhLrDD30Jz`g11M}G>=T5qISsL7@>@ShB0KC${pFE_+PSig4&NmZ&36=h?-S{wT=t2 z{mmT{vJjmQx`+qsx>5Jm2{i(vk9g=)&jU0E(rHtKn->+IzEFAet5d32jNBJOoaV@j zX6G2&m`55<<(}p2NPKA^Z`TP2|XM2_)+K8KK?_PvEy^Y}l2EG<4 zLwyImkS1#lHePu+rwEdG5ZeB2(AxpW+a@oLAUjOjk7^nsfN}Kr02Iku#@l2i>(TqQIq7 zT(bXDc_>@Eh&ZT;GECqTeRamDlf~T@olvylrg*}L+gGMLcvAq$&bcc@Ryb0%OI5C< zD7pN|G%4P9zFgwVCf+G1HbP7*9NNSo-gR5d7L(in}Y zSb*tHNE&iNrnBGIvx|MH7t|VI2zkGPuP|-nzA>hZP075!T(sl7*f;ELB@v!umaB&} zgM*7kttOspq}?(ohisuE8u{qAh_eZIL%a1WXF_%3R(-*UHSGaETFItwl)xi}WApr7u0r)0q0bJE0I==N34vDybh4$;mpTSs#vAp2)Luz znXRzS?A+CpO|LJ91NR~bzCOerL+LEekJ4pt&PDNQ=U(?c4x(i*y%;Q4&1W|yUz-F@ zoI~69orQsO>Bm-}w~NRq!gDRS2Dk3#zZcub1=bfh+iAvI%C=xDp_TN~2ddGs^jHbxe`I+BhD{ytW7CIz_`D{&p!|2))ZmiL@9^_)LXtb(Hi8PwOncSpq%l* z1KAA+xh<)6f-(=*4RE(4OBga2|25g?F^KMR1H!%hD<@xQ`UZ^Z=Fyp*ZM@AuBPz8m z4G(F}a&;;;CF$f*C-mtzA_xB|%b}%W9#C90NhN1kG&M}Ng8HO@Z}n2na;P@z6?@oN zO6Lb^v^~(bqI#ASxRv$~7hI97ezCS)YwaLfu?~j+Dk&ie*w-R@nDL)ptg%d|<%&To z$lWMzb!>PUs=Bx$5jew(X!8+qlH}{bw$XN#`R<{ z!DjbWLG#pKB7*B&e8KswB-*YS5?7>dNl6fD$VgjjhgLRZAZEybxaR`U)Qib5m`YG{ z{~LgWKcpO;VBJn>F}ALnw3`y}tx!NugUAoRc(JP+9bhS6GDR|rH5sj6f!YSp(XwS* z=)cf;S1CILdCI?bS*3bJEV@T2e7`n-@1{I(!@P0^L@r_9|DHUSu*UblVCN==An9`Y zH7Ky$hFO1(tG%&ffbV(-T<)dS@aW&6P*3+7SW=MqQFq%%9Y1wE(<*+=iwI*|bOkR& zklcDIz^y4*kbo3p*BZF~u@*%aPs?}S36WVQ z`#Ilbj!ffZ@k|(ZO_AC;xr}E>I9r~ z=FuLmOX$<$4vz|Q^Qi(r?Aaele&$CVrLG8PNSoWs0lQdtr{$d>Sn6X_@HDbU zUK=oU#AU+h>aMK@lJrsdw{o_^V@Da)Nk8gCG1a6Tx2Mjje1?m1Ss+jKapr3O0;pp+ zMYjI&Ku5R}kjCTb2KT+Uh=rK1jl8^*eeyYhTf))MRy&?XIhk#Qxt-}f8ZnE z>GD(b6YSln^&c_Sb~yc}Qsp?3ZoMb3>^~d}+?J{=0!Oa#@VK|w>`PXV#24kcaRT14YmqT{Y}y9O_N3(h&Zu9k5~WWg4DA4u zRZ?^*SnLr-dj&Y%eH;8N@HZ&GvS!+sC~+ed!l*C2Y}Cu@BYIn;Z)D*v`U@#o+?k?f znEOpDSV4%MAjTx$zEtX$o-E+xs=45Q|8r^m)8Mn=_}MbqlLNPR1SGO_`~<=;02SSB zfVTd%Wq_Pm580>`4yh}!sbe}Ru;#>{SCRQ&;`mj1t5TykywMkJEcVq1Um9ty5abCNEWyu*YbP=arba3h|nYC*lhJI z06p>DVg0b`go%S~pov|tjkEwBPufaT^zKBf|C|Eb4QCGLgwJdoOE#wk$ z_F|c79q7T_tyvyfrjXXY)z#7OS(3cJrqhzrnMHE2umFl#0xKh@vx4FgaSz-ldd80_ zCxLoy;z@PIe|*pDOEnFVWNR7%-$p>(gR^p1sUi`zz?g`6NNR9S5r?s{<@*-m;hxbi z)%M2BF@en62wnHAph*br@lCxKVvwdj_7x4z!k_8vxsRilFJ;cgfmo=CirRx0i%x#T zl!EMqKPDsGF>mF~P+kud&Mw8pp3=^bzyl@^G*n};-1O+X?vi=eF-3#Gx0M6yMC0Wv z*)A_}aR!Q29DG~3;f^3X;*>Kw{O)Z?+1rffEb$OoY=A~UM!^hqN1xcLKvx`nVPF)n z-#gJPx;1QL=uYqqBsuXO;UU}S*6r@q_qiLZEG2{w3<`~AvzPlel!#lzLfhZl_NQhB zrv_y)v96`c*biDo6!Z8Yk^QoDU$(~F50|3cguMaL*GNfsUUEHh#t>|>#|~D!6vf(n z)hGZQZcQG8K}YW7d?xUwzNhcwl$Aspp-YLnxw*{sh)B#%r_KzNq}@HV>&3Fi>Tiwn z=S{8YN|nGNxzB7Lm*6TT9o3Vf)o=y+1BIAVv4_VN794m@fj z#;0szThodpeNg2=)rhA_Hs+6310u+pIYA(~`uip2v5d)SUY$2n?m9VXI)T-FFL#2v zwoi6WKGRn7ptJ*l0c+Xpjs`X_y47bW;nw{jBd=XP{_hn}g18Pp#U=rTEO@)y2pFTb zwKCqBVZp8KmMsL*k<0|p;X&2n&HXO=`mrHkmCIB-Pn=`h-)7rJS?wn{Qx9Kwl&A9+ zGX`}GcYNMiN|Y0jyrTGx3s$|TV)}<;|3CQS!o<)Ey1$uQ5#yJ9XD2}ES6IQLA0i{vEC*4 zbXmsfXg*ioJ}#y>WLeF|Knr*4<7ak{t~B7@9S`9s?8w-VmoTZMc6hxb`WorC2Q-@E zVx%g|TNjdJk_L=_Wgb$2M+m|d`Q4(Ps&uPTKuCc&14$CElp*taDF^8N zljYzGQ_?4d%@&G9X!+97F_=-F!XknBnFbr?yK^AL#DHa}fOFXR!i- zueb_4(7A|xH2^KNeQ*BRCi_fN15f8~Qpvds=NZj_&#g%D1NvU`_N%6PC6fkD_}jl> zK+79Mz+lLE@K z8$b29!hPGoQra1n3B`~p6j0$Mdzz!zi^{$OFt4GTnaHqPj9&gnxz6IE_;+l5@jxhQ z(wY5UO8>lt3Gx~JaU`@$c(t#gxfbN9F#hUmG|il{xtgYMTR5az5EGWN+g~Glp~!if zpUx12z945SqbE!s8#ZQri;6lSka3ksG!ppiqk^Hb1A>zWWE&+QPeAxFIMVK+zT{F- zPIcqpS|GyrNe1@?9H(HlT1rWjrgC81d=Pg)_Kg;Ps3^T(iO`5K?!uW%4%QP#_x}F0 z3na1US|$Wn-}i@gLG~(Cg?$#uo}sN)q~EcGdu%)+qz7Itz9z#d} zx~Y3l7W3sqX+Z9x(t#LM!kqEu`c1vBNwaxHkCvWg8aCU7{DaaVf2_Q zrB68I*I9etScDq>mIK&yP-6+V_Zc9vJm<9{FbK9Dz!h_3LNg~hPHNc{T_dD$+fM>-J};0wSL+=- z*gd{&!}at<0Lgl2q<2ig`1Zzcpg*!;5jbl~E-j|jflbd@i*hJB*uE)6pLvtmg-e0u z{bq<=T^4~h&BDc3F~jxzY9im-nU~bHgH!XfouxlYRDGbt>7zz@WM4eWAJ^l0B3JXY zN34w=WP}{BeEO?Ar*d7vil2JT>Z|cX-}Q@@uRf}hux^BK$=Q$`_Ep;(rv{T0TP@*< ztq%DdR@L_x5_`(;zbf{r4ZSKZZ}Dz5z&}AtF#R<%GZmkecYyp6zzy8OysQ2(8%1X=%ys0 z*Je-?pUpe}1{;2~R?p}76^^-nR8|r>=m}KKt&vV%zex&=Ad+;aMPkOrN5xJ4yy8Ks z57D4vLKT79U_~19rymXd*m}&&af1&`2vb`87~tKA2Q0 zYx|z3aJgH$dn+qC_}e~|7MTAt7m(fjxLQ3uken8fKrBf?Y*2(PTR-yc3vafR`keVC zYbF&oR_Dczv01YoBaoaTVlc=_&QT*96>t7gp@u!{BHnlyHD5$0C^(iN1KaP{iVF9_ zgKi9goEF-wfcEu|tBEpemo(5wE2}d`U=csO)wQ}C9yy96muNhN4StT?6$n`OKFd68 zT$@d~bPxFZoglm6C+#_6QDd!|S5PNTMf%};g`WRSfRp6@UFE@(r7!O116i8sNYk~W z&?F#cZi7@`98b&RTR~Yr@~a*(Njg6t(_zBn*mri}q9N!(cLkWKe29Da4DI_MS%YpP zxV)6(H^Q$Vbgsqvp#n}zLn?3{IEi=64CQeS*P9JV=?Wm^L*j=39v68D1(s#XtXNM~ z(&}fK+>A@#kHaD(yel$hBXJ=9-7hu2V?faf(YgCK&K-LLlVL<2DH&ahXNrV+o|ZDo z7=lm=Qf~y&uHZQPUNsg6`m z&wXWZ@`E0+m&rFSlN#XGPF6(`iOHb}SF8pr59Tj_jYtl%FU*6UW~PYtv+DnU7M!%{ zfAKPDAI_>nxV)?YPpLye(X%y{SP)pMFj1YJ_soRs{swAjWI^S--)w#U4XCT0NRis1r))R3y3?>Oe#QS&Du1X^E7Lf1YCLZYsJlzb6%yWh3x zyi~wWkr2t}1nHp^eTEI_mgG^*2zmJ?NyZ}I&Nuh#1>kfQ5PD$C&GiGXtKV$h&;ly& zUV1K;jYcH~)O$k9X%=upTBT58TEbL9>Kp9JTo?4KJuIgdpV&mp-6 zSdA_a;-(8EERQWuggmIvI-j~xrQm;3D6HV)XM2#ao{zlWyc4!xHFE^(IK5U5r0o_) z36sK36I+c)?tjA7FZuwOBEtp_{YXshX$mKN*^QI#`KSi}aYUxtz;-1WR6eaC0enVQ ztXk_=MGWp%DBP3YeQE>QFKRp4Vu%^p8u-y5G|+O(H!TiNf(j9LL>&yL$1EO&{wM_o z<7k2Yz*XBHa}nPLJt(i%Dxof^kivT6ZknCHP(|$r(;qp8YW2VR_z-We;!GrBgk=%D zN<+99{tXuiQr*ocvagE?{ahCs29{tc=m7sKk>r>V0(iKc)vlA?ekYJ8>V3|*U83u_ zU1Q{?e4SP;V7tvP`}7O#ySEFs%mDk8J zbp5NXCpf;fGW6KB)4oM%pD4)xxa};WFG9BWwl0>{0aXU1-#Pu=VlaE{GFW`lX7%$p z>3*;#T}{GT3y2(bQdu{dLxh#c`9Lw@Rspr_ViBq3V}PU}3&rhQrL8UdA+w;j3VMo1E>Yy5)};7f&kBefQq-p$}e2^Iejg$C7*NXLcTqd=b-+ z{z970WZkZ59@#H9xA7#!V5wn~0h<~Rf~m~8Rce%9uMn9-L+Ho}E>yT66+qk+ePhcQ zm4#IX=ehNPzP3zOJaSqq)!X>S&gYkX`Uu3WXWMv*K&j0yj=E*8o_$qncFhu?Cvk^Mo;;b#AADZe^#~f-0X68=xof7(}Bf!&a=}2W_t_VrMbPuEu z<^V$X2kWRM40QzNZl5@A#kd~EM>A(jLo*1Y};I7uRjkM>le*huy1uq@sAnX?7-fs=OD{PNN|1CssBPqW7&*YQBtEa+P<&!%opgt@m04o)dWTM?!KZU5IwuTdQTC|0}q1 z&Z7S|`YBqB{#qcg0Ja@ReyrM2VCWfrs!V~@D<*z}?D0USWwi=a2cvz|N#C3A!}`w* zcxRs8-U@vF7?8wm9KCvF_gTQB4?_FKsE{9+vQPnYqL{e%x>1CwT1}|nWRR?!Xj@>7 z2DmgOLu7#A%a07t9sg`WYNndVY!!l=93Sd8u43DHiC5LTYuP*eQW0o~kgi2rGRWl4 z+ANs0(jcU&pyzDCj;=h%dA6852QKx??~PY|VTk;>XC9fXC)_YNi)|L7B{}}ZAu|x z-T#t7(g!)FM#KeK9*N0%o=C5>-Ug6ZrRd;jF)hRLJucGeI=)}XaU@CGtA-{Fq_QF zkJIay;L*2Ap#o!zBBqS2dU*5Ntc02_m!c|;q`g_g!H*0|JH4s!znj1}q8`ur7vF6x zu+sJSYxoeIuYNaz^OKj^lAknSgul9n!W@mgh9-1wM zf=S)p#N}?u_m?x^FSCH}JHOX*r7B${wPG-)>QskRr;%+iAuQdmhM}ynTm7P1HDsR_* zP?Jpk61;O2&}_0XTV&j0pl=tZ$i$$a+meT?y~zrRvA zW3%DpH2$H5jHAlW{yL$*`#hC{e)}^-Liswzhg&Ib0he2(?calyNArqXC{SHo>1HyyZ7fu)ib&LRU~uI?-r$)qqVKg zG>eMNQRazkmFUkz*&m%b#D$_U4V>YvHP>Co^ z#1&$_*v2AhN|7=YEj7ID1`;x|%u@gzd9IIyTCoIqQP}5^d-adwX(t*fIhRdNUF-cz zY?b^Fu)dTa47l+VFb=JMv}8zM`Y8PEYmfYB`-vBBN1cP{{;|NJLi`iYj&I+To_%ZK zfTiilOzL9)x(KBY`&s7acdtOw^F2cAGhn`#14+o!txuHc3Bt%veDfsaxri*I?le-P zRUGbn{Z1OtIaAZvhckfT%{XPTjWyy|Py~Y8*|W=m=^Mvj#fq9W9BahI)@Mz_vi29P zRqnK?f}j`PJ$)k&^NgqvKShB(jMVB%N;A@D5~b(d!BJ3bwzt8^d8`FsY>sKkjlwa<(9gC-R@dZA~ zp-vLwU?lB-kHglri02+&I!}>UoPN0*=>9_RWK$1LI|{J1pQ7QV@$W=dhBA;d>jOc8 zM91WdwPvW{kAkFQ1Pt9aRF~>AKcAq9FUtBIOA~^5^w>!kdHf>G0n4e$I~7eF?ILJf6X(RYb;c;V*udR`Op+ksvkx_R|$QP*?B1 z$3tKJON%9eJtniksb=Itd_9Ai>nRPqaCA=Q6)0CY$FbXFy*LOQ-eunNpxt|lFxb8i z3l^urL@xx@#9N}$GhFUxYFq1bku2la?iix$|0gf`$CTPX+2gK+JwO6dpBL%YV^jcy z7%=4jM-e>UEWZ0qtbO6$=J`!Zm`d%M-v0*!qW*kj!*d!X~h>(X27OX>PBZZgr@wG#5<#xN{W zYzIJGqxrz;;il@Y2-$xfu;X?eH7?Y~!Oph`UjW$M22@n^pFS^Z)3Z?%z|TmoZ?2!Q zo8sE7uNG3ID{TiN>hi9$*!j9vAlqpUpj=nko5HQwMa%X5AfYgFKRj;^v9a7-5PUv=dkJ}m2CB7Dj z8BQ8=ueslq8Jamp_5y|^L9aeTSMx(p-qE+2WtJ3!rH2AU~vWr`&< zh|m5&fWK6*V1!3ghC&}tz~@tivvZ&(!6`CFv zAo3t_nQn2zBU1;X(6Lr5_MC%(NL*I2yp5(jM18;6y{+SxOsOh~bVs!E-+DY4JIhJB zoc!|zNC<_kP6nnt*2JWq2q_4HD#-;x@~lygPeL{5AVQZAc7~Ft-x?uXc_ae9c|qD+ zS;2}u95YnULdC>kN5js79+i z(y_f;I;6C7AJ0FGl9NnNY2t71f2wy@ChS%)1V3AL z?t^3=0-K`g+;7MFe7b)iwo5I$zet^w`V7@nS-Fx|Ju{#`OezSEVubM{U%wAj^LQNd z?U}Z{$3y~1y>hcs^mogT!2x7JpQe%g$!Se6VbJzzi}DgEop#&ZxT`}xIL(t<9dCCj zC;NY0>|ctDnWhPlXY}Lki(PCwuO=(Oil*{$wxm~;*Gr3L_@JwM}SGO(|((?+Z)9mH{F$}2i5u2 zCuEZTKffNa+gGSN5s~yq|5Bf#rC!Wy_zze-Q#I)Nf{Hs>i!X!-4vd;Zb)LCup5o z`s!@BK4~d?YtX^@T6tG!r8{!|u4RUO`9_v%gwxJn1ECQiIk?Oy%0fknRu92^H-4LG z*(dyT(O&gl`q)y}Wm=Pf#}u2`ksBPS*2(w!u3PrWt>ns)bu6n)UXtRhfvJIjZ4|CW@fcr*hq=Q(WUx*_{s^n!l4 zixBow!8q_?jzyYMVWaCf7(ZMDv#)hub&=9E$EqRll<~ z{?5BZ{SeBs$$YRlku6hz^Z!z*jtPvSp9!i=%! zRY1!zQ-P1S-n|yQrI((!b*8mCsrdW#J|v{|+{!JD}+2*g``XJ+Dv&|c~ev( z98xHeHnY)db5)3z5#(Oec0}U@HL=}@CHFmXsX`0njf#-wLjEozxvUwu&D8knv}w7Qeo`j}Vwc7)t(zZ4#%<&Q`0z`&AY*45&6 zgV>ZAySukjMa65<1zMX-k!!!gk&TB2ZvwpTde6GPd}Qbeyj!I8V>|`dw$ek6L1wkT@NKKx%9K5_rT)sh(+)NF?ylEg#+} z&GnBm`f7pgS3BT7Y1|UWFoA}3KU9s)F&Oes4ti1Z_W^B270BPq@uRWD@RO(XS)Qr8 zRSMnGEnB&6SBR)La>K~I9ZPuUj~q%MJ|w@>w7dMmXwt8a3;ck#cIx>}xPV9?g#2<6 z6!eKLbJ!|IkyZp?#cNbKqfxfTwdl$yv4d9{&5M6i>p2o=@}zDT+sm=hnn1tE{s@q{>K>G? zBh~+;X7d{+0l{2`hcSuz0DYJLM^04yv;pqBrZlXzJy$i$Dbi zw55DmRgz>pFW5cWrwG!}ZgYN-!8{vHR;;8@JdE)`Vje?4GRO7?CFuKoObi4*n-#HC zNhER;qrGbaGAnwPFM1Eix3pSqYpdkHmJ%>rw|2At*1)*-~B?3z~yo$PpZ{0xU_9EBQW_XWn7l9b}cE)n%0 zWqvhcB13()?cU4EHaUj_?lMw*^2Pj>nl_KMin_ZINAoTn{12AywgFRJeW2lwQEO^m z%M~)d-BO<$j$;nk~$r6yJD@j6X?VRwq7HrWc<*!aVW~Y7HfVGnJK=I(t{*N!LQ2{HtXHYL6<#wcusP(Nv&~ z;Yk)YGh2+>;-}bzjSE<7fzX2>7q0ygo#2@{&Uqe3b7(`1ae=L*m?0-U^`|Ju%WJ@%8%7dicX z3&rqXWHW6w%Y}qeSKdiMsz3}Vy6&^%E9pL9T&nQ0047(``7|(nD;Lts!DiQtkx;-X zX|NP|L;l($O81mAvsb5O_xBKlWKbR1A}=?lG%4ecUy6L#&F0F2Ax+lZEciA~3jyc5 zWZp7q_2~O=M=~H>(1v-rkLzHcq@O8#tpjjD7aTW5GH^X!pcDnN2erB7I16E8dhP<-kj2z~x2myw~YL=t{ zV@GBwKqBPasCbvsfDah7TsYG^Ptiqe1SkKr+hU6D1|2T$)`AckTjEvTv_c-gRg1xP z!Zl}7EUda?ITLQq81;zd6`hG<$ji+RSt-=o$ytBn;e(2{VyYigx z^7>WW;!;?e@+Ma1?K&{a%!*PP2d0bKxZmBtfq4U|R@|uj@J_PzA(FhV(OmPAZL>c>*rHDQwA(5aH-nk7)eH%7J#;nkm=6=0)lFo~Q6 zqlda${{)#_NzXr2=!R}o@X&`mZS7-I^g{A`CIe9Y`%!VBme{C{Q$N2@qo%tM`s2?# zh1E2CoC5r7t_;Mc>eWT}RGYTY57gb<^zO=JEDQ@-&!d0U0V};Pln8YI=M{kE_OdF~ zN&{q~x-geqT06$+yXyo~q($UrI~0OIx&wR-k+xQ!7lAypYrV>`TF{~j8Xu&AU-tZ` zH9`#jT19U)j>3zH92yo=M|3{m@4)`QapNyPvhy&5suxz|?!@&_`s z893opt+*uNM)PoMvjDDszAKM~U);&z&nG6%r(WS=?Ekk4U|NKJluG6~*gEuJ1Ak;< z1H4LKa&#W%v%htGYV|BIQ;0kA%)|0nx=yfHjxm_eWUl0$j+4!sl}=@a7hu`{K~xOs zC-_DtPe^eL%?eu&-O{w-2M8Y`ob+ zEZ^J1yCqZFXURi@w8xUrQmk}D6zN8@AYI8HKg!Ev@bBEsL+;73fEmg*y>S@SHMf8n z^EwbcVe%{Id8TG?&6XxAzu@%W1UO){^VjCCx1=KxQ&|is39kh~NlOQdqWRV}GgF=E zsVDOo8^)s3TK*F{Z!hZaiKYmtY1r8Q0-E!H#yX!7^<|j*lMgFwpxk!Msuf7ti)zXQ z1RI=lOj=*N+1hus2+sa>g3U|pli^$2nB>RJ&T=B^uWiS?@f{+bPb|%5!PY%Vz-4Fg z04H*hFwoAAwtr=u2&$~A8Dj!(8k~1bNZ59C^N^5|9n;#Omu34Y%-KtPyhHAatCZ4G zdXLy+`@!Sjty_;}gBu)QN3$Mt>&ws2mEN7y5hC{}>5ua2ZaVUGB;o;VZegvUXF#r4 zxE%o=IV-rLYbBAma7)!lz52rZ*|k)8Qoh@Xra%R8uBcyY`sM}4^9`}g8+Ow@`gI3` zh|J$6sByRVjL0YlqM}2+CDVq$s~o7cYfT9v+}FW)T$Os@pNK}Nys5OTw>T3b7(_O*_>uh5kl%JO|;5IOh{dkl@=<+^{K9|@6Yew*X@0Ky`S&r z^Lcwb?vKCTE;ZvKKleRf%@+a~gm0ua^b4<&e6x8`GeXnGv0$GBF!APJW!9DJNI*>9 z#xKF8(1U#8W26JoqkF>CJnk>|9DAWiO}11&oGHAatFlKRpuw)h=v>jT8cwoJ>9rkf zpRl%xs)W^5+v)KD#^AqcgXoe0VDfhr=KapyYQ*nxZ_j@t`hhR5STB_RYe8nQFpYd=*|i&&k7Uj3)Dl!C{*S4eC{-$XHj%Iw zaO%7*Tp7|c&9XLMaiJo2P8;N-fl{^HEf*vIK?^ii!>OB?VE*DAUtc>jjM?$Ecn|{! zZA9F8r-1nsX0vXPrMQonl9p9H$+vFC2W~A$A`=#P82g&Yiw|yni%97K$ZMW-n&xj?t zOYswP3&Og!yXbzl!XU=YH5BqiS10RT)0chkG=WzPC#2DOg4;rTtaG_OcuUNiRj?-b`B|2e3NtZ>IO zP>l)?o*la6lH#MhzXTC@y2s*D-Ntv{AfKYZ3Zfv zaF03yIB~uvL!;=Cd!qk>M(4vTfhl2GZCVpyKw6(mJ@m8dQw*Rv_3Y!0V}Pe^i*v<= zc5zi8hxxh(*?@)%6tM;}fh#Vm?QrTl%y5qr#pp@x7 zutV;x9tvvRDKUAw6FAS4&iOu4`TFEnfck{(@vOoAB8SpXAC3P~(wKSvXR7!3lB42+ zty|7-g@mC-h4+1rQIzZ#&r5s*kWcKt``|RenDZ|S=roC(x)hU!%}RHS39{_ z1%ZLu5Bl6h@l1OA@xKD}jCUG|knYd%s1beHqq*n6Z_mNSdyYQSnQQOAHrYi&r*a~f#zu+$8 zn8b8MiqEM{4CnnKl&&z8%FcVLtYFdO(&PXr3r7$v9vJOOan^=)(z2@5KO*|4vMQZPz~bH!x>r zzHTOW@@GI?T|tVX{mFv)yL=ZYRC)hX#j`haDnEK0-)lQulXN5^V(%mlwV-x(7oyQ1 z&Kys}HcY>KI7J75mBYdeQm4?ED1*YLka~4%z_+u+z?dw^7D{CQAa)1r@)bgvy5*wk z+mjl_k9Hbw?$h?QeL{HH z*FROBi#)RTndjq(WnmN*t3^6$U77W5F`;aw>CK%J zX5E((wTD#h-YS9YG?-QlNwd0=#GAASr{2L?PXcP%Q#XF>>xa~~=QpX5s`rVQ_XZUg zG7qS%{ugRv)6K6>s(9{kVwYq7KgT00tQ+)Qe0H3OG^m@o#%AvxRE#*}x^{`gcEEr& zCLZg}c`DiV&Co}DOTu@>T+=(@Wx8XQmr7v`7o^-UGN>61IMplu_4UXQ*lOf>BE9W) zbi_Sf7*ifr=RQE(v!~|L8?oNLi!Ob5hZDkPtYcg@^&fy*CQ^l5EeXp#^cLq_ll%Sv z={OMcz_W3ac=uPKTyZ%=NByFig7}YBpRC%w0_9tFZoG)elOXP2pa*WjmSXp>YOB{? zE#B|fNXXwAv$v+o#Mf=EJB{b@@>U1@-DML%<37@+GobKD)77w~KlD4=l_w6lm2|`o zs0UtzPyW^XK>hHa^P^9#W`^{B8^iXj@CE-XRv$#T_GSY9_isSpmxdRB4@m@yDbb{P z5U>~rtA86fKy=u{#p;M+t`+R$i#{j5O}hQdrrMJg^3Um70QrDzs`Ezb{c>47f9I^u z?hy+hfLAn5AaQk{+qgEH#%8I=zp5&7386o3CDfMuS7&co0W-d1H%|rE%~nBC+ByJc z&xD;p;Oe!1=&(`zS>5nF#~wh%8dKEkiqX>esF;ZR2FKBwE$pIlQz7av2`b0#NfjnM zVWg0EGXA_kh~^F=xIK(V(8N>;f3^-pv37^JmtesW1C|{oF}| z*^H;=@Vj>$vo7A+>2eV?{X%K&5FTN+sY~*@_r4 zwD6mxf4V?#CzFID-yH;@fvkJ{B zE45q_+8-I5Dj<#iqQgpZt>rHb&c3WOf32`uQ#^XCXWBd8;KG;RM*U`K&4LR<`oAQY*6mkxVE94e6ZeOks{)W%(wpmh{P$UY(Uo20z3_e%bux^QHE&*KdK( z<3l?E_OI%{U;w|kj<+RyU^ecc-;>V|*&1&>mUWdN6yNRkTW?#P1>JmrR7O?jH%W*` zfsRpoyr*N&Ubfx%W8;Sb9-s*${;8buT4AKjU1mg#15A@Yb`LEAE@4mH06lp7-(yAQ zg?yzFjS9q7qwZeMG}YMF11{C-mG89oKLBe%RTJmE^FN0Cci<4X|I$&_&tkJLmlOiO zOzc;eV_eRj5I(;XQvPDnys<+^$K&N!!O++P?LrH{vD2N$!ENUX9Y596YK! z)ewV&!29riRf-Lcfjjado%?iZ(^1M{1dpS65J_t;HC$T`-Gqri2Su-S+J(|P-`Kr;+bkdDiruOBoNA9VSK zkELGBGBnKEv#Id7mDDjFTd4Zh%_<9rB-eo+L}&>N`7Jc@ZI>V4iLaB!o){!K*2@f2 z=6Cs(^4r%G#-7`hBPtxML$5EheNN(BZa!Yls&-IAS^hNu@_lyP2i8NsLLBK9Uv7O6K z+)B2!+`=_H91)~dIb~GWq`L2rN1<74wL|g?cgcT%%QX|mcJm30$At>Fl091eCd|}D zuT*NL>oj11`B>uDg8+sq>mtD3i4UupG}7umr$Y?P(N1;qvGt;{c75clUMAWhr`xrX zUl`w4H#By|J}>DsVy_ncbTB!29Kc5q)^adT{7@TPBBNBUKn_IcSY;_6XgGCkhXuCNdzTn2kZ~2L z@+5o1hvXVg4$YhIQJ!65R>zY{HRm(|`b!MxML@rU$%jd=)q;Oj>*@Zn=PzeX{6DTw9618&Q7PU=78ZM^HSkt_Bwz8ikmYy zE3M1fUN@1#V2?+hVS`+&Sk7<@Q%bZGUObwW;Lm)mZA{JSOHn!I$p3v-Avu;v2`78z z5kds-GEw>aFi7{gi^f*S2037YoU^s1iu%CNPE|R!I1)L5*Gi5B><=xpwA-Qoo|)F8 zx__#U@>tlS>=&zb?9w0UN3-7eqwWD8oV8m@bDOdqn^W7jyM9PZp|7Qc?$fgXEIhNL zSm^3=5uog7Qj`EtMA|;vX=m;3^i#1X#ZBp=02;b84Djqc4h750>M+-#!)$%Vf=cIFu#|4QJ&4J*{5(&ZW8J_ z9gxF5Gd0WGs>7@PMLZD^-T^ z>gpB&!PUA0>d8sC$g27`oY=bt^X7P#AK+i;WK#@aclCrU4TaC?xXV`#>Up^{)y^Fh zp)h`8`}v4Rakara?NqwC8-g^FWE?*TPXVB=vI zk?LBHTk7}8i3EVEf2?;9Spxh=S#7lHEWnu_Tc-3NLdi5iVgERApIq}+P)_$8;*b(9 zp)l5PTC^wYJ}4|0bgV{Yv1aa_u9?S#j6WKj)mdk?#$ zYQ@dM9*nDR?)Q+H#?p?T_`tM%U9v43)?iq&+efWQf4k(hs|z*7*HtjNe}&Zl{>hwF zeV|uvpm}Rp-K^IGu4M@Kv~d@oRV4z?#i=ER6eg$R-!ja#U5fVKiE+<597pa(yJRE6 zq&w=UGp;*rsXCjVvgXfBK-bf@!${Pq>J^*o?*z9xFimBf&k2s$Gz2OvA8@-a>7+B?v>%kci*=FknMS#%1Sj9uNIV@p71`9LS)Z`^F=>}mprrh{Q;n? zM9=9l!()|4Dks#sV5B=I0a{Q}pi@?M|7#c9Np)Tvv+v#1bA`MmbYaOogx-~RHPQd= zLGPkcGtrNDilcjQ%#(bAD1}Nf$wS=+jmn;|?LAFmK1>v#)?=Ic~U4O^yn)JR>79!Y6^EKyS2SNF;?pFb(9vFh8S@MoWVuy;IX|=RAHXcfW2EPyf zUV_x!1M>iVfK)-XMPZnqx=7x2?rDh!PH)odp{cDzMP$Nx&N?eklkg1>j|AZ^=N`3o zp$il}u`(E4vnw3f8YR#~ik#Ms%_Vf4Ai3_6^J2h>>qX`vB8mKT<+$X=#`(DOOL_06 z{I%@%sXGangtk?*m5_|x;h2!DMy>*yXkbdbxTMFR^DG1Qymk!drTYC$UB3Ba^lR1# z!HS3N3b;~I(G=2I8?Z_=BGr=a1lCZb99;f9MegkC+w9l9OZq#0ZtI05;JJH@;AZ}n0^cb)TH_w!Oe zS`NH8L}){{3QXjFQVZr4{p_}3^tYh!VAB6|2beY-C+2&x#ZvctbOzKW0rsFD+)ILc$-Vz_hxAMWr-@a%PsBDV!kdASDT$^W${}X= zM!cj_azk_ho~Pf`=DYIr9qWQXqs0AVy}3hKaZ#_;n(dpUdVv~HSlx7syBC3RsK8tU zBACq-zQ~q#eK>E{O2@1ljRiTVDbbyiYEbp2t0=W7#5P7eRY}rLp<8EYrK(6%>Bs3X8EL5)UVAI3 zBkdL$FDh?6FM7v9Fv^FSs5XD{7I%l91>`lq>QP8`+iKk^UoDVJMKSer!|-PFKof$` zaKP)(5+N7`g@M#}3Yr{iXZ=cELAvkN6=q4i0Bn{zfe&yUSlxu3 zbOQ>4mIdc}5l2A>$fM+oGL6y4VwH^Za85-h88ec6nX+Rzyw`6aJgLenh!c3h(ISXq z-sG^)WYE!f8qCcHp2l?x`kZTTQMJhZx+BvU!4&Sh>APSPTx5P8`+_2qIO5^v-4@(# zd=N9(+JR!k70QK6dVDH{Vh`F!E{C+Q-D8@ukEiXDUloVQOlifJ8eT--_iIc#HkOZJ zqZy)~Vn=~ySEW9-C~eH6$7}{zs1~rqbl;I-Ak`X4p*sVGZH=e~FZc%LAM6sB&wwSd znUq`57m#(rj>g;0Rhicwho%PJc8wwpL>n|NwA#xjB5qSiA)(~6{%t0D%u3F6)=*_6 zJ5216;WO$l`o`faN5Tm9_VbR<(i7|v+pm{mLS8c`=yr$=E;>%Kgdz)J$j1rXkx3JBl6PeJtf1e`qNIpyM9pleLS2G@ z)OHAZ1Ecw57-J) z^gvKjEfcAYjh998yxHX3uo2U2@F%7*-XLT5h_)1-4`TbVkF)35gN%ikUYjCXC#`#_ z?2_q2Dg}wbl%saf>ZBEeQduIgt4uTXGKId~G0k&oE3kgP73FSAlmn3vzI;FZ9A#(f z4$okC?S9HPHI8GIyJCzd19X7-R3n$xa$G@B1jji982RIXzacFI8jHw`wGwp+AfI+)0VdcEp88K-3MA9f=L=?7${^wcHvaE|c(epl&q2|uEx z+f2J95E9XtwV%`ie#N^6z9-$}c~WvFZS8wO^T}YXn z2zLWECz?Hj?18y~ogf_>k&KEJ4|}~|+yTnSau-{UL*Os&z$Ec>QHRy{_996&Ujla{ zPi*9gTG?)5J<4hNVfb(o*SXfX^$zw9G;sm9ayqkR)M@3( z6!{x0gpq&A>LD^)z3_Ene!DywC;Vwc3b;MYzwJDBzdOhiKAqN*LzsK>qjU{8qG0yO z;kiStus-Uego=BbF1i-m;h=pHA9Q5Wv3xCa)LG=pc}jUs8K|l4UTgR56}8+rb*?dm zG-DzH4oFXnqn5aSiq`oRXHT{55?MgcWY)ao2KDxKHjU#8sM-|MmTN%k%1`ST7kDD2 z%Ij=A8!yskFKYj0ZH>ce+9u~M1oLgHO>xGDZdEP2oS&~_lORE_``(G-X8pUYWPzlp zuzT)T+=6^-a=xT=tdl1@3W6$Mh&MTb0r#IK@u$?Surm5+s6^FL(@&f3?};dCOnV9O zluD(VFR$V}tCa8haMH;M%8|V#UOj$D%ho+k@xj`6J~qb&2wBwi56kfUO?IFBIU6fE zrt`<>`wi?kYvXlXz@E}>&LAVtEZrPsv_@`{lx*mF=4JARin^=24==W2>ep8jJ?(-+ zt3zDBu-rMR)9p~f^de^`jL>>__UtqRb!H&Ij3dE16d_fe=(h*n>tTu}Rufk~PIG24 ze>PS$)_#2bBqqD2B*>ZccOx^r=c(3+MX=Q6_hp>-OCHzBzP>8aV{y%*+4g{3$3c36qQIv=I+9xEJ^sc$Pj_p*UOn z?xVaRmaIN)S+|E?zZpcn-PyE4Xuy1O+CNQey~nuwG?T{?^o1Y2n42v-(c~!Thz);! zxb{|RMbn$*!0p@DZUIsMph}@Hoz5@pa_oj(UI;uJH!#I=7pFEKW^~zjthp^yYA1cE z+_Yq>FIgLr={V5;9sZ!JD*3*_6`G!y{d2!^~6=+G}{#1*&fJttUA97WyvM~NM9n(I2R_X^C zShIY!nOHz_YT;ndy?PAVBYVx2f>WUdHPFa&_WzK6ys}GoTGS8VCVo91xs=d`k`=#I z@xMknTVvIV1!maoY&&>54-{38G0uBdh!I(-cAt8*T2?PI;M9oe)mocWxEG z+>SOq&w6u`8B3MJI6D?IO}Mi1+1@MR-H~W?`j_;!wpdwThylL{eo&IY z-b!{KUEB~D<+Hw39((0BzLPf!vyV2k`|d+=0zdS&B6+#ezI^$U~yxJK)a>2&nWvw0Q&w+U1rB1deL0Eu1iJ6&;Lb#;f@S;4UE+pL-5T7)+oWtg$ z<_DI8V95y|FSs7@J|BMe{g!Tu6Ay02TB$dT{XedcfA4*F1JG2w#Q*g#WZg=; z(HzFF=xB?LmYRiGht2s+j-9-@z^G{2)p8NN#9C(zXZ8rlU5oELp$P`9n|CZJxes z8}YA~6(SC*9(>z&2TZ4*8i>Onbz9`kP*Lm8xDW|PjQ^3CuR_Rcx>~tJew~!}&bJ(% zwh6XmBP6yTK1#@=smia>wH3|&sY8v5|Clpc&p3Al;Dz<%_sYScZY?Qac+n|_ol)_7 z1HO0pP^rYS)P>Hrx+C~!sY8M{i~n+;I;Yl&`VSYWoqr=g(J+>vzM%TXAfv#Sj&0P0ObDGmPEJw6PvzqL6FmX=h1$@13MZEugN+0 z?uYrAqLZ;4r_VtYlO}WOU8k;{o`$V~K|*zdf%)xU(d`sfXRx z>w3&pQGpJdlTKTlirA+OoFd)Za6cUIxN6vIQ@g z@(`~WqKro;R$4|^H3^cZ^# zY7(<-e5KK(P(-rnt0%k+9*`Y}JDv~Nv=}kibPV4+l8Ee+4`Big79%`s-Yz`vtABKG zsp(PLXf=-VBXBcri7ik`A|LRN%1tc!@G=FSDeP{+F=|DudL7ppeftWbB6&oL;72lbr5u(clyND}^e;%wZXp=Z}GJm5Ed%e;%1V>eiwbldi6Ey$BNjmc}V zokR&}^&d$U$c^6bqsAwV)y$wTLpAI>w{>+c{+;@P4~^`^P1St8jV|#8Y24_D_;g0; z`>c1wW`~YX)0e^J&~|7X=;6jNyH&nQh^9CQoF~OcykVzb%_ik;*u?lw2aS{MTl-=; zPriXtncCt6ywk67d60kV!VoxZ+y`=i`y4{&US9nN)q%OpIx!m3Y$;J;be-JS6)g=g z2mn*k(rR6}=5atLo&xSNyy$Gy=&FdA8}cS6q|v@*?DPRIQs9lkW4d?1YpgU58R8CU z?&FSv&hu1wo6w6+ySBU1+7gc8w459}|MZtVY5Aw*VCB+QYRyG^*?I4vQdSqcl^w~b zd8hHiEhB*fq+NA>_ORG~DbVjQbN~7Ic8j`a_|@|bV^gd%8}ag;;sp9}sV)BOl2G0q zd4;k^>hSBDHg7v6J5lT?CSreD9%iCLbuzN#X$&ipk;C{xc68VzYXvpES|fcYI?bw% z-9gJ=LCu|6T{wgcosErd#$h+HR|h9q`gG8o97PkW2MlY`9u%& zJM}|$J|CMVf;)(B0nDK&oO6*&hlHvNNen#zB5W-PIpxeC+jloUhd7E6u)T z+<_W=dPcN?xuBiPn_`J1hb1%0p#!-qINzBz^6S!1PNBjxpu=Q~Q>E8hhq}%?PvU?r zbuE2P>p=`Xf6V37y_*iB8n|;b=9C4TToOI$a@?!>&b6R*c$(vuxtr`Rg-(9X)f*0u zdDk6fP`Bc4i!6=bDYV>PQ&l~9cB>k-ot&1|eSX0&f*4DFBTkW7&`ktb>!~Y^?<_|g z9r9;g8-NI2g5*D(jdf^O_6px7sm%?Hd<>l8e#H=}X(1v*{5Dbv;@va@KfniL{ZVq1 zqVysQE%wOvOhF{*DnT)?kl5tYGmcTk|D4Ax>2EW%MMs37fO?SH5oj5xMf@QNm_L*n z->Tni=t@qp34&2Vu$913sTSFJM89$GB<^0V&~F+({zMCMXRS#$k8MAqO5a(yhcuSK zuBjTV$f>`yi}Y}^;+9z{_XF6FvYl=4=cES(hXq4-2zuV`Na zW`IxQVkm;-l8vn7z9o_1c0J>k^n38`-p}}DV_S9t=Q?u_J4S;Q#P;AHId!KnWUU`> z7g8efGSL9NW(o*{=CvqaT#KogAgB@*5sdeugMq)*c4n`mf?ft6ZLH*fCwXAsJCP}$ zlP-kWg*iNK>4dZPC)eUGI9QejT*s2PaJP;l;l8(@Jaj>ms;|F_MadtF{$med4lnhc z-P0R3SsCKSMH2MfWPp)Qecyze~ zgBTh}^27&5otImln$y?)xnZAQ$|zUzNob2ARHw!_3@+LFOQU3d)!j$v_lA>p$IyL} zk2JOUEs#2rq4HY!w7VTCbmC)EWU#0E=(i1mBA)PYT;q| z%lav#yf1-&8+$l`Nj2#!&2P~@*n{@=dZ|+Ljj#<4?(p!O$@3(>lFyY0DRIgV#7|E7 zZH99rQJMFmUxL#ReR`YfHYQ~O@LgyQ#vgr{sUki$qCEn0 z>)2nCj_}8XVb6OKOs$!kK76qD{J_3C@!P7lco#Dd@sk~H`ux`w4HqHK`Z ztzzBHvyEX%jF8Ui_O^~e7u$3urNE>c>j^XxANgTz7M($|c2Dvgr=|wh5)HAXYJ7Lg z3|Qlzw63LojMpTd7x{$rRPA^MR=^&1g9R*@SEA#&*6cXR8}?6)`=u>mR#u2}ZOO*| zEeY5#P%bl){YI=wQGr`^xk!B}o+VB3UJTGCQ$?a8F<@(m4Ft6Weqz}u2%&D26qVs^ zO&y^c5iLpMRNutd`iUT^sYK5Ib##1}eRmDWAf~uI|Y$ZluXtYBq zshf%fqNs~a z9L^hSRL%`^xPb}~53LLIr1%V#3|kXpMW&qH&NdJOhl_Y?qK(R6&OKa8{wIMG0q7uATze!)dA72t+SM$YqP*2k==(p|S z;sZ*8c@sKE?L4iV5a1Ag1O9hF#Pts*hM31^D%ds>EW>Wnh3@e`-A(W*=_8h^q)Y;@ z{EuBK(h#4`2+AmU;Y}BsGQ&BZ+yP!Qcukhix`J_{lju8h?~2O0bx1*WJ`OHY)+~Vm zx(+dC)Yyb6Fxm%|C-G6f4sJX2s>P}(qiFR zfZWiHA*f7lzjz|}v|7-1J$oV1H$;w}nr7Q(FPmcf;f_ju1${PULV+*oG4KF0gW*Cc znr+Y|rx24_5)nm*)meZ{)~g{eGOoWUn{7x548y>fi87aA|HCYl3zXbu!p1i1<*F-K zSE>=U$xw>atO-4eCFl;Yniy=9uPwrY8_8lRQz#@7ClRU108v1$zb#~yG8pzg%RxUu zFtxH|9a1He$}`pE=5qbWt>81vc`+h9jeCu`4~NFX7u}~xwv@kuxMo{UOx|IZ-o`8O zG1~nl@Fao6?Qi^o^rZvbnW*&#uV|Iu$WV!+n$!i->TT&>08FRJ|d)au6 zLmAGbz#0PBG!A_YLqHEPb>Sr;zEJpk>>gbR%bP7_H}iJNQfM}=q(MwD5Sq>Ry;Ae{ zIQBPqfTtk0$D?~|;Y0@#nv(ehiJH+3Up@fNU;>rHd-G5&7M&Je6HGrgRh%>&{M8m% zCu|>Ujc|?N{e$pbKE=(4u5#UEnKbPre^=_Rl7FZvK@!SWoEgvKY@O(BNKHkZEqT?< zUgWHd!T|U2%BNwx_Gt^s6}qdSTYjtiU{`5KTLHzVqv3nuESUY?e$H{kg`H zC*>H9ntNEgQl~*3qmZ-fbz6_KT!!<7_zR#i$v*8ZkpVl7aXqlPL9#HaV&TqQ{}gIASx3Mi+k3e^zu-q{;fmeuERiU4iv%^9WuEJ6@LonZN-koqVYFKeQ3p{oPhZ-8#i`&D0BF*4g`mbFu!I8PG-ONz`35+p$uZAh{arYhku3Qvn}f zCej3hx3kfISp}nNct+Z{AxM@X`|Q^CGh&qtOZxE_a&Hq#=*;&fj)Ed(y^vp0IyjE9e{!Y^2&|v)T=$2Tex_Cj_n2wx-iG9p zwZ*Z5Y{BjB-pqc-+K?t);aLcT#bQUWSJ|pKy(HfOUmzx0RP9@RJ%EP5yp`Go&uwy`fd3 z^*01fK*#t$LnI3aTb?>r2f>V?5Qv)l50&8;Cb`1SmQO+w*o5kkVr+=2nXZy0kHiUb z1SK}Lvpy-NLwi5wbvs*=fbA9Xk@c*A^%OM`&#oma)lXASSPiAV~~2#mq^B&Q%$LEgBFOJzg(nGoyRS+hUQJG~2t;J{o^FU3?w#S6O! z;><}o`X1z9|LaH~T@9Oix4RF+==bVJ??CDAZGNe;q&?{gY0=0iw91!Zf=AjseNjbe zLa+YTSC0021FY1I(hYYJUt)wiN(q-)r^e8R-bIWU3x<@UrGBCAlhlF0D?YEY`WsUw zd#F6)K~Ngo5tjyUrZKv2cKt#ZaxFfyPMgyQH@Gp+bOZ3TZ0_Iq-O_Sa|u*%53jx6Ae*= z*aniX+fu+<;Cz~vk&|#vc=sQG;SgR>!ZzuI5G=~95KX#h#{Fc|N#CfDq~bBx4JV9uSb53G-nNd+24&NyjrO4I==7nLm)2=;;L3AEkuJ;vp zROTY}lV!**1gbX;W*DvGTIz-3$(by#kKFK45tgbBPuP zL{Zq(#b1;;%aT%Uk~|VR6DdDY?c9gBL7O?gaG3Q49yhidG{Ph{Elgl0RCJ<2AuNEa{+y+n#-!#Ps(ei$l(JV^}Q7a+DP@GY~bZ`ne*wj#W z2NWX=N54Xg^mb_=MpNk6f!l(^i*2{yOENM(edMG{C@H6czu*~f8YruQK_oaCjINN{ zFK?h-8|2z>P@?$8{m6JO5{kh}^w4Zmx=+47Q?1~$Zmx_ehf(qAaa;yh8F_6u&)?k#bL7=bs5SO(!x z*axfCz7@YHDtv>Dq zq6wWKd<-Ph?k=It3U3jMxXr+3UWzR0$1a-XqAxVi*JPDPrnP7LK`Ch7E18PAmEb0vOGTo7E#`#{cY9mG_QJ=M!luN7HZSH(6bnkeJ+VmzPmf>@R8f7!rf-i!Qxw`aiw zsRQ@-w%Ug_wo2F)9;?VEU26uJ@A=H++46JnNAa-{xLbV+(o&Bn`@w96fYkn2Duq|a zZX<^n^O0a^O->5!x-RUfLlttHSs9{_1Y!YPB4mTKSnlk5jPiN+45pfSCMFLv#U#r@ zD5r<>L;P=1v{-&}kOnKRI1XVQc_YVOSkVOaIk|pJmD$F;Off$v0*RfO7m)s)| zT;d2gKcS?;TV{Dcb;f;BuAphbFUi9I7jG<-oZ}$lu;-t4wocqEVdt_pFd(z4ik5iMYJEjZwU9~SAPhk@tQLk{68>}p%A*<{PqAAL zCy%H%{@X2a_omuRkErX=`0%S0{ypY2H3ZK(iO}UA$_nvGWO~s9Anr9cQSSY~ZKP&W z*lIF!N}B9MBR|m9x%~^V(9D#PQ%`_37MQ-riWwoVYnkM6)03D_*j>7F5KUg5t}a|) zIvIT>a&ZM^RzOLR{FeA=?4=!^bdlAq`y@&~G4*gqdAt`7x|B&QCc*=Bh!-eRpm+*k zlfJ3mCE;CR_lxcMU$*fJYW5g=lNw1;XJtwb5-!Vj3GUF$NbC?FE`r7sVDw1T8_}Noh5VTncBkK!!mx%?piM=j@VhpW4q&J0TM}5gb<{;A%BSEuG_LuTt2EV&THr8 zs`W{#y@GLi-@yNgp|q;(dT{Gs*f@|GYg26ggG%4uRl_t}m>z-js#y(RO)N<_+0qLD z#S5@W6rg83QUle5`UbLFzKZjt?%C0PQF}mZ)#D$oYH8>51=P6+1kWpmo6Usn$@kbm+sv4 z@M~XY%WzZ|{)W#SIU}Nru!z0cQ0?hUvFqLnaV2@tXk0a+|T6cN#cML}&9g3LsA5_V9+ z7Q$u_5Cm<-;4&&L3d*K$Nr?-hRTQn-_WJn#fyq4QJm>uG`?@kk$H5fN_oUjiZQwdi zjkODst!072)QvssxEyc30bMGsk2qIQ{YYj5%uPziuM9a(TCtG!@fACRO0w6+B zO#!;e#rgr91U&s^g)&=x!K?O;-lDUu&hnxHq5?7)l~{N%gC+)*c!(i zK4$BuuaEYPv_>e;F*&$55FoOQp?&|sA3bJ{tdRLP7R&^=mT}ZIMpwIb#dPkcR-tIF z`>ec!QYZl*tq&k(&>)L8dTX>+Mc?4zDA)!sAXD?FXvgB~-8&AnxFacz?UGtr)y?SP z)XWB&_l&?DyBSJTI|EyptK&R|d0%)8m4&jlK9@L;j-6{a4*Y^!O8pW*taT3><7Kpb zRQ#8)wUJd(5Z2yTKhe}j{a@#d8bwW}L}1(X{~?XYw9FEjLMU-*O4VYqvTKmWl~P#t zg+i{q{2-~fbuA^Fc6#`LsBR|Ml^a*La52749UlYqCNPfa=@jf> z%^2G(U~5g4S?%O@H#h&avH1dZ~l++u9HR|KoZ&sf4T*be*D!3V6uRkz9#3Czm=e@{cLhgG{cbeNpEL-iEK!Ck zE|H4mC&3SvzQ|@wtDX+;maWhKS3eEIv>%qNmQUdo^P0nE^P~9=!i<)$t${6R=p}tL zazfNWlZW|B<7KG#T03G?cos^1g?5XUJ648slX9-J#Wj5nzt|V>r!eoe2}JqJAV?sw z%~Gj7+fK01^@(;rJb&5z)+Z5cBe7MLbT`ybQdjQXx|N!spQ_#o%2AQbt;{Gru7^CU z7O6s2r{E7V15n6l6QIr^EwXg&#_=^EUs*h_q6K)s@gWO5W=k4PYJyd)oo%DCTtGK* z2GHqhxvrH0xW$>d20Xa@%iDL|k_%Bgm1ji;F}iL0#J+bgn|8OnLN%XajX#O$cxu~I z5=%X}c8NNjW_}pA%i%BgNb#fNR!5KjdKYqUWAReE>4#1RbN9UY!`{Y%wn3?WoPT6Tw(jyOL=gI;MScFEpn}Yf598(Uwh{Vm#bD=UBBfo zmT=3l^JK=G=IQ@kTE`9dh_YQdzOzj-$%BSiioxvLo4y3?IQyIL^n)$aI1^$mC1yiN zqJ*YaQXE_jt!jCu$6qG>@=PQp-Tqg4(kiuqUx!mhv$2Cz8aX77RX3y!7XWkxDkNx{ESP+`s`>-*KYm;1|FY|**&P$$+ z?SX5T_8ay`L^S?Va`~{bt0-3ewK#ULEV~Q-*X>EFY`r-y*yqYWmESFWmwoMY`nXO1 z`KMvbwViaW1!LajH_fGoim*AYz`QK$(F$E#vOJ@iSN}3T+4ow&?&-VxMui(2f25{) zxPJee=5CJ z66NI-)e}7`h(=Dg=odiohF&C|i>aQzO1TH(#UmYW{O^a=soo)B2EJHdy=b z?zkj<5_27M@O9X9h2&i9mUR`UiDE^Vnlk4;`fTPIdvbJl;hjbq+3v)H(T0JqSB)aS zu#-0ZygGP$#W6{(pMC1XVTlyY~{y)pw;ip9Nonr=4qY>2c|8QSt+| zx-&z-c+|6B9j@HOH&ae#`>3aw1aN(5N{ZKuxj#-!5x8LZ=st1u=+i?5lIv6aBF7!X z-l=CP7C>&-FMBKn&&NIro`y<2O%m5leoifqi+FThv1TqxZYvK4Pb;1%2B5Xtge51X z>bZQL>en>IdBi}6jP;m(HviQ2)@d}Z>-?`R9X?pUtp!vy$)q;eA)R}oov9a(bREvD z8hhVeUv|$cv&}^Qnb@m(L1oc)VjbqP$BtNSn79Xyuw0Xpg^G-Q=;yAl+iJ%nnhXFds3uvg|^GQI*t?o%!Granp%$!pvOsrU)jO zJ#`g21--C*q1)nM>4^F=?h=P9(hZLEtkMkEv}<_4L`w3dwAMEWLA!``w39uP794T- zvNEFoG<)ELvgE-}sq&i={DbR_8F}Aqa-#E3zB$)#cT!Hk;8L&ISLb+If$O`1d(G_Z zFdOvGk&z^CZ8TY??0xO=Ev!*+8f@eYV{cnwalvm+33h>w<~dfk?+mmCVt1>%=C7NS z9m`>YUI6|%GyD!iVaxu&AWBz%3-rA@1!a{ zGs^R-|E@rKmHT?}yGQ=6_{gnl9b9RS%WUvEe3Egf&R!MP9M;6y*(op&Eg%>_+x<*J~!(AB!#sQ@G_+-_{Y&w<$A6W9yZkZNH~{F7GhqvyTrh2+nRx z`GH|i44p2XOO>BB@es4n?X_*i?r+8g+;-b}HD57l|AD#_bLHuM9QqS%eg!{*JZF!? z8`JL13{XBVzfqCnsoS3F8zW43x3nnZdREO5AM*C*!wBJ1GQLCIV!jK?N^{hDeRF)= zk0*XR!Mr3MKsIWt5&S9zk_>h#;!>zgG1+S1vC%IzIO8%<%wSI$@6+ZM+s@^yM zLsaI%hk;3&LGOE3Pkr6VLvaCRz!kds@#A*fPr&YwY@c0MuFXg0@6_{mWzFoRU!k1a zYltdIY+eqyc6~iARj{OByf~nKRT-Ez4jrENVW+0z6`&gE2E(8zd8$!dfAp=U1 zyLoC<$MqwpA9>c6zhWFW56u@Zk<l&svdG6!3fRE?RrL8YQ zhta?N*jRD8oAqbP&6e_+bH@m`uD*wNX}PUG-YW$H%4$E=!|WtU8F$Mtl>TB<~ZiG%NKBM&H2NgS7(lGdQtc?NRqx6WLy{U1xG3DE>z z1EQkGLwZ7gV#VkR|G+x_53um~dNmzeQnP02x6hTG@rD2 z$m44H4({W$#6RZi)N#N3I(aAjVmKqkt`cQdvjlA$j!&h3VJW^BPwNj6Yf+x2U5Pr2 zxAS$^-}r}`b=k*kIP$-H8aTEsvtj*CXGLAw()cHd`XN|!bLrg7o~TDlZT}4Z8}Kb^ ztJox%azo zNgZj~Pa{vJtEa;A9#xB}O*4A;V9n5h`~#K5yQk|S7o2_Yjqku0TsOsr#l)naizezz zTgl&YxhbJbp<77_t!zrKXGqsTgN1b&I^FVQYZa|y8s8QDmKT;joLY(immj}Zc@@OA z1vXT1g0EaI-ugMQuKIP@9oxy|>s?o}U`9K7V${+B{{V_xJTbJVp9em>T<*+vVpjY{ z%CQ?r=2l&kWtgn}5;;BS)@z;$1+cd3njY;B`QgcUW$bl3$5ms;ab9JL`QnZoW53&n zWU(EO^bf{dt4I20y7qRwqIZfm%#Q7Kx_>>N_AITOS$Or#hxDDr+hItE7Xgg96nC0H6kGcpO3$N<8`O$TGW~PY|*8NtyTWhn@0*F zU!7_7`|)SJ=(bVnVC=r^Yf;$S63My12A?y}D<1?f|NHg3VCwV<-5Jk;DF*lEPu+G? zZ_h|dbvEdP2a-x3o3Nxy4!X35hZ|33o*ul$64zM#Nb3IOKo9d#Ske5Zkg)y;)U`y= zZ7uwE(ZRe#AeCfiHo)X5wWU$s<*?H;EmUzNf9(CauJ(k+tIapTCI8@DA8|pJIh;m& zfMKS^fz31PHw)IY8T9S9$J5?Rs}2Y1&ZKsioL^Kv446cmC*5kTEt~J|64XaF|DDSF ze0iNPjVF|Jb(Kxt#?H=fc06x6)mq~E4T@H89Krlj+Yx2F^>*sB$yKtczo&Lm9#n@V z9L>>;eA_iJC4S1nWY0X$Xn$M{+CQ90p}+o}z0nsMkE&VI?x8J}RCnsp zFYd2LDkEeGZWw0xG<8w;>1@)Y>I};32;&77)oUSymWk_u>SZh061^`oE{<##(GxUM zc3E+L{Jkt0sh6dzfz2I9gbxnfew3dYDMY38U;nl`qOxnFI6RyUjs_$heDh9zBxX9; zF;RbNSnNm6;mUfoc5z#la7_G=e>!(G8XS4sCTebKcnEVmq}U@a3dPN+cEv4#kmD_h zO%M2zB2u#EUWTM3AF~-#p8}Gbog~=2I@<7fMEXNb!Jj8Y{kpDmYUG7Va6mW?vP1Eq zySl)-5Jv(hP^y?>x-=Q{LQ_}wM8MPr$)5Y+HIGkh@XYK zoC7%S2?&O+Umewfy1lRi3+ivEADEZmv94YUD<`fvbeEqdnja#*+0pV)Vd0Zfv{fLn zqN|pmQDo;PHG?6Ye#8BqbG7wcd=e^O)?!lGWgzyM1V>WpTBD5D9$cp!IAzN9b_)5o z@Xm{|Q~EW`(|#Mpk4x2K#{*N1_-^E0&+@4QWyi;DFe%eSlf%Q|x7Rq9Sthq6UA1~F z5S!V4Qrl68bLd6tqF5ca1U4hGEsIvb+SS6k(Ep{W)DtcCP0@O{kzPCWeAx7ti}UL> z6W5#lw&pAVN5827Y1bJarAQGA=ESJIWOn&qjE_I@L~bEUWad+efG7O6Q_+jH~6-`pcc|FI9KEgUTLRnp3)3nlY~WH&!}WfxH6D^-jd6 zKlO?%oC4o8UFwcf`*Vk}pXR?VwzGrZJe7lT%(vzRWa@beZs+5aEzAZ?m3$l@nR7x} zbvlh{tjO|ldO#cqW+@g6|DlQV?=&UY?n?^c|Il9O9!BBGdmty|AKI=s+~~}!?xB6@ zdG4Jl1QBFDa!|hk-!!tG_4D}tlYzHuB$|1psFPS5MmpN*)k0BA(r~CHqr4`m^UNW8 z@zb=P#e7}czo|>X2hZ7EAZ2mlRcxZj)9E)~pTyEtn!u8%l91gI8|y8a(#T2lt+a3? zSS>+3WwRYes&7qyw(%Mx>#qY{SDQS&HG*dkHCGl3JfrM{`4^n7kvd34tA)2RH=M*TG|3NjLcFtb~pVxwUz%v&5&;^@cRN;(n zK`L<#x)B1>4-bn{y_|yTUhv193jY03c_w3(Q}nanD|}6lACtcj-#L2u_QMPD&F@RT zKc3jx&0Qd@q0ql(qqD8(3ALpsCxa#7aYy|vc~`9G(Vr5w=d7yz1}jQ~4C$cZQaE!L z^CAt2Yksh&ta0%t#~KGDV@}X5Y4ec_hOvIQkO3{Wea^wyFfKrMNOT2z_jI08A*s5V zaX#r&!WWQfmR)l|qty8P@C9>kzk(pXd3Wzq!R%itkC^Q(?WWwN?$*wLl4Q%I!!8}| zu<<9X+)wW|fA4XtYro=l;!POi)??LlXl}is%b#O*Nz>H>tt0U&^A`&Po(W?xTkzKd zpzqM2PlUy@gHeZHJePF+QuIixzGrbR~Wdlo$D2R`eq zK!P-R?s3G{0eH%^#;%@UR zoe?i&{o=o}?;dPqIu4C`)Eb2z0UbELt(EkLW3kZNc_csCs*`?zrZifs=bPV#eYI33 zwfPMaqs8gd2QZ5wpio`RB3$Tr$yng_lKjoDfh!QK`X+K9!AUHexcD+8sML_&O!@0h z75a-jP@jXZft}3n&0U`3eY-5lAG+z3BguMxb*c!m4#mXc`e9r)R?N7|Ig!A#+_ZB} z?9~)N%xFoJAJns!oJBd0cGI!LuG!7^Fn`s{Y}L&QW8jClq}y45S4_**LmmN3-Ldq) z<}1INFM(Wh+g)k#CTau6$v1}dGCHeuEtNbWUa+Y2c3g_Q(lV&HDG$U)#s&1OL$j+x zceO|AC3)`T0iD)@pHQrKek09=Ukoo=3yfUOIc)UZQHclxnH>oY}p{ zR%m}^M}}s z?>*28^sp+U8`5!`*2P^V27~^tlXaaL*9Pkc740p%V2J;WW9(|FY*!XIhrV6d`$&`d zwPA>VIyl_lDtLxFkG>^QBtTt7lG3PMeuwp^nBQk_7xQM-mn8PhA8ksh5fc~E;+bv7 z<3j+CYL26L@a-RaaAY<%%W5YQs5*By=k8%tD$Z5GN{vv~@zdfC-G0qJ>5>e2n=4?2 zmU$&UJ98UdkuzD-%1MXUN8p_NyYwUwS?=o&_ z6=|;8dXN9caAIFt3!8)Mu`-{XZGgidOla1#Go3Co@o{olJ4!cQaR0l&fGA3<%YZB5fb5>6-a)uwNVd+qnO+a|CZoO{lT=>?KYH)1QbwGb_}-Sa zGwQgDwcBAA*`P_&tzVtO(*tYOgZ5Xr0^XKTgPrRIGW=oOVSGEZg;n%0>W$sLxAD!D z?Oj5=jTdgM{vd8iu2&ow8Mb^uIg}r3+?$X+e~H)PsNCCH-ukR<@W)@CCe=MxWet3- zd;}=2cn&%hwHZnuF_-zO&jE!~5&Z&>>E6Dn zD(Lsf(6Ig_@c5-)=22?*{lAQ9x~>{}^9sZpUvxi8$`>hPkKBH1;>Se0RvhDmW8c#H zyYQn`6K~hsuCpoiGtl=+^2;?&@@dzk2q|Jy9VJz z14mAOi$>CA_2#F?uE4|UX>IV5!GjomwBNxmoZIJRt6A9@^3%BqSChTG?LI1OEuYhJ zc8-GjxmA{dD08HV9SBuQ$9i%C`NZ0njjviJ^t}x9GSOXa`6yVU9L|E8cd z>VxN4Xl8M1b^9NETX^o2r(hm50-y(O05bLNqNWM@I^m})8;@S&fs@o)3norHsEj}O zgbfy1)bD*eIIaI~^lr?+k-#{0SL0ymR3#)Pw^UL8jC`X2EuVM_LQUickiC+KvS%_A zz)QS`8|{(n&)qq33mf73r{c-n4cQIZxcPfP=y!S;jEhb88DgCdbegVfSE`)%Itku) z-(rHkQIXtGY{)yPe^WN!c4$J}%?iObeH84xYb9UP`(Q8p+ zs^RZ$FC^4C2W$*kC_4%Yh_tCs4*?acuYz9b&cys%T{ZbBrJL&_T&tiftXv*g{-aP- zv#^13#z{3lq`y(=q8WnKm8>ygK+P4(HyR6dD(5S*d--~Pr&Opfzc~`IBd^vo{D#0W zx%+ZKD9-l2OHBUZ@p?g-747he{F)li_*$OL)HlxuWg)hkC~_HkktF?ITubT5sC*}M zNRIbj-brLNvY}O?RynrgCm}DyQC7TZ-%|X*JbNcDL1`NE+9kSHc$ri3fa{xh`Frm< z!3cNa-dg$_t5`Tg9iMs}Jd@l_ti4lzzrL4fKev71x%(TAgW#Z$9cr55WV3gtT==~7 ze>~OPYfCE_{8TkwWwmuOvdB=~Oxxx1T0g2~DjO4M+_QZwDP}voC_BvBAj%b$5t(|R zn)DSj2@Oku(eggFC8-i+49F68jRN7&B|;@F5dB^oK5UciU$ke8WBFg3`;IYPF9Q}^V$Q<9n76fr$)2UfEzXjz`;!5K6yPh0%l1oFVajE{g8!7 zN(43K5ZT|PLP8m>-DYhxjwV+Ajv9xUvMqq^Pz41@0dXWYC5LKAdrfhqoM3s}Ah1yO zOu{k;n{XKfVXrkHZ5gWZw>gJx#odsNYQsb&x}xZHLy$)v-Bid4niaG~YY?|xWE!I? zr1%)iy6^;HB;h&gG_(oe67wdM6U+vxmmpetW*f;7+iDy!R8Su5Vr>ail$iIpqCF>2 z_HlSc^H5g&o<2$k^^SVK?u^6)9av2^LD^(l_tFvC6#aY8#5STKHz-D(*zDyy1{$FC z#+A+mLudR6rRYbnIY3}mJMa18|JDkA4p?X+#Jo{?AKRX%r94JG!UY@mJG1)1evn&! zj1$QlBg`1BBSL-b1;X;=8LtxA&j#VhI#{ROuT&JXIr1`y5*I6S8qM`5(6GaT5@TmB zr1Jep@J9k=RkBu@zp|~ES&kyXMsc={*SqXy8zMU_e1rHwV6Je4tEK%$OTc)6rn5d1 zC@TejHv}fxSi;S65RL^*2|RO7F@(yrX24TgC((8^LyIQivLR5L!L;W3q*tlfC(vu8 z5M=WlWws^a_xFHD5nHk zhH5cipi#h0XAz^cZ1(3p2j>Kic8e4rK^dM89U~T6G|d1w?sKA=o&_NQDZ7=Y9#rpd z$w2XRXBfV1oMJ_={7?Kz`~ZGjz8~B)>Z7?(?z8;TkQH(Ru$*NraOdoN(Pr>8@H0_X z9?-_!i**8mnXyVojn9Z6pX;^q?;$|U=oqYnY}uIA@Q{h3>q;imK=o0fH$JX(;c~-^ zwh6m%pO7JdExNu)i3$Fj7A{>o%J!(WmRk-LtNg}nSr|j;8GzNV$zJi^$nXmF9x4YH zgwLM1I8z@MG{(te=bF-*IX>o%T zidn*+#63nbfRmy#U3roMC2h3Ez0uw;lBiSMgTG2WVmhh=T*zOsOVALKU=ZBcX&{1$ z?C`S}QB3$mCc^-=9o{d(->`F}mMBUMO8VOG1e<) zZX`-Ag4{7~TC}cOX*vqOvnyw9A3vm|5cs=-8_*i*w{`Kqquxt*jWRU<{|_5}25mFu zPuv4&Mhgs`g9PS0UsUGp{fpL4e6IIKcDGF^CP`|h$vwdmdvjq*hzn^#>!hrfY%B_V z#cIGL!{3Pp;Q@-~0#LFhE{LAqyhd8l0oO(;JjO@iGDX`w&C1occC&I}~xxi>+? zd6W=VN;i+@Q~dg{2aUg1Y8b$nouyIFP~imoBX5cxf=*!8-ZuU0Djz|;R_szt8V4$W z=`t$HIu`mnl%X|cvWebBRegXxuaE8^h&5Ur)0RteL_NjRA%TcKT3$$bjkPsuRO7@Y zMtqrkd1&NkO%98`FJiS>`=W(&C9nkWVc2#yEYvLkAMG*~JMbpiul<%Tfh(PAEWGV` zh@1}P$yUe`5T*1=*XB`9G%#5m&xo|iM`arY4wX;rF}0niUjq$|eTKaodyuGIjB%hR z%E>1jepydb_fZSTi?lXDt+Wiua`(yQ{0=+JCrE?(x#`~M=7l!PfE4cYh;<4Ya_&(K}!);5h86H~r!do>sO>Di;eS{h~_AHKj}`>oOi?MAuR} z3sEb8P2Qnp97o}^!VR_~l#?ipthN9j>L%Jk5DrtOu>sm+%otHlwckfxHE|Igj9V}J zPPApVWALI^>pQzjmC4=qv1lzZE>M?0lzkBe!u2u>;s!1R@p|n{RK*HkDY-~piZx%x z`bEHebxvPfH&`ub#Mm>fi%RaW1vYAo21sSDjA^X&9kZ>*`63PoN!p%S=K|gjmD>P- zK@1}@^es_0eoN-N%w(=g!yDvUy9{aw?ErQ&z6W;}aEoK=ZFF`;Rbl>fL|;sdblqq$ zR}k0oi9bPEM`2NRP`=WVv1ppBhAs9JbGR2Mj2XL1^e(7W_6)gYP;;WvqJmK~S*s$mQzXoM&YLEr>c4nPUrgKKW^AM?AQ2$=#P7O7qM?yX8Z2rFbGfIETM zp#Gb@$lJ!PP<31)W>9v}?#mD2`QQOyXE`)iyi$%` z0D`hh*2qJLP>IGNO1wByQwxz3(C-04T&!+Tf)WSK`V|^iIG^jQ+eWfjZfUKkV(2`@ zFH&$-Wqzjybd|3_PUvLLzjUn>Gr2W)0#9I5zyMJX60tEb*V=daIMX;GghzB*ueif; z>xerEH(xs`^ciT4$O^1A!5!J^*eF`jf~x-FcbS}&QG+Lx4Z+JsE@HyR+J2P z0o#WUec7Zy*KuEB{qTI;Nzg}-r62%5D0hqZOqQtvyNNS!0#c&=F76{%+O}$ilzxL# zYIlw{2#(_mq>p)MZydM<^u-E5M=)kQM(I@)6%P4x-g0USKMS|=kAgD-8vI)3i-ajX zV(Qz}lol6$nr;5Fx=+HJP5c_Sh@%JsBhUk`LU>xU;h=H%VNqk1+PFyB1{{ML0Y9aM zrW}Ph7{kTN$QH;t154GihgTB6cd9OD=7s{4y}$TYFXsOveHhSRW6|Lv{AfKw*^9N6 z9|E|m&qHLD)R4=mVB?CHuYxvcoH$f_$p(i2`V`SB4YQwLlyl66LgS5VAL{GGbViE#p!mirUaFy7j2#A<778UTq}m5PKGrH6)nmt#qc6xbn- z+BLdM#2w;bk3E_TeGM-e0#X8o*tknv)u(#7$L0>Gr7#JZe)il3Y6$weH0)K-1PZ4- zBkAbEqJu2Z(|9}#xY8J7#9Oo@klEr&Ek^kRLBJ+`MKhsx+5Xi5lTn(|F!E2W+}0dZ16eEcbh5#!QyawIlc7%4@y%XM zcY+OQbQ&FN(l~k>Pvt(~juG+^P`y`XY`}L7=r4Q8G_{G8zrdrV*F|n({wP27Ogw9j z>xn%nzovLECC$=~HUtsYplL(-Vb)ta=j#)^gLsS38<`hylIcwxkd%oAkZdEek^aEA zS-RQyUR|N2R!NBIoTwL2p3tw-7BR=?fH=n6dO0%L7E8uDihJn zNB55ASYti(X82KqymDa9ItY>#IPF7cw!UPgkd;t9;5Ev;VG{(OP@XLg%w2|3^F<=! zC2P`}68D5F!kRc3Cj1)kx&bOk>oGlYXOO>)SpFMB`Y8D*rm>TgA39);IE5i8G>d?a zaLfX6XDF-d+n6raH0l8DH%tJqu5q;!KQ%~G29emPD)@lbgNY_KFXj&U9r6W`Yy?oA znV0JFi9z8$Ma%cf82DMgGVY|3;H~Hc50G^5cG^a<-*w+Z7Z*eG_(E$Oa9ro*R73Gu z;Fl5-FtLgZ)-I)7xt_ah)MKPg*fPZvBXcKde4V{tko7-u>Y^phtO#%k?Iqo6@xvzL zKS|e$qn8Rdp4IMdyq1td1S*13tZ$)C8|FPYL7XX!iJoNt-i`-^c3t!=9)zB9x{RQwNIpn@MjQX1Qi26BU){G9SB0q+EpP!e(( z@s!m8-orsU{9wD*a~SVYc8MFzcj1l^A7ig5cyVHpLN_>6?aoRhcw&kGP_zQwoEWUd zyut5;kHw`koi+Q=zJIIMU|-`pGieN5M%&YAG+Vn#d2LaxyU1Xt5Nf}+7owO>L^ikL zPNM*YH#)7vj24tPpQ?-x#M#lPJmag*wW`i8;(cRh4MSXb$0yO&4K3ChF#U#^abB~* zT5J|nsZCWbbspRwXD-4z@?RbUIZ@n{6z=nAoW9G$Ll8-Y-wmjuosOLombv&>lvN^z6PC_jZbR zWZ@1@@0TT!T6B?i=9sM<`5eFlZxM1w zKCm3TMofaPw76j=*ap3Q?jWv7-G$fzvBWUf%s!@oAVCGo^>8{cC|c>1YXRhj_R+hj z&6G5%3EDF5km&4k+geP8p#o3pT1pA-gS=kujqEa6vjUlwoe-6Xu6x0ET4(&-=>b|h zhR-D&tX(OxDav_A@`8ED0i+m68j9i;TGNkGI$Gmp0#WZ`x6&epEeL(g?Wg_;TkA3h z&BaVGbJ^I)Q`ohNL$X9|oYLxspo6rDCW5{r?(MHpHCp&}lQZF++AVrcc4fRO5(q=h zB4)r*QRfU>%+OT!wL{jlmgiLVy(^eH)~?2Cf7|=8oi=9ZFIcla!~%0ge^wi+^FsS@ zpeZe$d4#cVvNXQUg;Ppk;NRfi%03~l7bm3~ib~w;cfsyH>;yzBRg0HIIYZ%8a=C$bAEpeS3LiE(PR!+? zO_eUAXZ{7%moFY zFU=e?X{=#2&UE&*cqv`%Y}9tr)-DH4fcWe-QqtXf=zQrJNU#RAYZwfXBXNUl$b0`FOhVRz|Rk-6j-^5r8AOp_e0tn+XZ#c)grb>vP!ah+0czD7TSV z)H0MFpTcOfY=QWtwvN;U>J0pLx$A9RXS*!W%eF3~x&q8E#LU(d8ysLTn)M^?HR=(3 zjir&S9gXNOco`_A+*7$x&Qb8%jjN+7eD9Mtp&l*cnjr*aHYBzME%SF`cAaEd@wVAq zRli1M$W9R1b%Zq(9UK9KGukn&fciVV6R|d|Wua~ky&K>v&v)USLYzX1g5y*PzLvcE zybAhZ^b6yE{dlAT;?y--c+bAcys(f4ED5(A-eN*S``(e?0-VtyrlB^p=a>kE0{dW4pPUZ1*5{x*A22pT{`@ zE1e=WnGpE|0wVta!Agfw>36nyDsL@jJs?%Cbdnch4e_C@H8*TJsAR0Sl=sTV9mRyu ztThC?M92ei2E1ndW(b?GPv(4ZwSZ8mme^~~{Z6@wUkkp5AF1HTdJyS zYf}XSlvWHGAAl6I7~^H{gteq3tdBeo9z?=)D>dHfZ1E@V0m{E{x-3r?4xnZm!l+w) zKN1tr&$X`1q@e;MTMErk*(U1@vJ0j9qRikX*&CDZm)W;bQctX=>~Y}*+oWMw!`yVH zZkvYfw8yC+zJ5Vaat2q${3muxr?paB>A%rUup97rydhp;9H?{gCjMjev#3qkH^Yjn zQ#bSl7@+C^q0WLEim#ti>Y9jjgmIf5AC*1z@k?ZETpMKT=>JjG8FBDPyS@k-Liu>P`$yswMM4LGL)isG{#2Wfg3I782-Y%`eZ=xVsO#>=f=A|x zq(vgs4e|k%+YenNrq`&H;$wpzh7CZ1vi=mxiK!7*0AaLB)L}dpFH*XSE5dxcZ5hjz zJi$EERoF$VYo7VX=oLf*0z{P(%b3<`hKryH^+nzYqZ+q+a~*AR6}_?{Y3@brsMa!$ z#$|>FbGhi&Zo326NoZEK5^xb$#;d&;b7U`^8N6R~XWg%EHY{v9{taA>td@Dm{xk99 z%3g+y5sXr)qV=;aBK3zB5tO`KiR!S6Dn=srzO5w`p>@V9jKCy*A}L6rhyAn7iufCS zEv>t#Rdm)JGPOo-Am-MdKPF5h4=M!85)mY!iKXr;mA^gz1U7?Zy`DzGt!&(?sfKJu zXm*(MMn4aQJ`l9?yA)@E2u3~4N6ta3>8yRkJ(J#==*e(y@kEF~XiCJK4yQu8W+}3=7m|*ikFau22pV2Sg2BeXKSY{sqn$CrywW zI>Ix8Fi5yIn(4xo-tm)Lf2GV*JgHC6f5H}-?YTlX>jeb~7YjX?X7dV;SxdFnqVHxK zy*ezs0eU4`y4XbA>`i_Mua&jS1jHH+y{~y)vCz(PFEkiWp!=z`>9Pg6k z?*XF~Y6h^6X;aj;&|uNj))*EXhWQCtwd@z(hw45ODp3b3>Uejcor>m>K!#mE;-D&qLYn9haB$DI*Vn5F;w(Q<&?m`QI8-LXe+AG9a7c|6~AoxNS0u{;tmok!+fRm z518$WX1s@ypXe@j^$j@$x^cp&fwTg;3C42xl(LE!9ES3WBZ!RZ{62y<=q(1`kRrO% zX^$n>4t2J`UUtmxZ*9gD9n=y<{W_e}c_R)26SWvo zF|quZAfK~aTi>|6bxMzsPeC`46GVX+;1;^KTX^SMf2Ccpb3?J>+?3f2f1LH0bnnJM zoQ)cNgLPJISQqNZ-(p>gS~A)&9=*DtkXnG{%grEvVpKZMNqUKNUoMH;G9=vC?sYMj zBtgHIvNkrjw;vvY`44<<-_kaT_Lw?P@1#6m&Ky0gN8tHvlYGgw!L6eOeSnKK3+tm$ zKmw)14SpIwh-cHXS@qD!jT=%Ix*+t2o=Kg!GJnD?$^-e8xs`gpw0&q_0DlY5f9#FX zQ4m}*Y7BeZ>7~5y>q7bmCkDDbH#qs*^525HnNn&p#um3(ZiNGl*QMKv)U;Y7etT(| zEdz={vX_SiH+msnY1vxd9OfUXI4(SHeHE2FH;Y)x{zII#4vdc4pmItQb|CsTeuwQo zusV!sK&zttMmL*_P`ozMAdy9E)6(Cp{efu41y!I8&0fIA59?iVYrztQ1_%`8cm3jd z0VydD>_g`n7yW6aKe9UNZM#J$4&?_m0c2*E1XlJtv);RKz57G1%gWV#b(Wnooqx0( zL^DK&+@hDvl+xq2AB{HXkM(3fjP&NE37&IaVOmZ0I#{h$aYc3dxdn(PioB?D~$v_HnpKsSTke4q2h@qi}p*_5)@w^1)W9WmzZ(*Wo@rC zA{{{c;Aa7G+(t0Ek@2cd1|ASjp?q+S@=$|_-2yJVC&ZhO(0Y=7-{^2$Mkj_Yw|5R-to;s=ZLpjDydnJ1Sn4+5WotQ5O$De zcWrd4dg%?IR^j_0FO$lLXCZRA^cQDVI*%JLF8c#*-`GN{eW{`_T}UICf(6?$UFE3` zVtDx8*$@?cO%}fFhP{JQN$X4~o+&3v&}(5_x+LyilhJjCn;D*{t1|p+shWbz0kU^EI-9lCFZ-YI>ETmPa zRF+B<B_$`x!<1b}=;mT;G_^6l;ir}QMxkTYL-@PeZTe7A#o&gb8vnB2!26s9?nlmBzA3Sk zasprz*A+Eb296OHu}v}xlUP)9r**HAM|qC^06*07O^z$eihTs!uNbO4 zLOfs5viMYMPK;7CBnE#h%R#&1ci{K@u2_NwwI_xniA57323R*>P)Qk${;A3+betek zypi7kxWq7z@*mL-pa&Qv+UAr;@i8T>r-!zB(u;9bkdr!HR?RX-vlsYdwx{4cBoyH= zMW(V4gg`XnFw6RY)gro%9Q~bz{{{Vp+{&&HZ_h8XYDw_w zBUXTKsJi*CF04J?`xusd7a5!5k?vGXY9z)=x$wI}7umQV7r;=Y=qv^Fum{bw;2_I* zP>|=$a%1ijHi8Ab!})GjFa~Fja$PN79VLh4@U0YELp+>84Y`{53b)?265p(Yi*@;& zs;Cm8yGbnAS-y@+dWL51;nHIJt*2MijET9VJETU)K`>a*sA8BXIaXCsbM~>0AUgBK z2JPu8OJa4h47@bKWnd>Io^w*n=e8?4hIms_3wj1op<$EW6y;*Ucz|J%Y(Y7&j$>ty zxq|!`4AMNAu`R9??@-Q=AUE@G1ASKvpAx^ps(_6{#}a8{ycd!d5>IYHIjl@jn3&O_ zb=ep+pGXDG_uj(P5UtzkG`b(y(-c-KhQ4L`@GtV(rQOmGm^Q`=6VwoxQ(f?QnQ^)} z@LHeacWI2O@g0y8cn8h=XWlHT5{X^8w-IqY5(k>fO{GU<*5ZMVt7|n+JjQ^K#%!FU++CCg7=<{U7i*6>nNbL+ z7SdK>3~+eZm~xVR87=tWlZy=l5Frf-7*n{CUm?Q}*)`A#4IhAq0e5ui6!n2B%r52y z5X*Jk%8Rz}8EoBrXC2scnM*Hr!P$yX4|xV|0z5gUihUs-JQc+mL8+Zy3G^6DI=>5` zaR#{3HC~67J!Auzl3q7McBAhTxr;u^IK3GiB}0B=PO0__jh}tG4JFi*Xzy^qiuju3 z57kC;K#t6;HseaQFL{CyLvO+9Lajv$0D+^AuAH)S!*YqfG9&grsOJN;k<5jiJ!D5y z$!?iIh1r15m(dm)hOY&{5x!&b{XC@c`q-?-Kkg2$a7AV%PKM zcsD!v<}{j%^(9HmNcC19N5~IGhDZg+GCW%xQ6j&LZ(4DmLpefg|MUq(wddhICg?rz zP?5XPTb%yHsmlTCT5jwCN#z5>!NWVMWLbyue}1XJHh( zQEEJPwb*dGvEZfZZ&RV zgfe%5?(*No>9%?1pgKbfy#s&Z$bm!Wc>a?mFW~2ZJ?PS6=T2-NRD_u4hszRb^T>G; z2R*t8gW=uc!=jsbn_zV%XbsgHpD>&uy#&hy*79CK5@4w?wuf-pN9|PuALVOGwFFtY zOAZV}7XBIWGYAY77duBWZDF_fNZD(;vO`KQb|zbI>=;d8sABX%4JS^L7`I>#z~Dk^ zul^V?$g`@wX}G)j6e^AQny>@M*h+W!@?(tcFgN5qZC47UY~f&-z4+1mTbniK=*(PQa@>j;3u%* zOGJjit8o`3H+L3{kRjQ6A0OXu28}3aGsbh_KE@^pL7u|CNo3@=#8g#Eo#__dKMB>~ zDt8NKn2IQH|8+u|_0CZ;UdTt5Yj!?OA^8-R=QZVeTf_X5|f#pymo~USsLP z*8$p!O$(BJbW_?KZIO9bejWM){IpD1-p8@6^7JM2!#}FIT4t&<${C3TN7JbyX)Rma zfq*uK{ouDwvPD;iuHs!0UQu2<&?jJ@5I;l#qK!%;jy79_X82w4mFl!Spy)_~3%(x; z`Cp4@%2vgzu|$sFa=)4J7I{(lR=t~xrR9e;H`VBRc!3+F&jl==0o3HZvkOD3;f-pm{IgZ?;@|yv=t$aU<21j(v_s0Y^rSOBw{>4Fl7)RPc zK(X=|cj0ykC>4s3OoVqucR>*sBQ`h7mq<+NEYO0+*aj&nhTy#zQM=_9<{_jP#IuD8 zoiSmL-EmA|qZa-KlrHo?%#8wPZR8j zeP(JVh7YBm^2zfm#90XNicG3Y6m0^<<24euhtvd0I=$W%JoAe7k-=@48^H?sSKjV+ z3V|_aL{>d?#+oM7gMmFk@|7D%%>)ENhRkw!TplUdBi|&z0O8_&H2>%J`8ie+;ac$i3ggUeM%c+ZgIL0?=jJ_e)vq^axQULEm#L~CkCt0yT;T4YiSX11Xvh0`c(F)Juo1AOv4ULM zk6C*D+c{LG(}Z_T@G&{1Tw;;F}qVW|ziYCc1}g_?l`3D5EidHmv*a`I=! zV?IHU#A`6O?{cvAxy5WjNd%#SNqMST86Q{aZA(cZ?Y*}h@-L{6MJUA z>f^9Y)Glwg9_XY-W<=}I2PhI!puP@8+k@>O#Y2BEIpBiel^_$)r|hIqGB%sp?W|5f z=Mn+=sUhZ=+jL;6qZuRI{X5hQ&>B9YJSYBbtazmUL;ici7RV>&MQ|TBpu~=W^(TBK zt--SpdqneycK}6+B-?NG(f2`k$>1!&2Aw6&mg4g5rrwLVM_{RU?mhg3W-oi#TxBy!41g+%SK zfN6kW{E+A>odVX!0Z`9HAEBWKp|s&A;S7HbNK)|8yT*bJ2mH91G6dr70r*9}hx8u- zY0Xz$tk5#MxDOKspwe5LC_>RA6hh`lu9LJZJ0{RxG5`0IxS!Bph%SDaOm8D|l1zbo z1gvNb>q1FGkGQ-sitI*vXPDN|LRuq~jc}+3*;V4BG<&~b0#jsY44+oNvewP6HTST- z5h}p>v!cW43i%Q`o zVGeQ}S%$d2IL=Sua8fnW4c(aG%Y^`qUBqr50(x_&nx>j0EieI4u)xDs>Nnl#~31KvS)zgB7sbfEbX zm0k1X-=7KTEH5`q)1r-tj@Sb_D@{0BU!uu1E6q*z38MEZQdISWF(;_RAMbPjElK;{ zZ4q{26wFt3u}1U4DZqjuq;=soLAEf;z&&fOf=W4N&4!8@vYXD~JJ4yx9o;%b=swmy)eI z%roT{{-`WO(Imy%Lu^2bAcfqJjmspx)Tp8YZuD$M8h)#KEL#PUaRvKuYtVkgU9dv6 zf!?FoI%1Oa4&0uHyM=iQ(~^s2n-t}W+#w#{kce-=zdpUvz9;nW@o+KG@4A=Y-Ijx9 zK#=22hv3=xtC#BCI|qU1-tX%0%NFGDm-F+eqP{k7&ybK3pZ!H)QGdw(D?YI~|88RM zzZ&;1XkK}3Xl`Gb1u#wx=mRy8dQ;N6Vq{QDe9G#yP18+ zNz2l(nn1<#$(NTy%j=*tCT%RW4&cf zKLW9d$Vqi&Tx7tbF==knNv5OL>iqaws;^_iowWC#i8TYt;=fU25qb1&*?|O z!Sni={?FPkd5J!`ojOVKB=%3ex=a@ZI$@p(PV8U3Yb5|p0n=~m1!s~hEkiZ-Zk(kY zv!_j!eYvr>%A{#Pf2rm3*TgtN?DYrVq!FD=XwLs`j6`Aoz&2F%A_i+b$Q7zU_ZTJ8MuB8nmAdz7*m?L zCNC}ddN^wBP%F-avC8}?gK=!`|Cftg6$?)*-w7&{X7zsJPtN2Od4B0R-fLg|x^Kuh z(0Yt8-7F1FO+@~hldV&36K7O(y*-e%Z`kO%o#k}T;E=2-g9$&lyWa|3R^2T3owl3w zF&jzk|3;ZSr$l{Ad+5q1YZXj7tzN7M71i1*Kx$0U#3<5QWP>~@bemk?n<1^A35q5i zOk6j)Eo;TY31M;a^o>#0UH%ufd(G(utwR^WmXqjJr=DHE*)aEVRwh0FizcoouUxtN z@L0)-!QA_Rk+vRM z^z}aC88?*Ls*tiX&ScDQyFcFYTKQ7{sc+Dv^J>_ERc7+yM_J;HwWm<-!BGmXSJ9^6 z#UH%CE9RH2?o6+ASdK0YmYRO0s9#}UI3xLCnpJpi^6)BOnj3kxE-i}treQXin>7{YGnRUhVop7N^^ZoHHqD7vMtQi! zub=oRfW%2nKYsO5Z$V$Wr>WB)$#ADSW{3!go90yh;qnOfE_zS!BsJLrdnUS85c%*U z4~)pXpG5y7vcXAsh79_$Q@t?~-=&ZhOuJUWFXJhVwLW|dyOaV+*^>^tMwHz7+m?=)N& zH++gZiMx?9L}{#-_boU+7M*)@Vdod(0eQY86jE$X5=nt6-|avwVx#hYreMD z+Pigw6`hoUL}|@O zeXiItYrs$@KMZf5yF-fyX!9`x|GEtoFTD=%3sID@BgHG#Q7uQ_pOQ6|Mdj?DyhA^7 zt3`Cj&U&<|o?Y}$v3p-o_G`0Cw~lPZZF#*hcY5V?Sb4doe`m*0!+Pr{^Evuw2N@pv zlcPa5C>}}6juT#e(j}S3r(0TP?>?$cb0p@^2JdQqC<&ds`E`25 zT1q~lL{e7kQr(#X(Zd7Vv4bwwSHl{5SEnAHOW*wVLjgRRckA-?(w#1qcdrPNt zwrnrBOYp%*26S!1FR>k0Q0o8pj=DeZh~~+mzvLBRFRh-1^aZ%4u6t{(bsf=u=WFif zreTkl<*q%+iKYs*i1@eO5p?bQZ5o2~<dKCYmo}a^&tEGO(PZ#ccMjmbpVeJaxyn3q9rNz&hC6u0 zgF!|p0<$5&|Kat)@IU7JvM|iShj9Xj@8?_5}_u(te?KWl7T+LBLHB$4BdN}oDvQxj|T_Z}3yU&-&YwlX^VDkZr zKG!$!M$9#Q%+8PnacQ)hMqrp{SfMX7E_k8cx!{%JZO`48g8g^TwbozU9S{$U6}EA8 zUcn4L2$>xxO7Bk^Mi!0da(}(@5HTz$rsAtXShh!Z{E_`pL(M+}D!Jir{tix+VMq2< zhPl>2$19fm>H^*+zLDTpEoZvU*NMQ2RgU(RzCzowaeD6EAgbI(x;=&2KHnNB7VO8r zWIOPPds7Lk{r5@MISHx$%qzu_XC}k4#-p#Nq`$>qsozu@UfFR|`l2DMl96gU>Ky6f z>-lNaqe@Qfj=nuOK<&+K-&q~=I_0mAoyRV})MS@R+eo7&O`6+E46oJ@LNQ4i+*sgq z(O#N+VPaFtZ8jue* z$6py|X1&S%G)Y%#m6phupU8647<<4L<#mW>k$AuE!O7P(5p2;)(qFYr^#|LB`YWSy zB9olr-$G{p{jc&sG{Wc?RqG2g;z#uBOAGa@k@rVeT)tj<&?-lE8|N-8tDP?Wq**^I zxPSA6BPZu)U$ED=52Bf%?ZrFnZv46IH8<&;de8gKP;%?CzpwuL1xZ7VF1vkVi0U`) z$U!c`U!?`DzM;!T9#)HPBfiPy>yL2e9$I&=9SS{3+TE(2@ZnT>M9^47W#-9aF7fiG z&!S6RQA+2G*3pfe4a~FR-dKlzPFiB~0l0gGoRp$PYRa^U^?LNRwV~mCoBhLmttaX` z_1Gs3AJs3d^qY46IXH4Ir>J%4(WyT>TIzE;uAj!oa!K%+vx&m1*pscdyiP<7QER ziXXiB4!OxsN4wk7z!@_HP; zvHecm)tCOiENn`p1EOlK=GeV+eXjI??V|py8@=@kLDxh`4ZFkkY5Twz_T91_WqZ!3 z(?_Y#;9Av6SedBmRTAQ^*g!k@21=Ay!j)WVb=oo>m1M9fciHj8uE2DYpVq7By0l}K zA_!^m@aXH})oto=zU)6Q`ZnzI-u*0_D_w>@#6H5$?5YnBTN3%};qlVjpF`c#r9k!~6(zU%Q|c z+VpMHipbOZ4m`Id2MpQ~&TS9B_V@VHG1D>LQ5pko9Q*t0@HflUc;~L@)k7{jL$A{( zy~heAKmy$ojA~vlYNp^g5+@JNx_XQ48=l=fw=2kG(wGyNNA_JkAP28E3+wx0TVB0+#opk6;puF+g=s6B< z_z-jZ-KT5x(seR}PjM|Sn%$$Pp0(V};nxq2U)*%arf(Y~hEbUC_V)sJ>&bJx*|1-i zWWR}QXpGdqs&dzQer5k9US7^ktdL04c-8a4k(I6-++K0(8ZR|CwdvPySqsm(S#KU{ zm!~go*87StO*4kgM-|O{ZIAq+{-8OAsE@=wa2L*2GzD$xe~&9YRGFmsL21@dQe~5XlmtTMG#(#Y1FGzglEpSPG+}x#QBH&xQ#Pu&%!0|?PIs}AC{fU@;w>P zaV0mEYd`Fs4OO~LwBe&>r)~kg5B3jRPSy0qlW>2urY2SY8`V_l{p{5HnBLpZAK7|U zj^CXjJe>~e3Yhjka_sv3W$B$~e_ZFbjc;}5|IPiRdw_=?!#ptk>n!Dk-T$$ZrYEqX ztsJk%--XP;+ja$vJbKUF#YXu$k#+=^6eyi9+*;8*iu{ zD56$bwXQUTz3Fti>12859Z!5Abi*XK=%?0y%QIh3>U+-aWflb8*%Z@p(;>n8Vd7<& ztA1WsW*B@~t4)gTicxBxEO2G*rssA5pzM^N9@vTdK;Q1SYd#OwJ zLM2r0bpCj=rjc|C+sC;P*beZ@zwKN}WnJZa+wJ3|5jt!n#NEcU$+WW4?+oDeS zhVG6@9%a?etsejVwe$p>6qIFi;@hM5uVUXyh4(LI;DZFasLV;B4}yZ^T|u-{$M$yS zN%QW8d`dWd$?j&sAiZNW|MISPh{>&AqL{8?N%Fv+$)v&LBY)F%H?XrK%*H$pGewW6 zZz9DVIFIQ~Qm*{$Vpp_3=@(1pqdybu6 z(t`!tNo(1&=dso7`j3{gGY7QSd+NUD#&8-BykT2Uof7@>-WbsG{>c3|(mAu5^ia?A zldxs)Lp8^Kw^YV#-~RgEiRx;-xWS88Cwago+tlv5=vRQoU_#(*rDQm;sGV!kdy^*_TwnB~_cx#Y(R<&h=*+o!=D$HjgiSV`T2pmLJVyBAS{7aP zxAzPm`SXAQT~D(wJJHt3jh1oxZ}g_wEkZL7gStue3tS%ihN35}$<^ssN_xFjSPX(8 z>nQx!CE)OIU{)Lzp4C!`;P9Myea$|$`FoB2JUkiMG&B1xW$DPqW0Qxn>jzdWa-5kh zoe?j!7Ysj#Ef)opEWR-4!%3ti2DD(hdu^vJ<-uCT`^%#pi_g%_(vAUX_}BXK*_l>N zlcoK#$J6F=PWoEM{`)3VwbzenaVWiwYnh3EP~ywFWb1Q8&&=Mc{qgrTnr3Em=x}gz!(G~LaA-cc=o2h!&?7+kI%pc$kcb)I0!2n0j#hw&jNukUQEObN zyH=4@dXCs2b+t>EKmD(#qFHV_L0PDIL$Nrp-RJxAbXszk7>16dKetJ*rt0IhT(aSVNTcXyadFu|q7TR#{b87_v=Q{vr$fn!-l8$?ipe7anegL|G;4Up+l25 zrr!nM@5>P9p!@wc4r7P?#%*tsEDp}$@K!9i`{_ep%ybvbo^(0>mB2ipyr4HcH;aFr z1(CONLj(HImFgcNqptIvza43)6draP6+NSAZa^#Dqm%ktuE$7Dv37r$fsI^l{cLqj z=k@%s&7GV^uq)a=ifKNVWL?x2{_3$vQoEM??tSs2drX6O5oOJtb(>WImCZgs>)%)} z45+y8hul9a)(PFqHTowy>NT7s%sIO@lhyM*6KPibCaCnq^e|l8fne;E{wVE8bKIA| z-yZVm^69;s$P0D)a*F)urs&w^!95F#SHxE0)kVL(UVCRTU#yi9ukLZZ zbao*;P1;HC#^zi5r3FOixQV(9&vU~X{UXi6X=YYsX-kAB$Gz-StmogRg7u~`f=xSy z5rq${S9K*Zcunco(;f-@kG3yoCeKw?*ZTOqFVQS{NjY8Oa!d@eFBat`JEfjEh5VJm zt`CV}3PWoGU-a5^Uhlg8((Uwa4)#YF)8{If>#*V&L0;khIQY@C+rUj2|0d*|n|n{} z$B!M^xQHGfZx6HrRObvVw}n%7omPf*W%!?1j=kTt_kGIz*{;AHPfdRh{aqrxzH0t@ z#}Uh@9gTvX9X=*;d31x$Z%JWpGJN5oeR{W7o#X-Ex1Jh#TXCOrvrcT@s{icyo*vNl z&ppphmPg#UZ#;g)Ah*Rqm?ff|eY9zNLS9nwiD$llQ;!ZG6;7EXA1uuB#nb<}F>-M@ zpu)2sk>tTOirhr}E3`bhCmFkO&p(;(UC=`{7sT53J=)A#tItU(Gati8;~G=Mo{xzX zTQmPq;hy2M7iZmmpn7k{`F*1chD>`Weab_lvMZLBZI5V2%N$Lm7fLC{*V6+hljj&( zn^&~(f?f;SN}LVn2xV~Oad%F_5c zKdip2Xcbaie3g2l+y@8!q-@ZG^h||*FLk%Y*ZsY{qr#H{w-{ZNE zkHGp6j|9U$LLICZM2H8k08xfg2#H^yM(@2^?73njhpYqCJ`z8#0P*O;ecn$orEm>k zgZMWnrQApeoE+Xr`Hkk+TRG(^GsGU9*WCi%lryo z&k5Wb#6e?QyG#D1HX~EGD>$Tf5${w3fg`Nd3Hg_L>P8$tvpyRU@!KIzd}k$%jg7Or zWsH{-VqMevptZsV>TdC6bY+<52tQr6RV;mS5f5y|D){LDDZ|Z=?^}m}E&xvAgJV>v zOF2yj$AU}%F6KW0@ny_%LnsE61BXH!WblK?F_~dTrFrSpH3;NiFl@a+iB(+rW%wjt z6F{Ot2+UH$IG@^tTF+0D{U%=5etyK^Gpz>N03?am#W|W4jd(2nF$?uB;d{rRSVUdu zP2SP5i^c917(li|Y!DYftNg%X857~Kp|Yte9kDak7dRkZ2PGqLM8Y!6n%@BYgv-({ zqCtr}11I6#4b7=2Dt1pm3E-MyJrwG*ial)eua3A1QCjfZh(!K7!7L9OM}~SZ4E>=l zvO~jK3Z~g}9{(|23$r4M0Xn%i#P#S_bCEM@2mBf09FMfnY~nIuIKewS<`8$W*v<%E zh8X7yfN;)s4!XT!#N7z;1tiMMm5G!P@jluGJYa#-h5eKpp)czIfv2~A&V$?Y0^iiH zG~+!@47vD5$W6I{%zIR(u~0R=A!LD*4`k>##aIQ~YJN?E;pEyXEb{ zV&GzkTSfg~gy6a?Obn$7@NQGkjo_+)s#fF$?FF6Df-s4RM*`-7@FTESyccR8Wtaxj z=Z^xEA)&8SLRN#!f+=hrGhegHHlHKu(Xq9=?6K)04M2Cn{eh30u>#z$X3wDI8o~I! zXl)c$k8cA+ql928UvI09$3ky(k3 zHof|Mh;gN|MO9{ZP*DWeGI*O!N~~L z1s3wCy?J=M9@sO`kloI<$fv5S`=GU(#fRaBdp4SDNRf zQ}uXHA^il7N}85gZFHJ0RtXa=hhars{Nrq0C|O4Gf!&jv<}u%Sv#ZTBrm7@P2;(d2 z8fN|~!`8z(XflmFcDcB@$%zMK0}q+R|U z616cX)y*uOZ^(jQPz!kDQUkdI5Y4VwQ4qKm(m(venmA>eSOe;=1IrO|(Eu~w8GQ(n zt1>IrwC}XY8S4$!BenS-<)1ViIND;%5NC#0rPo8&6f7FF2DT|Q+l9_3Ib0txjwl2q z9fs{0VQvYAPoaCjM0pDjMZ2`rY}KlcEhT(~#DfaJlY(P6a}TuVIWziT82&3DWT=SG zddQS$Y#`T4o30TeRZ@=@Z(MNsu9{kE@T9mH7$6!RrRC~4C!h+Umyn($DQp(;3=9Tn zV(onD5-FZk1_=ejWpg+a=E)44nNz-dNmkqcE(Qe6)#$0k_-jqn2}~*Ms|>l(efrXf zlPU&a*CLz}&{x2V0Ac7#kF(KW^LhN4KR244*Qt&2tbsB(npI9wUOX5^v&t*dBqOLFavP{6i=vngUB-Ks`}~BE)K4oUw&zcIE&Akod*Gz1V;rAcPtmFJ znx}afdEi6A<6`{~PXzW5l!>sH=K^X_i5ET#5+N?=z>EoeT_0fA9}y^j8C706sv$ztSC?`JZ^jcqcyi1URMyhO+oZIsl#G!cOO!(L`acM(`kn%FSgcw#ir) z-eImVw%{A;E0HW51^Z+g=atZJuPA2_K&EDhk2vw#_Ao$|;q0$p;Muz_zaw*@%p%wm@Ztj{PI@`p$tJSRv4 zT*L=y6@2s^7@1RfSN-_^F8GnO89hN(s2^1Z4wV(V@}L0-I!FQz-NLK!L5yWjICSESa)`wvg-cuqezL!59{=-utAexL(Jh+(`N- zHQ!hA7_*6>(D3AFpevWC477#p1bcVB>!dKuQ-~w0V>muytXa+}RvLZ{T8~ijtpzAS zC7{pl67M&=xa9Hx8wi5(G1(@vodxEMy0%hh$a}hokBcD;fZc%F*m;TD1XcjE(ZDE7 z+RJ++R(5m7nUG$MP;9{mqdq82c7g&6akfCEL7yR}MF=du_1-1OFbEaAQmsb*hzG-K z5v5B!i1#OLhuo2!Veid%Ho@H?QX!3?hF~9>;^MQ%TdIK(Yvnsmkyb?+8XESPBz);n zsD3FF%SWKgosFsRVbLmbO#b^2J(U?3fHM9HJB#Q-yi~_guQ;dnFq%tA81MyTO9Vu3#-v1cd~fUbwE>u$wDiFSVA?WiSP|!o{Okl zSc8mB*^;53e^uhfM_6m<(k|iaAJ`*Q!SNRMlK%tHG|R%P3X%!K#Jkg|96U~T=rndD zJ%VHT3YldFnVGj#`&s40hxtfA(D62&x1qg49aTukB~qd5(Ixv(rKEW17QT^UM|(zb z>r@K^u8lN8<7n9uw-sh5dI$8L3`uEX>)m2JWmuq3z_yY-cTzty@7#Pv9J|cNuwXfS z!`eLyR4eFHd8V4@PIsZPF04R=;^lD#3ZCMMs*=<05KIYAz!pIvZ~GXN=1j{rK`f@Lr_LBcz+c=%&WF&69tXJun2clL3CQYpH@~(UPPz! zMQSdoSvu5-b8L)-u^NC?T2i)C5;^#gIwRpH#3lfzFr*z@AWs-?A`OCtGJOt4p*2<} zxrQM1%KznE^>(j;WboA$hGvyZO>JlvM!{70GJAQ+@E&Av} zA`ursO#sR^F{4|1jRo#>{SI@K8Eq_6$9{z$0Cv`X01u6wZ^L|-y2#^zJ!H2glp8-v z5F>yLhjW^U9)4dm-tE7_H(Z8^kZ7h~I?yKCfHWG)D*iv;mM&bSw~&%<~7Phz(f9R{ou)td9I91ye)a8!^Fc(QA`&Hrp_PyfKGgRrC_KpC#5 z7Srx`Q{c?Jf-FEzA~z#a5%;J9E}}hP!O@MW23ZwCWr0dH#bva>%6%?1sy|Z&A-cR> zw8AAP0I~~o0q}9IA)Z^kEqr3UExhKuEL2f{PV@9IHp3>QzEqseN}?H{zw<;-9NUEw z$3?>f_+t4s!8w_}*pQZo7n@Y~G^zjN@zxM3u`pcWo5~QB4d@pyJDcrSRNEdduww6O z2ikdIjw_g4QjYKoq8ag4V+(s=4Xt`5&U_I{txE1bAYLW&pz(a2;S|a_b`iU`qk-(E zLm=}r0ZTSd+{qT2+rM#T;Q9!jq@S>-yd&)uVdM$SEBr%Z9cerMIMp=YQAZ*tW#S(a zdgLi$M2PzXjEtII?2a&`67CW#q${#hViU8=5ZF%vMRSK)p09%uOm7%gTN>sOhR6^p z`4K!U)Z+n@;T>ok2+qhf$@baIzJ?jdVSa{Szs#RKfIgUCHs#RdrDZrEs^u#+&rV|5 zy=dw!R4I`x;&mA3uX%N<+PO7~eh2zV{Z*tE)LIm&k&G^Hqcc_Lu@6zUm;vq*I0yhX zkyh>ng^MZ>)=YEsZW>ip|6Pw`zRSJk*98Oslisiu^H7z`kpPx0LGLni?hVY(!;^I& z_OdW`k(fj)3L}5^n!tGTfuYPdrnFhHxY}E5LIo z;(BqGn27Qzq{9FV`?m!*1ZJyHBs3WkOxamrS;Ribq{e=<2hAll{W38UCgRh9UFhv& zpl{Vwz+6C|OznZ%1N!1z6~}oP;fMJ3$RZ6Jtou$UFK~!T!e*Sp z2uLhELEbHkLkrqaL&6~SqhcY~ET7uRKo}a66rcdmAloGvDm0QaHiy*WC04kjE*7*I zNG-T3vk+g1XlEnyFSgOTjT9PivZvpLC7|4At7=mw3}+z!X>NqpSYWn-^#}uArFY(C z=oe5O3ofbFa-C-86TvB?15i+=KSbAvy&WKtn7L46`#k#XUMmFtc=Dv#)%VeMER6LzVHVDTNF!8 zQYgPfngX^^+$pvTp4r|q!n`We4)S-%!W2EWN8>JA)t_SiBo>IAM0q2}dpaz}awV;o zAysm`LdxZFySSEd!MB*v#xu|(@`o~aQ3?A`MX^9!?v`!*5UR(qH3Le3?~R!-GnpMa zYpA%VcFHi;Q5{Sr9{xx7TZ}YAU@I7s*^)h+`6uK80hOA}K@E8@gJ{9M!AMU4-mJbs zxer~cj(rGojGeXp2}O$Dmq~p+_0Z?TT=jfZ3@;=qH&Xa(0&#nXMt)OM4Hd_QSc46k z=Fp}vF&}$^@S5m&hVe06W{3`+%nc(4(#nlJh^8vtpAhWiZJ?E>@HMdQG^m@KVJ?Y^ z|4EF2KbIdz=dt(3F`z(#j}f6Cc2`|np>_+~!?T2XHnEJMX0iySHRZQ4pH#Py>f-+! z*@8?Elg6?ocG<=U2p#ZL1}Jlzv{nd)a<7r51smmbIaGFrLsNuPA}M~gW!|-c0Kzzm zq1339s*eShc=ncmz;cPngmKYVnX@ucX^-CA&R=rwG*%##pg=RDqxp%wwY?wJQf2KD zyAgHza8gEzInB(?>_VHjg^?~{4R#xO2@$VUf&)}-^udq@b<_imEwzI~UT>})YPM?V zq0AZGA#fo#RE0K;+&tjEl@YsZ}rK?yW)%i9U%6_~z7gQ1M9PN|R2_2i9{V z!N9g7;lNgu0t}LEOEnuds)e_gjMTMxJzyfe{GeM9qatnO2IN~%hKqXUtH9r4^uW&Y zJLI5XNX;Qp)MNU-b;Y?q9!)sn zu#Ybl#0h42SHkS|SdT>?dHPV76?zo2(CEokiS}vGcgUr;aLE~AxC|`-R{$nDW648k z*dsUQSuR|&Z47fW`5|GuB1G!P*szdlA-q;-B*s^vw(^84WkVz0O&=5q( zC}LPX`7@Ra`$#>gxH43B%FDw?4fa|+mfX-p?PT%!XjzoXVhy)~!J|~!dnlA24S*s zLHN<%Q;lw+iI7p@Mm`2uM+v8dqn-V(__lt)9w59TEJLCcJ#0{Mh25#rx~i(jL-GMq z21;dt@KMAzeu*GoMi(Tod(4GaR37mlq>FDLum%p2?S(!uOf8>9+*4>GUrdG3D)*t+ z;GYl`8k>ihy#Zs#XeGWb2(%n}n9r42pbw7m+E^@~CNCMROLSVeg|7*0VIPH3EwIHv zsN&j{rY5(~h6ZN40{lwwKsoa}r19$1*?+;PRtz;-Rfy13k``$O8V76?8{}V`lbpip zLW6;`;@x8x)oG4+9eKEb1DKe3hPZYb_QBlH8O60G)NHH=iLHK;ZPgC;*iAw2@}CHd zhEeFs$39;TEvWlBd&Pv1hHT@f_(C`Z{3>hNeR;4Dg1>Z>jb#t8Ef-qKRY~wsHZD6w zi4*JJq8;(x963}Wp(LFjn z8u?4(Ap5sCduWqMy{${2@fi){5O+0Lgc9Se;wF9ydiPj`E`2D z1JtcvrZfg77q3fXLAsDwz70Ax>gPscMfzsnqknmMh%c-i z8WWsiw0Nlehwp|yNRnKQc>EevZMX|eJY8WG_!s&0zEg+0`u038G< zwUR0KCY)4d#Ow3s|JlKzQ~ns%qu302mjvb4*}8l-N`uUcj!2&hv`Zm}L0y>@xy2ci z1dXAVa<$?Ddh_rOo!(T9gSD;FGV%E*MJZ~awZ<`aUwZQ*9FBM+s1|6cT#Krb$2wZY z68W>y4p@=8t61C2d7)*3o|FcJ%kKerTKYb8l;{`o1_ndkNx9j*06x3&yigAf`2 zPtkdBHGwp2bk_=^2!wz_KnX1*fTHxa0-=|XM(9eD4pKtLRcaCu0TV!)5?T^!=-rhf z5Sk#Ni&6qol_0o??)&-ugE@0%p6A{(GiNT`DARZ&&w_MygLEJIR}@L2S9ld;*pKZwV(J6p=@N+KxbI@&X=QP@50wm#|pDtmp;FqgexVq z;wrdRcBJihX%Zku*g2UPsu_ZGxO3IwokR%*pq!JcciSURrDHY2%vSKu0CN=ldgM9m1 z#adDntHH;x7D@+l}wY%Q8Qp zJHi@-qCU-INn`&WQfsLdE)r7!RuQ)tNcvoRPsqyskIeiGp(IANyW&1MuC~YiswqfDGbztZE)B?!$bIQY z5@az+-6Tz_o}dAQ$Oo6;xFQEN zow44u!hoSd8*B1}`y}v%)0~IVM(zzLvjFmCl!#nC;4BX*p(Nb)8%D3%77|F5^V6d| zqjvRJ>ml80WXNdXFnb>^|JzVt7Jyf6uXbR6=jB##Q7!V>ui}>`}3Yc0xDT(mE9$b@iGECXdx!79g?mu zO;1J%#9?D8WQc{mkQz}7Zfu;EWjZA%GW=Zl7uE%Mf<@4i{fcfODax;_FJ6!1SVgO| zWuwE~N%eI1Tvh?ZL^X^|7x@hjWjwdBm+%>^l-4R*@lx$8Ml5tKuZSNeJV4N8J?_I8 zR_&P(Fx?mGCm+w&K+3oniMqc`%-Fq{(6X}=OTNXoT)LirwUv-+uZ$-jtQ}K~i4`C# z>@Q+7S13t`IlFvH&8&K%PY3U|fJ!PsvIcan7n5KydMB7?f z#!6y@@PYAxrNRx!6FxRzpEB-5>#7)cJB7eq(jeu!)~YBg+zq=(TR43NdZ4M;^s%PM z@?s9o7Kc*9C25g(t_QF^rp|J@p-;8pLzt247s-b}58$&pA4boU)@o=qM({jH6^_Sx zfn6Lh#Tk*ZehSmD9Uku53pLH9ql|bFAQnqT$ zOodenX<$}~m}p%oqzLZ8Z?xNmD{ze5O995@Hx@vZ--;DL<;q(Te{!RG68^yJPGrr} z@~W>uUN6@@%Al7EKK~6)*rcSd=v@q3mLX6T{5%)T^Azm zY?-9@VvEkqgs3vn4hB+oHlbvCJdwMlla&9H8n5%)Kr(!&1ywtSWT|H80BmeN2PuO2 zl9M9^1|>*r1B`ho3GhDcKEN=+FH{JLRdEO@GQ)ny^wV1)q0o*YOXv|qnh@pAkAy#T zaKM$Jbm*R3p1o4@_PawfI1ZY zzB9&m6KZHis?zF^20oII>)g&^7@KziJ%p zE){_@^UrZ>EJENXTktJs*RX~dbU;v^G{OT!8J`eyj zBC7Vs7#GwFOJQqmM{qv?Qlvxp?Un1rU_&ARu0}1tRrJ;Nt%42>DzM*&?6FqKC&+07 z`iT=HFK!e^ETPs`@HwTBH^omNB!gx(0#=62GOm&q;RLEch&eOmI^bO2Rl~!t~IY%M=aBNDO8%;|5q;;6V6*Y)J&MPO)sbKnv+;K58%E(N`WRyPE6sP^fkdst=b@?7IR#lmSr}82UZSu`AjWHYx-j`L{y7 zm?mNu3&av+rC1OUu!Ykk ztg%+Y5$dsvC(jx;%3OeLKn-~#-CIwmLf{usBesPyc?yvN(!3s=Gw#C6r8G-j>pq1F zhzVen7{Iy@ud=97tZ0Q>Azvs&0@R4ntbjgQEIz^LoBTQ;nQTqw<*u*_x%;e#ec@F8 z5IECjPwHA3SP)NHW)v{~IJV;`_dNg2^Qcn6$E00S$rhgL1Z9A;AaWneLFJ##qo5vy zLehowcp%bm)2NrWuAmLA5jfRWP1SpY&Bh!?K+4}qUl8hsNB1~R*x}Jd)>o}G2Vnwo z7XDb39;6E)1L`f*%hSzxwI!DMGS}d9btkNsupx$O zwt993*ce6+ajp-P+!B-Lp3sAsNO~u~LIlHa_Y^>`e=#7-7!oRo{-HpXjC+hHfL|P| zeq-YcNE;Q0z^@tnXN<6UH^UTdWGYvA_4@A{JM~Zoi?3KjDOf0gf!PehzAOFEV_SEH zWqEmpFd-u8A)MFH*h+d{a11WQ9D0msB;UpEVEz>_!a8#mhqk__WL4%rPWXZYLbQbyaCT@uQYb_pV!x&=mxL;eAiplZ1CO53XXK>}Yxl5-i1a-Pge-aNlDl)<9hG{BWx0URJ$!X>?Qy#DOJM6Gg% zOgIQ4zRBfPn!_&}(rPRe?J&}CScqjR+3L?Z@ z#g${ThzdZL16Ik8`=EHs)NPh|sE(J8d&%>wDt!is4@ei6kiy(op_oz#ObbL#WF*vs z1#2IKZB@T0Aw+gc%?Jo#|8lQzFYpsU8pvkN*imGU27iHIj8XPeijZ~WD6lR0eWg?czt5 zY=X?L0K6sI0r^-(FtX4olcr0*fKrmm1`LovrUY{{d_J9zDSO%PVK9B-}Y-1W^YH5_-%Er&e|*{YZ+TSlFbY(`D8L zHwXq?Jfp4e4mHa?*+_Q+6JisRK3H2$yDw;EO`B>VWcA%Te)zQ3uf(0%-gOJUOdl%gHo)K*SW6yKgT@3( z2~~*oMB^VQnp)wiY>$U(e$rDk(4L2tKpfGg^Ckp&RM6fPPt%9bTYTfA_lf9BYmJ%l?_{IsNm3|AEMO5J$(IY5O7=%GvzqdJvG!g1pbB@+sHuzoL zkS!g4)DAZMT^bgIzKmYCQ^SpCUX}x6oOZndC@<>$3YXLFd?7YnxI)IBMOx-}HVA1_ znFSIT3R9D0#q@c`=G_u^tJbWr6(|y;gx+M{X-fEQ=Q>4ld4Og9<24T+KynvDaAKI* zb*rMjgj(WWu_D6E(_DV{ZaJ;Quncv?{)T)jgzOV`uUvKLL1f-(lo#<~Kt_m@3}4db z?=H+H?K85tV0gQcE)zb48bxAkQRLHvl)eaKL@WS%xh+-BH5y6Je1;WdMS-6&I!_Vo z-Ko?DU8_Hnv;>W+kibxT!;2_Y+l#iAz`b+>xDf{w4K%h)ttPP;yne8rQ7OaCGTq=v z=a6?HdV-K(MpaD^Jse{qq(iXlJF{|%X&O|boAh5mb5c3!54L8T3ErT)znC9s8vj%iPR8wG>AX%Wuj1<3$uXs<;(!t` zq0K^Wzwy_fPaoHp#pK65@1ihTxUX)xbenf!GhaDc%gmprQIfjri*8w2gU4nmc8y^L zYjvhfxYp$3>oJ;Dwr3zZfYUstScRV6kYc}fZmWBqdo9>n1@i&Rbd5I2tn!i8KxN~` zuK$2dVvISKza>>X6ODgyr6P)S4}ksuZ|T*ny%-p%9KBh=aH^2(3Rg-fb_Q!;dC1}% zVa~&22QRN4w3ac`XzA$#*?E8*OPRZHp_!2%D!??P%RnJ5nq>Se_;O@t4bSr&X&=%} zFFdt*r5s%J393PJCYx zc$Lo5u9)BCm0wYy@FH>1@CgS4aFwt-TV_Cx8wJKT-C;YJ%WATY5IgI6a8YWu-zlb< zgN>HCxonU?1MnC#)_1`x*vm_{IKb+RP&F@U-l5y2$&z9ij%j=zOzwa&6oO$UwB|}1 z1ziFxNsIZyEbAItSvm(fb|B1~H7G*#Skre{XlDM~}3lVlWDwBNJoC0LZ1{h1bu zJ5#9)&DO%mzJ=I9S%-U~~vX(tn|+`(2Iym>6Qp zsu=GT*V|oHc&m^D4Tc0@5eiAHo+Q-7tU>YBy(p}{t8Yc_r`cyb8RIf}Fo5uI(dWB3 z;8S4HnY&VUFSBzn5%LiNZP*H)FluwmZ7DnYS}&PSLc;m5{?Qkf&5~f}gdY1{c5e%9 zope#bh3pIR!&2z>j3@ADs)S&kz);aLAkwK2UG$X3;E@`G z&BOF~n=M{_f`~E>pwQt;!S%jByuxJf&b@>bJ4#2|ipVlFRWX=M4Xmq7I&BdX#x5hy zk>}BI zg!@w^-q_2@m0B( z*Mm)Lr}RnPBzO32~>U?YsXgt|#q z0;VuX{MA4mi5Z_Q$T@%n5eXIdy6O%KF<-9u{A#CsQ2s`>8R~9hu-r5GW>~CNO_n?~ zW=I-a&D%|-IdU{jUda7b;|%>ykq2~eZgVPt;vg(3FDdWA^-gRTVV!iY&kl8kj@5^ScgYE|NLC^5B|XCY1;+I4uzDI zJY~G7ZvuDpSUWuTF|Y^ViRmn!ez{m&k3AmktMFG%fK{u)I<)_{%Q%rptOB@@3QE?l zS+);u+GC<(>t(Iu67pdj$ z2{C7vYs8dqY`l9(kZ%_FGxX{Fogpa@fyrp^i}LbtXIR`d$C2gl;E86~*g=H$6+nqF z0#=ljs%aCZNF&2k`<#2MnKp%=KULg9KSh47loJ4XnHpA;P4k3M zSPZ|*D@l2_Rj6D#S8xydA||c=`~)V`0u;7`2+#RzEz)Hr!-&!%Tf!Db45JC|TO6oq z&;L{obXI*V3bO8!zt}ZhcLanH>sewJdAIUImE0;XqOGMDF_mPcwLiHHN4)%kta!%z zzO(F`J?2*p>m<(4<)D8E=JV)`KBWHj+YwB1HOW#Wh>p-S%RC*8*=9fGG!cI$!9r{& zoE&h#ii^?#Q~U5o+Ah}E2;|j4dLJ4tek`re7C0cNk??R|_pCT|X8PcsrmYHP)<`j8 zvDB~Hr&h7V9(>otmaurnyv>}V_~rl4`>%fk`U6dg`-}!|ARN!WX#7`C?&mw69*$Yd;+sqj%Nr&F;a29s5CS6HxTItuf;%*lTC-{rZOjSjH>1Fp9NplHw%P*z|9^?I z&+Az5tN@zaOPF{QO*IUV&u^$wa^8rU{k*{7chKWxT65&by{vH&M90-dQ+<|isl`Xn z%0pu;c{PH4ujzF>)n6@AZ+I1M_0`WZ_0e{XuU5N#?Np@|ChW6+w^>*Zw{+#+KhO#e z_jcP(A=z$Sq#;nJwc&JjTfpGM+d)rv=mENis$L|f?R!VJRe$S2H7$_*53+0w6xQCT z3dltVp8wG{>vVF2t!m!S3{*P^)4S1vyPLT_IL*>`Xfk(TwbxNI4s&rtSY_+(WzJRQ zx*Lq*AxCIJfp?yU+~Ahpe@cdH7NYDwOpD9?X(#}qvB94+>l6ah(ODdOH!J7x{`!e; zKf|oX=tlJ2mg@tRMS;S<5|8GdH936|+?`@|cKr%6c1SGX^23#IVP1dF%+>h+g3XOY z)HmpS){r&xZJCg@8$ymVw;?!(X5@`X%O_RkRL$GKtVi%?eA7!cseyrshy*%Zaz^{KVNX*_-}5iz)5^M zRHS20JALxoLC5Ni+pjq*Yc4ng+||6V&XZ~-V7}-e?9)(tz`U9A;M~ZB`X}EGmkD2k zQ%$wj#@-6Zkz?wv%C+~O9)@}xgAP@Wfdj}ME@P8>|4+~1#K%MnqZx;XXC?e&)ugAk zND;r*?A9xGe`xgsI%)4C#H*_hTNos#ag@aK%QFSGu9(e*0@<2eC;Cd4*mS{#ei3k^aE?Xlbl*hhvd?x4W0IaSW|x82mlaL>fEM+@yNy7x*EQ)h5}?w%H10 zRhKIfAL=t%HR@hg3qpUAJoG)Ed89K*CX7=_C7fa!N8c?ytiW30STbl`LTMm>=T_Cq zP5X!aA;EuqR4Dp%j_?bjZbj*u)8<^&L-b5E*xKtN;V%$vbIc6Of?rWNf2v<9XcqgT zmT%^H&}esvO}pJ3evRQ5FuUOQd@|?CCzt-^0pn%!|#P$n^(^gkEcKNtXyP`H|$HeU=X#CX}e>ZJ)-pnyM|iVp4FhSK&!}JKr=h6}HU?+HD%@ zZjRPfu~dN_hs3= z`~vy=FV;icX(EvGf`(L`kQcKREIyR%L06rS( z_qyZn{k@Dm;Av^&_rzB%ON|P*AW3p(TqOKF%=!T5<6F+%s#@i3+SMvSc5At8%(Z-- z|6(m|;}~)InfzFkErI(Ox2rrDsfn-O4Hi~jC>Mi{2eDM{EfnE`up?*%kP$mfID~a8 zFN#`5p>RB3huQ1~nhpWq7y%Q%Ww(Ceg>DMcq1!j@fi>n|p^TbUd(-IW_LUB`oqpb& zT4cZH7vB~n8#y=0sNEv%o=Nt#b+PU+-hqHTMd^#twIv&k=tti+WuGJ;@cVpTAe~wLauL;@XK$pQ`mEwy>AE zJHgVcqM|G23=T;SA)s=jUFs@rqG08kZvkz;#Jo$iPp&BEa1IozzuCq(r19pjb-gLi zniHUU+^Gt*<-Z%2_w;RK(J#S`Xq&Kr?YY<=m@s|OsNuG})ao1KG<~MA-pokfgzKEa zeq&nQW{nMA%-_Yp%j>1*-_!c3aow9zmp=5%`PDO0eUe?Gt(_{Lr=vl^9TzXEw*>pt zY~%(6(FZB8XPt$pYTQ(O$dud01;(9?efZzUKCdm*v1$wC6H0^drNVRbABnpD!)coL zzwAuUDo-;B3sLz|)YQMP4pdNPE+Wpr#nR=p6$&M`w{P#7##&Tc4r@4Z>W{dVO$&Y@ zn9&F^ft(;bTe--L8TblX^YQ&#MfWC$^P;59y+`h>Xcpm*+cV-xPdjr$>u0X#{5Q5x zwLq_$YGb=uq&^74Dgfw4Nk4O4TB`_6;>g+QWSaME-Yn2|sixsa=cJm`wT`y2CW-lf zFSWSPBQDOHU|ML^cUecYU7K2pTrB9K(ZTR=D}FerhTD)PAJKjhJ$O3x{LJY4q3(=d z@NM7b`)~y>ePbzK^vSQi}PubD8ds@$l z{gMr!3k$dqF~LoNuKDib#}#qq6(*GNin6eF58RU|_tHbLhOiXG3n$B7y(pW3>U#PL zZ#p`ulQyi)rvtRqLcM9SnzE;FLt1TG;ybjSHHigu{j-sk;Oo6Pj2_3EMLPRr`5{7; zUfH{S_!!?USEPBr+sbPtdZ>cwV*b9Ie|V?e$?@#R`e*WTb6Tbm%(~{kAYTF|oYdZa zK)8wDv|*3?Fb>ghU6pK~J$<&yR9wAfMkMnc$Q_+;G8d1DxAp+-?3^m?U(BZ4%#GhV zz=%dj2H*ZTW#=-?%}oh-sn?nbX8Z6UXDTb^z=_t`tGcSwd~xb?a+}A354n0a`Fdox zfdG(ogjR+GVm?CA`EHRAOnRqi-EAOEG4*VPXFKTI8GK{>o`3+Q!Ep zFDPGY(w%ztdLEyO{`>V-9+wrBuu1;-opd17K`g2$$T^?Za)YC3AM(#(ovy8(BcOUw z25|EI+ZI)Y{}Vj)^!#9~Km=6WJ$+mGf53kc9hxKA*x9lPB5;w7J{QD{*eb}?In8HUq%N9IYBkNL6CZUQTZUhaThIu3>@ z>S)ROX)2@ZFOlbCYrh5nj*qiGLVhYLGE|}(;(*+*v zMBN(>2f|K7ZuS92_kSyoCC6fFFi%mON}nLkC+5=Mt!Q19th&(6a`OPnP#*XiNk}(%d)D4Z?USIB5i&PX#QGbwIOP7p$w`5(t;qMnV=UuxH z5FPAZ5{SGjD~R|!rxlxy1)&S&)*ZLCcJWTH*8EXwZtL4*%)-@&fZl<*eyt4R4|vsm zs&1;pcvDjTv#x5ak@drp!atY!qrbuOO8*TBfJWEFlUk2dZm09KTw5Ct+gv;23VwZo zWS!YvEaF-mw14JfF)fbV%PB~$MhqTe!%rJMXNLze(?WcSk}8t#=Bbhr&>PZfMp> zTl_oKP(&M}Yu<0knDvy$A2wFMqPXt+G)HhtD)aq^} z{d~*}(QVEOC9DoOcXn=!Qj0#44{g23pC!P%MPj+Ux$w6~wD0Q%yL~wI1N<~!<@E)# zk2-Se>Mg&Nf5_4NhT4vvR(F_=ziT81w>V@c)~WK(2BEEA^nS|=V>{zU-wvHX#QX|Q z!{!uu%m@#@1_TuLhS%OIniYw1ajQ^VRUdvcbxcc4w7iz8qAz6;TU+$sA;@p*dzk;) zO=Z=$Da-ATK52>|k!n(62xH~wcoy3tJc*O`nb8^D}0Ia??{YxN5_-l0cLa1Y%!i z7O```S!1KRZfP3Y56oY!0k)m$Kb zM9~+&?|l+P$Usf6f+G0d<#rs70TFA@!XnyfpSLyN#AG@J`{%`#cINwaS-*TF)fO}N zRElM4T`%r+7t3*b?L23RXX%YmuOO6n*J68j3ZzZ(J@;$hUtKs$3Sw2;^}G@+I%{qI zCq8~dbLMun_ieS-X0-Kt;JN1nu)byQ*okY1)4CgNseHe&EwHztZEwMHVpysuSAKUR zKVw&Dq^{9SxPndZ8Do(d&_#HlFB>%UOPM{->%h?s(OYne4-LD1~u> zpOnDQo-l_48gwO<78z#?u;*Zw3h~aD*fZ4t>mcosIx8-ARv2^Bd0aDO$G<)51<)=? z4ePLH7bW=ACEaxF`=saHJ1nWOf?rlT&Du5f`H0WF%E3Evn-831a6uNz<)K5%- zZwqVJ9FEmC0f_u3Jylo_)bRK6_QFq8bkd94gZ{Ba7x$y`Yt-Xi*6IK3zC!x;+q>uB zrD~0Std5-e@Qg9zFgqWmtzQOOoBfAOwFiCLj2?LKxINuS9P4l#b9lk{8o+Kz@@Ru- z!%tB?^~FIeWkCat2=Rm@OZ^$Kv}Lh1r>>-nCM1q6oUUyL9UL}p+FT6Rw4RckEFdY2 zo0R1;^%&ZP*fTJ7C%(>s*?s^*C#3YlAr~eZmB!TZK{N;MVkY&VtGl!UIohM9CfBS}bQ;+t&Q5W`lFqCM~qk z4PzrN)+z*aO;}BtgO9zVY*u8W@=DaiR=Z2?0c69N(LZ-$Pl@nZaUHr@@R>$a!nHjf zdh^+UA#&s*0VurumyA-#uv_}iyxmLg3BPQfTu_hyc@(vNAk#*mbRCWW&+a;&!A)0% zFjibg!rNlJcKlYVvgk}%=N&ZYlyeQ#)cfTXx2@&{8(B{}Kuxb;>n%G(mk#3ePX(yI ze&w)=nR2*s|0OQa%dket?w8^-g{_p&zFP~CAs^iY5K|$#pD{hkqFu9W0d{Hw*u ziJ}0V568KzxBj)07KH<4S>rs>4mn|u50jDx-#%Hf9Xf0-*p6G+ZFDi{NSVeq+|B8L z4>j3Rm->tfRKx z;!;4M)K`TX=bg`iU#e=6kAKNhJA*H+x{^vWqSsHoEP9K@RCbMP|EmeK(^?1)(}m2S zZwjBc4o${I=26q+SxzGj9gtel$q)WjA58wI$~zvGy&q@#cZmh#XbioxurLoWQZ3%v zu8(p*hn&;M56&&1hw~oU-3W=AFL`C|&=m!qU?iN}@*4jmGyd!^Km?KNOp3n$6oi0H zJFp*oDW1*L)92%kA~qa1f-fw->ig0qMAn{WdazWP(eVs-BTOqOutKpUz~_T9eC6)ceu~G(dras^ zLqS zn_qi6Aec)r&wKCv&%Vv7|N7qSM}F-)JcrG6jbpp7W|$BwBTCpVA0x2yjLDOL3e7&i zMqx`n0_oBsxejjHUiGJK85A_yWMzFxli6Zk-N%kzI5U&FRPw{Sp44~4uMw`-%j;Jq_-kuLon1ibI_NfF~J z|JWGqUA!9vc4apsa`L73W^Hq3HD2<|iv?*sYt+2G7^(T;|9l>p8n*1MB(jCTqvUmSJ zIFf9T=s52}HjBrJ*FI_Yd_PcDyL#>hfUPRpUZ2mFtz2bLY@QOcxR8qQ#1d{;^R4sk z43bxfmzPe@e!F|ZWODBFT~OwX#XZ+I=I)}(cdNAmuye653QdAz@A3ZcsuWNnS+3Uw z#rvZ7`m>_3IbcKJiP#u#sG9z+?QAjgmu;C+NKbsXU;Sv`J7F(g4a5L)46suPImj*7 zx)h=M_4R#?$?Z-yIFaYJ(TNQ8+=NNj-HD#!8dI0U&{UzC;a`R>PojQkz6Cg~c}ev7 znf6!#i}^#=jV&;2P}-D%%^T$ky?L6y=Hl1=@LkTDr{2V{qGvVwkuJtSU6rX8s#C5h zt~o4g(gat_gX~42K0J3|Nu^qge#Gh<2j)Yyj}Pnpw}Eb=h^g=n1_buyv#X{CTYYdR zH;c~utPV9M&6*pRvuSJVr(pWEnkN>_M{pvcN8#V`E1Me)_9g)t@*6$@+6kW}-VGmA z)#pX?_iG*7r5eC3S1XY*QfO`;Ac*^cp{Fb{GDf#dQhr|1=FtE2o6e`Mv|JI@cO_)0 z{LevfwDw#Z%;aqUaf<(i`>(Ud7Z$T^Pqr6cPC9=t@Rk(4QYBfu7ZmMMSXCO`Jj6D3 zt8#X0v+T5*h8a>f=@%P|na)(~pQZV`=1i5>hrM~yRSC^f^oOjs z_5qGa{j9)l;epI`q@?LCxLSSifYD1f;v9Cii;suP`C8B~ak;zSwUhx7;pd}0DzhZZ z)a16{@7)@#J}%qU7|9Lr#2YKSmmQq*rW>b&0$xAL=uE#j zEMlV??e=<~Thk3AM|b9F7U1(reOAIJx?7*v*Vg|`+m$$gSSM6aV)9G6;4%315%+3Mxu9)xXz81*ES#`2VZ`JwU?0{nsv{bE`rofg)4M%gB8slD(hQ;G&CM zWMm$qm5axE2?bl{SZ^5mx5~^tJwJY8`+3hOXX|u|`8bNNMM7a;q+6c+@jsY;Z-MS< z&vXh|w4lf3bDt_0Wz&qnZUW{w6O8{J?qcWkta$ygkxwW47qnlNR2!kU1U-^5tA9EEM~zFU%;_Ai;7sO~Rt zAqSJB4oV%bZL8>}_qDBCmR)ey@or{A;laaaYdd_43j)tC(Wgy?!%v1thc;phFjDza zrd!K55ux*#5;f`0o}WWw=ND^RP5fh=HnkMPjv^cdoXs3YQ)`ri^L*MDr-xmjmk(;! zz8LLbt);%jM~bP1Z27cc*-IYec&`(5L_^m&W0kkfC<7%E_;~{3FzuCYao^=1<(Gb) zfw^d#W90t~ENU7ii|yldm%rS$n46j&3nDBiH`GHfKeH`+aR6ll5ApcA;Zw)@Gr|qO zj%F^tROeBlb5v$JofnaZR@9DB`;uSj8oTWs=NSF0_ibYf?dx4DVk-cI^R3UH0B#YJ z4Hn;$dGc`R{r_lheErQ zJs(Hyz5C*UA3bU`>Z}N~u?v@(K>t-_@6&>|VSbSmEBBn=INX3~wJDe+O4z_WTr}td z9U9L~>2fDkXt9NFGWYEl@;)?U7&Lx0<(S0s#1EJL za(E@v`rPZ!k7NAt?E9`kVt-fA9}bUxNh;c3`WykjO4nT$Kos!gnhY-LEn1Uz_0B=l z7b0&qzFSx>ZoaY#xt-x3u_=+Ec3}R^C&+o=;mZ$d(Y{F7cQ1pP9X;zKE&DcIj(sYG zuDnt#E4 z$gyzYWQ~w3Tir7+{G#CR=O30`8kp`Ko%mpjD4&^AmZ`58HmnrkI{tZhk#EQ;rBrJg z^R=Ktr?H8#@z=o80zHW}9%B)%J8{>ccjso4QFjsLd zcW-Nqu}c%nyF-0G|Dfses{!$fp3zT|C7M2dx{A2-fK=_=H8*mzVv?Ea@wb;7N{735NqEz1sV!`-k^Nn9!oR@dU8N|GMew03C7fp)CDYC7%TWRHr&jX z)EmXVSz)Jtd+mgsf0#daIPD>R((3$v2PK-VL2xZu5jyPuJzPt@(YP3d8dol&Z8!eo*Z3sI?@?{H%jpHa8WE}DIVYW?G-`g! z1&Gswx_+)eQ<(4N@2@bT3~I{L+D<|*a3Mm=FGVM5FNdO9y}RNifv78tn7^V~#rp8> zMTKHsMSZV!Zy^7}2o7ieao~sky#{Kz&h*WN`@)E+MtyOrip$;#&8 zX=)0l7fATL+S!iii|O9Jd8pc=&0nIZWb}k?C**2yzDl~v5YweJ?qq|dgokTf9qhV? z94uP59cs4!=W54)&$>30u=r=vBy3Tl?zWa0`TdlRbG=s0(Dd+4;bPB0 z+ilki#9JTKif-0zF|>T&&rBdZt8=}vAN4=r3-P?hx*_jw6@9+`QF$ZRr1kPmiDEP4 zSC>PO!XBI5zt#fmQa!td;soGJhuL*e`9rKI_m=A9*G#Xw1Cr_I^domH1(eik*2D2Y z_RoKeFQhR04DN=#iND00ZmTG-_@4#%HC{@T+5Y5bMyTHM3Wwv2Zen$J4%-aeIx^Zp zv`4gjsl8g7x95y9mKKVe(cZz;uX%Tl$Dr1J>0MOw`t?I|*hQ?hACOKuBt6YzjJ-L^ z2Wi%La)h6D;UqQ6Jzlk!Iz@P&cYoS7)n2s-?!&1$8Ow5Ev4U?*+*@QuRV$=J(}z{8 zu`A8GeQ(|$Y`#0*8=mr4drC&=*fktR5ajKKJ7_`LL3l7ozFo#atgV@u7T&tH<%coG z-dS>9F4MjDTFECR&iRu*xJYxYX_PGaU@?%4e)6bC^5LX@dbsqBjRV(nV|;qr|AMl0 zAhB(#nU;!)EyR!=RhC7Y^TNw6VEqKueArV!!^sEuFP;yp$j>g6uz<>Mw3>XS zh>V3*Zw7hhr0}m*x2w%&D2tD4)2rjbUtlw)Y!fJLomgfaI>z7n(KeJ zK{wl<7x7w8eOldM38$)bO3o>-bu9aCgVQPqA<))7toTb=dmIl7m>D+qwZnE{=+_#d zhE-e2PwcQLtFT*q-PK2j%O_U&s%=3*@XdynyHbajU-@I?PGeUD#Q7qf%2pC?b$qb+ zh}=4ubao3PMExz_@$kN@lq(}?=fB0b&1_u@R);Tt+XZq-Z+7bdK)L87t_l<*emVSw zr~Xn*qZfJrxc8>0+9N?}JNi5gz*!CS9#$&IN-%T%vqqE%p6DfyTC2D1MeZ-V^)9(emva~6g03Pg@B^!R3-JnY~anAn|OY*>he#HSs4 zr04D-`QKUArO8i2rG;asruPP1wxH)`?TMn6Ckq3W;yO^5c)b-b&L!wP`}UPrRbTXn zx_r&De(8=EsRMc#ZNZ1-S8IS`wAxvQ%j#2)0-WPiPH7=e6@hGlNqq zP1<@6>+`PpS`NmMUMOPv{TTEV$NB(nZ1PFQ1gRMjNN zqh)M6U=J`BD{N`iuCS7JLOadrE*~ZTH-Q=O;@8vtsdknvYKU1EUEDhVEG;0o`K_jX z*pM4;=g#tl@i#}jjE8dPQeU-nnh&#x}dr;GeY>?)BeBSV5=Te6<2N&V%=kOPdTBR~y8nJZt|eq^D@NLz$M<&&jo^ z-;EH7XzH99Mq^8aC$tXcE`@9FJb3@+#yccs@UG9o)X>5|&VeSg3|*sOOR7Y`&vWxn znMh5gNlfTarTN-NWZ*_X{lao-o)XXnEmAj`&U}3CLf};y<^} z|Kn_2wcLVYhPc2!JQ`qG+kP~hSXE$ZDsfbYkW^)d`;0gsA90qqPA&RsHJ+j zW9{_Mis2`7GZ7ZD!vD2+G@EHVVbu3=1tSwCp$Y-XMrobJ6Uf(Yf=MwN2H$IUJ^i(A z=ga)l{wZiRf6qHK;_zsLt%AzGHPWtmq%tSSoYqjOefCziv~Ab*f5*)h8wYT~U(l5J z_!_ah?%B<=d*RO^YdDMo@@(?a1o=VCd_X1QeTD8xcIZv{XGX!oI1Vh=AlL9RXdG? zUWpzFE1CuxK0VKnHEDA@V-0~m(a$SI$D6|Tea+Htee_njGbX%OCrx+EOK+B>eyu~z zUP4}ED(%b`UK8o;D>0#P5VSUlO{^F-VuzwA+I!#o3(lu=&LcA>kw4@U+PnBn z(Nd?d-k0-|Xz_gV2k_A5eEuWb!MLk!Xsw`wY3$?l-Ru zBh(eQOE@p@|0C{lf=`xCJOx7ppCKyZE!qr|a@S35_~`diO7L;*P$r#AP+IhE2nsj;W;4 z4GMa-`8gHndxCuU#n4>%dvT(nh!%V@2)W*Tp+qtWv#VIl|emDkt?yq-7UqP+$ za$8yzXW4v#gahMe;TdW(CGnZCZSK&J0TyBs%}#LBc%7ugp`Fu*JESXYKQR5}k-S+K z+`=LPk-zalbu@gI;!<@hh61|U^gL)F^35Js8Vg)+bYr~Lwtou=bPNCr3RiM>ee+0A z;F>#6TyDx!)tmMy+KjB{*sA@%Ndu&fkGU?kuSw6JJu}w1USh(Zz^?}21%b-C?>2Fr z`BVE&;0=nTlt;53oFG4W>7`}Y*0u5q3QaBIRK{ULv(*&ukhAZcva-h7NFFE9WWqDJ zHsSPUB~Q-7XBvKl%i}hoKigaFadH8?4F z$>;j~{n1W@O=S9Gt{g`-#eiDxQnJyuK%e<50amt}^+#ts9^_FN?5uTz0NvquzT}cV z$bOdZa{KI_LFY|WxNqD>JXsSht0?l-t+fATOI=ts67lB@xlOqzhuW+E7R8z)Xr=rX zDpH#wj8Q%h67|RtTlK0#@nzBpla)-ZxRvQI2)gIfZ0XC_3+bDK)DA?NWU|`THX7Zr z+iK!cDa9{-b3L9}FT%}1C;o3fIPwnZNBFtGKl1XvlGO$qv^o{&z1zI<=f{0+cJXDP z6kT^W?!>mI3j=J(s+Br|Gfvlhq#=FJ6Wfiw)AX43r^PI@vNBkp{W|N(ml=+l7(4M9 zaUl1xU`91kEE~$^&YAo77bxwiA)zssX$;j_6PK$V4E{Da^$Fdv*D*1eFtk;0u5uCA7>a3@wt$vc#Zfy7p$EuymcGk#H+%)K-bKVc8t{JC`4JiIXZ zPf|caOJYY(o#}Vp)&8209;=|)7eGs$Q(6E1&{})r1p$vFo@M!-uU)UHs*bBOMTKr> zLz?t0e+;)h2aox9psAl@IT^AH{S$?~wX()ndv+`TJ>kZa{#qIk>t$m)|87Z`9q7c_ zfd;{^OlOOr1v5cQT|IN7=+HY%nt82V1m%m~KvS01%QFEf%&w@K(B>W|7@)|Qs zq~9Wu{FzRv>7XPeGDAUJN=)y8Mp7yu^!k@dLWULs7l(02umTT2JmMDM!5ay0(-|BD zh0)a&+&3k4EJ^mkZ+|_bkVqWJ>Z?4lvXs1xwz!~_Qxb!{$Kv!1w3Zyr8d&odXDLlA zYSOiGl&Wz31pnc6>C{xq=)Fo}43F(b=Mq$4O@?C167}w#2;o_@)avjy8)%$-_gppuT`Qoz4mRG0LBcJZ+T$08Wd-pievR zGCd~^Y%oJ@zNMNPf@UQ0vme_Vvl&~Aw3)!W+bS1e*OxIY@#zl7eXPd*zV+U&I%jKP zy2~_eL%)&5R!pHOc_Y6eWW8kw$k2sblrCW^yRrtO^J{x$owqg@^V6T>`j)NvayrF) zCb^dG@_ul(>w;yFdSQXB`=IRcIMq)@o;?4(7FG?}pzU%+pUMtG*keHf#JU)pOSvD; z*Ncks1j+MwVP750iAssfyn;m{I9L>m*SR_r+$~tbQOOEOr`2(i?;8j3Q4x{n6_~uO>LAQPwA9=4mj-Utg-^V_QPNGn^GI*OLtj4 zsp>sS+Lz7l@lg%IttEi058)WQ+-uWyGYr2G1aStz&;-6)<$bsb(=b8=L+=KNQBeAk z!;mU~A+NCrxCWW4v(yMpJ7o*hZ#gnIIFo-_q7ifS_W`>UVyEt-koWCWI_UMd~I~Qv(gdAnp_*9 z@~$KlkEEhu+{2@00Juw?ghl-OtMc$SvAl(Tki`wMGuAnC{fA?lK9ji2a>n&*n|ANu zyYJdj>-@Jbps|Q1NCeqOKK&!(rtO+v$!EPO5c*B~gTD-E?93!2b0l!+ov%dCf`xn6 z?TqfTGz2Z*l@yPYAb#a51y~0-cuCbkX0ZG%W6*nG{?rLAr&?1?jT4YIdTRAWkE$Pb zr?<~{^xS11Two?CBkKFYp>4bab%lj1!3CbK4Vh@ok0WqHN=uQcBDmab)C1gLQ+b@5 z-J;ZxuCc!w83<IQ# z@Jg*_e<*?{A|nE<9bc1i6Gt^LTkU|ZA)(dK+@J|6B+9sCd*YKNJFa82OgI^ zO)Fq&6{B&!{D*HWOzZ=iPfVoux0gIQj&k*YGth zV8ZmGWd6Ls>fW3t5K+&-#^qp|70`0g0oJiX-hH9B*__(2T6}Vm>z*a!UQ(QHe)y3M zIDBHu6tQW_{#5P!68ZC-Hk{CvTaMb$%ZgzfloiZU8awWLj_afuKqDnd@t2aAw2h_N zg%uMEsItyX@YlDu;56^f4$xteGLODTsJEMpaoy5oXZpNMO`yV7kM)jz`1o3|u;A$R zswn@%eavOlvVr@y9hptU{V}SA+|gW?zqp?-#6_JVdwex__&VF&)wZaTnIuZ-ct5|Z zDn_2}g8kD(XUI0%^iUFqO=x5wSW11~4kP~z-}yDsi|JyoeLcX6Xv2;Mzkv@cSO+cN z;g7K$Y!$b{_eqQ@gh`>RVSyX zC6zUm3~Y(ZBW}^U)(7v4uN9eiw*^z!OKRK~KF584?L)#ur!uO+jBW~zl57xxK&*nG zUJMK>KSVswclz7jpSWH~WY`WLGurF<5N`=O<6usvCN6LX?Hx7tY&5%ZrOMOrERc8@ z+j;$k)~$=&lAr@TLu1cbs=V96;-uQyup_=(N3#p{9aanVs~c1ab8hy9Ft3lx zeVi-`_t#}#(NgyjJF=sV*sQ3z?@syNjZr8fpPSCVUM}c8WbB)kQNgda-h?mro8Jy^ zqvrMi4{gG>wt5AYKbr+&e>ObQ z4#`<*vg7$g^@g%>%qj(inh-hBc6l z{8S{I$L2;SwS;vrL%4P!-%vz(rsogmw%X=hllnxDZM z&+E$X28RGX6$@1vF-eTpi4FL$FPcZ}G2h$I@x27&#l~!!v6UrD8|~!F($(jyV*ypf zo5}fh0#@<*s-`QMu8(z-OddBKZ8aOM%%xGB_LxiOze6Xs4Bnf;`zApw#=pe2XnsC{ z{W{4w)}v27(Syg85auGk@;GmMgDm{5WhNGEr1N)PS(sx#{!n~>CMZK6*t_(lhFqzS|7pT4_w-Q{MX&z}j^?lv zMMEUBaLjb~-PUUKyIsNjDIf9_2hP>Nwn%V@1vBTVQP3z!48aM`N3I4`!FS(3tefiE zIx)m(vB@omDOw=rU?bZmbKU*0LM_!v-N|oNnTZo_NrSerVdF) z|4zz0(GB&*&#|wo=J`t*lO`?EM(H1M&3SL(JxyO-`I@pPL<3x_Wm1Sd*SUvHbmlPV zsIP;?!k`6}BvYUMadY!~>twf7V1akkNlHf7hOeK_kWtIA_-lIyNz^5| zr78U5^vm^_fSiCY`gs$q+kvM>Fh+UVLD-26>=;nip4nbDZGK*@iVbrQHbjsY=@3dN zsl_}Z2$|5v8eFs0o>%D{Hro|D9{$mz%;b`VfjYu1Z+G-m`|7c9Ie;b`2)p|(5T@q+ zc&*fe^ZKymX$EF5A)oPvJ{uxAJbqwouwzbX?j845tEMyvzGzq?>;F#h%Mx>jz)b!? zESm>aVMynb#d)$RCSWR9SnT)GEX!evB&UF#T2D7Mmn;WoiDj0D{PpHs32Z)EU}hj2 zwx}fBFx+MR&ObPI@8$?hb-O|Csaw7{| z)8nIY3kRr!-mQi9>$m0{I2$iE7r=?*cgw!Sx{C&#*_z4BF(^N6#s+6`bpCwJu8Lgw<4BT+SSX+vE+;NK^C*1=Fs?$70MbW9pD)p zO03O3aHJyt$o`e|aCpkV{Ni#5x;^f;4*Y4c);F6YD8{XJDZ|c?6+M|*B70-6DnYD| zUCZ%wIiaZWtdGr2c+~daVRq(z?;w#$%Qo9u|A+b`0__i2i{CHKeK0{-Y#+x7-^Ib` zK7cmf8|IepH33xkXW*YSRQ>JPjJc1Wwa7{HiLt61lZ}4Jn>e22Iswk9>*Tq$hm&b{ z(>Z8=!rYm!4pH_~2Drs-6BUug2hp{P^1#{+)e0p`m~1l_hL!wq5zdT!zYegv;Ow)` zdqj|q)IqVgI<$yUJPYgJMd+DYL>T65wg9~wL*vh7~@UOj7Yae-z5*UHFMq` zt|bxG=J0_CoF&+bX^b~tA0-|~djesMUKUdU3lNmK>9Wh@o9Tj9*6sS`^PemTi*d6a zf2s)oXa6Vf~Qx#QAnHWds#2rl?7X}&H)6jnK=m<$uE6sddGSRh&F4I-c` zJG#811L}1g$|`y}Q^mG;!ntcAxC79c4_*-l2oCP?nN-jcXbHi3hdz}M*-6dr#-Yw4 z&|zA34ih`q8BbHh#O)%@mMs_w&-1;HNRmYAz#i4S`5C8I%h=*@?W1UQBX{pJe?~jasfPW)tE8u-b6-|2idDR<2Bsuccc^E%fb~=3tH97ymKyf3qt7M$hvD^vz8!5ALauv<|P)p4O0Fz zZsyzM!xcy_MH=&6-2L~`frU~M$KSXnuLk~hQRrP8#zm2fJ+$QDF|KTHJ$f==>b z?_1(1(S+2*J6TGmG$r;d;QcJ5^Be+RBoBpTd8h{^d7=Gp5B3^qScK!>^~Nt$(J0JF zs3oI1Mue+xF`CWQqIU_40amzk&Bi~WN`p$X@OU@gviZQTE+vz`k7bha3jL8$`W=nM z<%M<(#j&;4O{U?KV2^J%l@w}HLwT6?<&AD&47qzds&al`Hae3cqB0#%av~;xc#WZ#Qru!7Jn35v?D4khWgk?B*M=>hbddmCf&CrBZJ)HSzNP0d)J4ut0YwUCG4}VPPFu-4z18W zSU3-ttXN8LerP=JX^&F;ptj^~`}7j?jw26d0p{bjZ&dlD^b=cKo6F+@wwwt_o0=)? zXs?PYsukCRxVry6;PgRluqNiO{-UlwykGO!@znMB-L5u!1)l@Tai2lOpG+J{BT9<7 zlc8yWp}uSHo8{P(_4qV23x=wS7V(3FgLBHBF>KkXh$tm6Gk%}=CTWp>h%@mwmu&KK z%JOUkVluh0Hs#EOX?x74b`b<411m$k`ktOT`L6E9h%VRGOEn|FBU0FZYOOys<=ar@rxNwD0n#fYlCICxv_07ASiC zdhfV9elMgrxY=VqR4ez${Z2&1!iw+VV2`-?{=%x65nZymabTUkMfxcsLStdfl6T`Z z_Y4%cO#1;<0FqWI*ARxcci`3f<+59OUAC9|q++stL4>yE3-0LHzbh~L-hW8p8BwW% zUd_Nz2k)Xh51w_;TD9mvr(7{!Y}bt#5MuPePo-%ltaj%gram_P2z&{aBYx_{{?>RE zI&c1@y(39gTbi&UAC8SG31|po3I2eOUsgVQwcpbRj9oL*`glO1t6sbX1dbWG|2?Ki zTFW@Tca09n+%}q1?W-+h?~~12Aq*+^4rM`Qg*P|AhlDUhbY-A+Xp^e;YOy zWf8`66A5eIW6|#ndte`S|Em^f#Y9L?4{@GvCP(9zGFb&B?d9usFteDcr>S&qN_SJ@ zp7?=I4tw*mTg^#93HnKf@)h~9xnLz;1VmZ5mjqfAQTcV+vA8(iSY5@)lynY0w4WCK znxi>ZzxRD&;YzQtdUvaEQi%Mz;+EWK*7V$b`jOf=$%ctC1g+T*94mi+TW4~#LeE6& zOx;iy>KfZK`@3-He_mJ_zS{_fO*PrZIH980xZ_U^`!Cf0%@*)xC*y8*PfxT%ET0E zVASZJrZTSpR3r`{*jJ|d=>txHt5ApU7*cj<6KgS^4jB_ zJ@4xZ9d;Tuv3GZyZbmaWsDSCf7R31>t>*d^ax<=)Crznv?$UBOM zKVCSi&BE%4k1l@}Mq@Tm?qadZnu|x4Spn59^L7H*(#xfK^;eoAr4E?<{@0CozhGzL zDFFl?tENJP(Q_i~WIeWHP5spW0VOZa(bWOMa6^|uT-rGBIyvC4bhU1e5%!z_9;u;I zW%H=(5MstZDV7dpKVu%L)CHety8h>PGH4ORzhgcvF}8k3hU=Ku<%Ns8Rq%pN(Re*IiU1cOCTwp#>_p zy(E^MM0$t){pv$he!sYn;-;*ctBT$MfAF&wKFp`!vyRQM-euv%fnmU4#=*V;1uK!^ z9m~~cI2f{?tE%Qw0Fk{!0cCKIN-IiraQ$glBqJ#yXH`Cg;AdHaS{hIxl1`j@7| zS!9o1kRg>X3xJEA5m>BRr!C(wb*mZF9Ay4r4&J^qCphC=MtV(x<6<;R-AneLr~j|4 zAfQBFYFiOMe69elCZAg^HMSSKR7zeaH;WX5wQGRtZhq_Pqi;WWe+hd57ch?3K6nU@ zSnBT^9*JxlnEY@UNKzdt=9gaF6D298Ud{qhK3Bl$X6QU+#6mDc)=H{{N`bh}7!SX5 z*o4pX=PUZm8E&k7XUn$AnO=58ko~^^3>z##AT7r7${6x6>H@&EV9_i?TEfy>l*jb5 zl>OCVWkzsX!ujc*=TyVKMNC4&!Q0woqx^2xwGN&c#C=f_Cm?k>+zE-Pg$cR zpxWSOPH!#xH+RP$+YGohqZ3hey=_mvl$q?lwH*YQn2wIEwgF%ARv^acbcLmI-1F3c z(tRb7zW{KLeLhQiiYvca%{ubY9?+M^qFkQDc1GP&wlc+E(#`x{V8RZjluK{)bIeSe`12 zIAy+4! zK&Rq}JBd(vy35ze=@A*w1bqg554b4Yj;lovP@ruB8X|D#A8QJ1uwkuaUD*<;EU32b zdu^J2*)oGxCH6WxPo=Wa#EAudMIk7588xC%8k z7eS;k_9N+rqEH^nL8eNJWI*uZAd3KNQ#_V4MvJi`q&PRs_3}wSLu}5iWp#tec+c+- zcpJ4119XM1tnZtnph|vXR?ye?l`o(jJFDGALX#5>w(n~jJEumcSC322Z1FVmsxA1? zR-c8J7}W*u)alzKrG7YGEm93~W!J|N%uT^|kI|wX#zt9hOK@IsnAQo!;IS5)&}=W1 zRcD{{hyMlL*w=kESfjl#W~N|eiqb6y$sT`FHan`H0zPT4e|FrhT4Dat z+>#vOfN&@b`tGaKh%~vnon47#k&_s+8~cw~xfByi8zQvSJF6lp!Pj;IU^!+sn)aA~ z2}HbRH}kcSwQzirpg0pC>BD8f+AQu7O1w@9tqij2eR}eY0?UhF%*-Tb1apfq3joP# zWW3IB>ipuu%)32L8J$Ucxv7c|O?lx-1<4wpKpfF|MHNCrE8SXaE5wFRjmpyG@~^{| zmx~X+TtrHh19~QnfLgBl6NXu~OavL2xg5fNJZ#8tR&mDC@chuAIq2qvs;23_NYEpV zC-O=NDCZL?Om?OB(d3jw{u7q1lMR?`7Wz|3I?B5=$Pm$_niruuIT46}`}ey8_3iSZ zAAua?Gb0E$wR7ZmtO#gnOT`$feh|>BRkq{z!WcyC;_^3wn|S$jTNRkgf3{On^lnWN zU}Z(5557_;t3sIb9i=geayInLDrrs6@aI<+^V#_}wbd#=ZtcO9wB#2fA{q%gX$K9N zh4Y#3{0!`ak0?7OOS(&e-sRtwrC>ZqtVau0{!2LI>s`+S<8{fQ`L1aGZ2D1 zy```7R7-9&s%!+aM9I{#k?phZ%vY>Q`f<;qF2L`|cCd=m`B1rU4AeQD!K;vjNCg>yUGMO&(&ZVn zy8J=4;*y)O2pZX*NE#|Sf5Hf`AZXFOb}ifE*rfCb1FT1Y*D8VaJjHZ!#tcQwT?vf| z{<$`LIhG2WwXDLR^WixbUCauW@&~H&(*yyuC6pcFItXHW!+C^i<-i{uRp7FK09!Wn ziN2-0$smiq{r)4iMu9NjFXSp0HWxQ~mweUyLX{REt7)zOm=-cn8e0t5_6p6hGzB+! zRJjwk|0C~mT|5wJ4iqXEJqi5@>_=nB?=nhw{&4#Z{o&E(WDTs^K+MS*C@qr4FB2fI zJbKFG_DUCpoa#s6J~BYA^w$Z%KF^BzZ$$4HN8^HiZ@+ziLL(NE#8nMwO+E?sm)x`) zZ7cI|3^K3yfXxGm}!OHw!i|#?KU7F?u@r|{o&+1spX$a=|mo*7WY`8!x zdCPd#7B=9`n})`*f|c%yXBJJp8}U(uhOti8EGn^$WS+*lFmsP|_sE7<4n+12hr9&o zs_QcuZ#LEO&PEUUTIl*4JfcP{c3DmsBz842jHT1|M56c2S8i`&)jMeu-!G;76}L>6 zPo>%R#F?e^#)+N`ND{#u%1aG?WnOF)Uuk{kqd=hlM8ro|+B3-(8Pka_jOwIw;^`yf zw0>=}ZMm<}0&8c<2>9kfGU^L*ON=E$yrsqNqgHnDSN{AbVS#2<5wpMKGlOMQHjSKJRXMf2^wV#XPcXF|xU5>JPHB zVlL?ifVV}Ci~D7|N=S~4bb$}Lht6Z0CNnrgE8ab!IKiAzDgMDm`zsi_Xn>XeFE>@w zNvo0rpRR>)oNj4=>*tZ;%n0+?lYuO@;0$-h&hQd@$r8dZX{yJE9N0vYTAs{u)d^xr~dFolsq6mGpx2R;R zJnjYMt5Kvro3VXBhP9=YIIyp+;Mo~}`LEh0Rqrr8>Da>gyR5`NVJb44a=;sV;QSkw zx4CN|vGaBQKLW%g9S=iBoa0;-C~{|aqY33nH8{ZgAzxO%ioi#18#|Udlxl8pm$vC^ zh?6nQhq~#DUAb)jQ z+W2>6wEim#Ry>F5<7O`^tBMW=%)Ez#f<&eAjYydLauxtW53t>dyvYV zoW_jx1jDD~hnF}0e$fOmqUX^y>QqI>)9k69_%NP=>gEmK$qA+m=MoI%s1lY{zZ~!q zA-+LzTwTX~+*&+j!K@JeB`-c{Vre8> zec;i%WMx7~&k8&p5+^h6i`P}1oDC|W(zaB)O1Wi_1CNNDVm^&698ASEHMWqJX|F7O zXa!+K!N6u^`XFy!)+)8(>(0zzQ5jJJ7t&*yHtk&Dl6`Gf9A)Qrq=|oZ&eRvVe@0;2 zljnOyknZ!xhpYn{tRtoyqB{*D^jH3KdfM{pWK}h~8RX$1{8T?*vO;t>SG142qKDAQ z&g8pdd8|q6mf+@EvDPPnFM_df>-L%I>OvnE3mi8usFI#(-MQqhP>uvih$#isidC@> z?Y9R4mmAFOCb)y`{7hL*Ar0OF<|5%|1o-IGMDkBI;+c_%N88ME>f5@^axuKFt&bq1 z52z>3=S0vE;Zyp2$k1_ge4$r#h2Q`+Y`24s0`l*gL-;VESQwn(P;3FOoH1qBHDU%f zpRwch0_ZE2$0%-gs_6^~l>!L3fINC{L2~+ChuwoSZU9X@Dp4egr+vFV_|XRUk*YrQ zv!d6e8W~<3xA*C!6ww#?!6maAFh5Y#Y~CTT9FBuZ{5ySUxAcm-HQOswF>cBK^-O(V z1H1oQOmQS2A?TfHTc!NgVO^YMtmw5Ddv2X&`{o>AQM-J6!w^NdyfM?ACI+m!Pk zQcVT~v&z5nzmF4^m5=zn9`A78c|d$i-u`>S73JLO@hHodrk3PV+)l8DlOb_>Rs2a~ zWHxLHuEFZwQzLvm>CUsoD+>jw*;m}oH<=BzIruyttn*trF_vQe7Qe7#%@$@;;2f*p=CVGFyKJydhb{?^GEC4MFUzNWh$FOx;yVB#0QU`gfwN zR^qqz6N^DHNqz7E>rH{+iz?nbo7zG_A3ZdcRe-=dVxa)y5L(lo@fpKUOJoCgWgxER zN&RW1*P%;ee>~>V-a})9pg=2LO5Fw7WqPKi3T{Qj_E`{RPAq^RJVxFdPx}vujf>%w zM$#1Q53X>u>W1Z@VHfQ#!@*AE3kyI0QlIts;#}Y7!6cLPOnFd*$1VF5Q(LoIVmSfC$e*cEAfqK|m8CWXN=OT3N zZ`1_O!#^@-j|a7#+9I+Ns%#FsUc)6z<6M(Ynj^xkZRSK7FYRlooNdk0LnXttxmz|L zb{>b@$_x#z6hoXq`@Jic-s(lh7W9g|fvQe93~PB?*3(TX$wRwemS%=X&Zvl7Ev8Go z3LZ49D-&bCJ^#(UyNs%*qAF2glXd>Euzh`&*pdNNC+`(;n-)VK33FV+iRe!S!$5k* zHJ3(GS7po=Y3Nx&XRt|9K!e)oRR?nqbC32;^?&S3rv(<~f#bII6dJ-F{oRg=4d^oG zB5vF$1I^NKqEEEt{Kw0`FIxU!Ur4fG{F!&yL29YZYuS)IQ$iGksha9Z)san%(pV0I@~5I3Sn2k3fBh^*^{jAR2VS&(E;`quUp%pM4^l2eiU3DIxW7_8QSwV# ze)){bz^|~G-z-r!kYPyU@`MsiD_$QtWj=#qw$ zsd5a*Uj9U8aKA_r4^ zJu;$~CH+0e}qwf?z3<9;pOCkZ)E4Fd*s zm*A!P3XMAjf6;gcmnCyoxA&Brt{I$wvi-ZRa=cXRQ3MxlZ-e*Noqc7rfqmL9#%~S&xAyQ( z9_Hoz#sZX1&H4E*dLF#|EVf`tTL$nS#>=e)wr}B2EdPQse$hY3*h*g_Djz^4cf?5+ zf}A2aPTnblaiRLL3R{o1w0Q}M{k*xtjA^0NL^MxPlq&X4DmGqN(6YDb0;lBn&Opr; zPG0CUM9T)m2|sC$`P%bMb!NV`viN;rr`W1T?u7lTkn6WNXeDH>r#9|r8fykm8W)*X zO{nS)KbmG7#xh~yE>@z(%Am<4-0}wRn}gugsbJ|J=X`bt>50kL?V{@%_6kZ`$_@=- zw#s~U;&x#ac$D3O{XKR#10OR(xh-?*KXpdGR~RoHrAORO-zwph|_bt)X_DcEvJTaXdTm21M;EKj84hp?J^Iu?U?*Yf`lF7rTlb_zoOq9 z>G=vC9mJK|W%;QL?~brg;0_PnHdOw|Saeqe&Ef~gLgd>fQuU~)@jL(MZq4u!Lh zZKbxf96v5W)~K#2OOytVRbdQyL=wK7{3S#wGlKoYXjd~R(rZBpfLwU%WG^70ZJQ>m zSp1~kQ?Vs+bZJ24)4A@+t`@kebCr!Jn{nv_m0r$IyfU0V`)gb%Xa@gSfq;!H zq!VV#tdnu9`EeTHlG}TOqB+Wa^kAd*RiFZKf{2dTvRW#Jeu+oI=ncc#`q5it!fQgz zi&|@`5m#v`ESo7&!;|!)G}{zg7>V`y&8~!aW~Z5vW%UE><91LlJ0y^Y`sh~#Yrbc4 zW$}aF#2~;sGptVK*SIl&)y9WTV2knI4pU(8iqz}?c zd!Z^U+ayc6$F4p>rg>EumJITY(q=L$6Hw+rotebCb>yE1!B&ez*CU6$Y8owntxU+` zdQWUkmBKYZ?zd5a7F7e$Ni&~RYMZKk2Lgj&JK7o3_XJO@(MydgfC%p}Uek+_pp_Mw z85vpaNK^QmM-TkP4oY2L9py(NYRuG7$gIkWOS!wCb+Dud-pYLBqS|e81XFK*e_Iz*p}XZXB(zjvF=Z)hkkG z1%X&~erNh)sP>sjYVcR*Y9TB+ZbpO0FZ*%5)IkNugiN0jzQ-%Z*4t62qdpO!6KQOP z_uXS_>|uPWl9^ zDJo#K0BE8+BsB(264$15QoTT{^%ey_8cBTT5?gK;lHiS6e!2=l>%-3O z>SPf$AK$iuO%%mPY<%Zg>D+{bCw{6+7rvF>^jUEX$UF1Xe8%du6J34(Q4scp!0P6Z zFgqR>oL6k)!SS7YTW-$%%Oy;!J-odW*(#wByi%EKXkDce!v5cKa|hjP9zXoPZ(%Ze z+#G0lFI~~7dAY=~Z*q8QNtV!e5!4WIqul)S_mv7 zGE{^VH)%W`d#hIuojBSTKhka)zav4beOPxV$PMYWctYRofN#2-vC@+X@_Kzh zb>0VQpcJmWrXP&Aq}jHo5Vo`hmTK;`d+n*r-c^3Ixj732Ed*JkNL!~`-b?QKnfY!;S`a5mQ2UdAOZPj!m zmWn%kj5h9GUlsYN?S}?uu9~I>23?o~nsOvhBo3jY!$U1!2Rq(>ejh5Y!}^z;K5JQx zzEVa?!1+Rz^t)^xTu^S zNCXMk%?5Z?JWm;Oo))Z+s;%(5uX5i_M+&V({!_RDq$C#-$B2lL_XJD3I5T$=<)bP) z){44LtIyxvkZT9jNWgKJ5@8kLRsYiI_-Q%M6=_17E@wR&DMIrOu{VGB>)T(6?u)^c z_eKBARP@lr7@wvJ&sb7f4L8bZvMd`a_o*tX|+laL&t5Dg!JU2+Ka;5z+|n%1%K2_V_>9?g7-)7PSrUlRzjT zbO;?3kzN!+FQEu3q5)A*O0a@76Qx8!bLc%_#ezz)ASguzLQz8ZDpIbXD8+;*q5>us zjEe9d@V?*s&Hv40=43KM2KL(PX=|ZUPq2OGx24IuI(hX~$`=Del~0uqjNhL4w{5#t z;b-h8u6_T_J1Hakw}_6u*KhFNjKBQ4;>DB7>=)4!8b?#yA9sv>IH^;#Jxc0Q{exNj zi0|C(OT{)H&jx+i8)|Cu!TP0Tw=U^a_?bJGLc1hu#U<eZX@hS%p7P4*)|vJDoOBOhOLKYxUygO|@FT~f;|&Y5o(Oem*^GZq zJ=(M$U)yp2wAY^46Ak9)&rkil)BH-qOk>9T-`M(l7bBRSP;5(-_l}b~uTEx;yJ77% zRqVL)H0GB2lh>QmOK)mF@9k-f=yf~Seer$R?cUFnV-pbo7!zC?5Ne%|6i99GR_j^Ih?i!)bBbCwSD% zAQv}gr`*{K|GX)M`Is) zR$y%jb=t2yQ@B}5*FKr7ueM<{WJa!1a0uLRkP#4hc>1uV?X0gwm?S4^uVLm7gYfg) z2YW+`sh%$@j^zE&+1|iD`6TI{S*82|hsOMcBady~hiepR*}b#PA$&nwz8hD&veWiQ z%s-*8ymqWBFZke&&)WR>L&#z7fX_NO>{HFo?fNJ0Rp);@`+L{RkjsXRoAneMzsGNp zdK%i$Q{S>n=ktL*UFZC|>IkUs20aHIx5*68c%2PUcncr+a=TM@Z;{;a3u4)+k=tQk zE=$I~eW-4-%X0N(7V2Y^rALZ=i)QpQ!t`AEmVt9DgJ%;zYu}p*a=bebYV*R#(Kk=N>c=fVU zl*IL)T_L}#CfBxJa3IrLBt{qZx+DgTOe?BxT1>_If8^e!;T<14`|+P&_>!|{MxP>G zmD{?zV!~)a{!z+Bx(nXS*&1(>DM#HEDD$I>JnM8A=a^j`a-S?=VJd9Z`HX+f!gGsh zBI;T;Q zBvW-RON6tErnGqGChcNw=;S#;r8+yRJyGV@8AcqRwP-D^%a#vB(FsG%woJlYo(H>@ zh6zr7Ir&E*S^uXid9H<8pp?c@3Y6C69AOGa=PX?h3Fw~8qGc;R>%?}3VJC9(vj=x2 zO1@#y|IIaSm9M`dp&GJ%VfgH^`msiRy;8qi4gn5?C(3QqS!zRBqPGr_is>;syP8KxZi#73irb(^HtEvBCE|5oE@ z+37CWb}6GvEnpuZuH9q=E5i0)&{c0go&9uDoT(6<-^>jbT=RpT677|wy5znM*tdWs z{eguiiY<7}wjSQGM3IhbHQ%$9KJ9UhOkTQv-EZ-jQ}x0ohiWFrY(ZDJMKZIA`rK<$%ehKskX|Z{TU@-%v2aFjZ{Ep7U(G+8 ze%u{vr~mufYX6q5Ek-Ql_souZw=MkVRAt-nAI+@DuBD}iX@^g4fC814HoclS+kSv@ zY(aPSfsg9TF1pV~L%NTPVGy-{>BrozpJ%3aDJOfdy#?D|A3U)3YEJ8=9pg@i&!3B> zIrNSEBK%%*n&wSytKdyZES~x0|1*4hEZs-h(5SZuGa|b5HQE2?ndAOcmcfGViJHm0 zKNRV{^rLL%lGJNIea6zUedA|Y3X~0jVt(CZ<6BiGRo8y@R|efsj$R}zwY=P6JK4AE zAgwmc%6uB=l2spu8@NBbY%%dMTyB?hrOQ7pp~t9o!p>O zs-7N(pGf(kQhGw5<#-^oZ!$-){-nyA?)}4@t(euJHU^ZzbGx(#RCyl+c70!?`hXyrJGknnrMH;p97- zPH@^wjxo(}B0YXGhmH?S!YbM0wMa`j|{!2Lzkg2cE|ZJvzP_DmiB?C-g! zkUQNyA~Cur;ZA4Y2rePSbl<;NMO z83$*)TGhDoJ{=>Xd*+bg3b+(yO+%p1;#qhoueBR)JMD&}^HF9qM{0e^(BO%w> zW-qsf<+89Peb3EWu_tC-hTcV*mPV=wcNNlGNgiCPp#S(mli=jm-Rs817y1uuX%PO*vg4byhtJB|epB z*XyIUv|E_F^%$9VcB`3#D&@(2r<7qO&)x#avh(JM#N~Yvkr}hk3R0APLQr;l@iTkU z?Q08_zYts(59$GtNs_sIQduv_(){dmi7xioK|NE3mFrJxN%f}3TiVI9m#VHS8$@A9 ziiPH`3RImy;&bDP<7Op&>)go`DP zOw+|1?H@3lHky(K!-KnyW`7lKy<{`K-(GlI*K?l4!c%G6@x&Hs(>Bj%1MAHns8x4H z@NHW(4tKVmwHvo=L4WQ{Xr0n>OwQ*%7uY|_tiDiEd2m|g(Vq0^$pC@n+5@N7sfX5> zsebJ}C7n~F!W9pn*EOHdgi@)>v|8JUTE{BGM}k(3zL+m7t6Az^l*OW9t5g- zpp;eHvtDoPm`X!i6xD7FinsI#qFRlq(+Tt@Xevxg;~*oQD?>J)Q1j|5I>EQ_KgOjY%!2&5MeoFRII3;y%exYqmt1u+LsX+&yBS;$z|F zz46$$S*^QWub9qvK!Qq#A>n{xX{>y9hY@K_-@&AN+%W7}Y>$7je-XZiTOH@^2k@P( z5(kEK0*cS}u4k%M6na5cnhYwgPeCKdYKWpe*~51hSlrb zTF>qp*H2Wr))vaQNt}=kdf--QG`PbvW?Xi>#?5N!)x<}Z_^CV6%G=F`#Ru1oic{}M zYhrnRm6c~g9PZ@j-7OHa>^eB27O*$MaDNJ2zr|L>Xh{VZ*S_2q`^YmHOO4+?x=^hd zo!-`}eGIyOYm-uuY7ZyT+Q|gQPPVV09cN8Z?skfS$)2>$lRiudlbokqvO%p04$%Zr zwN)xrNuSu&-Tp6uRXc)xhC>MWJ-bUXM0%yxC5rEN=FX=~JFdyj@=Aq|hlB^PKf0F! z3u9C63`pDeisKqww0TPQiuw0lsG*Wsv zd>ZO%rY`3nL1p7huO4%rk-chv+fn{@nqx4GpWHxO7kn`9JXb+*4ci)R9Gq`8=|#gX zhX0No2@x^sZ))6; zOQ|$7=daBoKWk&8f4Goz@j{->g`8HEv@2%YPv6dH-JN!2m1TSPh|uLd*vLaEcWQ9; z9rJ=p>WIEs(mDUM;SrgL8o9V`6U)a6&3oc!4yClzSk1Sc9MKdRDVA1CZ{3|8gaBL0 zJ+7Lio^IcPl)V(AzI`c^RL7z>7zLJa6ls;JuMoZg+Q`ZhT+8XMI*T)iN_jGQglS&| z8%}Pv)Wa?L*u)J-k-P#`U)DOuQXN!%-(Uze&N!;J>d*+LSU)=b@+f$~GLBlg#ck>o z-7)3(wjipM>X010PNx~+x4DegOJ~NlR4ot%tJj?CZ5bwU@?Z<@5=>V9ku@3DbZg+IbPWCyPLU2^d3wHJVfd-AkEY+xiwJpkr+XA8n zEL9(jV`gid?V<)uT1GLmZDicDIpWlw1Y)%gTR2!4)U|Ut(je9?fV-rBhwLEqE0DWHf&HF z`B!n*o`}eOIgwGP)ax5INctnqPqaH{>@&LBBj9@5*80a?ij8}%0^UaF*w@@L{?hI^ zg8%($H9bHcMpFxn#p^e;`j!P*GgznUfp@(g0v=^l$s)P;?dz-+>2;pXE!G-%mN0ci z*KMG#3slo(yA>sGr-}v27B1`Og<Q(7aK_za~_}&J@tsrVKvf*FF5QX5p zm+V+tneppXtI<+pTBY&pgE{r1rRw#Ffr!ePe_eWl)@p1Uk|Q};y)){Er}yX;mhvs0 za-!n3j`w`w#6d;2?4!t>s)fCyaW8qX0pA`NH~q{xHagxNA1MxAX357je*5e|jJ;fc zJEAV^@lI*)IX`Jh>bo=X939$i_1%ot-OtAjT2!jrmPI6Vxbrg4udHd55zoFtLyDI% z&wfbLoXD4ABeKgeH-DsLU);37bUrp-_8OwB|F#lugI&x&l0l21cFoP{)m&Abv4bH0(lbb|U9MyVV{(lSvp6v)hNC$sVt}002Np23iR8Sc^p@TG2>KUr|)-D}{0UjFW zwW@pwIu^)}_?NmP@R`Pr9`fwBD$A;U`5z~b&zCz!!>W_+^V5}$6NCm2paG1yyFvwIyAm_KAiDBJSOs^>(7igJ;6enPGC2$nhz^?P)X0= zo|*?`GlO9X7Tp?oU0fb50T!DND|NWEKY#6LnLf>6F}y$CoVUgPsm8PJqr5uxZudWsGkH~+)`92?(;_x~w-||nZ{zA0K#G(ASS7qb# zVNw%^^CkbQ8oN5~Wc--Ml^PG-*+Kop*BV!9Jwj&(8_B(Y=8_$n!tzZxPv@tz9azKU z$i=xPho(LGSL;2jW(SQEVn#K_YdzTTM#;=veaX!1Lz0;cWkKc7H?`|Tj;@pXTFZjO zY9B+y8F&rivegP47sEwp=?D`-{Sue$w6F`qio82~zkRIx9rKcpp{MEvC^^ZESvw>* z=Bd|qLpFOt7d-c{8}~_xy!`;Ts1-Dzzfg&fM*5*;2btNbA{v~D7LO(FkFT z*2RcQfQk`&PuJIIIU-qZU&V$ECjWvcQ@kp>lJoIDlP0KK#To8E1jCs0iY!~Uq|d0> zG1&%0xrkRAM`w(3C7IfDsja&eg8jyD@jVWdZDZIUaYV8gwpw#8Uj)%~X;$)59UXj8 z5ewP;BP&W@F&}A4Kh=)Qsk&T!M51z*rNkC{Y=1Wyhx@GmKeZM$?e^rEa>sZ(xdh3u zl`sKE)1FAR;;sZ94P14a?qc|HS^_V)MQX_>k%s6Bkr*M(SYSN`Gwg~H<%YI>2XD12 zHgCPKYQjb&MuSWt;`us>%H*H)=c^}h3lGpuAK+-4;!(+I1{(3g`?s|DZs~~WWo_wg zkL+y=?CnT2D$qs{wpMLZjr^xQCyY8UBhsq>oLXnuwqlR5ky&?Z2#YuT`7`gPE9)lz zFZFRo&E~%@T@0_M1&^rG34!)bHVDifk=OHZJ|ds%`c_XqgF{hU<#Eb-Gvgj-=7_wp zhs|3=kLY-;J0frB(MZ*>$v#uoazsA=>pz2j3EhUsMX(5#Sr{(mXLE&YHlHn9W3%~u znS4>U=VR|pf#QYT2Y7x@yAAUVAA4`GsYqRFY~oi;h9B__VuZ6VG0&?FcgIqK0+G{t zOUrv(zAk#T2YFVlx>2pJpzQpSq0NllTuY{Lw64c2-!Gx((;AN}RJ_fv@GrD+suc44 zMtjIN-I4!NQ>vg00b4a(x9eNr`Yvo)B0e76Xv5O8QOWChJm_z~mC?-=qpiM*RJhu* zzzVmmuuS;~d{I!T{Pr0l7){d(8i)+VCxfe7{2AxjH)t2tj0?*YXgAbO5Hec`w7Y6| zJ3hS&OHqqDTjqsm+qY5Y5YuZnkrY1}bmW2R=e7jCV~eIHON75_!87fxdPfgmY{B!? z+bb&$M}y4zTjjRavzw7BTRh65D~JE1jnJoov{%x!cqd8gCaP9G6OojaMEiyQ*fYA_ zvcjhg3a+9)?7N6k4sjKRPob0z3&a+0ocv-W|JWz#P7R^nTPq+kV^-m@bJAP!>m)6d zVXb&&t@eu$-I?4V`M)|d$)UCobCi}tjHg(5v1MCZKk_(_EVrSa`cfnmqG_Ex(x=b?KPHst{gj~5GH;#`hH{c_@`zG-zU%W-Oy1kOGBD}kj_(?wOAu5Ws6!_p+fC3oh#REoN@qlL#|vrsY13~C8>f--t1OwS>;;X#MD>}Uwa%U zHk3(3kQznkdL}xg)}TdNVd*H*q4UI9(IJg^Et1EWSbTSo=#WCZHYpzUU5m7g*xlqj zkH3JOM3dIY&0w$izE+h}6MFV4`EC37NbR?=-31F@ek3v>%s1`yb#=vXlukPpV(od*C=y_>~lg7u_QAS!dwC zRxTm;dVLmk%+BXzo}7Ztk%?7_#;tr#ij7r|ZACXJJ_7`*nY*Py3WDS?MF9s{7<3 zv!9)vuH5x;*IvWOyr`OGeLMm^twqWCXYKG`DK)3svf_ON<<)WKyZyg6GeVHw?U&U5roZzngvCvk+&w*;m7lRGQ5^EqkJF|HBxa zisZ`4aKyKlxDn2kD=vl)9FIL$u2EI(hC5rnYB7BHxYyZo{pg!+2qEi)X9ehcM=U%g zH3WO;d`z`7^u{meN&4RLW9T2grNNtr5cWCx@FWvyayK+zOGhO)LvN5|za=Z3D??kO zk=A;tc>+Q0tZu_Wp@pXfEfW?C!&Bc6PVU-lq1x|V+PL|f{MC&2Twz*?Y{)5DW8}J! z4_}lu?lC+Yc0=~B@2T7TV5?Y7aF!*zdS^|;uB>|Y-OUfY#A?((v+T}=;TOXt5)jnZ zd0p)$!gJPPtxELIVzA3L$85=B7!Hc**#7K~tBuE8>w3>KJy#nqM&4O!*s9bsLC|Tc za3Z35@71JLvTG})g}1NsN}Ik=;<80y?``RTH0ukMC^n~h>Yi@r zYNMU2vcxylUKK|GU0k`mphR4G&%VfHuN{viE>{)^FNWJByfD~b=2AbhRXC*DMbhBg zaN@kEg3sP_;>PtS9gkdT! zQ0`@W9aVi{cxL`1w>qxjrKnZ6mv8xUs=!rb>O`jntT6R0m)RZV=($WgP9GCH_cuYD z%Szx(Fr^m5vl9O72!q9OohiOyHR3q$lD}b2`M^ed@%-+6zF|g-H}rn2o!n$#p}ftz z5pRHOFsBV^j`^DcELhyFGA7!8WCT@~EJ273ZO$LClV{s@ntK$-T7ChZ47^Mc*EX zQedeoptkswRd=^|bXgEe_ob_>TZg?roSD)X-nm`-k%}14uW~|;TYc~$Vy5_h9TVoA z?&14$>H4z{MC4Q*s7gu5Yr>d~!kM)>u%ts}eg0&6N&8gHLM zwAyq+a5y+TQ|A6C{Ov9G#c=sz_ay6$dC9|iLKzj_7gP{%CuDbehoAMzTUOw%c}FG# z!{t-ztiM?}W_8PQ+B_U~Q3dJ!75CL0!ShR)49K@)=Lsq|@T1z6BYLFg$#=64 zTTP_=m^?vSPE;pd!(;sO80CZB1lybLJ;T$Tri$J1|HV*S^ZJ(d9!y*oZM*WS$_IB4 znr^zk9G*^Bak%SlMPFzAXjH&ZffmD$B+75;ve**uCegc`=d1Pp55{|}>Grwv*Fx3`WCGywF#Mb9Y6V|H=g(j;bVss$NLVKG~H1Vw6LR??1kaSe9*!a^dI?nY-;uEg9u^wZq?MzP2lsWR#a_BgoD* z5mf4YjqPd8-9Gi{edaH_((3MBtH(09I5$@{1krnC7NxSMR6k_8+msH{inLWeXRfs_ z&02@GR71)EPr*&h>S7S?Wx+}5swG$ zGIu*G)ds^oz72Q(d|`vS6Yr+VbN6`gk4#jYTY%c&PLBt;!##FtgIhfWPMKE@OHJhb zuqpk+K>B++^U-emH!_JsGU`X&dejHSJYtqJ67|95oa?CDd-XwK>5vcJOlpvr!RvBhJblsguWcc(;JJXRdtCxSa20pwNO z!U|+7EjHeDW~eN;ymE6`K_#Z~P=Ve2fYvtLmwy2*Vnw#AysdUd8a^eND!TaI=R;2W zD+|45%!UY(B<@$Z>4|kJ@|Dhw1igGr*CA4{TD9{}%1N97jGc5*@%2y1X76QMZ)Ig! zZ%Xm8&{HU6=}`3pRSE}-?=jUD!`)9H;vKiS;~cdKv!jjdb-TI=Gt43o%Fknl+hPgj zS1~6Dw;rW4Phkk%UKZub(N)gI6hmD2UFRrDz}RwjX;F^2Z98t2$`CI8Wiis)7^JnS znz)aZ&PZ$HRA7!;D%&dr3de9Y`{@d=d&02|v{-Albgy)F&q`y*xv1%OcG>H8 z#=D@5Vq8`m#kt7pu8DOyzICJK)1rbTx%HjyTOW^zT@2Z-yFdL|txo+BmlsobWvQp-Hh1f9)f*NoUSskub+cUwQg)NisRp(s7R$qL z13_ilj~($Ygd&nxAogXPODx4f*Y}MWft7cKB&Yjr_}|}`5O%*I7yd4FH@A9f;-zFm zyo-7fNmqC1l~`=s^0c@^?0byM!y?k*u^ur5&x=TOU5jNzFB*{6wUC!O>Vmj7`+vpq z+RLsC_}ll1<;A_UzL ztxj%tO6%*?H^-MlQ1Y|(!`O-J21NdF8swIjaWq<_KKHcxX1rOR;l#T1@Td#JE(=>Z z<^m(f_o+yQ1*;!@%ef*5YV+e064l=bx^^x^+m-|f=1pHrdQjbcL*0(L$AorL+_!{w z9&ukzSr&#P7lf9_X1O~5N2V)XW|Kem^vee9i3r{QzX&cUbosJ<8NXYHPG2*O>zErs zC+uAbuubPX7OjEEq?X!Dt_wv^vV&ud@|dhX{|=vblwD+vXHea1t)&=3CmRFuI)p_*;MW&yE4T-aF?PQI`l%hZrOB)4$08#h^^I_>6hcm z-zn}6RMSv+qOV+P?o;kB&SGB}(3sA}*p#*Pg=Lzne9TSfEGzPNx$bslwX_!VOKb_V zLFEwH#qiT75#tpKEBA%1z4}hVOm%5}-@k`T%vq~LA1Kl5wzMAT15d9&JFU@omIuM1 zFrhE(t~txLWkNXwJuxj&^N(_f`C|C>lcRjeQ1}YXYJ!_PZ;PJk_>|Ag-QZpV?JJW*ypFlQ-;#=KBw7n!q;g~HfAfWHEn*q{UBFw8GGoL@mlG0Zs$ z3Ku{6z4@I4I0t;~Ff#8A(Fv5d+Ea(x2-=kPPC_GrD*bFw-3<(qa zg^8L^1A#4Y8b8@E%cwqwSO+ehpgfOd3m^gG7)#VzJP_DOUc)#7Jx*_Z-AFdU z%X3lEpHKy(!dm%QViA_uf+afQVU$UEF_wrlvv9HAVmSY#nDvTS%l2fSX3Cqa%rMkU z@(tP5-Jc8pCNF+Rp>jq9+m>mv7>=UjsM=#nR&C2;CR9TwQv3fWZs~ELn2xFbSRSk5 z;YAaG<`L~hrP^HiX7+0NEN#Btg6E+Hug66*$v2tBw@twFKyb4e^irS;S)q-fHx9bM zMVY-64!MeDCE_2jgpFe$|5SW4Fp7ozr;;CCdh*5q4-;s2vCHKa4nZ%58`A@LJMnOo z2^b9maqKH5pg9o4aUDzmV#4t79|4SIIpbkh6Oa)E7|h~*CZLC2Th#j8WI7ki+J%RY z3R|ag+18=OA#qn=pF;8Sz_$@~y%FWx z{hAq;|Fod$7@kPJ{vh^^mDOQ z0FRvcVsmo!FNKt=vr&5z7#ISzV9=J^cYucW|EvU`Jc2B(`|;XGokB~ zve7_i9Bgie&bA#G2Tz(I-x$|(luN3_16FX16^yX$hov3y=yDE*^c+`wUbTXYAxXWA zM~AU70|U6?Q>w&$W1YC-+p0u!D|jjz7>|M7lRKlq-Eoqt6*c&CSp^3VQkjW&lekh_OyagFoW{!-OPa&`P;WjV8c@eJUE1je~9`lzSAdl&{N# zw#1+>yiH%*3~gz9J`N7Dt1&3+QCtW^l@(|O-x>o`jU_*$0d@>1PFBaEm_xXbi>j<6 zR1AVPXbT(}fE$oS4GYbl^g6sj^HKh7SU|zB0?znwzQ0 zT4xnAhGVCyvh=NBb3x$~sO2q&@(Rb!R&Dx-q0HjHLM=$2NwJL+M{#V1Dr#Xk73j|a z-+0hu2hjJ&Am$vfj|Y$JU{N|jhv*Owlo!K2;k9#*)j~&@=#k0Lw{u`~{PiOq;qkyD z9^~1!VsJd1I0w?kAn|6je5{Dx6eGL2OlV>FU$C5(ARlCT za{gUj8)|*68nTj=EW>aQfodG6`m!yS>KZ>JYSsPUa4HJH-sO;!vNDr8L2&l!i#H=&J=iug19nCLq(9+hLz z&So^?7`f2M2VR60)Y`Pd;4MQ4w(f~(5xW7w2weTJdAan7RJ-EjWlY)yhK%)cr!mf75Ug$?_ zIhn8_(g0fF3(%W^NJ9AU#4dXvi@Y4bX?xN=5u*6k??8_Ok^V&&TbOVm(hKyt4h4H) za12~OR{TT*e9!

m<#kewz(9PByDyn{}VMFur{mJE2||A@kr=+7_&_diu|M4b?X^BB)pCG(~fHxxx6f#CutiXK}#LB^RCz*u--60332y=`~j8orm10fo_5nU zx-;Ii9gry;S&`i8rNo=&@$0OV-Ob-Ht#R@L$nHv{OyKBJ<;mouX0f&rkFB6Ip0go> zUX6zjiP!jifX)fMuOy}FVFa%5r8C>{upj*lcC{e98VSkw!bTe>5AV2_oB19M8pR=DR zX{xqY-1%p!PxM|`l(Kl^cs;n5VzR<-DR?XhiXM+H z9P;$V=>OLAq7Ylky3k5W!QLtT$w(ESH4VIuGHr?MZ6cO5Q9m87b&g+jj&k}mPP^|v z>jp46k#q*+}*~-6K7!2swjhQ70!Q?#rG=#RlLQiL&b}#44SadJAHT=7=laa*_#%R%Az*-Bd6ShHKd2;Ppfrw=j2!75G4$<*}A zm!d%*S9z0A_zIFFLfDedQ|3b|8`dzv;mVM&pq7Q+co8(h()c;+a+<5uEu$}rDvvls ztlhA$$;6L_{@)8k{SsgslDL3AbjMqwH8^ekdKsoaVRkXX?^^tH2(Y zO4U~Xi$2OK&P#Gc zX64W;=R35(aD4?KXu5ZHha7N*_dlB{E7=U2gQiauwK+cw4klYx=y;i8Y?iD7+ZhlI zDOk$i*%JwA*C;K4p+ZtWbA9e*%Nusm@cNRi5Ga42z54PZH|!tJjct6$P>3R8U9Hpg zmf!3k-MU&nydFAyK4Xq_Iu`Iql#OnOENKz~%Qj@*qFnLI0MTaitEor*!_4%VoJw2RAK&) zhau@a=Tpad)vBcA~4tO z5B^6*P4)M$v0zy4lmZ#*oPQRY+T z=rNtAnL`kw8YWbifUh_u0{OJ;3-vw3!bp4DB1U>)Y=iZWl|Qz;*wTA+F82`K76xF1 zEB#%H5Nok}m{_Cc0>0c@H5RWcFn89e7M*I)+_F_T)`!q5`a!UcKi~c^CVQcmQ9J`3`#r?0_s>Z(KLogZZa71)=7{$QMkioF5gEy^~zi39JIu zBm6zM#=gR?U(~g3+@&Y3<;=LCeUv(S=~l-xRAl~7R?_tu$OX(?xoAjOC4>@73yjg@ zZJ?xBQv@b$oouwlBy=7f_eP3@mj0xc$sfp>@_ks&iGsefF$?XzJ3skl`>T(z1dd}& zPN-Uv9x_BQQvumITOm2_vn7;O!|_YD;yjM{d*e?}y@;$9 ze-&~sKAu$<@)DP2dQQ*ySm2MMu>H6@iZO9JpgEE5f=yjj-;(c5>O{Apx}v!4ryJ1pJ(bPR`F!GP?i)`so=-R$J&8tFB`JUP{eEJ(a=O|*6&#YX(0J`TQT!V8A zjIBF$Fi#?1HiUaA+EP0eq0uv`QEN2lG;_a_p)3#hFG3$GKFpjz#Tp_9TL$|(s}bR0 z5q!k3mgQ1+N}yz{iJHL&4PeJdqoY6yoSL}21%;QL@OGkCW&#ulk6Z+Zuu?tCe~$NC z0-eOcBBvveCk8xx09;4D?UwX+z6QL~8XAO4#JSP6Hzu&j2R*E8(O{bBjLn{tOv~(} z{Fa*A@J`^h#zbP??Iw7$6RXpQFUT*ttbt28y~ubB zolQ;x$f&pVTuR4TDt|XY$55y6!HyBO&COI6+thBLLQ?66r8G8hkP7nhHQ5tAA#v!c z%9neJkqpc^b6wU+1uNVOMf~K#@_r-g@?pobwfukN}H&T&j8!JIh#v}j= z!=M|oKoT8jzdU`)^hfhipu>pkFxGo{vxbi4o`aN`MFg=XKi~8uJfsSLS%UoG@PA#T zX9t9#{yx)ET<*+=r~sIAf&d>HsuO~1(%Sa5n=oVA$w$)%%_zHZ-l10vNZA?RO~0JY z55n(oGt!+gb+&HJ*#nLfM^S9%C_zchx*1UiFHC>G!5o3KEOE%UZ#0F;LFn-`G9@;9 zBM^q=xdqvkesDk!4aZixa-BjPqGgtSKT=EJinhgy_!qccY9*>ro4TxVuTw51#Db)W zGJ;-}ad;_tI7QN7bS=SEohhyu#KVK-*jyCT|G_$1UfzP@el2QExJZBtW|D4b)@XlO zv@*9|Hc6ItLzObr7~rkji9b2VO?pIVQZ*pMSbrbSEf`xX6Ccl2kRyQ+@#^zgN?uQ= zQI37L{^udpeWACS_9ZmF2wLV7^{wgStzpbigoa)HPnE1=sLJW!!;90i+^R;? z@=KJweoZ`cvTLa5}vpeO= zik<8*S_b>FS@J3tRS@6yx7cU$Qd{3LgN1g@XI9{bd|b z0`{v9Zpv+M#*WG}0rrPm+{bs~F)DAw9;5r|?|rD(-0RB*sqhx&Qq6e+ieD$_BC=%c=wbzErm>$)O+;A*P$;VCAbh#1>5OAQWCUvtgfX1lZt&zqL~6{yy_bq|ne!!k2G_(h zS94nv%thef=YW3TtAl)r_WYDwt@teA>+ea&WXxedwx|pAN=!Y;H~ZFN>Sv;315GV0 z8ABN~WvGOOXCG|V@*ISrzDPt2FQB)U{xzOv#4rm$rchiVK{rLPG9bR;?%L)WJV7=R zG}DLmDW`3C9`OvW_k>B_%~Ko=oM^PqJSc|yE~k{eM&s=U57qYKwLR8DO)=3AA9Ori|&)s(AU6)z|cRTGLrYk=$TbZPoWG9>&D!#CEw#1uO7y? z%aqneKaoQ;_N8!z2VsR_cQzm0ffXh6gKYG#?p_n0X16PGNTC$m*umQ2azjK=ar%63 zX!Y=_FHpv?ckwah2qFOr?gn|-m7~YW4&O>ML(s(pRmA_GaZuJ%Kp4}ARXHgIfiL*= zT;Em1=Oq3kq9N7LaaSYV7ZJ@*2I?|YA|ozV83X;A2=9`;J)Xzowe9yroz1o^Y4b0x zK|Qn1H@Rg0ZcYtzFU!2t`y>QyeVOtPg5nB`8YQrv7?!w&EogY)>Jb|zN2J4$b@>o4 z;|q~ro1i}xyOQM%&eoN>>I8*&)?})67*FOFA!X1>dDr5gWfg&b1cv%7YI)@gdHn)=4#@F#bI zIkv2rggQo>8yncha%ZR-fE}O%*0WbsN21+}pJ3~TThyPMh^-<^`)5KOOgtRI9ijVPnYNL@ttxJx(SThRKGWY zUiLH!D`bBJ>zp{HGfP5CHe~|Vz~7b#Afgs$TnS*wl4qk%Hnc>n8t<05RY>|MBy5h~ zUmAOeGg$W-mY|4uVrDpa=d{DgrvBLGrTluH2CxRiBJDRoLr{WONgBLiV1#T$a>B=% zM{To@<)|}n%uQAd>mh*%ijhpU{s==dOQX5qQ^if%7m+MFvP$+bZYC4U%YQp- zxa0#_n#t%r@^VD)Ws7TdL;ez@syV_riwia3^@Jy)LBCbkWT5;4h)VIKI9*Ejzda*E z>R7hbA}<0M!{XX#Yt8ND)e-lCb4xG-iLoC_jpR=mQlVX{dwRWr6#YisScSqcWz4`g+}exf^7+(eoaps+>*q$&puKjb_Lu)JDS|SNu6s zTaf`%Ha!PHZW1bhI#kT~Jrio7KT3HJ+!oxPk?5qNfRltlPRb&wHJPcjPLipDVsz&~ zTIQ^$=v0~_{5Cg`S5CMKLTbIl6J6Cv-w`Oq=_R?mM4!>Atcw9k{ef8h!s}lb;|jA# z6QA%Ur0c?t(GiS#k5{xcw1)gOG$11*=fTFof=0p=awFkvj4WQN1A)0nCvEe6feWC_ z5l>Q?MN30<;uX@)$3b`nRl0#ig){K`uknFi9}0%MN@r90%q@?W7EmNR(eFM~X+I;6 zCEzG*Za6w%hZ_!~-|9RD8DwjAqR*ZiTQPr_!M<~DX%7+BY4^3|6)vkS z;Z)ImH7MILXtp=upPJRi|4!Hc(>yyC>IXW`C1@cnOqo_uv$B>tG=rm+zr%tVYA{hU zOqp1lJb#Wfwyuz;6wOTrNJm2P4GND$LJBPpK^!#Ff&t^(h_lTJQ>I7TCrm@MYuGPZ zK{E>NODPmZNc3dUC*)`DIB(cyV`|aCknJ~Z$Ne%TNGTJangu)+0X-Qaj5z9FJ1}Bf zXT7}^sN2!^13F1H6C`ESgDk6YU46Vm2cLCrkKg><1mL;RWf<7ZZ{Ax&p0rK2)MfzD`=J0UlS>tL;4VRjw;fIYSA-3GSa08wCchWC; z`4wZP?f|5X<#Rw>s*<4k_;}r)SVb!=MBexAZbtP&SAfO$A$AIV|Lp0|F8F#)$u3eI z&)~xpLU4 z_3$p5E+ucGSX4VU+OZGygq_)84Nm7yai;EFBZ4ck``*jI)|3$nCy3Vd98pEvWQLg^1AGIt9A+p1 zDiSbsI=w+stSITgO}_@JILs zCTQVZR1<$)>I=uUngzXw>oma3B2L|USAQhtLxondVsVtmw6vn*#QXMHN270P%%Mt3 zh*;+q9Rt!4#2_?!Pux3m$u=ZxU`DMV>AUFCm$fB6QrK*>%zicw5RtZXCDx17s7+oF z5EQVHNsk}cVCJ(+A^u0?2kgq}t-a%V+ea-CCK>TGw5(EtPm!qZ1LERX0zVj=ulud% zCy|Zzpy_U+Vn%wqyG5FZZ!0q7Yp+N+6a0v%$cun5pzg31A9l+YkjYS=Zwz_AaOLm7 zh(czJ%J8IUVwNK}8e5FKHuDdWM|@|tqj3j8qCv(Wr&5tP5~;(YMv+a!gZ-J8g5ALq<5jL(fTT!-L9RFrMG z#8v`#M9kfXMnsk_u#QoBqIt;F%S^_HOwr+;*n|H-KeJNQi=bk3w?eT@X@LR6lQj+A z|3tLzKyK#PPqX9?~5-3F3i{RNeMLjq3L<&-de zBhO?+`?OR$hA+z|pH}%7`}!BH@UyM8pq!%ry$gzJQw-=XCm{OpyXep9E+62ZTD^uR zA0~{y#8Y7lejT=&9WCn9$WAR2Zfo|5W*lp*V^$My9~+1^ki_2h{o9AKf7dJ!8m44Z zhGCwM!;@}&D`p#gj)gZkdaWWXJ^Zi*E&6~c(w93sRo1$57#mY&IaoJ-`LyL%uwY1;?l6M#tbn0X>a{WxSM@N-u%ZLF6ga9 zF|_Ix$WzZbQuLw`AsXY3*F&*R zohh1Dm%+zY$@b(w?2_Sp>s`a7`OE~!4MaPJHT;AqAL`q5s=B-4Bd$+&z|h9J)>*S! z)F{e*@mUiMEbeVy3(L^~FbASO0-D;VXZvH*$tdK?D>COqZ)3oM6bbdokx%sbrI?9; z+Xdr;U#M1sP7&*aM@uoofNV%%gSt;ZWJfNQbZF%EE9k2H-xs|12xZMVA7aD6R_?(?IItwT_ zk0&5;?UvC0LmXF(@mm{15?r2{SM((LoV5{covsE_{!!tSHecF@s;;XjnBUXDWlb!V zgGqzBbP7UdO%IWfyNeSF=bU>5_AS4E6Aey-UzL=r=8xCC`#jf)X0^6m+JGqBdh)x9 z=_~0&NFJ|`zu!|HQ8uYOC&iVUzlm01n6Yt=Or*kTd{j<;!7pz_O3;`S_+=sip!Fff z5C5+N5$}mtA%gQ!Xb2^mXCf~i;$77Oq5Y?8K8rwQgiX^%u{{fih^x<^OKFXsA|a`I z-0}-^U-jqW6yrCUhZi5r_Bdr4O2ko@FFKR^U{|qwQjGrw86J|}L@l9u9f)GyjRBv_ z5CkZ?qxHr%y=8kikVu)sp5QEXjED|b)1_uXT?lkCRs&;lsnM?|_9e}dzPU`8l*jtS z3Qm--)s2+OLY;(EgX|Qgh^aDlC_!kf!%l7W7Gi17x!^U_VV?g1$FQ&T=EjXXac(?u{>3@0}Um+7&N)9>+^ zk8VT$!0&;-IKeU;C@h04zf#%w9ia19Uh@#6klYLGN$m=0eAp~$YLsXRTv14~1SrT= z+tA@SkC@In(4n+;OV@HbVr*CTn*LmI`vP{9=0Wt5qi|mw7=$FTcP39O_i$T(xPrx$ zfOsZ^Hhq1{0SpE->l3gM4M>Azh=H+s z7h`KHvBC{V0)0ci@6G0tLyCEQ-e~rqT<=S z>wg8E3HRhKEn{|{LD+{D+CF@ZlFSnhG$88JlsE|CCGcdbywdqLWFi^%8y$q7vt~Le z*4P;w7^~k)W&$n(e{kSBFDvc|RY{P1zSfy0+FP+1bp?6V_482mv_jUh8gjElE_huf zF1?^~k`Uc9e#JSu)!ZxJNE82n-RJ1oFZ3p3FXqrt>z}t;jm0aMgfQ@3U@#4jeo~Dd3z$zdp#|PCUjrj*13<*?U?KUpPJBS&8ZI%?YJsd+F#x)v{3tVM)1mTA0y7MT0sedkPa0wXk z*p$;e3tkL-ZkQ3=rd%o_6wlTcZw|;=`FLQ;*giAm#4Gtjz+-2YNM8zu`Iy~ zni{J{SLOy;wcOASl9Coh-SXbK++O@Ud5XdZrn9;wm#ia^{=bAJGe|x(Wdj~WD*QUn$B>Chhi|U!&c@6M z;>-M+f9G2F-!hMLrEOv|uP2PNJ&1go$n+Q}677<1$p3|>-x-KK-SWS>RgrW)@P>}L z2dI9ws5>tA>VH3Zq#MKx)b5N3gtP6urF~Ao)P+q-g7BzjL9eW^frvDlOBykWPqz|R@S{xq`?N&X1S)8c!lFD zygI@Z;Yq!HQtLo;J?ywwJZPR{l`wDFuV@o*W${qhI9N%S~B_Y_df7O)|>L&l_8d{4x9TOg{T%1&yw5)OMx zm#OGBf4;kO2*Xa*wX=swvA_v!Ajes?#qQNYc@I-cTD?LEDt2Z2sqRLNoh&boTVuPj znK6=qvDQ^aUi{>sC2{2h8KNiVU$F2T{aX^o3Ezri=?Y&P&g?EP41hs5U!e1p6-hNx~YOvQ?3?kKJ6mxeB@P#D*D z77d`Bcu2FoSzd_*gO9tfXy;!6_mAGWi?c#^_k~8zYx)70#Teu4Fk{eSuw>q-37=B$ z1fh2^i|u%5bcwsR0QynIgJBB?EE`MHM`M6*8RouKNe3P;`vkJDwv!20Q^~}~LFrn$ zKSSv??E7ybgj0#qb2>3N4Ht^ycSoI+zDQl;S^Yvc1LA_TE-h1 zn&TL?n(4Lta-xE8%UN+m`b$;o@7daqVGl}|fpTLOM+%}%+?2C+`v%(t3^>^&F~O=^ z7^nOQy-|uJ2o3sTZk3&tK7Tq)`&r(K`dTZGC7yjL2yh=AR=HhEa&Bvm@2l;cgE-ZX zy5_?m;379iE%disb`KC?JS zU!ip(#m_mU=RfMkJ*?8fg_sMpOEe?O?y;G)X^zG=k7#|aY)u60M&(XwTx{1X74FQ- z5%58dlT4_rN8Q1`!cZu@s8ID<{#2 zJMkn?nQzYs0_0mXoJ@CES($!G>>V~J>Ge3l^k46rjVl^c2kUlTt1?=8fe^SBbY&I725X(>!-ipB*FDH&>IdV8jC$e)Hq;I@YGxYs)Z4x+kr0X2O3 z_+sgMR~niawZ_pLhHt`R@5oZ1P2xsGSJJB#v2vd^btd5SUC)ik_t(j*rgGzn&VfVT zRGDCc3#N2uW7xhs>IysDxrr~qrR0ygtdShYHF@el4xw1}Qg5QgBCfBH#D&l6wo{R5 zG`-ZipIDTL#Ztq~J6NadOAZ^NLbui{RE__ms#1#hL{OCEM*EqYx=}xUY#1nodNAfD zgabei#&{n)z9=HtVhkfAMR#q=ji~&IdU8G))CW-LLWiuD28cD9iaXq7cATg18}Te_ zu{JyMe28Rw?LW?F=`%m0xA+{1JL~+-ar#k4QnX`GX3LkuiJ;04HU|cN+z+FtihDd< zP<*@Il8w)4fy406q%Qhzc!WEM01?$4`1LXjx$+RtP(+&(A2?7*Bo52SW?2&>1EVES zS9r)ov!>7hM^K{uIxKm=eooR`5fMEGm3_5hZ#jNilJrP}v-SCbmXoj-=xw^1_t=sI2aouGjk-QT+Q)yu| zSRRgUoMmX4q0bwWvi5H$8la&>h=RaP^%i@^WhpZ=cG~xP8G$}QIaGsu5SGa%pcbdV za&fQk7JTNk6WSHFK*g)rovel%K;9&yO+LJ7aqjiFE!RWmek0$_h9YXZ?Foel>;C;M zZ)e~j;pCgz+&1^9|NGJf4}FW>q&5J;SB&8G6`H!l=b|^;RYThAR-FjYr*qc-dO3c# zJ_lLH;mc1?nRLJ}*?UPURgviCNN6pM13TB54cS=5QLs3~V2UuvN0)>0OqCM>#S($C;cCYPSDJ>OJk69()JVMHGN1RgEO^FgFG?+ni*|R zSr45Ez?;7Mf4_ld4I^)Nc(9|+CZ}z+y8B3Ao0y~xX>mS)XFttd!U?I5s?ui~ZfF;I zfEm)WrqLPIx;C<7QWl&mA0lwagXH6_6y?BoSIMk&A#>8#dV<$n1o?eMfTIp#7kR*y zCmTl!P=1JI1BeRceK60U)l?i50q9n(T*pp#%*uX%7h-g--ULI4#Vme_Ze`_w?IUaj zyERp|HR%5W!D3xkco}-Zv@o0f7z_SZ#7mfkJl4HHTS-QV@wqEORt_BO<0XQa`fMKR zu-h%syuZMnu}gJ>0Rfej`;ZYYN9yP-MloWIzNana1gG({!VNBy7&`gnkMh$);DZLSSq za!6s_SUe}3w2}}~HC_TSuc}19$hPmz>AWK(4$|r+Tq0TTK-UnIgdf_uMheTk99Yx5 zdZfQeC5^TAjoYxZ4#wmf8z>CrHd^WMC+;z0=kEdetqH07i6Ce~6tQ@*vT9ltm+)sAD?2|QI%$-XOyCDmsm=tBR ztv_Es@8LW9vB}i(>fdqmT8G3hog)rm=auWM;HdHm z%Oe4gUBX#HmH>aJzGl?t4)TVB}G>}dU2n|=zIc<>6e|xB|F_4?kk)GBplH7eKf1orcrCiB@z(c!{ zNZFxpt_i6TglBan#>RMfTH&%7+{u9o7X8enk;q*)LT#c;b8@saIQGq1mS}| zCSIXW-0KxZ17)6r98*pgaA^s$mI`OX)+u%!-K>t))h*o*-b{RL%*2H?hJZ8FKjk=q zMqe8?;8@ZDIHx?Z?}@=oLXsw$!d0@8`&ykq*#4bhPyLX!t|lRvZXo2o`VvVSxVGBo zs!RvZbGXdboL9zgsOd?S+nF)-)qYr5ftC6@Z)t7S6$FtE!*_ypB#p2ci1tL2eF^{}rA;us;^=8@ z$6nfhL9;{{4uQbS7ar@6I>l^GK#BYYOSTzqE}{$3s}u@y2(_qh;Nh-MFwi`!H>a=wgV7?A;kD+WuHt4E^dI@NbVKiBJ32Mm*A>Z zvCA?s8PV2{jI&mu*QJ1Yu6)c`4BT_O#9R&h=7rMartnL&|`K>0FzK}(O1nRFjNKQiI16S{m= zyO4qFHDj9O#R>+@+|lc@3P=fMk8tYRuLdMs{HD>mG#)BNi(wDN$sGssFb1Acgxi4` zFF1PaQh`X>R+!8N7AI3z_1-rk|GCVh^?X6%m=T&r@#NE@L(ll~Z$8&C?=wMelbqvp z{JA<%5~KVc-?$D&=w9oiHlQVsz?;1EBAMQl*eyL3){_UsE_}BIi3GX(jCjtv;POCq zAKf=?EtZ6SMIxvYnI*Wb(ahgOOC}LZiNXr@nf;!TvtU1-L){Wu>I@_}?oma|2JPLyTmnBYj3vh1cC@oe=VU8$ah_yeyY>{Z*Np5*W+0Eys+7 zj9@}XWpr!gHoPHecI|x+I6g}qRN|5!LmW}7$W-&lA~rOo`{+^D;Mz<1Hg>b6i35eM zv1y$_i@|oYXO+BPOj!6K=4yMG7mtk=DyxBHEuxrF*I^bH3S)niPHv^Hk4H^8576!A zljo1*!Y#0JaJqX(ivsgxSxGWK`wOf58dc>u8)6;QkBstuc0h~X4L0ELid~4C|Dncp zKT0k&az`XA%3fs=!}G(JQE)0xq19;4ds#0UV4HL7(buDIT=g##rHOM!Wu@Sg_L*c$ zkJBgA1RTLe$nTW+F)YOaU2IRo)+z--5&Kv(52K0;g-m5rG}uVvsL*$p3EfbXyGR9@ zJ8KEqI`oMrI1k1~gPjA-vs)u5sNhk{9P--n}M7qEKC_QGe zZk<_^!h7I&+#!n!N(;$t6plm)2Mc=Dsx5aYp9(6P++ny`&U#D=nzV15P^NiRq8o+l z^%SOoTN45;N79RQxY{tUItcStbj6T-It5-7vE>EE*~~OG*aXh8WrwQSqZR&>C2E7conCrRwz{c)l7p zOGcx+yP!}j#X=?qGsJl&yr-O8P}tSHRaQ`Rq!jHI3)iYfj^8#=(Li-SDKeBHK6;6U z_j}Q%FCjy?GV#lnP+{Ta&#U^t!$NAh;Y_%5E!uc_ji@M$nE3VehC5jHEF4IlA+()%?tAo)>0yGMZ&LPdm=zutP^NvpQJ!B zJOJ^M{n_rNb#V}6!sG8DJ!e=8fgUuVdS*irmWbR#z7V|#ZoMrr#&srMg;ev z?e8DYkU@-7MUbIm0`+pq!#}^u<0QAA6r!EAPymaMKJiOA{zG}am@~4LVl9~#tX#VN zS3~MQ(i(ABUEiLTD*hydi(GEe#h96mN0d8BqGcZPvGave5lg3mc4zNp4mQzMmF#lQ zmfj|qK84p6a}FD9kgoHqmoAGsho=gr3v1m`lYTku7jPllwdZ1pGfzXHPjrIu*%O)4 zkn-*n+nKd!5h%d6fih~$k*c}=1Cwf3d#_i67JR{&wev@9Nhy!-KnW3Og=_!uL%-ys ze|y%hepU82Us(CA0Zu=ez%47qQKq-TiI@8D;7}2g3%3d+Mxk$bp)306T?x-?e4s+)0lAQ% z*oe)mv;uF*^{3i$2JtvLgaC_x`kqhq$j=T=G+YyU=t**5H=+fX_k4YvJ;A)?YuSrU z#dJMLCv{9!di)rDl=0^=P_&O@s}Xk;?~{qT;$QX6pIU392id|S#_roX6=t|8U<~pDhwr3#48{CDs{-lGQ=(HYA;2l=Kn2B&j z3y5fdz<6>~6W%GdPL~KMmNh0oEy2p#O2PaiE6{6mb8{M9io!`(QhUr&C4vXc!hs|n!I^4LtJd#PG*uq_zwQRI1Y((1{EH$yOJxN^(* zVxlvdmNXc)SAG($gyL@MR->>Ag12T>f4fhe(>on>+A>>-+HFdi&-ytN3*AnV%x`lg zUg?ygT*i97_Z+5W7p#j3TwE}=uYN8V7m&#L)S z7r(AGQzV%^^CQ!8xbx5N*+mqYn&l)D*6&s*;ke;}o9%c5C;+3YY#M8Y(wwgUNOQuh zytz@Z2rDD$a4IMA-o-dYwFR2nigwX>n9g1&FVe)O7w&_5L_G!Muc%3j$?~`~{4!`{ zQ0o&{^03&jn}**9tW5e=Wjg)hLmaN66|q~jit)N$ozZ#QUKOlj=kRUO1!T3GQGyro zFz;)#YcqgZZ*?IspA0EzD$P~oHHzN2quK_6pMwL4s(V*OCeeon5?@bae_YP$WToKh zpz}I`MylY+LaW?y&?7Hu)em~ip4~uuLDVo{P;jA8I9#+EqQ(s>56}SRVOqV zMsdujGp)8u-PYF4JA&&n?q-pEc59%Hyr*1nF|{qpHrYZ?TjaO!P+>Eprb@~2{-wQ7 z#z%GDmK5r~xMcdw)N6!aa(j$7$Pzay;n)3uH=aUJ1!2p1`7H#K62K^JIO41f zWVk}n$QX(g`Ku{`IB1oj11JKbVtb>NxMx18SZ}tYNn$6qm690J0dz9O|E-R&KLeqG0S+&ru;Ex z^h+tq99V_-<60-B%v5>N{=a0#9SW%I;p3k2l}|19Fk;=5#qwyu$Lt>neRo=_Z?C2` zdIpBxeY7TuvXY+t^hjlM+?5Qm{6-N4)D7@YP~{1;Xh6wtr)7=h8y4Np-Tsi>5Q8`z zv-J!vE@m;s_vAevVbpFmiIEyOl}k}x_k8HZmfyZ|x~jC+0ceSgp)W-vVhhKfu^HJ_?aLJgQB&lnL;!0^_|;Y@Djk0 zb>YUD>VlE{*%YA1#T@ZjBg*{*&_suRkIjQv`Zd;2T<=(j_AL=fv01yO6(Y4UNAQhU z)}(`k>PfCR#hsjrAb1ys(5wez<>6^vZ&%wU?MD zyG(VIP2|)}OXeSZR!U<@+zkiecI*S*+W>GHme?#Y9#G*gL93HdZY|Zf&r3~csPwK2 zpq^yPfWKt5gHU1Z^Ig%BoWjfI_O&~nQPj-3-Ly@aJ$=8ZnF7TrGKGIU_YSl7r#u76 zmidR;p}Pbrtm0dlCwZb4y3-?5UM0f#KpY4Y;C2feSqDOEe*VB<<(@FHU4W^Sji|rA zc8Kqgf#AhkY+t8CX(qdtg!PWtwX2%08^Wt~{0>6SwJ-g2phkeetFWG&v|psfO0UFG4Wd6$y+HNDTK2TtcG;OMgMP`5U8AK; zh*+ID-~b3ip!jv=R*liCMvWw&Hew7YJX3v8@A=d|qdvrC6RTZUvzMmLe$85H3#J93 zQL76l_1EaPU1*6}gy#u;PR$$@+n=Qvz4ReDM%&#+a)s+x_O)Ro+V{bLg4+`ON_loj zHX@iq8k-2e$$(idi^u<=sDFeSqLB_Z#x!pKGPl{|V*@D%gy5P!$Xby#%}u`f80R?8_LP7I zOx$g0!k#l$2p&BgO_fJv)RQc0F!0k8a&=~m!8HCU#sD{w*VcL9o{C&nn%C6sjSY~c z?JKHy=<#uj=RRXL7#zv%Hwai%Q)dxTSBVl213c)b0Eh zMV-)QirR&dT~G}Za2$0$L=}Q^r{P0bcnWL9e6iwMbT$BZ|BYvt7)o?s6_9Qaf}*Qs z${u)^CP+i9OO?lr6=sg&tl&vpK!sqiXxV3@$L!gO)mBA|^Q#uRJx7C1cZN)kWMt$C8lkxgHGi3sW7WJWcgP-z??Wd^x?`F|H#M?E@n{~95s4g{-YTHd z65KNdi(ZT9HHYvJg(1;A@qu*B9-3Bt9gimn18ivLbl=Q7i)AC(uMBo!Sid?jEwHftlTivm+PZGM7D=z?ar2y>6LGuHs`Xz?Hg=!|fXGFn`%a(Jn(~XX zAxC3x$n6)t@yJw7Y@$O`V(4fa-V+87xKJhT{_?)KFZ40g-hI-WO~8=;x~o=Bt-lLf ztEN_xbMruw1|?1JSqgIVZoK%RJo9bEX{|d-;!=z)oJ#H&Fys7rl+4X`56@ZmHO^3> z9;`d52S8D-?b|qZN~6svPyP75IkO#xFdBr9wT?iE@~|^_`&5qtOVl;GAdH6`j{to` zB&iy_kWI8-_%RCZ@1EtVco3GUD$TGELX=;k;m(1jg!dW zj)-OYaiQT4)Q1C(=Z?u4*9RU0yzqWj_Q&vejDSdD0`Ms=9ourB!)Yfv7c;{0dEE8c zw95PHqJZ()slwD$txC|dsRe5_W89lJk7)DktSC^tHU(4)5IG}tN2JkPX^QJH#AD$F zccHw@okVPj= zU~$iOw3LzGLkdVvt3gxg;aEwGEDA{mz|}7d;@SGZ;Qb}$JhXGpD9iq5-CB~tgAmVe zMQV*+^^=s^I}GTu{Ej}&5z8z8BmnPgGmFGt&(M-~8bk&XU48_}tqrjj=nZNfVYb74)v77KsAf8V-SGWGX9)6I&<)!|3D$WXQ!|HM){F zyn|=jg!LJC$SKoG%)pgUrN)pD)DcJ7U8xU+NPSMXToY+`{H4u?r?8L9D#|!XOvOwq zpcBKX!mw9_U(+wE9iq}EEyhn{nFc`;e(Ru2D@8vMYG7f2__&tH(=gb>=Zn?n1#OZc z5y}2Fm-vf0hs>dV6HJ_|plfPcoek^WQC;2xHgVnB9Gwq3S4Zj;%+R(_R z#O@XcTVHjFKomUpQizQG|`@wvzgxVNG7|#HoG5}Dv2m~kHod%~Ee%7v5@}5e2A}2e;B@hD5 zmik5%^%+NOl$YMZy7b($Xf?Pb=ENI(N%y{2s*BiA=1&yB0tjHy6nQ&>aT!LydKOtj>c%uH?0rO;oLUMKU@Ki1>F-WU;P3)`XI6Jk* zGdokJ(fU)9EMjS=NXL@nQuL-;tkaEE!6FP{0uM1t)&B=f@&ond51;fst&6@@>A83DiRt70Qok{bo z;Ii2_$`9vH_Rt^>gUW%|8rLopP@MKU@ujw@SoK)oIxkaa#`qN5N3wh6J_hs$XNjFf zX&PR93?xu?IJ*@?bJ5L-{O>zj9o$vDNkFMu>f$yA>vEX)D?IGrei1(OSL zp?w1;S9P`;r+>29GAZ3VZcS|)D_GOzxiioPk7%f$tpOwT6Ga-v$uj`B8}+Dp>FJGd z(mRe)Omu3P-JB55_>8q{_e(kw2K~G!zl(Ob%tTF`BsJS0I%<=#?t{?nHx)Bh_^!Uk zS(YB)2ea|wxFXz}P4F)Isxq_+2w0Zc_)|WeDBe=j*h>Cf6jOz0TDY9ty67fDB8G}z z&)}rBfUh_Za`jo$esCc*LE?Gm<#A|*U~l8|o2JJwm8eUne?5csFIkz35U5P!)NNLU z(c*MA^-Q(OZ3+5hjq^9gRHe3?RxeOQc_^Cky=>3Hq2UQ54I5aQgdHp?5XPAxRaERG zcFBcPsq)y4j(15T$*s=yiX)U3K$*X?O8b>VL_<`EE~3l1FiRv~r?uynBg{N+Sdxee z=AxRST|$!FL7H%DlM#R$l@?A#rA@r&qb{dK-40>&_fQ#&EdgkAh#tm9G8JUCM*L^U5o{M2mjs=a>2K`W^^5&ujB^dy=pt?W~jb*hheEVG6KN2E~ul*ZWi3uQYz1msTAvo$9M?s(l-A{|OMR zYV0I)(`~CNC)E=xj;UadE7b_66x)vyiJf|!sdrvzzL`FGlY?B&veaX2Rhb%SngXhk zuur7`x?AB3=g9duDnTgF!|;K z#~J2;&Nem(U1KFv?fBuY_a$H9Yb=N6_{ldA=_g0?PyZ#w_im&#XN7+TBk@|>uU$7v z1E(-&*iX36LhZ}rDL_0%ZYd}Z9!iL|6oS_(^pLwm*mUxCCZL`jPUw9fn)PgXjj^B|tPB6<=$Nav;DqVHd6IXJqZ9$PwFEwV$FE zFw(fGI$d&y*M%sxZ)JaiQ)E2M6!^V@k-(`$`}PGLhlh#6!jiMIl%ftEcKenbJ7Ggx z0tN8*j@P(1&>ibZIQ)$NAkT4U5tzw_Zf40|S(TLs$u-I+%ti z%S+nf>6~R{+TSS-!?$;ank;YDy#}QRq_79pOWY9F(q}J<8|*ron+Z1YDpw)%NPHjw z=Pb{#a4J+Smm9)QMCi-YPc+&(?w@7~I`qC>u?6DyD10>{X&;HpGGaAt zeJ~a(%G@%v_Hj{t_LZuvmhZq9?aQiupx{D z$#hGK)m;zvWH-X6as6ElZgofTV6Yg=12RmF&HUl#u-?psJ@A`%R3*)ecWs8Ur>#d6 zMgrCFt8bpAJieof6G6NT$Lvru!vJ?OgJH;@bI#5^aYvSEeGCUGuDvLXE zT5~Ox8$2qu+p?|F5NBPZUNm52kFocYarsZNJ|FQ74QkmkXWDcIQ;>NJ8DuUr6Ss+1sPou`T4V>49oRnb71?9z#s^J9J1pR$LW~qhNz-vDUF5 zfCLSQA`BtT1+V(3fUn-HzVb(3R$j}DN6ZM5NUz&)zE$I=!c8cc zCsRjy>9I-%&cNvP9QX>u0&rscFF+}2lF zgWx{jEG4|^Yt!R`k#0ynexVZp#Enk&6D_X~p zeNI~S$nO_gAo8 zmc7Y-8OiX3cBa6L@2Kmpg84+^;MUZ_IvsgV*sMGw{=3jF+?v!jqA6GRK(DoH@uZN^ z*u!%P1IX`HU5+)e=)OJ?U38voP2=irD|xtkh#N}n%|=kRA%1x`8702);{PP8O5QN7 z)+1C?_=es*E_66VqV?R{a8!AFUqWko#Z9XmuC_(S*r9WNs)l)$_$8WQ-8*CMwGlJ} z!q|Qh*=`)kcmHm_!4|Nu}w+{X7m8#&o!%g$CnKO z2?xxDC35P~@&|*C{O-3qA*#=y?NKM9%t1v9l`+W%ODb}Qye>+`wuh4)wfLaTSGJya zrDwIhg1fmik4Y1tGHq!dGsW=HB9>B?%>a|m+1eZQPX-HdN0iK7V3Nf89*9j}DUtqOe60@$(+ME=wK>k*IP+ivZQ6pNIe&_=AvthQ%Q6 z#0oERp@K{ou<0^vDo{8gzn@B8^$l^_jh9cAn@0d-yNW>^hxhI(Y5r{7PUlo7zMnUSON2bo=8R*5ZDNb#IxiG+G(tM-N1_i!FJ=QpSK(F+S5DMm7g z!&kjyB}Ug6yJ=C+uu>h#XTTF_6_%BY1`i@4OPPr|@&M-vq^pF@ zJ5EarGiruTI&^H+or*d|BVH70(2oCt(m|Mnc{LLq7LFqjIBo|l_hi>)FMcqex*k9h z#}f38EPSRIwYhY0tPr~60Aq@#tfQnftsXm*J;h=gf}wRP-}TD!=OG}#Fs5Vp0F6kWc;)MC&`(m`fh*D>)*m&+`il7kPYP?Nl2@B1Eh5{6Q)ONl z+AG_X%+ozJ%)rV2UOS2>%v}8NrW+L1Uc3Q^x>8XOi-1h|XecwX9lFz!)7|e%d9fsU z+9BTUH35%y9+6TCNS3$&t*7VKU%3s=t!#q5@TD#!CJ)nt_ksdLpjxf0@CM-Z@NOke zz1+ZdVQHF#_4~$--}L6S`UHJt46eQM+RODxTNWFU*XYguL0I8Dn%1o#PwKLj1F`Ag zo2rnCzqim7`2J#9bc3TWd{ppsUHus z5Xq5VG3-bD3-O@!{<%4vUA%=|U`|Q_MRgH#oKrOPz=VQ)$v|(4~w_Iq4ixS_hcCi+}Q&V0KMd9VD;gHMXo zDQR#uZg#=8rz9^`WcoI_ACQ-%W)rKTNF}eRW51-WUCS=AntLxc9Y;=iaiX=nh}pha zI3lv@8C-%kh@G23Qw0Y~C}*O}q)`#1edxE2-d>W_z9Ln8f(8~VuH^SRLxjL5q=Yyn z6Nc%g3s%OZzPapAHRNu9F~lR989xuK8E*A))$u)IG0rB0tf4DM8Trb^9QwM%>3`GG z|47cO8o0{3iOe|v4>K&oy^JP;4&3F3C)&s$)CxfMIGa@W<@qZ(*RyJhxXcXk(o8_Q zqq3+{`-yja`oXZD0&f5mw`>C1>=V*)=gE`t9zjzn8!j-|FJt2aseV&j{3Gy^$R5UOwbr#I16sBHUy89O}8BFUNIsEap-! z3~z%%RQ=e8A>sa|&Wd;Nw35%BZ=9x)u4MIvDWlVe`cNCUhKz(7Q8^@Hc%`J5#hxK)$(w=XNN`AI8Sj?qRKYl zVN4-KamV-7Q&Vh|zMHtAV)M{`Y#}Z1OwpN`kn_7Bz3Kf*px0>B?>FXDc4gGJwhA5(^2D#x66CB5DmV;GdLUkQJySh=;#Sgdz4)39FnI$X$lY&cf z(QIPw`}X-Pda8!Tc1!g8D(Kj5zgWJ&jVxTqi_B8&Lr7XJ_+z5dA?${G+)E*0c982_ zIyiGcJP1_)j?6IoYz(k9ZRsbLD##fJdUadyUT=+O=@BC`w-DySdf?_p`6FpTc6M(Q zAIpD7ojL2n! ztc-oepdxy*OS^YhslpIm?5gXn+9qh=(n9~z6|iqM(LnAwcvf}J?aJJgI1#@^kRm>% z5dukLZFA!T!;(8rveNmB(Zp0;|*CeqXSXu);2Q$BhyKQld_=uPQ(m0&L7k&!zE&p zu6cIyuXswlBESVtHs??wI8O}4U@bEPxqMpdjQC?{P&5o8a~to4^q=d+&RZXV0mIkvfK`93imd+6f>bye?=5fG>Sf^DUU!u}9J(KtC1Hy;VGL0-RYlarTP7L+G!Fpn zyYH@K9wWh7QkvCEzK4L_-@MYI zxSDQrZQ_yj*b2Ed4E72rRuM@fRqIK~dSdt6z#KkY_5tJ?AnFuXx@ovdfOxcLlKF~G zi^I?Pn!x-yH{zzlz&UfhY)vkN<;sm$*D`<2VAiHowB@__AS{Jbqkb8eq_LRwSSv12 zKGiI0bfWDs)|M@Wi5mQ4QHNloKWf%?J_SrD<^XDr8iBzR(vM;AMj5AF6-1g zPk{%I-)&T=JlV3*EGyhuGf7gfzaZ+R=ZK_pvL2781>xLq%?LvnGge`KXWOsQVOL7e8~3HLlNGlyy{JppRMgX_OnBP9Q(-4OrZfao@ln z5M_sNTptKj)%-j7-GIvqyeJ);g5k!;ToSG3SPd~nO|sjx++dM$6oi#LUDbSEdA&jK zfhFC-8;}_A(#6?K^tOtq?#gn)|DyV4b=%y2ahR~;vmCI0cDkF7!T0osS6T1Urba}G z+lrZtyEQ2Y2_h+Yd2a&n?VYcRl?a0nR2P}$M0!Y5jvuhfP($XfIMe7qyN@d%V!ALX zPG& zJbvlC>9jSF!n?RBl1eQeLEO}?6TVudh-n~{tU6z1AfpES zbe|6M0Qo#xc)F2fIJHdi>OU5tmaKx3MbUxco211$0#>%lasQ^Bs9IEpMm7 zEhP`vrI&`h@|IJqIQ$k5alm9) z*(4p8l=*6$BnEGsLPzdhxH_oj)}aK z(N}_=owhC*oo+zg#uHYOV4m)W;Z9-#odZ(O<7M4pY8GSf#>0p5NApX#trDgm6>ct% zf8pcm`8B%yUW|-p7OQp`dyy%djqyhn%|(O-4ezzD`?9k~0$F9bFeh4;Svb+w>1i51 z+`327{Fl;p2wHI2fz%MJAUX_EbE%F8>S(2}~9K;%e*Y|0`7$I*!YO2S~d zaa(Wz{ZSgsdwsw;zBTDDARnRQ>$0P^%k5?X7|=`Y%?sfYwoRz#zlD6SbrYZ&@wVSY zWBTt-`-h04mlvV&5L^MF(Cva3{T{$3{dMufEAwA!PhO?cD`iF|+8({cUV+ZF?0dX@W-EW#(B%m%qU9ZqzjPku<6e?(whXWp#z?sN>~+b3E5S z{LZfb8}EV;1X@{!Qbx>3du&a>{5qU7p25UK=>nf|ELYphpyI8~Y1xZ}iYtIgk?D$v z*I-WAqr^@;akg_h`hk%i)9;)l>xkFHSl0f4XY{j2T3JSk``AKUYC8NZ`btQD#}T|E+u~CU}t29%X{3=P!!2c1+TG50va&ka0L8Il;&PQNw#Pg7E(gfYBaV)I?SI*8| zF?bV7A0g^#p86S7O?Qw!kX3Y|a-wxp7+b{AX~(($8CACZ>ES~d=9|$?wzE8{z;VA* zz)!Zt@IdC~i*DG1Yqu9H#p26q1vc$(&9u@)t80vmJXq(*Fcnz8hjwUQJ)y@w>?PPAs;gaQyPQcaaJ8jD55A~<*S{Li;VD8_|R!xcR1H0?y_GCI0#;Bz}nXm zb?oRxocj+kRsoulO)?dit+uL_Foia|cvfgY*GRCH6+qAV^D_m$fZ8)TQ;bCs@8tZm zd5QFW^fWqWY7-|=W1Sde_@VIt+Se7VgNgA z@TE~DXa|H+S;COPJm9C}w9e8n<@@nbqyUM;?wYzSl#;kYK_Q7{?JC+_z-MFRAq?7? zLP@vwrF!%Dp|b|J4NJL~eLWdrl(nnXL!L6p@j;UvCFc5lyVDKkk;>e!2^oKOj9Rb{ z;_!LHKbT5#&2Zw*OweDjetj8@qk|*fn)Yw(`!5)Y>rdm8bnr8RvuGlNMS}w(wwu@{ z1csQuXWrf@YeX`xQV4a~>(5Ywf~u4ImGvUEyBl$81PJ2NSM!5clQAd>W2{nOZHKA* zfJT60J`57m(76$9(ny?)&`EVW`g+_Fdto-0v?`6p2O|R|6n0Zj_3L+Z+)E`Avk9G; zGqrH^*DUl1R4+ck6ea|zrL^T`A>PwW7A;q(s#P`Dz>i!SR67@t&h7?cHgSarn09cP z9Eys~4IH4&!4DbGyIlMNSb{-d?pHV%e<5UJ`c=(BH!z29bwr70^3VDVR6ri|*mPJm ze-)yMR~2?t4HD%SI0g$8J^rz`&3+@0M+X z-r3dlM{VE+o{c+$v5FyJyKfATG`rkBqe08>tdb=LzoEH(o|bXy%?V&B)mOCvL%z%o z*=>vY<;rbv-QxYzLJejga_#!{+ixS*n#p6tDH9JD#m7lav5K6ptRI;?773WEddN+ zs9gKW0%f3W>rWn|VlD}9>Yb!dP(An9l7vFBwGrJ)^F7~ifEX3>_;nXUg$OU@9pvxs?_$%GUai4BPB7(EV`_DxWYX zpkd=}vJLo*I!65=61rewIhp5;_dVEtDo|5aE0@BZ;d2t2S zgUhG)-d>R(;S&prwNZ`>JlrPMbi#-Q<>XTWSKDb@zEsY{wb*a8X%pqne_-YTw~}qO zn=)YkuF)VhmZ7hL6m0#_06$Qr!el4%)E=GCx%;pfY~y$J$O@}>!D+=F)6nZnH|{E| zJ@Tr@Cu&GQKJ9Q?!R-CgP1xxKbwnvTbre4tAyu$p#t_we^;BJcaVom&T#OiXP1^N= zd343Bu*%*CbSMK#u$6cG(4*<3&?YO_4Riebl6n@vPC4jGc6%sBs1-1o8ohhZ1WHX$ zR0w9Z(DFm;@9fgJywAmGRk-Zk_4CqHO;loW5?JU4@p5*(4W11+pk^3U|X` z0c;*#srrzFn6NyRXIkgc0Cm{h)pslh%yq$a-1$~sUezl)!wW(eN)#wGXc#e3Dqmi8 zy)*40M~x@&-gF=_DM>@ymPuP~1+?M`5)lH3LKl?2rv9>PlgA@<9!L3ebXiHD(q=b- zE|g$;qs2b)&+)l~(CkA|jW)p*prouRxwE4(3inMTsy-FfzRw1m|3FsfoSQ-1FC@7K zeMJ(R2T7KI2kO;#(3 z9cZ2x*QgeURaotudKKljQbb}+rNzyqQ7#G577^-uKdHx>=$^78sI~CA8FGCL{MWI- zW%M|s1Q|#`pu4Ps2vMsOw$GZ{AL&!CQ9*My>b<=7l!kZjQc6Or@?_A>Vx6}4Vgl|B{=fKj=W+PMzkmrY z=htj}5U!!%45GB}97%+2VzkE@@ zEpCm0#`kQIpt!ga_XzcQiz>2!1J<|BV`16T?B{}@$A93X_7k@Ydv-I9Y`{m8;)eNx zgoTJmZ?-$MAz1Y9>KhdjcXi3>R{)gN@mHTpR8Go?1fBOH2F-8 zwj``5vCdC)zC>LvJ(b)}L^1!1>NU(U5r`79dAunUd`b@`YO-xM5)&D(=$ei^ZXm ztG$LP;Ehs49~IoMeH@h0(QnZDI{%KL5J9g#5$Ybw9!xD(f!XQUZILCS#ImxXy^JA8 zfhm;~5c@;V3qWl^oIZwDqs}2R2=7UFinlEnb!YIsSi7YkSztgtTGbO{M`KXU!Z8*H z1#fLwS6T&~0@1wb)sZrhY_TK?fhFGMI&kyR|HPscw+)o@-tt~wNNA8+)+6@rCOcB8 z(}=keG^l*sRGnb5=~#e56RAMUs_OmK(29;xGJ8JTQ;Bl%h4{~%^|AGO8bJQpr$?k& z=96`Zb3?YgGZ7X3MW)aHzS4u{kY91S3(EXeVsn(_`EdZ(DhGrtrz`$WG3?UfcA#@* zz}6oWt+`UVxHc0%r9#Db}P1cso4K4@!=6mUAUlz0gU9fgKM9Qf(HK2kV z1s{a|zPIkD7pE78XG21Y_Oj6)m~aH-ufjhz5*5qv57SChQ=NaRT)4mbkaV-qj1+o8 zUp#8TE`M7OD#5a90v`qU2;1rpfu`CW&xAU~?;;a&SEO%5fIFP&6`dJn>`)^qo+T&DJEbfsZ1ci<$JM5Y7=OEjgn9F|iBjrGW-Ipy_ zBx;Vogg{%yhG?AHG)EuDIbj~+C)UEG0O$x!%%U7*FL{S_bw%TIEa!Ykhkyh&`Nuhk zxLo{cpFCke3^xvW-hsw+bG}+~G)~7(phc_AV#G-qJ^6^TA~6RT^-QRs&`YNU9gvCl z@uFr2gk><;8U8~DxdVIZnqZq_K`f_dy(~L#9 z+SR7<2Tu-eNgZBxdzGlWW}!Wh<1QpI!&WNb#(`TnAgtP$U{sf=Ktvrh`8u+w3H-1$}{uvoUb~7^~xA&_VQ9S-g61o2r zBN2vNHS#{0!}~Sxh_%eUc>s#3KAUHT_Da0qTOoE?`B^*3Ww~F9gqE*%S_~ifXZoA= zySHF*pBY6du1Msh-pHr)~*vTo`E;Gkapx;V8&osudV= z=(W3E2@akMe14s5W=b|1yoof$Z`EE!-?X_;Yuf@P)ha-ZlrdsrH^(JZT9TU~@$LMF-jh-rCj}WK{PV*f{@0wsr;2P=2YM!w(&_d6CFz zQ;a*Mx_Qv)JCjXfm`x)$Aq)%;Y1l+{ZzzfZg@q~-KUWJrm}}e%m@tMt!eq|mOQPbw zr>&;Q>M97fV^uCeE^cn)WjfERQySY@qu2$5C}&2i+ywP8a|QU1LN2d|)^^sJkWdd> z2x4@FKr}B0B!|xY*CK5sr=y?8`z^Qo#vDzd6_Ji0ox@9D4RjGXR`+dWkb_Kqru5ng zBk@KDTAC%5rd^d`*%%J)uT8ZeJvp7y9E@1*c+*UTf`0!H zStX$5^eEA|MZgexyI={OrNP*Gn^#p5wvjGC4OMF~k_Su0jbhhZ1(&7mA5PjDz)hNS zr3u#aRu6vt_D`&ZF|)a~rVMI|OR&gR`X*4QWBY>Q+achyPbSheS+eY!<;B%x)*YE| z&j+`4f^jn1EChz%y+18&3b9$4BzG}fj z)C+4n!&CI7xB2gHy3u7y*@$cL17mA@Z=0$E-EB`Mblt1*Kx-+7^v zLRRCHkvp{|Py_zMpX>aEylo(m>+vGqx~-7{Riex0s$UyrT|v*@1y9YfhDRVqK)x`2 z8RGg&dOC4n7Kq~4fr?~3KtAHT=S9d7Y)+Vj-8t?>f5kG0arFTULd?d}9v<%A32Cv< z-B|x|phSnyUuuoq9rZSrLm-Ad>d*Dr)o|svv`O?jSZK47K|NMH|DDhSaOud88{+(a;4QOg-Je0C;$y&{RnAik>ZG>|`wt5?U#MoCMj@cL z4O0b|f$3z;4%B*UFDQe~i9^iJsqC*4LKe2iD zG70DzHOV~c0{*s!T&1>K@eeTqc{d%K7DUT`FnO2#>?_IiaX_L|LxReZRPl2{he4z_ zl#WTlu=gK&y7&^*6g3TnBqY1Z7J~z~yX+ZA;({zJF zme|W_0-3rBBG0@8!$_gsAIIWn++g3u%i~F65`ipBm9f~AYF`$Zg@x!?cw6!G#|1Fr zEyrbN#4CXE*ts(R8kkv7lQYvSIHHMpo<9d*sbdG?sY8VtBMTIl|KcP{aI^bazN7bV z4G6AI|8=Z76osjb(Evt3xxcI=%Z02KO+lJjV z4byEXGwkPCL9rTH=z>VduZ1xS>?TS3(9Da6I**+(X990h9FVq;w zxFOhkItv|trYwcc62O7@fbF^ga&Ws%x_-XkE{+AGP=Ao9ED`Ll>pwi1Od~i6zZ1A| zk@e;1aEUFiG?PtX1^mp87|o_(7q7S!tMB+x<_o^WU&-HJDXhY8#`G=$F3yc8#I}pf z%R!$D6UM-mc3Vl3@c=Yv++5RyF*|X5jg8(<>2n8Z+&dXaHxkqwKICyTF`kjT4pw!E zt-e&($?q5AZYkjs3HiAy!XGyM66G@{tmGE)YIZX3uG+mtEvgY zc*+a|fJSe$V&X~1M@0g27yNobb)_JjpcN%sZnHADl0Gh%-=Yu@WoV)tbWuDy=YI{+ zlBwQnhybR&@6^!G`gJ{W(#AUjjQv0n`r}?S0l?a`F4Vp8hvU-`qbK;)m?Y&kNB`)G zBIyF~p}1lBsaGEJAJ1Z~;MAP?>OqR7_Rx#fiG;_!=(AeRj?(WJ(jJ

-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

8nK8wT>`VdmiY%7PGD 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

&G16~PKfF@Kf)kd^I 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 Date: Wed, 6 Nov 2024 18:39:03 +0200 Subject: [PATCH 298/409] refactor: update GPU node deployment condition to check control plane status --- azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index 768dab61d6..5320a60d77 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -286,7 +286,7 @@ else sudo service sshd restart fi -if [[ "$deployGPUNodes" == "true" ]]; then +if [[ "$deployGPUNodes" == "true" && "$k3sControlPlane" == "false"]]; then # Installing NVIDIA GPU drivers echo "" echo "Installing NVIDIA GPU drivers" From 838ebec98b6a536e22670fefd3ea3317a53a6739 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Wed, 6 Nov 2024 18:40:34 +0200 Subject: [PATCH 299/409] refactor: comment out Chicago configuration in AgConfig for clarity --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index a24265e567..dc212a0547 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -161,7 +161,7 @@ HelmService = "service/prometheus-kube-prometheus-prometheus" IsProduction = $true } - Chicago = @{ + <#Chicago = @{ ArcClusterName = "Ag-K3s-Chicago" FriendlyName = "Chicago" GrafanaDataSource = "chicago" @@ -171,7 +171,7 @@ HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" HelmService = "service/prometheus-kube-prometheus-prometheus" IsProduction = $true - } + }#> } # Universal resource tag and resource types From f2e559dd967c0af0507813d758b4a4a6ebeca879 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Wed, 6 Nov 2024 18:46:36 +0200 Subject: [PATCH 300/409] fix: ensure proper closure of GPU node deployment condition in installK3s.sh --- azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index 5320a60d77..27c73e070d 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -300,6 +300,7 @@ if [[ "$deployGPUNodes" == "true" && "$k3sControlPlane" == "false"]]; then # Configure K3s to use nvidia-ctk sudo nvidia-ctk runtime configure --runtime=containerd sudo systemctl restart k3s +fi if [[ $? -ne 0 ]]; then echo "ERROR: Failed to install NVIDIA GPU drivers" From bad72b3562f96739825d29a4885de5c09b90bd15 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Wed, 6 Nov 2024 19:02:30 +0200 Subject: [PATCH 301/409] fix: correct syntax for GPU node deployment condition in installK3s.sh --- azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh index 27c73e070d..dc68270bd4 100644 --- a/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh +++ b/azure_jumpstart_ag/artifacts/kubernetes/K3s/installK3s.sh @@ -286,7 +286,7 @@ else sudo service sshd restart fi -if [[ "$deployGPUNodes" == "true" && "$k3sControlPlane" == "false"]]; then +if [ "$deployGPUNodes" == "true" ] && [ "$k3sControlPlane" == "false" ]; then # Installing NVIDIA GPU drivers echo "" echo "Installing NVIDIA GPU drivers" From 968e7f6a32e0d90d04156210803bc557674ca2d4 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Wed, 6 Nov 2024 20:47:48 +0200 Subject: [PATCH 302/409] fix: update VM size for GPU nodes in ubuntuRancherNodes.bicep --- .../bicep/kubernetes/ubuntuRancherNodes.bicep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep index 3b553e8f62..b1cab88431 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep @@ -42,7 +42,7 @@ param deployGPUNodes bool = false var networkInterfaceName = '${vmName}-NIC' var osDiskType = 'Premium_LRS' -var vmSize = deployGPUNodes ? 'Standard_NV4as_v4' : 'Standard_D8s_v5' +var vmSize = deployGPUNodes ? 'Standard_NV6' : 'Standard_D8s_v5' var diskSize = 512 resource networkInterface 'Microsoft.Network/networkInterfaces@2022-01-01' = { From 9b147bdab6d42029c500b2d696515201f9fee319 Mon Sep 17 00:00:00 2001 From: ldabas-msft Date: Wed, 6 Nov 2024 19:05:21 +0000 Subject: [PATCH 303/409] acsa-e2e implementation --- .../yaml/acsa-edge-sub-volume.yaml | 13 +++++ .../artifacts/PowerShell/AgLogonScript.ps1 | 1 + .../Modules/contoso_hypermarket.psm1 | 50 +++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 azure_edge_iot_ops_jumpstart/acsa_fault_detection/yaml/acsa-edge-sub-volume.yaml diff --git a/azure_edge_iot_ops_jumpstart/acsa_fault_detection/yaml/acsa-edge-sub-volume.yaml b/azure_edge_iot_ops_jumpstart/acsa_fault_detection/yaml/acsa-edge-sub-volume.yaml new file mode 100644 index 0000000000..f473f87835 --- /dev/null +++ b/azure_edge_iot_ops_jumpstart/acsa_fault_detection/yaml/acsa-edge-sub-volume.yaml @@ -0,0 +1,13 @@ +apiVersion: "arccontainerstorage.azure.net/v1" +kind: EdgeSubvolume +metadata: + name: videos + namespace: contoso-hypermarket +spec: + edgevolume: acsa-pvc + path: videos #Don't use a preceding slash. + auth: + authType: MANAGED_IDENTITY + storageaccountendpoint: https://{STORAGEACCOUNT}.blob.core.windows.net/ + container: shopper-videos + ingestPolicy: edgeingestpolicy-default \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 437823794a..2662b1fd2d 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -236,6 +236,7 @@ if ($scenario -eq "contoso_motors") { $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray }elseif($scenario -eq "contoso_hypermarket"){ + Set-ACSA Deploy-AIO-M3 $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 4db9b8b4f2..5cef52fefb 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -531,4 +531,54 @@ function Set-SQLSecret { --namespace=contoso-hypermarket ` --from-literal=azure-sqlpassword-secret=$Env:adminPassword } +} + +function Set-ACSA { + # Begin ACSA Installation. + # Documentation: https://aepreviews.ms/docs/edge-storage-accelerator/how-to-install-edge-storage-accelerator/ + + # Ensure necessary variables are available + $storageAccountName = $global:aioStorageAccountName # Using $global:aioStorageAccountName + $storageContainer = "shopper-videos" # Container name set to "shoppervideos" + $resourceGroup = $global:resourceGroup + $location = $global:azureLocation + $arcClusterName = $global:k3sArcClusterName + $subscriptionId = $global:subscriptionId + + # Create a storage account + Write-Host "Storage Account Name: $storageAccountName" + Write-Host "Container Name: $storageContainer" + + # Create a container within the storage account + Write-Host "Creating container within the storage account..." + az storage container create ` + --name "$storageContainer" ` + --account-name "$storageAccountName" ` + --auth-mode login + + # Assign necessary role to the extension principal + $principalID = az k8s-extension list ` + --cluster-name $arcClusterName ` + --resource-group $resourceGroup ` + --cluster-type connectedClusters ` + --query "[?extensionType=='microsoft.arc.containerstorage'].identity.principalId | [0]" -o tsv + + az role assignment create ` + --assignee-object-id $principalID ` + --assignee-principal-type ServicePrincipal ` + --role "Storage Blob Data Owner" ` + --scope "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup/providers/Microsoft.Storage/storageAccounts/$storageAccountName" + + # Deploy the ACSA application #NEED TO BE CHANGED + $acsadeployYamlUrl = "https://raw.githubusercontent.com/microsoft/azure_arc/main/azure_edge_iot_ops_jumpstart/acsa_fault_detection/yaml/acsa-edge-sub-volume.yaml" + $acsadeployYamlPath = "acsa-edge-sub-volume.yaml" + Invoke-WebRequest -Uri $acsadeployYamlUrl -OutFile $acsadeployYamlPath + + # Replace {STORAGEACCOUNT} with the actual storage account name + (Get-Content $acsadeployYamlPath) -replace '{STORAGEACCOUNT}', $storageAccountName | Set-Content $acsadeployYamlPath + + # Apply the acsa-deploy.yaml file using kubectl + Write-Host "Applying acsa-deploy.yaml configuration..." + kubectl apply -f $acsadeployYamlPath + Write-Host "acsa-deploy.yaml configuration applied successfully." } \ No newline at end of file From a302fcb9103181a4842b8195dd4c230f4a4e9739 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Wed, 6 Nov 2024 21:10:05 +0200 Subject: [PATCH 304/409] fix: update VM size parameters for improved performance in ubuntuRancher.bicep and ubuntuRancherNodes.bicep --- .../contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep | 2 +- .../bicep/kubernetes/ubuntuRancherNodes.bicep | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep index a3f084e75b..d8001ba602 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep @@ -18,7 +18,7 @@ param ubuntuOSVersion string = '22_04-lts-gen2' param azureLocation string = resourceGroup().location @description('The size of the VM') -param vmSize string = 'Standard_B4ms' +param vmSize string = 'Standard_D4a_v4' @description('Resource Id of the subnet in the virtual network') param subnetId string diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep index b1cab88431..8017136f12 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep @@ -42,7 +42,7 @@ param deployGPUNodes bool = false var networkInterfaceName = '${vmName}-NIC' var osDiskType = 'Premium_LRS' -var vmSize = deployGPUNodes ? 'Standard_NV6' : 'Standard_D8s_v5' +var vmSize = deployGPUNodes ? 'Standard_NV6ads_A10_v5' : 'Standard_D8s_v5' var diskSize = 512 resource networkInterface 'Microsoft.Network/networkInterfaces@2022-01-01' = { From 3e7e46e47310c46b98e4702f19b0d33821f8531e Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Wed, 6 Nov 2024 21:12:54 +0200 Subject: [PATCH 305/409] fix: update VM size parameters for improved performance in ubuntuRancher.bicep and ubuntuRancherNodes.bicep --- .../contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep | 2 +- .../bicep/kubernetes/ubuntuRancherNodes.bicep | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep index d8001ba602..a3f084e75b 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancher.bicep @@ -18,7 +18,7 @@ param ubuntuOSVersion string = '22_04-lts-gen2' param azureLocation string = resourceGroup().location @description('The size of the VM') -param vmSize string = 'Standard_D4a_v4' +param vmSize string = 'Standard_B4ms' @description('Resource Id of the subnet in the virtual network') param subnetId string diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep index 8017136f12..381cb6a60f 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep @@ -42,7 +42,7 @@ param deployGPUNodes bool = false var networkInterfaceName = '${vmName}-NIC' var osDiskType = 'Premium_LRS' -var vmSize = deployGPUNodes ? 'Standard_NV6ads_A10_v5' : 'Standard_D8s_v5' +var vmSize = deployGPUNodes ? 'Standard_NV12s_v3' : 'Standard_D8s_v5' var diskSize = 512 resource networkInterface 'Microsoft.Network/networkInterfaces@2022-01-01' = { From b3556e44661dc23ed260953fc328768b30d607e1 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Wed, 6 Nov 2024 13:13:37 -0600 Subject: [PATCH 306/409] bug --- azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 437823794a..df99606178 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -239,10 +239,10 @@ if ($scenario -eq "contoso_motors") { Deploy-AIO-M3 $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray - Deploy-HypermarketConfigs Set-AIServiceSecrets Set-EventHubSecrets Set-SQLSecret + Deploy-HypermarketConfigs } ##################################################################### From cf6c60ccc2269a2e4ee579a14984453d936d91dd Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Wed, 6 Nov 2024 21:21:40 +0200 Subject: [PATCH 307/409] fix: reorder deployment of HypermarketConfigs in AgLogonScript.ps1 --- azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 8025c31888..a5c0c7beee 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -234,10 +234,10 @@ if ($scenario -eq "contoso_motors") { Deploy-AIO-M3 $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray - Deploy-HypermarketConfigs Set-AIServiceSecrets Set-EventHubSecrets Set-SQLSecret + Deploy-HypermarketConfigs Set-LoadBalancerBackendPools } From b9bd2bc254e1ad6d13d4176180f81a546e8afeb9 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Wed, 6 Nov 2024 21:26:43 +0200 Subject: [PATCH 308/409] fix: update VM size for GPU nodes in ubuntuRancherNodes.bicep --- .../bicep/kubernetes/ubuntuRancherNodes.bicep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep index 381cb6a60f..8017136f12 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep @@ -42,7 +42,7 @@ param deployGPUNodes bool = false var networkInterfaceName = '${vmName}-NIC' var osDiskType = 'Premium_LRS' -var vmSize = deployGPUNodes ? 'Standard_NV12s_v3' : 'Standard_D8s_v5' +var vmSize = deployGPUNodes ? 'Standard_NV6ads_A10_v5' : 'Standard_D8s_v5' var diskSize = 512 resource networkInterface 'Microsoft.Network/networkInterfaces@2022-01-01' = { From 4edc0ac31777f6385bbb1b126e70808fe983e3f5 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Wed, 6 Nov 2024 21:50:40 +0200 Subject: [PATCH 309/409] fix: update GPU installation script version in ubuntuRancherNodes.bicep --- .../bicep/kubernetes/ubuntuRancherNodes.bicep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep index 8017136f12..39ca585807 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/kubernetes/ubuntuRancherNodes.bicep @@ -161,7 +161,7 @@ resource vmInstallscriptK3s 'Microsoft.Compute/virtualMachines/extensions@2022-0 ] } -resource gpuInstallationScript 'Microsoft.Compute/virtualMachines/extensions@2022-03-01' =if(deployGPUNodes) { +resource gpuInstallationScript 'Microsoft.Compute/virtualMachines/extensions@2015-06-15' =if(deployGPUNodes) { parent: vm name: 'gpuInstallationScript' location: azureLocation From 0d1b79197148c8364c715a0d1496d6991da6ea6f Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Wed, 6 Nov 2024 21:57:59 +0200 Subject: [PATCH 310/409] fix: update Chicago configuration in AgConfig-contoso-hypermarket.psd1 --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index dc212a0547..a24265e567 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -161,7 +161,7 @@ HelmService = "service/prometheus-kube-prometheus-prometheus" IsProduction = $true } - <#Chicago = @{ + Chicago = @{ ArcClusterName = "Ag-K3s-Chicago" FriendlyName = "Chicago" GrafanaDataSource = "chicago" @@ -171,7 +171,7 @@ HelmSetValue = "alertmanager.enabled=false,grafana.enabled=false,prometheus.service.type=LoadBalancer" HelmService = "service/prometheus-kube-prometheus-prometheus" IsProduction = $true - }#> + } } # Universal resource tag and resource types From ee9c1ab15caa57527ccd4882a515966df4a46672 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Wed, 6 Nov 2024 22:29:32 +0200 Subject: [PATCH 311/409] feat: add Deploy-HypermarketBookmarks function to manage bookmarks for various services --- .../Modules/contoso_hypermarket.psm1 | 139 +++++++++++++++++- 1 file changed, 138 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 49cbf80a5d..29324224f3 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -803,6 +803,143 @@ function Set-ACSA { Write-Host "acsa-deploy.yaml configuration applied successfully." } +function Deploy-HypermarketBookmarks { + $bookmarksFileName = "$AgToolsDir\Bookmarks" + $edgeBookmarksPath = "$Env:LOCALAPPDATA\Microsoft\Edge\User Data\Default" + + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + $clusterName = $cluster.Name.ToLower() + kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + $publicIPAddress = $(az network public-ip show --resource-group $resourceGroup --name "Ag-LB-Public-IP-$clusterName" --query "ipAddress" --output tsv) + $services = kubectl get services -n contoso-hypermarket -o json | ConvertFrom-Json + + # Matching url: backend-api + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'backend-api' -and + $_.spec.ports.port -contains 5002 + } + $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($backendApiIp in $backendApiIps) { + $output = "http://${publicIPAddress}:5002/docs" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("backend-api-" + $clusterName + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 + } + + # Matching url: cerebral-api-service + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'cerebral-api-service' -and + $_.spec.ports.port -contains 5003 + } + $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($backendApiIp in $backendApiIps) { + $output = "http://${publicIPAddress}:5003/api/docs" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("cerebral-api-" + $clusterName + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 + } + + # Matching url: cerebral-simulator-service + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'cerebral-simulator-service' -and + $_.spec.ports.port -contains 8001 + } + $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($backendApiIp in $backendApiIps) { + $output = "http://${publicIPAddress}:8001/apidocs" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("cerebral-simulator-" + $clusterName + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 + } + + # Matching url: footfall-ai-api + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'footfall-ai-api' -and + $_.spec.ports.port -contains 5000 + } + $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($backendApiIp in $backendApiIps) { + $output = "http://${publicIPAddress}:5000" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("footfall-ai-api-" + $clusterName + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 + } + + # Matching url: main-ui + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'main-ui' -and + $_.spec.ports.port -contains 8080 + } + $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($backendApiIp in $backendApiIps) { + $output = "http://${publicIPAddress}:8080/maintenanceworkerdashboard" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("main-ui-" + $clusterName + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 + } + + # Matching url: InfluxDB + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'InfluxDB' -and + $_.spec.ports.port -contains 9999 + } + $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($backendApiIp in $backendApiIps) { + $output = "http://${publicIPAddress}:9999" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("InfluxDB-" + $clusterName + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 + } + + # Matching url: Shopper Insights API + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'shopper-insights-api' -and + $_.spec.ports.port -contains 5001 + } + $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($backendApiIp in $backendApiIps) { + $output = "http://${publicIPAddress}:5001" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("Shopper-Insights-API-" + $clusterName + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 + } + } Start-Sleep -Seconds 2 Copy-Item -Path $bookmarksFileName -Destination $edgeBookmarksPath -Force @@ -814,4 +951,4 @@ function Set-ACSA { $quickAccess = new-object -com shell.application $quickAccess.Namespace($AgConfig.AgDirectories.AgDir).Self.InvokeVerb("pintohome") $quickAccess.Namespace($AgConfig.AgDirectories.AgLogsDir).Self.InvokeVerb("pintohome") -} +} \ No newline at end of file From e46641a3c614a7967e3e1d537ed658dca6839a60 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Wed, 6 Nov 2024 22:33:29 +0200 Subject: [PATCH 312/409] fix: streamline WSL installation process in Bootstrap.ps1 --- azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 09bd229193..3a56375d8c 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -412,11 +412,10 @@ if($scenario -eq "contoso_supermarket" -or $scenario -eq "contoso_motors"){ Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -NoRestart Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux -NoRestart Install-WindowsFeature -Name Hyper-V -IncludeAllSubFeature -IncludeManagementTools -Restart +}else{ + Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux -NoRestart } -# Install WSL -wsl --install - # Restart machine to initiate VM autologon $action = New-ScheduledTaskAction -Execute 'PowerShell.exe' -Argument '-Command "Restart-Computer -Force"' $trigger = New-ScheduledTaskTrigger -Once -At ((Get-Date).AddSeconds(10)) From 4a564b8cc6fe39bba2231eb603f45c3e45a9a7eb Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Wed, 6 Nov 2024 15:54:49 -0500 Subject: [PATCH 313/409] Made fabric capacity optional --- .../AgConfig-contoso-hypermarket.psd1 | 3 +- .../Modules/contoso_hypermarket.psm1 | 39 ++++++++++++------- .../PowerShell/SetupFabricWorkspace.ps1 | 17 +++++++- .../bicep/data/dataflows.bicep | 2 +- .../contoso_hypermarket/bicep/main.bicep | 2 +- 5 files changed, 44 insertions(+), 19 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index a24265e567..9520587905 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -59,7 +59,8 @@ @{name="customlocation"; version="latest"}, @{name="kusto"; version="latest"}, @{name="storage-preview"; version="latest"}, - @{name="azure-iot-ops"; version="latest"} + @{name="azure-iot-ops"; version="latest"}, + @{name="microsoft-fabric"; version="latest"} ) # PowerShell modules diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index bf793ef58f..e9e129ed3b 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -300,10 +300,11 @@ function Deploy-AIO-M3 { # Get IoT Operations extension pricipalId Write-Host "[$(Get-Date -Format t)] INFO: Retrieving IoT Operations extension principalId" -ForegroundColor DarkGray $iotExtensionPrincipalId = (az k8s-extension list --resource-group $resourceGroup --cluster-name $arcClusterName --cluster-type connectedClusters --query "[?extensionType=='microsoft.iotoperations'].identity.principalId" -o tsv) + Write-Host "[$(Get-Date -Format t)] INFO: IoT Operations extension principalId is $iotExtensionPrincipalId" -ForegroundColor DarkGray # Assign "Azure Event Hubs Data Sender" role to IoT managed identity - Write-Host "[$(Get-Date -Format t)] INFO: Assigning 'Azure Event Hubs Data Sender role' to EventHub namespace" -ForegroundColor DarkGray - az role assignment create --assignee $iotExtensionPrincipalId --role "Azure Event Hubs Data Sender" --scope $eventHubNamespaceId + Write-Host "[$(Get-Date -Format t)] INFO: Assigning 'Azure Event Hubs Data Sender role' to '$iotExtensionPrincipalId' to EventHub namespace" -ForegroundColor DarkGray + az role assignment create --assignee-object-id $iotExtensionPrincipalId --role "Azure Event Hubs Data Sender" --scope $eventHubNamespaceId --assignee-principal-type ServicePrincipal --only-show-errors # Deploy IoT DataFlows using bicep template Write-Host "[$(Get-Date -Format t)] INFO: Deploying IoT DataFlows using bicep template" -ForegroundColor DarkGray @@ -327,6 +328,7 @@ function Deploy-AIO-M3 { } function Set-MicrosoftFabric { + # Load Agconfig $fabricWorkspacePrefix = $AgConfig.FabricConfig["WorkspacePrefix"] $fabricWorkspaceName = "$fabricWorkspacePrefix-$namingGuid" @@ -335,25 +337,29 @@ function Set-MicrosoftFabric { $fabricConfigFile = "$fabricFolder\fabric-config.json" $eventHubKeyName = $AgConfig.FabricConfig["EventHubSharedAccessKeyName"] + Write-Host "[$(Get-Date -Format t)] INFO: Creating Microsoft Fabric workspace configuration file $fabricConfigFile" -ForegroundColor DarkGray + # Get Fabric capacity name from the resource group $fabricCapacityName = (az fabric capacity list --resource-group $Env:resourceGroup --query "[0].name" -o tsv) if (-not $fabricCapacityName) { - Write-Error "[$(Get-Date -Format t)] Fabric capacity not found in the resource group $Env:resourceGroup" -ForegroundColor DarkRed - return + Write-Host "[$(Get-Date -Format t)] WARNING: Fabric capacity not found in the resource group $Env:resourceGroup. Make sure either you have Fabric Capacity or other Fabric license to create Farbric worspace." -ForegroundColor Yellow + } + else { + Write-Host "[$(Get-Date -Format t)] INFO: Found fabric capacity '$fabricCapacityName' in the resource group $Env:resourceGroup." -ForegroundColor DarkGray } # Get EventHub namespace created in the resource group - $eventHubNS = (az eventhubs namespace list --resource-group $Env:resourceGroup --query "[0].name" -o tsv) - if (-not $eventHubNS) { - Write-Error "$(Get-Date -Format t)] EventHub namespaces not found in the resource group $Env:resourceGroup" -ForegroundColor DarkRed + $eventHubNamespace = (az eventhubs namespace list --resource-group $Env:resourceGroup --query "[0].name" -o tsv) + if (-not $eventHubNamespace) { + Write-Error "$(Get-Date -Format t)] INFO: EventHub namespaces not found in the resource group $Env:resourceGroup" -ForegroundColor DarkRed return } # Get Event Hub from the Event Hub namespace - $eventHubs = az eventhubs eventhub list --namespace-name $eventHubInfo[0].name --resource-group $resourceGroup | ConvertFrom-Json + $eventHubs = az eventhubs eventhub list --namespace-name $eventHubNamespace --resource-group $resourceGroup | ConvertFrom-Json $eventHubName = $eventHubs[0].name if (-not $eventHubName) { - Write-Host "[$(Get-Date -Format t)] ERROR: Event Hub not found in the EventHub namespace $($eventHubInfo[0].name)" -ForegroundColor DarkRed + Write-Host "[$(Get-Date -Format t)] ERROR: Event Hub not found in the EventHub namespace $eventHubNamespace" -ForegroundColor DarkRed return } @@ -366,7 +372,7 @@ function Set-MicrosoftFabric { return } - Write-Host "-ForegroundColor DarkRed INFO: Received Event Hub key." -ForegroundColor DarkGray + Write-Host "$(Get-Date -Format t)] INFO: Received Event Hub key." -ForegroundColor DarkGray # Store EventHub key in the environment variable to use in Farbic setup script [System.Environment]::SetEnvironmentVariable('eventHubPrimaryKey', $eventHubKey, [System.EnvironmentVariableTarget]::Machine) @@ -391,14 +397,19 @@ function Set-MicrosoftFabric { "@ $configJson | Set-Content -Path $fabricConfigFile - Write-Host "Fabric config file created at $fabricConfigFile" + Write-Host "$(Get-Date -Format t)] INFO: Fabric config file $fabricConfigFile created" # Download Fabric workspace setup script from GitHuB - $scriptFilePath = "$fabricFolder\SetupFabricWorkspace.ps1" - Invoke-WebRequest ($templateBaseUrl + "artifacts/PowerShell/SetupFabricWorkspace.ps1") -OutFile $scriptFilePath + $fabricSetupScriptFile = "SetupFabricWorkspace.ps1" + $sriptFileUrl = $templateBaseUrl + "artifacts/PowerShell/$fabricSetupScriptFile" + Write-Host "$(Get-Date -Format t)] INFO: Downloading script file from $sriptFileUrl" + + $scriptFilePath = "$fabricFolder\$fabricSetupScriptFile" + Invoke-WebRequest ($sriptFileUrl) -OutFile $scriptFilePath if (-not (Test-Path -Path $scriptFilePath)) { - Write-Error "Unable to download script file: 'SetupFabricWorkspace.ps1' from GitHub" + Write-Host "[$(Get-Date -Format t)] ERROR: Unable to download script file from $sriptFileUrl" -ForegroundColor DarkRed } + Write-Host "$(Get-Date -Format t)] INFO: Downloaded script file $scriptFilePath" } function Deploy-HypermarketConfigs { diff --git a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 index 14a7a65ec7..40204d88c0 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 @@ -82,8 +82,21 @@ function Set-Fabric-Workspace { # Display current Fabric capacities $fabricCapacities = (ConvertFrom-Json($httpResp.Content)).value - foreach ($fabricCapacity in $fabricCapacities){ - Write-Host "INFO: Fabric capacity name: $($fabricCapacity.displayName), id: $($fabricCapacity.Id), state: $($fabricCapacity.state)" + if ($fabricCapacities.Count -gt 0) + { + foreach ($fabricCapacity in $fabricCapacities){ + Write-Host "INFO: Fabric capacity name: $($fabricCapacity.displayName), id: $($fabricCapacity.Id), state: $($fabricCapacity.state)" + } + } + else { + Write-Host "ERROR: No Fabric capacities are available in your tenant to setup Fabric workspace. Create Fabric capacity or sign up for Trial license in your tenant to get started. Re-run this script when a new fabric capacity is created." + return + } + + # Verify if Fabric capactiy is configured + if (!$fabriccapacityName) { + Write-Host "[$(Get-Date -Format t)] ERROR: Fabric capacity is required to setup Fabric workspace. Choose one of the available fabric capacity name and update configuration file, and re-run this script." -ForegroundColor DarkRed + return } # Verify if Fabric capacity exists with specific name diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep index 176a682a71..6dee4d3fe4 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep @@ -81,7 +81,7 @@ resource iotDataFlow 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflo sourceSettings: { endpointRef: defaultDataflowEndpointName dataSources: [ - 'iot/devices/#' + 'iot/#' 'topic/commercial' ] } diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index d192bccbea..32080d17a2 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -265,7 +265,7 @@ module eventHub 'data/eventHub.bicep' = { } } -module fabricCapacity 'data/fabric.bicep' = { +module fabricCapacity 'data/fabric.bicep' = if (!empty(fabricCapacityAdmin)) { name: 'fabricCapacity' params: { fabricCapacityName: fabricCapacityName From d172cadfc93a09c88e94ec092353cbcbcf14d9d4 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Wed, 6 Nov 2024 23:37:18 +0200 Subject: [PATCH 314/409] feat: add microsoft-fabric module to AgConfig-contoso-hypermarket.psd1 --- .../artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 index a24265e567..9520587905 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgConfig-contoso-hypermarket.psd1 @@ -59,7 +59,8 @@ @{name="customlocation"; version="latest"}, @{name="kusto"; version="latest"}, @{name="storage-preview"; version="latest"}, - @{name="azure-iot-ops"; version="latest"} + @{name="azure-iot-ops"; version="latest"}, + @{name="microsoft-fabric"; version="latest"} ) # PowerShell modules From c983f70638799000a289e698638c5fa41a43dbc2 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Wed, 6 Nov 2024 16:40:14 -0500 Subject: [PATCH 315/409] Dashboard automation changes --- .../PowerShell/SetupFabricWorkspace.ps1 | 4 +- .../fabric-hypermarket-dashboard.json | 225 ----- .../fabric/orders-sales-forecast.ipynb | 1 - .../fabric/orders_sales_forecast.ipynb | 1 + .../artifacts/fabric/ot_dashboard.json | 791 ++++++++++++++++++ 5 files changed, 794 insertions(+), 228 deletions(-) delete mode 100644 azure_jumpstart_ag/artifacts/adx_dashboards/fabric-hypermarket-dashboard.json delete mode 100644 azure_jumpstart_ag/artifacts/fabric/orders-sales-forecast.ipynb create mode 100644 azure_jumpstart_ag/artifacts/fabric/orders_sales_forecast.ipynb create mode 100644 azure_jumpstart_ag/artifacts/fabric/ot_dashboard.json diff --git a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 index 40204d88c0..032ae5a0e2 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 @@ -203,7 +203,7 @@ function Set-Fabric-Workspace { } # Download dashboard report and Update to use KQL database - $hyperMarketDashboardReport = $templateBaseUrl + "artifacts/adx_dashboards/fabric-hypermarket-dashboard.json" + $hyperMarketDashboardReport = $templateBaseUrl + "artifacts/fabric/ot_dashboard.json" Write-Host "INFO: Downloading and preparing dashboard report to import into Fabric workspace." $ordersDashboardBody = (Invoke-WebRequest -Method Get -Uri $hyperMarketDashboardReport).Content -replace '{{KQL_CLUSTER_URI}}', $kqlQueryServiceUri -replace '{{KQL_DATABASE_ID}}', $kqlDatabaseId -replace '{{FABRIC_WORKSPACE_ID}}', $fabricWorkspaceId @@ -373,7 +373,7 @@ function Set-Fabric-Workspace { # Import data sceince notebook for sales forecast # Download dashboard report and Update to use KQL database - $ordersSalesForecastNotebook = "orders-sales-forecast.ipynb" + $ordersSalesForecastNotebook = "orders_sales_forecast.ipynb" Write-Host "INFO: Downloading and preparing nootebook to import into Fabric workspace." $ordersNotebookBody = (Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/artifacts/fabric/$ordersSalesForecastNotebook").Content -replace '{{KQL_CLUSTER_URI}}', $kqlQueryServiceUri -replace '{{KQL_DATABASE_NAME}}', $kqlDatabaseName diff --git a/azure_jumpstart_ag/artifacts/adx_dashboards/fabric-hypermarket-dashboard.json b/azure_jumpstart_ag/artifacts/adx_dashboards/fabric-hypermarket-dashboard.json deleted file mode 100644 index 0efab7f01c..0000000000 --- a/azure_jumpstart_ag/artifacts/adx_dashboards/fabric-hypermarket-dashboard.json +++ /dev/null @@ -1,225 +0,0 @@ -{ - "schema_version": "53", - "title": "Agora Retail 2.0 - Contoso Hypermarket", - "tiles": [ - { - "id": "bf1564b8-c635-4dd4-b82c-7859783c06ff", - "title": "Store Orders", - "visualType": "column", - "pageId": "9fb7339e-3f60-4f8e-b96d-923c278b671c", - "layout": { - "x": 9, - "y": 2, - "width": 9, - "height": 7 - }, - "queryRef": { - "kind": "query", - "queryId": "cdbf9c2a-a0bf-41ec-84e2-e6e4b1bbb38d" - }, - "visualOptions": { - "multipleYAxes": { - "base": { - "id": "-1", - "label": "Orders", - "columns": [], - "yAxisMaximumValue": null, - "yAxisMinimumValue": null, - "yAxisScale": "linear", - "horizontalLines": [] - }, - "additional": [], - "showMultiplePanels": false - }, - "hideLegend": true, - "legendLocation": "bottom", - "xColumnTitle": "Order Date", - "xColumn": null, - "yColumns": null, - "seriesColumns": null, - "xAxisScale": "linear", - "verticalLine": "", - "crossFilterDisabled": false, - "drillthroughDisabled": false, - "crossFilter": [], - "drillthrough": [] - } - }, - { - "id": "e56a7a19-a204-4819-843b-28ab6471337f", - "title": "Orders by Product", - "visualType": "pie", - "pageId": "9fb7339e-3f60-4f8e-b96d-923c278b671c", - "layout": { - "x": 0, - "y": 2, - "width": 9, - "height": 7 - }, - "queryRef": { - "kind": "query", - "queryId": "59491618-8a0e-4e5b-938d-554bbc38f56e" - }, - "visualOptions": { - "hideLegend": false, - "legendLocation": "right", - "xColumn": null, - "yColumns": null, - "seriesColumns": null, - "crossFilterDisabled": false, - "drillthroughDisabled": false, - "labelDisabled": false, - "pie__label": [ - "name", - "percentage" - ], - "tooltipDisabled": false, - "pie__tooltip": [ - "name", - "percentage", - "value" - ], - "pie__orderBy": "size", - "pie__kind": "pie", - "pie__topNSlices": null, - "crossFilter": [], - "drillthrough": [] - } - }, - { - "id": "9f9c926a-833b-469e-90e8-8bddc9387d12", - "title": "", - "visualType": "markdownCard", - "pageId": "9fb7339e-3f60-4f8e-b96d-923c278b671c", - "layout": { - "x": 0, - "y": 0, - "width": 18, - "height": 2 - }, - "markdownText": "# Agora Retail 2.0 - Hypermart Dashboard Reports", - "visualOptions": {} - }, - { - "id": "14872fbe-c900-4b12-a503-17535c8b6508", - "title": "Product Inventory", - "visualType": "line", - "pageId": "9fb7339e-3f60-4f8e-b96d-923c278b671c", - "layout": { - "x": 0, - "y": 9, - "width": 9, - "height": 7 - }, - "queryRef": { - "kind": "query", - "queryId": "8f13c521-66ac-47af-8637-263824635c7f" - }, - "visualOptions": { - "multipleYAxes": { - "base": { - "id": "-1", - "label": "Quantity in Stock", - "columns": [], - "yAxisMaximumValue": null, - "yAxisMinimumValue": null, - "yAxisScale": "linear", - "horizontalLines": [] - }, - "additional": [], - "showMultiplePanels": false - }, - "hideLegend": false, - "legendLocation": "right", - "xColumnTitle": "Date", - "xColumn": "date_time", - "yColumns": [ - "in_stock" - ], - "seriesColumns": [ - "product_id" - ], - "xAxisScale": "linear", - "verticalLine": "", - "crossFilterDisabled": false, - "drillthroughDisabled": false, - "crossFilter": [], - "drillthrough": [] - } - } - ], - "baseQueries": [], - "parameters": [ - { - "kind": "duration", - "id": "a68b53ea-f5e6-45f3-9197-55a36e7d0d1a", - "displayName": "Time range", - "description": "", - "beginVariableName": "_startTime", - "endVariableName": "_endTime", - "defaultValue": { - "kind": "dynamic", - "count": 1, - "unit": "hours" - }, - "showOnPages": { - "kind": "all" - } - } - ], - "dataSources": [ - { - "kind": "kusto-trident", - "scopeId": "kusto-trident", - "clusterUri": "{{KQL_CLUSTER_URI}}", - "database": "{{KQL_DATABASE_ID}}", - "name": "contosohypermarket", - "id": "0d698e85-cad2-4c2c-9791-0bb4de278f5f", - "workspace": "{{FABRIC_WORKSPACE_ID}}" - } - ], - "pages": [ - { - "name": "Sales dashboard", - "id": "9fb7339e-3f60-4f8e-b96d-923c278b671c" - } - ], - "queries": [ - { - "dataSource": { - "kind": "inline", - "dataSourceId": "0d698e85-cad2-4c2c-9791-0bb4de278f5f" - }, - "text": "orders\n| project order_date, d=parse_json(tostring(line_items))\n| mv-expand bagexpansion=array d\n| project order_date, itemid=d.id, name=tostring(d.name), price=todecimal(d.price)\n| where order_date != \"\"\n| where order_date between (_startTime.._endTime)| summarize OrderCount = count() by bin(order_date, 1h), name| render linechart", - "id": "cdbf9c2a-a0bf-41ec-84e2-e6e4b1bbb38d", - "usedVariables": [ - "_endTime", - "_startTime" - ] - }, - { - "dataSource": { - "kind": "inline", - "dataSourceId": "0d698e85-cad2-4c2c-9791-0bb4de278f5f" - }, - "text": "orders\n| project order_date, order_total, d=parse_json(tostring(line_items))\n| mv-expand bagexpansion=array d\n| project order_date, product_id=toint(d.product_id), store_id=tostring(d.store_id), price=todecimal(d.price), item_total = d.item_total, order_total\n| join kind=inner (\n products\n | project product_id, name\n) on product_id\n| where order_date != \"\"\n| where order_date between (_startTime.._endTime)\n| summarize OrderCount = count() by name| render piechart", - "id": "59491618-8a0e-4e5b-938d-554bbc38f56e", - "usedVariables": [ - "_endTime", - "_startTime" - ] - }, - { - "dataSource": { - "kind": "inline", - "dataSourceId": "0d698e85-cad2-4c2c-9791-0bb4de278f5f" - }, - "text": "inventory\n| where date_time between (_startTime.._endTime)\n| summarize arg_max(in_stock, *) by product_id, bin(date_time, 3h)\n| project date_time, product_id, in_stock\n| order by date_time asc\n|order by product_id, in_stock\n", - "id": "8f13c521-66ac-47af-8637-263824635c7f", - "usedVariables": [ - "_endTime", - "_startTime" - ] - } - ] -} \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/fabric/orders-sales-forecast.ipynb b/azure_jumpstart_ag/artifacts/fabric/orders-sales-forecast.ipynb deleted file mode 100644 index b07e7a3694..0000000000 --- a/azure_jumpstart_ag/artifacts/fabric/orders-sales-forecast.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells":[{"cell_type":"markdown","source":["\n","#### Run the cell below to install the required packages for Copilot\n"],"metadata":{"jupyter":{"magics_cell_name":"magics-cell-markdown","magics_signature":"27ac753c3c60167f65c4d05fa7809cd85f1f0273d5b842aca4f65a01"},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"7a59fda1-4e93-45fb-8d19-7db1a882cc5e"},{"cell_type":"code","source":["# Run this cell to install the required packages for Copilot\n","%load_ext dscopilot_installer\n","%activate_dscopilot"],"outputs":[],"execution_count":null,"metadata":{"jupyter":{"magics_cell_name":"magics-cell-code","magics_signature":"6565d62221c469ab3707694ccbef2e4568d575dc1ba3ebac23f0f052","magics_version":"1.0"},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"201b7702-02d9-4d89-abc7-0cdbf6277f24"},{"cell_type":"markdown","source":["# Contoso Hypermarket Orders sales forecast ML notebook"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"ef02f63e-941b-42c0-8481-ce8aac727fa8"},{"cell_type":"markdown","source":["## Case 1: Forecast sales across products for a particular store location."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"75fcef09-e93e-421d-a93a-84aa5fac24ef"},{"cell_type":"markdown","source":["#### Set up MLflow experiment tracking"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"b1418874-4b23-4dae-8748-07e756bf70f4"},{"cell_type":"code","source":["# Set up MLflow for experiment tracking\n","import mlflow\n","\n","IS_SAMPLE = False # if TRUE, use only rows of data for training, otherwise use all data\n","SAMPLE_ROWS = 5000 # if IS_SAMPLE is True, use only this number of rows for training\n","EXPERIMENT_NAME = \"orders-sales-forecast\" # MLflow experiment name\n","\n","mlflow.set_experiment(EXPERIMENT_NAME)\n","mlflow.autolog(disable=True) # Disable MLflow autologging"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":3,"statement_ids":[3],"state":"finished","livy_statement_state":"available","session_id":"3945a8d4-06c7-4a20-bac5-81538ccc6266","normalized_state":"finished","queued_time":"2024-11-04T20:08:34.5715751Z","session_start_time":null,"execution_start_time":"2024-11-04T20:08:35.2969409Z","execution_finish_time":"2024-11-04T20:08:39.4325786Z","parent_msg_id":"e0263fb0-aea8-4e02-896f-df63ace091c0"},"text/plain":"StatementMeta(, 3945a8d4-06c7-4a20-bac5-81538ccc6266, 3, Finished, Available, Finished)"},"metadata":{}}],"execution_count":2,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"edac2e41-e4ec-4a84-adad-d57938e17562"},{"cell_type":"markdown","source":["### Step 1: Ingest data\n","#### Load orders data from KQL database to prepare for ML modeling\n","\n","> [!IMPORTANT]\n","> Make sure you have enough data generated using data emulator."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"9fa68416-1c4d-4481-8ec2-c2571310afbf"},{"cell_type":"code","source":["# Read from Kusto\n","# kustoQuery = \"['orders'] | mv-expand li = parse_json(line_items) | project order_date, store_id, order_id, product_id = toint(li.product_id), quantity = toint(li.quantity), price = toreal(li.price), item_total = toreal(li.item_total), order_total\"\n","ordersQuery = \"['orders'] | mv-expand li = parse_json(line_items) | project order_date, store_id, order_id, product_id = toint(li.product_id), quantity = toint(li.quantity), price = toreal(li.price), item_total = toreal(li.item_total), order_total\"\n","inventoryQuery = \"['inventory'] | project date_time, store_id, product_id, in_stock, retail_price\"\n","productsQuery = \"['products'] | project product_id, name, category, photo_path, price_range, stock\"\n","# The query URI for reading the data e.g. https://<>.kusto.data.microsoft.com.\n","kustoUri = \"https://trd-g8jnmstet4k7q79z9v.z1.kusto.fabric.microsoft.com\"\n","# The database with data to be read.\n","database = \"contosohypermarket\"\n","# The access credentials.\n","accessToken = mssparkutils.credentials.getToken(kustoUri)\n","ordersDf = spark.read\\\n"," .format(\"com.microsoft.kusto.spark.synapse.datasource\")\\\n"," .option(\"accessToken\", accessToken)\\\n"," .option(\"kustoCluster\", kustoUri)\\\n"," .option(\"kustoDatabase\", database)\\\n"," .option(\"kustoQuery\", ordersQuery).load()\n","inventoryDf = spark.read\\\n"," .format(\"com.microsoft.kusto.spark.synapse.datasource\")\\\n"," .option(\"accessToken\", accessToken)\\\n"," .option(\"kustoCluster\", kustoUri)\\\n"," .option(\"kustoDatabase\", database)\\\n"," .option(\"kustoQuery\", inventoryQuery).load()\n","productsDf = spark.read\\\n"," .format(\"com.microsoft.kusto.spark.synapse.datasource\")\\\n"," .option(\"accessToken\", accessToken)\\\n"," .option(\"kustoCluster\", kustoUri)\\\n"," .option(\"kustoDatabase\", database)\\\n"," .option(\"kustoQuery\", productsQuery).load()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":5,"statement_ids":[5],"state":"finished","livy_statement_state":"available","session_id":"1aeb6edd-3450-4a72-a646-81cab3450974","normalized_state":"finished","queued_time":"2024-11-04T15:57:52.7175715Z","session_start_time":null,"execution_start_time":"2024-11-04T15:57:53.1854873Z","execution_finish_time":"2024-11-04T15:58:02.3738514Z","parent_msg_id":"01b395a9-39ce-49ef-bd5b-1d25ca30965d"},"text/plain":"StatementMeta(, 1aeb6edd-3450-4a72-a646-81cab3450974, 5, Finished, Available, Finished)"},"metadata":{}}],"execution_count":2,"metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"jupyter":{"source_hidden":false}},"id":"941a85a3-eaf6-4f2d-b862-2822a11cba86"},{"cell_type":"markdown","source":["#### Verifying token availability"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"e877707b-df48-40ca-9f95-27615082c0de"},{"cell_type":"code","source":["import requests\n","\n","# Define a simple test query\n","test_query = \"['inventory'] | take 1\"\n","\n","# Define the request headers with the access token\n","headers = {\n"," \"Authorization\": f\"Bearer {accessToken}\",\n"," \"Content-Type\": \"application/json\"\n","}\n","\n","# Define the request payload\n","payload = {\n"," \"db\": database,\n"," \"csl\": test_query\n","}\n","\n","# Make the request to the Kusto cluster\n","response = requests.post(f\"{kustoUri}/v1/rest/query\", headers=headers, json=payload)\n","\n","# Check if the request was successful\n","if response.status_code == 200:\n"," print(\"Access token is valid and has the necessary permissions.\")\n","else:\n"," print(f\"Failed to validate access token. Status code: {response.status_code}, Response: {response.text}\")"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":6,"statement_ids":[6],"state":"finished","livy_statement_state":"available","session_id":"1aeb6edd-3450-4a72-a646-81cab3450974","normalized_state":"finished","queued_time":"2024-11-04T15:58:09.2861621Z","session_start_time":null,"execution_start_time":"2024-11-04T15:58:09.6630073Z","execution_finish_time":"2024-11-04T15:58:10.7161928Z","parent_msg_id":"00ba4704-6677-43f0-81df-205cd8d56524"},"text/plain":"StatementMeta(, 1aeb6edd-3450-4a72-a646-81cab3450974, 6, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Access token is valid and has the necessary permissions.\n"]}],"execution_count":3,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"dca0ec6b-628f-4e91-9c60-5d7b1e78e0ed"},{"cell_type":"markdown","source":["### Step 2: Perform Exploratory Data Analysis"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"d3363923-eb3e-4c3a-928e-3f304fc85fd0"},{"cell_type":"markdown","source":["#### Import libraries\n","\n","Before any analysis, you need to import the required libraries."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"0b764c51-1738-49a5-a8cf-e340518e9d8a"},{"cell_type":"code","source":["# Importing required libraries\n","import warnings\n","import itertools\n","import numpy as np\n","import matplotlib.pyplot as plt\n","warnings.filterwarnings(\"ignore\")\n","plt.style.use('fivethirtyeight')\n","import pandas as pd\n","import statsmodels.api as sm\n","import matplotlib\n","matplotlib.rcParams['axes.labelsize'] = 14\n","matplotlib.rcParams['xtick.labelsize'] = 12\n","matplotlib.rcParams['ytick.labelsize'] = 12\n","matplotlib.rcParams['text.color'] = 'k'\n","from sklearn.metrics import mean_squared_error,mean_absolute_percentage_error"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":7,"statement_ids":[7],"state":"finished","livy_statement_state":"available","session_id":"1aeb6edd-3450-4a72-a646-81cab3450974","normalized_state":"finished","queued_time":"2024-11-04T15:59:02.4045828Z","session_start_time":null,"execution_start_time":"2024-11-04T15:59:02.8317392Z","execution_finish_time":"2024-11-04T15:59:10.0846956Z","parent_msg_id":"2207d7d8-0dfb-47d7-a8c8-f514e39ba2d2"},"text/plain":"StatementMeta(, 1aeb6edd-3450-4a72-a646-81cab3450974, 7, Finished, Available, Finished)"},"metadata":{}}],"execution_count":4,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"eece5426-68f6-4a0b-a478-2d4381322ac3"},{"cell_type":"markdown","source":["#### Display raw data"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"e48037a1-e1cb-4d33-9aa5-57faea8be1a2"},{"cell_type":"code","source":["# Display data in dataframes.\n","ordersDf.show()\n","productsDf.show()\n","inventoryDf.show()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":8,"statement_ids":[8],"state":"finished","livy_statement_state":"available","session_id":"1aeb6edd-3450-4a72-a646-81cab3450974","normalized_state":"finished","queued_time":"2024-11-04T15:59:16.8616111Z","session_start_time":null,"execution_start_time":"2024-11-04T15:59:17.2765554Z","execution_finish_time":"2024-11-04T15:59:58.8909583Z","parent_msg_id":"7c7b2b1b-596d-4377-bbd3-25919e0d1097"},"text/plain":"StatementMeta(, 1aeb6edd-3450-4a72-a646-81cab3450974, 8, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["+--------------------+--------+------------------+----------+--------+-----+------------------+------------------+\n| order_date|store_id| order_id|product_id|quantity|price| item_total| order_total|\n+--------------------+--------+------------------+----------+--------+-----+------------------+------------------+\n|2024-09-26 13:25:...| NYC|20240926132502-003| 12| 8| 3.0| 24.0| 60.95|\n|2024-09-26 13:25:...| NYC|20240926132502-003| 4| 10| 3.0| 30.0| 60.95|\n|2024-09-26 13:25:...| NYC|20240926132502-003| 9| 10| 0.2| 2.0| 60.95|\n|2024-09-26 13:25:...| NYC|20240926132502-003| 2| 3| 0.15| 0.45| 60.95|\n|2024-09-26 13:25:...| NYC|20240926132502-003| 8| 8| 0.5| 4.0| 60.95|\n|2024-09-26 13:25:...| NYC|20240926132502-003| 7| 2| 0.25| 0.5| 60.95|\n|2024-09-26 13:25:...| SEA|20240926132502-004| 9| 9| 0.2| 1.8| 32.2|\n|2024-09-26 13:25:...| SEA|20240926132502-004| 10| 3| 0.3|0.8999999999999999| 32.2|\n|2024-09-26 13:25:...| SEA|20240926132502-004| 12| 2| 3.0| 6.0| 32.2|\n|2024-09-26 13:25:...| SEA|20240926132502-004| 8| 7| 0.5| 3.5| 32.2|\n|2024-09-26 13:25:...| SEA|20240926132502-004| 5| 8| 2.5| 20.0| 32.2|\n|2024-09-26 13:25:...| SEA|20240926132502-005| 9| 9| 0.2| 1.8|51.099999999999994|\n|2024-09-26 13:25:...| SEA|20240926132502-005| 3| 8| 0.7| 5.6|51.099999999999994|\n|2024-09-26 13:25:...| SEA|20240926132502-005| 11| 4| 2.0| 8.0|51.099999999999994|\n|2024-09-26 13:25:...| SEA|20240926132502-005| 5| 9| 2.5| 22.5|51.099999999999994|\n|2024-09-26 13:25:...| SEA|20240926132502-005| 4| 2| 3.0| 6.0|51.099999999999994|\n|2024-09-26 13:25:...| SEA|20240926132502-005| 2| 6| 0.15|0.8999999999999999|51.099999999999994|\n|2024-09-26 13:25:...| SEA|20240926132502-005| 8| 9| 0.5| 4.5|51.099999999999994|\n|2024-09-26 13:25:...| SEA|20240926132502-005| 10| 6| 0.3|1.7999999999999998|51.099999999999994|\n|2024-09-26 13:25:...| CHI|20240926132502-006| 11| 5| 2.0| 10.0| 65.0|\n+--------------------+--------+------------------+----------+--------+-----+------------------+------------------+\nonly showing top 20 rows\n\n+----------+------------+----------+--------------------+--------------------+-----+\n|product_id| name| category| photo_path| price_range|stock|\n+----------+------------+----------+--------------------+--------------------+-----+\n| 1| Red Apple| Fruits|static/img/produc...|{\"min\":0.2,\"max\":...| 8000|\n| 2| Banana| Fruits|static/img/produc...|{\"min\":0.15,\"max\"...|10000|\n| 3| Avocado|Vegetables|static/img/produc...|{\"min\":0.7,\"max\":...| 5000|\n| 4| Bread| Bread|static/img/produc...|{\"min\":3.0,\"max\":...| 2000|\n| 5| Milk| Dairy|static/img/produc...|{\"min\":2.5,\"max\":...| 1000|\n| 6|Orange Juice| Beverages|static/img/produc...|{\"min\":3.25,\"max\"...| 1000|\n| 7| Chips| Snacks|static/img/produc...|{\"min\":0.25,\"max\"...| 5000|\n| 8| Red Pepper|Vegetables|static/img/produc...|{\"min\":0.5,\"max\":...| 1000|\n| 9| Lettuce|Vegetables|static/img/produc...|{\"min\":0.2,\"max\":...|10000|\n| 10| Tomato|Vegetables|static/img/produc...|{\"min\":0.3,\"max\":...|10000|\n| 11| Strawberry| Fruit|static/img/produc...|{\"min\":2.0,\"max\":...|10000|\n| 12| Eggs| Eggs|static/img/produc...|{\"min\":3.0,\"max\":...|10000|\n+----------+------------+----------+--------------------+--------------------+-----+\n\n+--------------------+--------+----------+--------+------------+\n| date_time|store_id|product_id|in_stock|retail_price|\n+--------------------+--------+----------+--------+------------+\n|2024-09-29 07:29:...| DAL| 3| 1834| 1.86|\n|2024-09-29 07:29:...| DAL| 2| 6580| 0.23|\n|2024-09-29 07:29:...| DAL| 1| 6899| 0.38|\n|2024-09-29 07:29:...| DAL| 9| 6936| 0.36|\n|2024-09-29 07:29:...| DAL| 8| 68| 0.98|\n|2024-09-29 07:29:...| DAL| 10| 5998| 0.47|\n|2024-09-29 07:29:...| DAL| 11| 6498| 3.5|\n|2024-09-29 07:29:...| DAL| 7| 1927| 0.72|\n|2024-09-29 07:29:...| DAL| 12| 7081| 3.09|\n|2024-09-29 07:29:...| DAL| 5| 574| 3.94|\n|2024-09-29 07:29:...| NYC| 2| 6615| 0.28|\n|2024-09-29 07:29:...| NYC| 7| 1719| 0.68|\n|2024-09-29 07:29:...| NYC| 12| 7218| 4.1|\n|2024-09-29 07:29:...| NYC| 11| 7019| 2.38|\n|2024-09-29 07:29:...| NYC| 6| 637| 4.44|\n|2024-09-29 07:29:...| NYC| 4| 643| 3.16|\n|2024-09-29 07:29:...| NYC| 10| 7033| 0.36|\n|2024-09-29 07:29:...| NYC| 5| 757| 3.11|\n|2024-09-29 07:29:...| NYC| 1| 7410| 0.25|\n|2024-09-29 07:29:...| NYC| 9| 6904| 0.32|\n+--------------------+--------+----------+--------+------------+\nonly showing top 20 rows\n"]}],"execution_count":5,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"1f672306-d3c7-4f1a-89f7-0851e8a90082"},{"cell_type":"markdown","source":["##### Demonstrate the impact order date on the sales for all sales in Chicago.\n","1. Filters sales data for the Chicago store.\n","2. Computes total sales per order by multiplying price and quantity.\n","3. Groups and sums daily sales data, then resamples it to monthly totals.\n","4. Converts data to Pandas and ensures order_date is in datetime format.\n","5. Plots the monthly sales trend over time, showing the impact of order date on sales in Chicago."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"54f2e3b3-4c12-4a3c-a6b3-44b4ca0cd519"},{"cell_type":"code","source":["import pandas as pd\n","import matplotlib.pyplot as plt\n","\n","# Filtering Chicago data\n","sales_chicago_df = ordersDf.filter(ordersDf.store_id == 'CHI')\n","\n","# Creating a 'sales' column by multiplying price and quantity\n","sales_chicago_df = sales_chicago_df.withColumn('sales', sales_chicago_df['price'] * sales_chicago_df['quantity'])\n","\n","# Selecting relevant columns: order_date, sales\n","sales_chicago_df = sales_chicago_df.select('order_date', 'sales')\n","\n","# Converting the DataFrame to Pandas\n","sales_chicago_pd_df = sales_chicago_df.toPandas()\n","\n","# Confirming that 'order_date' is in datetime format\n","sales_chicago_pd_df['order_date'] = pd.to_datetime(sales_chicago_pd_df['order_date'])\n","\n","# Group by 'order_date' and sum the sales\n","sales_chicago_pd_df = sales_chicago_pd_df.groupby('order_date')['sales'].sum().reset_index()\n","\n","# Resample the data to get monthly sales\n","sales_chicago_pd_df.set_index('order_date', inplace=True)\n","sales_chicago_monthly = sales_chicago_pd_df['sales'].resample('MS').sum().reset_index()\n","\n","# Plot sales over time\n","plt.figure(figsize=(12, 6))\n","plt.plot(sales_chicago_monthly['order_date'], sales_chicago_monthly['sales'], marker='o')\n","\n","# Adding labels and title\n","plt.xlabel('Order Date')\n","plt.ylabel('Total Sales')\n","plt.title('Impact of Order Date on Sales in Chicago')\n","\n","plt.show()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":9,"statement_ids":[9],"state":"finished","livy_statement_state":"available","session_id":"1aeb6edd-3450-4a72-a646-81cab3450974","normalized_state":"finished","queued_time":"2024-11-04T16:00:45.5593816Z","session_start_time":null,"execution_start_time":"2024-11-04T16:00:45.9707825Z","execution_finish_time":"2024-11-04T16:00:55.1084841Z","parent_msg_id":"07537c0d-3bf2-49e4-a350-205625e0c308"},"text/plain":"StatementMeta(, 1aeb6edd-3450-4a72-a646-81cab3450974, 9, Finished, Available, Finished)"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"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iIio0jxQ52DFZRV+js3AY62wjNL2ViIMay5FiK8MHlJxOY+wZmNgiIiIiIiIiIgq3PV0LRZHqfDLdTWyhS0QgqutBT7ylWF4cykcWHK+TDAwREREREREREQV5mxSNhYqlNgVp4HAivNoZC/GOH97DGxiBxtLJpQuSwwMEREREREREVG5MhgMOBSfhYWXlDj6IFtwv1Z1rBAql6FXA1uIWXK+XDAwRERERERERETlQqc3YNvtTCxSqKBIEV5yvpOHBKFyGV51Z8n58sbAEBERERERERGVKbVOjw3X1FgapUKcSljJeQsR0LuBLcbLZXjOmSXnKwoDQ0RERERERERUJlKz9IiIUSE8JgOPNMIySkvEwLtN7DDW3x7etRimqGg840RERERERET0TO6pdFgercKaWDUydMJSSteyFmFECylG+cjgZseS85WFgSEiIiIiIiIiKpUraVosUqjw6w01BMaD4G5ngdG+MgxtLkUta5acr2wMDBERERERERFRiZxMzMJChQp772oE92la2xJj/WUY0NgOEjETSlcVDAwRERERERERUbH0BgP239NgkUKFE4nCS863cbHCeLk9grxsYMEKY1UOA0NEREREREREVCit3oAtNzOxWKFETJpOcL8u9SQIbWmPDm7WLDlfhTEwRERERERERET5ZOYAK2MzER6bhnsZwkrOi0VA30a2GCe3h9zJqpxHSGWBgSEiIiIiIiIiMkrW5GC5Qo2IK7ZI16kF9bEVizC4mR3G+MnQ0J6hhuqEs0VEREREREREuKPSYWmUCuuuqpGZYwBQ/OVfDtYijPSRYZSvFM42LDlfHTEwRERERERERGTGolK0WKxQYuutTOQILDlfXyrGaD8ZhjSzg8yKJeerMwaGiIiIiIiIiMyMwWDAP4nZWHhJiQP3swT3a+FgifFye/TztoWVBRNK1wQMDBERERERERGZCb3BgD13NFikUOJ0klZwv5dcrTFeLkOgJ0vO1zQMDBERERERERHVcNk5Bmy6ocaSKBWupgsvOd+tnhU+bVUbL7lJynF0VJkYGCIiIiIiIiKqoZRaPVbHZmD5ZRUS1HpBfSxFQHADCd5yTEOnFnVgY8OgUE3GwBARERERERFRDfMwMwfh0SpEXMlAerawjNJSSxGGNLPDaD8ZXCx1uHs3tZxHSVUBA0NERERERERENcStxzosiVJh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Tp48WSNjDRgwQP7+/jXSFwAAuHzc6noCAAAAl0NpaakSExO1fPly+fr6qm/fvoqMjNTp06f1+eef65lnntGbb76pNWvWKDIysq6nW6N69eqlG2+8UZKUn5+vjIwMff311/roo480e/ZszZ07V3fccUfdThIAANQJEkMAAMApzJgxQ8uXL9e1116rt99+W02bNrU/V1ZWphdffFEvvfSShg0bpq1bt6pRo0Z1ONuadcstt2jy5MkOj5WVlWnVqlV68skn9cADD6hRo0bq06dPHc0QAADUFW4lAwAAV7yDBw/qtddeU0BAgN59912HpJAkubq66umnn9Zf/vIX/fLLL1qwYIHD87GxsYqNjVVubq6eeOIJRUdHq0mTJlq1apW9zcqVK9WtWzeFhoYqOjpa06ZNO++taXl5eZo1a5ZuvPFGhYWFKSIiQnfeeae+/vrrSm0rbtMqKirSCy+8oGuuuUZBQUGaPXv2Rb8mrq6uuvfee/XKK6+orKxMzzzzjGw2m/35n3/+WdOmTdPNN9+sVq1aKTQ0VF26dNFzzz0ni8Xi0Je/v7927txp//8Vf+Lj4x3a7d27V/fff7/at2+v4OBgxcTE6PHHH1dOTs5FrwMAAFwarhgCAABXvNWrV6u8vFxjx45VSEjIOds9/vjjWrt2rVatWqVnnnnG4bni4mINGjRIFotFt956q9zd3e19vfTSS5o1a5ZCQkJ07733yt3dXR988IH2799f5TgnT57U7bffrtTUVHXr1k19+vTR6dOn9e9//1txcXFavny5Bg4cWOm4e+65R3v37lWfPn0UEBCgli1bXvyL8n9GjBih2bNnKzU1VSkpKYqOjpYkbdy4UW+99ZZ69uypHj16qLy8XLt379bcuXO1c+dO/fvf/5a7u7sk6cknn9Tq1auVnp6uJ5980t53bGys/f//+9//1n333SdXV1fddtttatasmfbv36+lS5fq888/12effcYeRQAA1AESQwAA4Iq3a9cuSWf22jmfdu3aKTw8XBkZGTpy5Iiuuuoq+3OZmZmKjo7Wxx9/LG9vb/vjv/zyi1566SU1bdpU27ZtU3BwsCRp6tSp+tOf/lTlOE888YRSU1O1cOFCjR492v748ePH1adPHyUkJKhv377y8vJyOO7YsWPauXOnAgICqvcCnIeLi4u6deum3377Td999509MTRixAg9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"},"metadata":{}}],"execution_count":6,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"82b2d558-6189-4236-86d0-dd1fcb70a487"},{"cell_type":"markdown","source":["### Step 3: Statistical Analysis\n","1. Simulates Sales Data: Generates 36 months of random sales data to simulate monthly sales values.\n","2. Decomposes Time Series: Uses seasonal_decompose from statsmodels to break down the sales data into trend, seasonality, and residual components.\n"," - Trend: Shows the long-term movement in sales, whether increasing, decreasing, or stable.\n"," - Seasonality: Reveals recurring patterns or cycles within specific time intervals (like monthly or yearly).\n"," - Residual (Noise): Represents random fluctuations in the data that cannot be explained by trend or seasonality.\n","3. Organizes Data for Plotting: Prepares labels and corresponding data for the time series components.\n","4. Plots Components: Creates subplots to visualize seasonality, trend, residuals, and observed sales data, making it easier to analyze patterns in the simulated data."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"2012132c-890d-4803-b1ab-aac47bccb7f8"},{"cell_type":"code","source":["import statsmodels.api as sm"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":11,"statement_ids":[11],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:11:09.3863545Z","session_start_time":null,"execution_start_time":"2024-11-02T23:11:09.9853625Z","execution_finish_time":"2024-11-02T23:11:10.3651072Z","parent_msg_id":"3eafa0af-e142-40f7-8fc5-00a8404b59a4"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 11, Finished, Available, Finished)"},"metadata":{}}],"execution_count":9,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"e1188c21-b4d9-4b45-91ee-8fe49ba78162"},{"cell_type":"code","source":["import pandas as pd\n","import numpy as np\n","\n","# Simulate additional monthly sales data for testing\n","dates = pd.date_range(start='2023-01-01', periods=36, freq='MS') # Extended to 36 months for more data\n","np.random.seed(42) # For reproducibility\n","sales = np.random.rand(36) * 100 # Random sales data\n","\n","# Create a DataFrame with the simulated data\n","simulated_sales_df = pd.DataFrame({'order_date': dates, 'sales': sales})\n","\n","# Decompose the time series into its components using statsmodels\n","import statsmodels.api as sm\n","result = sm.tsa.seasonal_decompose(simulated_sales_df['sales'], model='additive', period=12)\n","\n","# Labels and corresponding data for plotting\n","components = [('Seasonality', result.seasonal),\n"," ('Trend', result.trend),\n"," ('Residual', result.resid),\n"," ('Observed Data', simulated_sales_df['sales'])]\n","\n","# Create subplots in a grid\n","import matplotlib.pyplot as plt\n","fig, axes = plt.subplots(nrows=4, ncols=1, figsize=(12, 7))\n","plt.subplots_adjust(hspace=0.8) # Adjust vertical space\n","axes = axes.ravel()\n","\n","# Plot the components\n","for ax, (label, data) in zip(axes, components):\n"," ax.plot(data, label=label, color='blue' if label != 'Observed Data' else 'purple')\n"," ax.set_xlabel('Time')\n"," ax.set_ylabel(label)\n"," ax.set_xlabel('Time', fontsize=10)\n"," ax.set_ylabel(label, fontsize=10)\n"," ax.legend(fontsize=10)\n","\n","plt.show()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":12,"statement_ids":[12],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:11:16.0894261Z","session_start_time":null,"execution_start_time":"2024-11-02T23:11:16.6780856Z","execution_finish_time":"2024-11-02T23:11:17.8287048Z","parent_msg_id":"87050ac5-3ebb-4738-ba9a-e82d9101e432"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 12, Finished, Available, Finished)"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"iVBORw0KGgoAAAANSUhEUgAABGgAAAJ1CAYAAACFEsZPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzddXhTVx8H8O+NNVKqFC8UlxanwwrDZViR4e7OcBk+BsUmwGADBi8DhnfD3SkyYDgDhhcrhVIq8dz7/pG1UHLTpm0a/X2epw+QhPY0uXLO9xgTHx/PgRBCCCGEEEIIIYTYjcDeBSCEEEIIIYQQQghxdxTQEEIIIYQQQgghhNgZBTSEEEIIIYQQQgghdkYBDSGEEEIIIYQQQoidUUBDCCGEEEIIIYQQYmcU0BBCCCGEEEIIIYTYGQU0hBBCCCGEEEIIIXZGAQ0hhBBCCCGEEEKInVFAQwghhBBCCCGEEGJnThnQnDx5EsOGDUNoaCgKFCiAsmXLokuXLrh69Wqa1w0ZMgQ+Pj4mX6GhofYpOCGEEEIIIYQQQggPkb0LkBVr1qxBXFwcBg8ejNKlS+Pt27dYtmwZGjVqhB07duDzzz9Pfa1MJsOuXbvS/H+pVGrrIhNCCCGEEEIIIYSYxcTHx3P2LkRmxcbGIiAgIM1jSUlJqFKlCsqWLYudO3cCMI6g2bVrF54/f26PYhJCCCGEEEIIIYRYxCmnOH0azgCAp6cnSpcuTWEMIYQQQgghhBBCnI5TBjR83r9/j2vXrqFMmTJpHlepVChVqhT8/PxQrlw5jB8/Hu/evbNTKQkhhBBCCCGEEEJMOeUaNHzGjx8PpVKJcePGpT4WEhKCkJAQlCtXDgAQFRWF5cuX4+TJkzh27Bg8PT0z/L6PHz8Gy7I5Vm5CCHEXr1+L0bdvGWg05vsGGIZDoUIalCih+u9LiRIlVPDyouswIcT1zJoVhDNnvNN9jZeXHiVLGq+HxYurULKkCgUKaCFwmW5WQggxevNGBC8vPSQSe5ckawQCAYKCgrL1PZxyDZpPzZkzB4sWLcKCBQswcODAdF+7c+dO9OrVC99++y2GDRuW4fdWq9XWKqZNaLVaxMTEIG/evJA465FNcgwdH8QcWxwbixcrsHBhxsE4n8BAA8qX16F8eT3Kl9ehQgU98uSh0MZW6NpBzKFjI+tevRKgcuXc4Dgm0//X05NFSIg+zXWxZEkDRA7W9UrHB0kPHR/kU717eyMqSoLGjVWoU+cFWrWSwtPTuY6N7G5I5GCX8cyLiIjAokWLMG3atAzDGQBo1aoVFAoFLl26ZNH3d9YdnyQSidOWneQ8Oj6IOTl5bOzZI8vy/42OFiI6Woh9+z48ljcvi4oVDahQwZD6Z+HCHJjMt3WIhejaQcyhYyPzDh6UZCmcAYCkJAHOn5fg/PkPDReplENwsPF6aLwmsihb1gBH+Fjo+CDpoeODAEBCAnDsmAe0WgaRkQpERpbEzJksBg3SYsoUjb2LZzNOHdBEREQgIiICkyZNwtixYy3+fxzHQUDjQgkhxGb++UeAf/4RWvV7xsQIcOiQAIcOiVMf8/FhUbFi2uCmeHGWpgIQQhzOn3+KM35RJqjVDC5fFuHy5Q/Ve5GIQ5kyaa+JISEGWDDLnxBCbGr/fjG02rSh9fv37leBc9qAZsGCBYiIiMC4ceMwadIki//fzp07oVQqUa1atRwsnf0lJzMQCgGxde/9hBCSJeYaIvnysYiJYbLci/yp+HgBTp4U4OTJD7c3T08OX3yhw6RJGhQrRtOiCCH29+IFg3PnTKvhXl4cDAZjPc4a9HoGN28KcfOmEBs3Gh9jGA4VKrD46isNwsN1NOqQEOIQ/viDv67Ytq3OxiWxrywFNC1atED37t0RHh4OmSzrQ9azaunSpZg7dy4aNWqEpk2b4uLFi2meDw0NxdOnTzFgwAC0a9cOxYoVA8MwiIqKwooVK1C2bFn07NnT5uW2Fb0e6N/fGywrxLp1yfDxsXeJCCHujOP4AxoPDw5//ZUIhgFu3hTi2jUhrl83/nnnjgAGg3VaDUlJDLZuleDAATHWrVOifn29Vb4vIYRk1c6d/A2RKVPUGDBAiwcPBGmuideuCfH+vXWuiRzH4No1Ifr0keP0aQ3mz1dThx4hxK7i44Fjx0yjiVKl9Chb1r0617IU0FSqVAkzZszAxIkTER4ejh49eiA0NNTaZTPrwIEDAIAjR47gyJEjJs/Hx8fDy8sLAQEB+OmnnxAbGwuDwYDAwEAMGjQIY8aMgUKhsFl5be3HHwNx/LgHAKBRI09s3qxEiRLudWATQhzH7dsC3L1rOr2pYUM9vLyMf69Z04CaNQ2pz6nVwO3bQly/LkhtnNy6JYRGk/UGSkICgw4d5Jg/X43+/bVZ/j6EEJJdfD3FDMOhdWsdhEKgVCkWpUqx+PJLY88xxwFPnjC4fj1taPP6dfaG/69Z44EHD6hDjxBiX/v2mU5vAoA2bZxrwx5ryPIuTgaDAQcOHMDGjRtx+PBhFCtWDN27d0enTp2QJ08ea5eTWGjlSgYTJnileczHh8W6dUp8/rnBzP8i7kKtViM6OhqBgYG0GBtJIyePjTlzPLBoken3XLVKmdr4sIROB9y79yGwuX5diBs3hEhKynxoM2CABvPmqR1uxxNHRdcOYg4dG5kXHc2gfHkvk8dr1tRj//7kTH2vV6+Y1GtiynUxOjrzoU2JEgZs2aJE8eLW7dCj44Okh44PkqJjR3maNQVTnDr1BhUquNcQP6tss/3mzRusXbsWixcvhsFgQOPGjTFo0CB8/vnn1igjsdDJk0K0a6fgnRYgEnFYuFCNPn2o19id0Y0w6zQa4PJlIa5cEYJhgA4ddMiTJ9uXT4eRU8cGxwGhoZ64fz/tCBoPDw737ycgV67sfX+WBR4+/Di0Mf793buMGygNGuiwZo2Seo0tQNcO8imOAx49EuDECRaPHyegbl0FGjWy7kLgrmrZMgmmTjVdImDBAhUGDsx+PS0ujkm9FqaMtvn0GswnJzr06NpB0uNqx0dCAnD+vAh37wqQKxeHjh11kMvtXSrHFx8PlCjhBb0+bRu2RAklzpxJdIljIzOy3Xd4+fJlbNy4Edu3b0fu3LnRtWtXxMTEoEuXLujbty/mzJljjXISC3h7c8iTh8XLl6Y3Yb2ewejRMty9K8CcOdRrTEhG1GpjIHPmjAhnzohw8aIQavWHG0dEhBRr1ijRqBGtZ5KemzcFvA2Dxo312Q5nAEAgAEqUYFGiBIv27T9MBYiONk4F2LpVgl27+Htejh0To0kT4zRQWjyYkPRxnDEMjYr6cF188SIlCPXGkiVA9+5a/PijCkLKadLFtyZXyvQma/Dz41CvngH16n0IWhITjWt9XbggxIIFUiiVpp158fECtG+vwKJFKvTu7V6LchKSFe/fGwOZM2dEiIoS4upVIVj2w7m1eDGLyMhklCxJdYz07NkjNglnAKBRo3dw4j2NsixLv3FsbCw2b96M33//HQ8ePECzZs2wZs0aNGzYEMx/S8G3bdsW3bp1o4DGhipVYrF/fxy6dJHjn3/419j5+WcPPHggwOrVSnh727iAhDgwtRq4dCltIJPeeicJCQy6dZNj40YKadJjbvemdu1yrvLPMEDhwhwKF9ajRQs9Fi3ywLff8ve+3LsnRMOGCqxfr0RYGE0DJSQFxwEPHqQNZF6+TH9k2oYNEmi1wIoVFNKY8+QJg0uXTKvftWsbkC9fzo3KzJXrw1pf9evr0aWL4qOA7QO9nsFXX8lx546GOvQI+cT798C5cx8CmWvX0gYyn4qOFqBlSwX27KGQJj3m6ooNG8YBcL+lU7J02S1XrhyKFi2K7t27o2vXrsidO7fJa6pUqYLKlStnu4Akc/LlY7Fy5V0sXFgOu3bxN0gOHxajaVNPbN6cjKAg15miQUhmqFTAxYtCREUZb7SXLmV+AVqNhkKa9HAc/0KYMhmHJk1s0zvLMMD48RqUKmXA4MFyqFSmn/G7dwKEhyvw3Xcq9OxJvcbEPXEccP++ILXhceaMCK9eZX4tk61bJQAopDHH3Ig+W24jW7Eii2PHktC1qxx//83fFKAOPUKMU28+DmSuX08/kOETE0MhTXri4hicOGF6HQoO1iEoSGOHEtlflgKanTt3olatWum+xsvLC3v27MlSoUj2SKUsfvnlPcqWBebP5w9p7twRomFDT6xfr0StWtRrTFyfSgX89VfaQIZvtfjMopDGvGvXBHj40LSF1qSJHp6eti1LmzZ6FC6cjK5d5byjAPR6BiNHynHvngazZqmpYUlcHscB//6bNpCJicnejkApKKQxLzLSNKARCDi0amXbcDhfPg579yZj6FAZ/vhDwvsa6tAj7iY+Hjh7VpQ6avDGDQE4Lvt1RQppzNuzR8Q7vckdd29KkaWAZt68eVi/fj18PllZMSEhAd26dcPu3butUTaSDQwDTJ6sQalSLIYOlfGODHj7VoA2bRT44QcVunWjXmPiWpRK4wiZ06dFiIoS4fJl6wQyfCik4WduyGrbtvZZrLxyZQOOHk1Cly4KXLvG32pctswD//5r7DW2xho5hDgKjjPugmZseBjD6uxu0ZweCmlMPX7M4MoV06p3WJjBLovOy2TAmjUqlCrFUocecUvv3jE4e/bDNM6bN60TyPBJCWl2705GqVIU0qTgG2kNAK1auefoGSCLAU1UVBR0OtMGvUajwblz57JdKGI97dvrUKQIi65d5bwVMZ2OwbBhxl7j6dOp15g4L6XSOELG2BtsHCGj01nnJiuTcfjsMwPCwvR48ECAzZtNexsppEnLOL3J9H2Syzk0bmy/96dAAQ779ydh8GC52akGBw8ae403bUpGkSLUa0ycE8cBd++mDWRiY60XyJQubbwmFimixbffyqHRmFYgtm6VgOOAn3+mkAZIL7S2XyfZxx16w4bJ0iyGn4I69IirePeOSbOu1q1b1gtkfHxY1KplvC7u3i3GuXOmzeyYGAFataKQJsWbNwxOnTJ9nypWNKBoUQOio+1QKAeQqYDm5s2bAACO43Dnzh3ExMSkPmcwGHD06FHkz5/fuiUk2VatmgHHjiWhc2cFbt7kryH9+KMH7t0TYNUqpc2nHhCSHbt3i7B8uYfVA5nq1fUICzPeaKtUMUDyX9bAsoBEAvz2G4U06bl6VYgnT0wbg82a6aDgX8PcZuRy4H//U2LuXA8sWsTfa3z7trHXeONGJapXp15j4jyePGGwcKEUBw6I8OaN9QKZMmWM18OwMD1q1fow4kOtViNPnhcYPboU7xpP27YZr5UU0vCH1kKh7ac38Unp0OvWTc471e3jDr0ZM9QQ5NzgK0KsSq8Hfv1Vgt9+k+DWLetdhHx9WdSubUDt2sbrYnAwm3pe9OypxZdfKiikycCePSIYDKb3DXuNtHYUmQpo6tSpA4ZhwDAMWrdubfK8TCbD/PnzrVY4Yj2FCnE4cCAJgwbJsXcvfw/O/v1iNGtm7DUODKReY+L4duwQo18/eba/j1yeNpCpXPlDIPMpgQD44QcVAApp0mNuyGp4uP0bIoDxc5w61dhrPGIE/zTQN2+MlaglS1To3Nkxyk1Iet69Y9CypSeio7Pfei5X7kPDo1YtAwICzNcLqlZNxIYN79C9uy+FNGY8fCjgnVpZt64euXM7Rp2rWrUP00Bv3DDfoffvvwKsXEkdesQ5zJ4txZIlHtn+Pn5+aQOZcuVYs0GlpyewbVsyhTQZMLf+laPUFe0lUwHNtWvXwHEcKlWqhGPHjsHf3z/1OYlEgoCAAAjd9c7rBDw9gfXrlfjmGw98/z1/r/HNmx96jUNDqdeYOC6VCvj6a/7jOCMKRdpAplIl84EMH0tCmq5djSGNPafz2Iu53ZsUCvtOb+LTsaMOQUHGXmO+6R9aLYPBg+W4d0+NqVM11GtMHNqSJZIshzPlyhmvh7Vr61G7tiHToUHt2jps3ZqMjh0V6YY0K1ao3HLrZnOhtT2nN/EpVMg4DTS9Dr19+6hDjziHBw8E+OmnTFTwPuLvbwxkUq6LZcuaD2T4UEiTvtevGZw+bZobVKmiR1AQB7X7rhGcuYCmcOHCAIB3797lSGFIzhMIgBkzNChZksWoUTLeKSGvXxsXsVq2TIUvv3SsigMhKdaulVi8BaxCwaFmTX3qjbZSJQPE/PVOi6WENAwDrFtnevPXaj+MpHG0UCKnXb4s5G0kNm+ug0xmhwJl4LPPjL3GnTsrcPs2fyfDd99Jce+eEL/8orT7FC1C+MTGMli50vJe4uDgtIGMv3/2G9p16hiwdWsyOnVSQKmkkOZjfAGNSMShZUvHuz9Qhx5xFQsWePBOoeHj78+mdtyFhelRunTmAhk+loQ0Kbs7uVtIs3u3mHfLckcLre3B4tvjvn370LhxY4jFYuzbty/d137xxRfZLhjJWV276lC0KIvu3eV4+9b06qPRMBgwwNhrPHky9RoTx5KcDHz/vfmGiKdnSiBjHCVTsWL2Axk+AgHw/ffGkTQU0nzg6NOb+BQuzOHgwSQMGCDHgQP85d+zR4zmzY29xgULUq8xcSxLlnggOZm/IcIwHIKD2TSBjJ9fzhzDdeoYsGULhTQf+/dfAe8agPXq6XPsc8iulA69UqWMHXp8uyCmdOj99JMKHTo47vWduKd79wTYts185S93bva/MMaQGsgwObCBU0YhTcp55G4hjbm6Yps2dC2x+NbYrVs33Lt3DwEBAejWrZvZ1zEMg7i4OKsUjuSsmjU/zDX+5x/+XuOFC429xitWKCHP/lIfhFjFmjUS3ukoFSsa8N13KlSsaLBZxd/SkGbDBiWaNHH9kIZlgZ07TW+6uXJxDr8mT65cwMaNSsyaZX6++vXrQjRo4IlNm5SoUoV6jYljiIlhsHo1/zD+n39WomlTPXx9bRcEWBLSpOzu5A4hjbndmxw5tE7RpYtxGmh6HXr9+8tx9y516BHHsmCBB+8IjTZtdJgyRY1SpXImkOFjaUize3cySpd2/ZAmJsa4m9anqlXTo3Bhxwytbcniy+i7d+8QEBCQ+ndzXxTOOJegIGOvcZMm5isJO3eK8cUXCrx4YaOrGCHpSEoyLlLIZ8YMNapWtV04kyIlpOnVi3/Vea2WQffuchw65PotkUuXhHj2jH96kzRrSwbZlFAIzJ6txtKlSojF/JWEmBgBvvhCYbb3hxBb+/FHD951X1q10qFzZ51Nw5kUKSGNXM7/s7dvl2DwYBn0jp3bWgXftUIs5tCypeMHNMCHDr2yZc2H0gsXStG3rwxKpQ0LRogZd+4IsGOH6XknkXCYO1eVY6Nl0pMS0tSsyX/Re/3auCbN3buun3Lu2iXm3d7cGUJrW3D9I4BkyMsL2LRJiaFDNWZfc/WqCA0beuLqVTpkiH2tXi3h3Tq2Rg096te3X00/JaTp3Zv/PHKXkCYy0jkWwsxIjx46/PlnMvz8+Huy1GoGffrIERHhAY46e4gdvXzJYM0a/tEzkybZd5XFlDVp3DmkuXtXwLu2Vf36evj42L48WWVJh96ff0rQooUCL19Shx6xr/nzPXgDgN69tXadopwS0tSq5d4hjbm6IgU0Rha3FH7++WeLv+ngwYOzVBhiP0IhMHeuGqVLGzB2rAx6velF7eVLAZo398TPPyvRpo0L16aIw0pIMD96ZvJktc17Qz4lEADffWdsEP3vf6blTAlpXHW6k7npTV5eHBo0cL7ft3ZtA44eTUbnznLcvcs/DTQiQop//xVg2TKVQy6ATFzf9997QK3mW2hRi+Bg+w+VDwszpO7uxDfdafv2D1twu+J0J2dck8uclA69adOkWL6c/1585Yrov2mgyahUyf7HH3E/t24JeLdvlko5jB5tvjPaVjw9kXpNPHuWf7pTyu5Orjjd6cULBufPm9apqlfXo1Ah6vECMhHQLF++3KLXMQxDAY0T69XLuHhwz55yxMebprcqFYNevRSYOlWNsWM1dm8QE/eycqUH3r0zPS5r19ajbl3HWA/E0pBm/XrjuhCu5MIFIV6+NP18vvhCBw/LN5dxKEWLsjh0KAl9+8px9Ch/Q2vHDgkePxZg40Yl8uWjygWxnefPGfzvf6YNEYbhMHGi/RsiKSwJaTgO+OUX1wtp+NafkUg4fPGF8wU0QOY79Jo2tUMhiVuLiOCfT923rxb58zvGPdrSkGbXrmSUKeNaIQ1Nb8qYxeOnrl+/btHXtWvXcrK8xAbq1jX2GpcoYb7BO2eOFIMGydx6j3piW+/fA0uXOu7omY+lhDTpTXfq0UOOgwddqyVirqfY2aY3fcrbG9iyRYlBg8w3eC9fNk4DvXbNtYclE8fy/fcevLvrtG+vc7hKfUpIY266044dEgwa5FrTnf75R4A7d0x7ihs0cK7pTXx69dIhMjIZPj78x1lKh94PPyhoGiixmevXBdi927QuIpNx+OorxwmtgQ8hTXrTnVq3VuDOHdeqV5hbNJ12b/rAtT5xYjXFi7M4ciQJ9eqZP1m2bpWgVSsFXr92oJYxcVk//+yB9+9Nj7W6dY1bJDoadwtpDAZjr8invL05u64NZC0iETB/vhrffaeCUMjf2nj+3NhrvGePa3ymxLFFRzO8O8cJBBwmTHCshkgKdwtpXDW0TmFJh15EhCemTy9KHXrEJsyNnunfX4s8eRwvKXS3kOb5cwbnz5vWkWrW1KNAAcf7fOwly5/28+fPsXr1asycORNTpkxJ80Vcg48PsG2bEv37m6/oXbxonGv8+DGFNCTnxMcDP/1kfvSMo0oJafr0cf2Q5vx5IV69Mr2ltGypg4R//VKn1LevFjt2JMPbm78ioVQaP9OVK13olyYOafFiD+h0pvfeL7/UoVQpxxo98zF3CWk4jr+n2MODQ/PmrhHQAJZ16B044I8vv/RFUpINC0bcztWrAuzbZ3rOKRQcRo1yzNAacK+Qhm+dQsB1QmtrydInffLkSYSGhuLXX3/FsmXLcPr0aWzcuBEbNmzAjRs3rF1GYkdiMbBokRoLFqggEPBXpp49E6BnTwUMjjeIgbiIn37yQEKCaUOkQQMdatZ07ANPIAAWL844pDlwwLlDGlfvKf5YvXoGHDmShOLF+Y89jmMwcaIUFy7wLyxMSHY9fsxgwwbTEFAodNzRMx8LCzNg2zbXDmlu3RLg3j3Ta0DDhnp4edmhQDnIsg49CSZMoJXUSc6ZN49/9MzAgRrkzu3YozMs3d3J2UMavroiw3Bo3dr16orZkaVPedasWRg2bBjOnTsHqVSK9evX49atW6hduzbCw8OtXETiCAYO1GL7diW8vPgvcNevC81u80lIdrx7x+Dnn82NnnH8hghgWUjTs6fzhjQGA3+viI8Pi88/d+IWVjpKlmRx5Egy6tTh//04jsG4cc7dwCSOa/FiKe/irJ066VC8uOOOnvlY7doZhzQDBzrvOWRunYV27VyzIWJJh97vv0t4d28hJLsuXxbi4EHTc87Tk8OIEVo7lCjzFIr0Q5rYWOcOaZ4+ZXDxomk9t1YtA22w8IksfcL37t1D165dAQBCoRAqlQqenp6YMmUKfvjhB2uWjziQBg30OHw4CUFB/L3G33wjRWwsTXUi1rVsmQSJiabHVePGOoSGOvbomY+5ckgTFSVEbKzp7aRVKz3E/G0Ul+DryyEyMtnsOkM3blBwTazv0SMBfv/d9MQyjp5x3CmffDIKaSIjnTOk4Tj+nmKplEPTpq4Z0KTIqEOPgmuSE+bN4+/IGzxYAz8/52n8u3JIQ9ObLJelT1cul0OjMVZI8+fPj0ePHqU+FxcXZ52SEYdUujSLY8f4F4RLSGAwYwb/8EJCsuLtW+cfPfOxlJCmb1/XCmncraf4Y2Ix8P33aowdy98wnjNHSgupE6tasMADBoPpMdWtmw5BQc7TEEmREtIoFK4T0ty4IcCDB6YjRRo31iNXLjsUyMYaNNDj0KEk3s/05k0hfv2VgmtiPRcuCHHkiGk9xMuLw7BhzjF65mMpIU3t2q4V0vDVFQUCmt7EJ0ufbLVq1XDhwgUAQJMmTTB16lQsWrQIw4cPR7Vq1axaQOJ4/Pw4LFqk4n2Ohq8Sa1qyxAPJyaYNkWbNdKhSxXlGz3xMIDAOA08vpHGmNWn0ev7dm/z8WLPTf1wNwwATJ2pQqhQF1yRn3b8vwJYtpuebWMyZDQmdQe3axoWDXSWkMRdau1NPcZkyLCZO5D8mv/2WgmtiPeZGzwwZooGvr/OF1oAxpNm6NeOQ5p9/nCOkefKEweXLpvXasDCDQ+6uZW9Z+lTnzp2LqlWrAgAmTZqE+vXrIzIyEoGBgVi6dKlVC0gcU716BrRty59K0/BVyyUmApcuCfH2LVVUPhUby2DVKv5etkmTnLchAmQc0uh0zhPSnDkjxJs3preS1q11EDl+8a1GIgEWLuQPrjdtkuDcOQquLcGywD//CHDnjgCscyylYlMLFniAZU3vF927a1GkiHNXci0JaQYMcPz6BccBkZGmAY1MxqFJE/cJaABg8GAtSpY0/cASEhhMn07BtaXevGFw6ZKQdsHicfasECdO8I+eGTLE+UZaf8ySkKZ1a+cIaSi0zpwsfaJBQUEICQkBYJzutHjxYpw9exYbNmxA4cKFrVpA4rjmzFGbHb66ejUNX03P7dsCjBghQ4kSXmjUyBNlyuTCsmX0nn3sxx89oFSaNkRatNChUiXnb7m5Skjzxx/8x6073nQ//9yAdu0ouM6KxERgxQoJqlTxRM2auVCjRi60bq2g8Pojd+8KsH27aSVXIuEwZoxzN0RSZBTS/PGH44c0164J8PixaSDbtKkOnp52KJAdSSTAvHkJvM9t3izB2bMUXJvDccCpU0J07ixHyZK50KiRJ0JCcmH/fseuE9iauZ2bhg/XwMfHtmXJCa4S0vCtySUQcGjVyv3qipbI1qep1Wrx/PlzREdHp/lyJElJSZg0aRLKlCmDvHnzIiwsDDt27LB3sVxCwYKc2eGrc+dKERNDFeuPsSxw6JAI4eFy1KqVC+vXS6DRGN8jnY7B1KkyLFlCIQ0AvHrFmA35nH30zMdSQpp+/ZwzpNHpgN27TcuWOzeL2rWdcwpadpkLrm/dEpodEebOnjxhMGWKFMHBXpg8WZamYXvmjAjt2inw/r0dC+hAzI2e6dVLi8BA5x4987GM1qRx9JCGQuu0wsJ0aNLkLe9z48bJoHPPt8UsjQbYuFGMOnU80bq1Jw4cEIPjjOd9fLwAPXrIceiQY9YJbO30aSFOnzZ9L3x8WAwe7BqhNfAhpAkLc86Q5tEjAa5eNf2c6tbVO/z25/aSpU/y/v37aN68OfLly4fy5cujYsWKqFixIipUqICKFStau4zZ0qNHD2zatAkTJ07Etm3bUKVKFfTr1w/btm2zd9FcwuDBWpQuzb/uAg1fNUpOBn79VYLq1T3RsaOCdyhmiunTZTT6CMAPP3hArTZtiLRpo0P58s4/euZjAgGwcGHGIc3Jk47X03j6tAhxcaa3kTZt3Gt608cKFODMhojz5knx6hUF1xwHnDsnRM+eclSunAvLl3sgIYH/fbl2TYiOHRVITrZxIR3MP/8IeKfNeHhwGD3adRoiKWrVyjikGTZMBs7B6vbmdm+Syzk0buygiZINjBr1DAqF6b379m0KrlPExjKIiPBASEguDBsmx82b/Pd8vd64mcDp045XJ7AljjM/embkSC28vGxcoBymUABbtmQc0jx54nh1DJrelHlZCmiGDRsGhmGwZcsWnDhxAidPnsTJkydx6tQpnDx50tplzLJDhw7h+PHjWLx4Mfr06YO6detiyZIlqF+/PqZPnw6DwT17eK0pvXUXtmyRICrKfW8gz58zmDXLA8HBuTB2rAz//mvZezFunAybNrnw3sQZePGCwdq1phU2hjE/YsvZWRLSDBsmd7j553wNEQAID3fvm+7gwVqUKUPB9ad0OmDbNjEaNFCgeXNP7Nol5h0R8qkLF0To2lUBtWue/haZP98jtRf9Y717a1GggIOlFFaSUUizZYsEu3Y5VhJ85YoQT5+aVq2bNdNBLrdDgRxEnjw6jB/Pn7K6e3B965YAw4fLEBKSCxERUsTGZtw0U6sZdO6swMWL7lvHPnVKiLNnTc9/Pz8WAwa4XmgNWBbSjBrleME1X11RKOTQqpX7htYZyVJAc+PGDfzwww9o3LgxKlSogPLly6f5chR79uyBp6cnwsPD0zzerVs3vHz5EpcuXbJPwVxM3boGdOjAv+7C+PHuN3z18mUh+veXoWLFXPj+eyni4zN/mg0bJsPOnY5V8bSV77/3SJ369bG2bXUoV861Rs98LKOQ5tkzAebPd5zGvVbLP70pTx4WtWq5d/gtFpsPrrdudb/gOi6OwXffeaBChVwYMECOK1cyf207eVKE3r3lbnc/AYCbNwX480/T0Foqdc3RMx/LKKSZNEmGBP4lTuyCb5QTQKE1APTrp0TZsqb3hsRE9wuuWRY4cECENm0UqF07FzZskPDWe9KTnMygQwcFrl93zGktOYnjjEsp8Bk1SuPSW9lnFNKcOCHGjh2O08n74IEA16+b1nnq1dPDz8/BkiQHkqUWYOnSpfH2Lf98Ukfyzz//oFSpUhB9MtY+ODg49fnq1aun+z3UTtZlp9Vq0/xpK1OnarF/vz+Sk9PeKG7fFmLFCgEGDlTatDy2ptcD+/d7YOVKOS5etHy4rlTK8U7lYVkG/fvLIRLFo2FD632W9jo+LPX8uQDr1pmOS2UYDl99lQC12vUb/t98o4Zenwvr1pl2ty5fLkF4eBKCg63f65DZY+PoUQlv+NiihRo6ndotG9IfCw0F2rUTIjJSZvLc2LEeOHw4DmLHqUNlKCvXjn//FWLVKjm2bZNBpbK88SGTcbyvP3BAjAEDPPDTT+8hdKOMa+5cb97He/VSwsdHZfeRRTl9X6lSBdi4UYuuXX2gVKa95rx8KcDs2WLMmZOYIz87M4zTm0xXAVYoWNSpk2T3z8leUo4LjtPi22/fo107P5PXbN0qQefOSahVy7VvHMnJwNatMqxeLceDB5Y3wcxdE9+/Z9C2rQJ//hmHkiWds36UlevH8eMSXLhg+v75+7Po3j3B5c81oRBYt06NHj18cfasaZtj8mQP1KmTBG9v+wcg27YpeB9v0UKZYRvb0dss6ZFKsxc6ZymgmTlzJmbMmIFp06YhODjYJADxcpCJf3FxcQgKCjJ53NfXN/X5jLx48cIpp0LFxMTY/GcOGKDGDz8Emjw+f74coaEPkTu36914ExOF2LkzN7ZuzYOXLz0s/n958mjRqdNrtGkTi127cmPJEtP3Tadj0LevN3788R6qVrXu3BZ7HB+WiIgoDK3WtBLStGkcZLLHcLA1yHPM0KHAjRul8fffabuBDAYGX33lgdWrH0GQQ51mlh4bmzYF8T5eo8ZTREc72FwsO+nfX4yDB0OQnJw2TbhzR4zvvtOia1fHPA/Tk9HxwXHAhQte2LQpL86e5Q8W+AiFLBo3foeuXWMglxswcGAZxMWZJlh//ikFxyXi66+fgHGDWRF378qwb19ek8elUgPatv0X0dGOM0Q8J+8rBQsCkyf7Ydq0YibPrVkjQ926j1G2rH07gm7cUOD5c9PPKizsHd68cZObVzpiYmIQGAg0a8bhwAF/k+fHjZNh48ZHEIns36i0tlevxNi2LQ/++CMAiYmWN71KlFCiS5cYNGnyDnPmFMHBg6bv29u3ArRv74WVK++gYEHna8imsPT6wXHAt9+W4X2uR4/niIuLgQXNO5fw7bfP8eWXIXjzJm1IExsrxJQpwKRJ9r/u7NhRzuQxoZBFhQoPER1tWfvaUdss5giFQhQrZnqvygwmPj4+01fClICD+aR2xHEcGIaxKPiwhapVq6Jo0aLYvn17msdfvXqFMmXKYMaMGRg9enS638MZR9DExMQgb968kEhsu/CaTgc0auSPu3dNbz7t2qmwfLkDjUPOpkePhFi9Wo7Nm6Umo4bSU7myDoMGJaNFC02a3vP58xX4/nv+/TcVChbbtr1DlSrZr4jb8/jISHS0ALVq5YZOl/a6IhBwOH36LYoXd76gNDvu3ROiYUN/k/cDABYsSEDPnvxTaLIqM8eGVguEhAQgISHtsZ83rwFXrrzJsfDIGf3yixwzZpiOt/b0ZHHmzFvky+cc0/YyOj5UKmDHDhlWrpTj3j3LGyC+vix69lSiTx9Vmvfin39EaNvW1+wU0YEDkzFrVpLLhzS9ennj4EHTnrihQ5MxfbpjBKG2uq9wHNCpkw9OnTLtDKlYUYd9++LsOrJqxgxP/PKLaW/x//4Xj2bNXHsqWno+PT5iYgQIC/NHYqLpuT1jRiKGDHGdEdd//y3CL78osGePBwwGyy9WjRtrMGhQMmrX1qVe43Q6YOBAb+zfz98zX6SIHjt3vnOae0qKzF4/jhyRoHt3X5PHAwIMuHDhjdut9bRrlwcGDvQxeZxhOOzdG2eVtkNW/fuvEHXq5DZ5vEEDDX7/PT7D/+/IbZaM2GUEze7du7P1Q23Fz8+PNyx69+4dgA9BU3qy+wbbi0QisXnZpVLgu+/UaNHCNGiIjJShTx8D6tRx3kY2xwFnzgixfLkHDhwQ8S7YyEcg4NC6tQ5Dh2rx2WcGAAyAtJ/N9OkGqNUarFhhWvFMThaga1df7NmTjJAQ69x47XF8ZGTZMhlvGNGxow7BwWIATjQfxAoqVDDOpV60yPRz+vbbXAgPB/LksX5PoyXHxsmTIpNwBgDCw/WQyx3ruLK3YcNYbNliwO3baVuOSUkCzJnjjdWrrRu05bRPj49XrxisXi3B2rUSvH1reTJXurQBQ4Zo0LFjyuKpaStflSsDO3Yo0aaNAklJpteFlSsV8PYW4uuvXbfhe+WKkDecUSg4jBljcLhruC3uK99/r0WtWqbrdVy7JsbGjV4YONA+IwhYFtizx3Q6Y65cHJo1Yxzus7KHlOOjSBFgyhQNJk82fb8WL/ZEp06cUy98rdcDu3eLsWKFBH/9ZXkzSy7n0K2bFoMGaVGiBAtA+N+XkVQK/O9/GnTpIsSxY6b1oSdPROjUyQ979yY75dbFllw/OA5YtIh/ysyYMVr4+bnfefbll8C2bTocPpz2mOA4BhMm+ODEiSS77aq5fz//zIIOHTJ3/3LENktOy1I/Z1hYWLpfjqJcuXK4d+8e9Pq06eHt27cBAGXLlrVHsVxa7doGdOzoWgsGazTA77+LUbeuJ1q18sT+/WKLwhkvLw4jRmhw9Woi/vc/1X/hDD+GAebOVaNnT/73Lj5egLZtFbh/3zWHJjx+zGDjRv5V3idMcN0GWEbGjtUgKMj0uHn/nsHUqfa7WZnbvYm2TDQlEgGLFvGHMNu3S3DqlHMupnL1qgCDBslQvnwuLFoktTicadhQh+3bk3HuXBJ6905/Z5uqVQ3YvDkZUil/Y2PhQimWLHGuXrXMmDePv3I7aJDGKRtg1lC8OGt2YeRvvpHi5Uv7DKm6eFGI589Nz4HmzXVws3aFRQYM0KJcOdN7W1ISg2nTnPMNi48Hli6VoFKlXOjTR25xOFOoEIvZs1W4fTsBCxeq/wtn+Hl4ABs2KFGzJv+oiLt3hWjXToH4+Cz8Ak5g/34Rrl41fV/z52fRu7fzTu/KDoYxbkrAd5+8eVOIX36x3z2Sb3ttsZjDF19QXTEjWW7txcfHY+nSpRgxYgRGjhyJn376Ce/fv7dm2bKtZcuWSEpKwq5du9I8vmnTJuTPnx/VqlWzU8lc2zffqOHlZXqhuHNHiJ9/dp7KdGwsg/nzPVC+fC4MHSrHjRuWNaSKFTNgwQLjzfabb9QoXNiyijTDAN9/rzK7I1ZsrABt2ijw5InrjelfuFAKvd709+rSRYdixZxruK41yWTAokX80yy3bpXg5EnbN+7VamDfPtObboECbLohpDurVcuATp2cP7g2GIw9Yl98oUC9ermwZYuEd9Tbp6RSDr16aXH+fCJ27FCiUSO9xdPgwsIM2LBBCbGY/zo6fboMq1c7z33FUpcuCXHokOl5lisXh+HD3bMhkmL0aA1KlODfDWjKFPs07s3t3tSunZOc3DaWXnC9Y4d97m1Z9eCBAOPHSxEc7IVp02R49syyi1toqB5r1ypx5UoiRo7UwsfHsp8nlwObNyejUiX+kOb6dSE6dVIgmX9Xc6fFccYt2fmMGaOBzHRAltsICjLfmTl3rhTPntm+3XDnjsBk5DAANGigt/hYd2dZCmiuXLmCypUrY8WKFXj37h3evn2L5cuXo3Llyrh69aqVi5h1jRs3Rv369TFmzBisW7cOp06dwqhRo3DkyBHMmjULQnfaBsKG8ublMHkyf6Ny/nwpXrxw7IDhn38EGDFChpCQXJg3T4rXry07TerU0WPTpmRcupSEgQO18ORfUiZdQiGwYoUKzZvzV+qePxcgPFyBV68c+z3MjIcPBdi82bRyKxJxGDfOudaAygmNGunRti1/g2zMGJnNdys4dkyEhATT469NGx2tPZOO2bP5g+u7dx0/uE5KAlatkqF9+xD06eODs2ct6xnOl4/F1Klq3LqViB9/VKFMmayFrY0a6bF6tRICAX9IM26cDJs2udYUyPRGz7j71qQeHsDixfyN+z/+kODIEduO52dZYOdO0+PPy4tD/fqOs4izo6lVy4DOnfnvbRMmyODoG7ecPi1E585yVKvmiVWrPJCcnHG9TCjk0LatFocPJ+Hw4WS0bavL0m5+3t5AZCT/tuUAcOGCCF27KlxqN6M9e0S8HaUFC7JmR5+7k+HDNShTxvR4SE5mMGmS7dMrGmmdPVmqTk+ZMgXNmzfH9evXsWHDBmzcuBHXrl1D06ZNMXnyZGuXMVvWr1+PTp06Ye7cuejQoQMuXbqEX3/9FR07drR30VyaMw5f5ThgwQIP1K7tifXrTee485FIOHTtqsWpU4nYvTsZzZtb3jNsjlgMrF2rxOef81fsHj0SIjxcgbdvXSOkWbCAf/G8bt10CApy74ZIirlz+Rv3Dx4I8cMPlu8eZg18Q1YBuulmJG9eDlOm8NeWIyKkeP7cMc/nq1cFqFEjF6ZN88Lz55ZduytWNOCXX5S4fj0R48Zp4O+f/fO4TRs9fvrJ/Ho9w4bJsHOnnSbaW9n580IcPcrf4B8+3H2nfH7s88/NT6ceN04KlQ2Xdjp/XohXr0xv/C1a6OBh28uz03HG4FqjAQYMkKFVK08cOGD5lPeRI41T3teuVSE0NPujTf38OPzxRzKKFeP/XidPitC7t9xpRmimh2XNj54ZO1ZD5xkAicR8cL1njxj799vu/shx/HVFiYQz2wFN0sryCJqvvvoqzfbaIpEIo0aNcqgRNADg6emJ+fPn4+7du3j9+jWioqLQvn17exfL5YlE5i8Ujjh8leOAr7+WYu5cKVg245tt7twsJkxQ48aNRCxfrkKFCtadhiOVAr//nozq1flDmjt3jPOMHWxWYab9+68AW7fyz1EdO9aFun6yKX9+DlOn8r8f333ngQcPbDN0RaXin95UqBBrlQqnq+vfX4uQEP4eLkcMri9eFKJ1a0+LhuwzDIeWLXXYuzcJJ04koVMnHay96UKXLjqz0yJYlkH//nIcPuz8IY25hsjQoRoaGv6ROXPU8PY2bdw/fizE4sW2a7FRT3HW5cnD4euvzY+4drTgWqUCunWTY9s2yy5uxYsbsHChccr77NlqBAZat9MpXz4Of/6ZjEKF+OugBw6IMXiwDAYnvz3v2iXinS5TqBCL7t1p9EyK2rUN6NbN/HRqW017++cfAe7eNf28GjbUw9vbNmVwdlmq1efKlQvPnj0zefz58+fwzMq8DuKSatY0oEsXxx++yrLGHrflyzOu0JUrZ8DSpUrcvJmIKVM0yJs350Z4KBTAli3JqFCB/8567ZrzzzNesMCDNxDr2VNr8do97qJfPy0qVzYN7LRaBmPGyMDZ4O06elTEu6NOeLjO5bc7tob01l2IjHSs4DoqSoi2bRW809k+5unJYfBgDa5cScSGDUrUrm3I0WOhf38tZs3ifw91OgY9eshx5ozjvI+ZFRUlxMmTpiGTtzeHIUNo9MzH8uThMHMmf+P+xx89cPduzgfXBgOwa5dpQOPjw6JePZreZIl+/bQoX54/uLbnYvifSkoCOnZU4MiRjOck1a2rx+bNybh4MQkDBmRtyrulChc2hjR58vCHNDt2SPDVVzKwTrqcn8FgHGXKZ8IEtdU7Apzd7Nlq+PmZftjPngkwf75tzidzoTWtyWW5LN292rZtixEjRiAyMhLPnj3D8+fPsWPHDowcOZJGp5A0Zs0yP3x1xQr7X1UNBmDECBl+/TX9cKZpUx127kxCVFQSevSw3a4MPj5AZGQySpfmD2nOnxehe3e5U84zvnNHgO3b+YdAjhlDDZFPCYXGRaT51uE4eVLE+15aG/UUZ1+NGgZ07Wq+h8sRgusTJ4To0IF/e+sUhQuz+PZbFW7dSkBEhNqm0xFHjdKaXZ9KrWbQubMCly87Z0hjbvTM8OEa6nnk0auXFqGhpkGITsdg9OicD67PnhUiJsa0Kt2ypZ4ajhZKL7j+4w8JTpyw/7n8/j3QoYMCp0+bH6EnkRi3yT59OhG7diWjWbPsT3m3VIkSLP74Ixk+PvwpzPr1EkyZIrVJR461/fmnGHfumB4DRYqw6NKF6h6f8vfnMHs2//3xp58kuHUrZw9KjuOvK3p4cGjWjD4vS2XpU5ozZw5atmyJwYMHo0KFCihfvjyGDh2K1q1bY9asWdYuI3FiefKYn5qxYIF9VhZPodcDgwfLsHEjfy1KKOTQr58GFy8mYssWJT7/PGd7hs3JndvYO8K33TIAHD8uRt++zjfPeMECD9652716aVGwoBPWImygUiUWAwbwt+CnTJHm6NaaSqVxuPSnAgNZVKni5OOnbcxccH3vnhDLl9u3VXfwoAidOimgUvFf7CpW1OG335Jx5Uoihg3T2i00+PprjdkRJUlJDNq3l+PmTedatfrUKSHOnDFtAPr6shg0iEJrPgKBMbgWCk3Pp7NnRTm+eDStyWUd1aubn5oxbpwMGjse/u/eMWjbVoHz5/nDGS8vDhMnqnHzZiJ++kmF8uXtM1QlOJjFjh1KeHry159+/tkD337rXIu1GAzA/Pn8ZR4/Xp2lBZbdQbduOt6t2A0G44jrnBxNdfOmAPfvmwZqjRvrkStXzv1cV5Ol2otEIsH8+fPx+PFjnD59GqdOncKjR48wb948eNBKTeQTffs63vBVrRbo08f8PGKRiMOaNUosXqxGyZL2HxeaPz+HnTuTUbAgf1n27RNj6FDnmWd865bAbMJOo2fS9/XXauTPb3ocxMYKMHt2zp1Phw+LeHepaNuWpjdlVkAAh2nTHC+43r3bOCLP3ALpn3/+Drt2xaF1az3svQkiwxgXzza3e0d8vABt2ypw/75zhDTpbSE7cqQWXl42LpATCQlhMXQo/3EwbZoUcXE5cz7p9fzTm3x9WdStS9ObMmvmTP41he7fF1o0BT0nvHnDoFUrBf7+mz+c8fNjsXt3EiZP1iBPHvt3LFWtasDmzcmQSvnLsmiRFD/+6DxDu3bsEOPePdObTdGiBnTuTCGoOQxjDK5FItPj4MIFEdavz7lki0Jr68hWzUUulyM4OBiFCxfGsWPHcPfuXWuVi7iQ9Iav/vmnBMeP23ZRR7Ua6NFDjt27+S8iEgmH9euVaNPGsSpYRYoYR9IEBPCHNNu2SWy2Fkl2zZ8v5R0907evFvnzO8EvYEdeXkBEBP/5tHatBBcv5kzL2dxNt107B5iT44T69tXyri+lVDL4+mvbb4m5fbv4vx0/+BuzbdqoERHx0KF2y0iphHbowH8MxsYK0KaNAk+eOH6CePKkEOfOmd4L/f1ZDBhAoXVGJk5U8y6U+vatADNm5ExwHRUlRGysaTW6VSs99exnQXrB9cKFHoiOtu15/OoVg5YtFbh5k/+emicPiz17klGxov078T4WFmbAhg1KiMX8dakZM2RYvdrxQxq93vzomYkTNRA5/3rwOapMGRYjR/LfO2bMkCI21vrnk7npTTIZh6ZNKaDJjCwFNL1798bKlSsBACqVCvXr10efPn1Qu3Zt7Ny506oFJK4hveGr48dLbTZ8VakEunSR4+BB/tqTTMZh82Ylmjd3rHAmRcmSLCIjk3l7mQBg3ToJvv7asecZX78u4O11lMk4fPUVNUQs0bq1Hk2amN7sOM647oLeyodvcjJ4z5mgIIPDVU6dhVBoPrjeuVOMY8dsV/vcuFGMAQNkvNvdA0CXLlosX/6etzfO3oRCYMUKldmtO58/FyA8XIFXrxw3pOE4YO5c/hBh1ChNji4w6io8PYEFC/jPp/XrJTh71vrBNfUUW1+fPlpUrGj/4PrZMwYtWih41z4BgAIFWOzbl4xy5Rzz/teokR6rVyt516wDjNPGcnr6X3Zt3SrGgwem73+JEgZ06EDnmCXGjdOgSBHTYzQ+XpAjMxiuXxfg4UPTz6xJEz3dxzIpSzXAs2fPYuzYsQCAPXv2gOM4PHnyBJs2bcKiRYvQpk0bqxaSuIZZs9TYs0eM9+/TVpRThq+OHp2zjfPERKBTJwXOnuU/7BUKDlu2JCMszLHnCZUvz2LHjmSEh/Mv4rl8uQc8PTlMmeKYYYe5VeT79dPm6K5YroRhjI2RU6dEUKvTHgM3bwrx888SDB9uvZEthw6JoVTS9CZr++wzA3r00GL9etPezAkTpIiKSsrxEStr1hhH3pnTp48GixerHWLxYnPEYmDtWiU6dVLw7oD06JEQ4eEK7N2bDH9/x7vGHD0qwl9/mZY7IIBFv34O/MY7mC++0OOLL3TYt8+04Tl2rAwnTyZZbeFec9Ob/P1Z1KnjmB08zkAoBBYvVqFRI9PW3K5dYhw9KkLDhjn7/j5+zKB1a088fcrfh124MItdu5JsujB6VrRpo8dPP6kwZIic9/lhw2SQyzmHGy0OADqdcZ1CPo40ekar1SIhIQGcA/eKbtnyBjdu8AeN//5rgI+P9cquVguwatVbk8eDgw2Ijc38z2FZFhKJBO/fv0diYqI1imhVDMPAy8sLkhxYET5Lh3hCQgJ8fX0BAEeOHEHr1q0hl8vRpEkTTJ8+3aoFJK4jd24O06erMXasaWNg4UIPdOigRWBgzlzk4uOBL79U4OJF84u8bd+ejM8+c+xwJkW1agZs2pSML79UmDTQAeM6FrlycRgxwrEq91evCrB3r2mlVi7nMGqUYwZKjiooiMOECRredWfmzZMiPFyHQoWscz6Z270pPJx6sbJrxgw1du8WIT4+bWPg/n0hfvrJI0fXZFq+XIIpU8yHM4MHazBvntopQjipFPj992S0a6fAhQum1/k7d4Ro106BXbuSHGo3JOPaM/wNka++0kChsHGBnNz8+SqcPGm6XtY//xgX4P7qK+vcE0+fFuHtW9MGfOvWOodpPDqratUM6NlTi99+4w+uz57NueD6/n3jtMjnz/nDmWLFDNi1K9lq99ac1qWLDkqlirfezbIM+veXQy5XonFjxwppNm8W4/Fj01ChdGmDw2zVrNVq8f79e/j7+0Ngq+26siAgAPDwECA+3vRGrtNx8PdnrbLbGMcBr18LUKJE2p8jEHAoXZrN0rp1LMtCq9VCIpE45HvMsizevn0Lb29vq4c0WfptCxYsiIsXLyI5ORlHjx5F/fr1AQDx8fG0SDBJV+/e5oevptdQyI64OAZt2niaDWd8fY29Ic4SzqSoU8eA334zP8942jQZ1qxxrHnG5hbBHDBAi4AA56jwOJLhwzUoU4Z/Ae6JE61zPiUlAYcOmZ47xYoZUKGCYw7vdibG4Jo/hFm40ANPn+ZMOvLddx7pXnNHj1Y7TTiTQqEAtmxJ5l3bBwCuXROiUycFkpNtXLB0HDokwuXLpudX3rws+vZ1rIDdGQQGcpg0iX8dk/nzpXj82DoHNIXWOWvGDDXvltEPHgixdGnOtDPu3BGgRQvz4Uzp0gbs2+c84UyKfv20mD2bf/qfTsegRw85zpyx/1bmKbRaYOFC/rrixIkauy9QnyIhIcHhw5kUBQuyvDvdaTQMXr+2zjVRpQK0WtPv5eXFOcxnZm0CgQD+/v5ISEiw/vfOyn8aMmQIBgwYgHLlyiFfvnyoU6cOAOPUp3Llylm1gMS1pAxf5bN7txhHjli36+n1a+Mib9eu8V8dcudmsXt3MipVcs6GZpMm6c8zHjtWii1bHGOe8eXLQt51TDw9ObMLmZH0SSTAd9/xn09794qxb1/2z6eDB8W8o7TataPpTdbSq5cWlSqZ9mCqVNYPro3rnXiku+PX5MlqTJ+uccrP18cHiIxMRunS/CHN+fPGnarU/G14m0pv7ZnRozWQ2X6taJcweLAWwcGmn79KxWDChOwvpK/TGXc8+1RAAIvatZ2ro8dR+ftzmDGDv16weLGH1Rf+vn7dGM7ExPA3i4KDDdizJxn58jlXOJNi5Egtxo/nv+ip1Qw6d1bg8mXHaEX//ruYd3pZ2bIGhwpAOY5zinAGMNYVzR27r14xVlkH9N07/nPS19c5zxlLCQSCHJnilqUjq3///jhy5AiWLVuGAwcOpB6gQUFBmDp1qlULSFxPyvBVPhMmWG/B4BcvjOHM7dv8N518+Vjs3ZuMkBDnDGdStGmjx7Jl/I10jmMwdKiMtzJpaxER/L1egwZpHHJdCGdRq5YB3bubO59k2R4tQD3FOc8YXKvBMKbnwZ49Yhw+bJ3zl+OMuzcsWGA+nJk1S4WJE50znEmRO7dxx7ugIP7G8vHjYvTtK4fOzofwvn0i3s6D/PlZ9O5No2eySiwGfvhBxXs+HTokxq5d2TufTp0S4d07mt6U03r21KJy5ZwPrv/+W4hWrTx5p6wBQOXKeuzZk+z0o3ynTNFgyBD+CnZSEoP27eW4edO+gYNGY9wKnM+kSWqrTMVxVwEBHORy02OY4xhERwuyFVxzHHinUAkEHLy8sv593VmWD/VKlSqhVatW8PxoWeamTZuiRo0aVikYcW0zZqjh62sajDx8aJ3hq0+fGlfgv3ePP5wpVMi4An/p0s4dzqTo2lWHhQv5QxqDgUHfvnIcPWq/muNffwlx+LBpQz9XLs6qi9m6q1mz1PDzMz2Wnz0TmF2U2RKJieANB0qWNCA42DXOHUdRtaoBPXvyJwYTJkizPeKDZYGJE6VYssT89TUiQoVRo1zjfMyfn8POnckoWJD/ON23T4yhQ2Uw2GnAA8uan/I5dqwG0pzZGdpthIYazIZckybJkJ31Js2F1rR7k3WlF1zv3SvmnXqbWefPC9GmjcJk84oU1avr8eefyS4xCoBhgLlz1WY7SOPjBWjbVoH79+2XgmzYIMGzZ6Y/PyTEgFatHGudHGfDMEBgIAvA9FhOTGR4AxZLKZX805u8vTkK1bIoy2/b8+fPsXr1asycORNTpkxJ80VIRozDV/lbHNkdvvrokQBffOGJR4/4w5mgIAP27UtCsWKu1cAcMECLmTPNzzPu3l2Oc+fsM93J3CKYgwdrXKLiY2/+/hy++Yb/fPrpJwlu3crapX7/fjE0GtNzMTycpjflBHPB9aNH2QuuWRYYPVqGlSv5vwfDcPjhByUGD3aNcCZFkSLGkTQBAfzX+m3bjDtY2WMDjj17RLh50/QeVagQix49XOtzsJcZM9S8n/3LlwKzU8syotUap2N/Km9eFjVr0vQma6tSxXzQNnFi9oLrU6eEaN9egcRE/ptZWJgeO3YkO9Si4tnFMMD336vQoQP/exoba1wk2dpTyCyhVhvr/3xo9Ix1yOUwOxLs+XMG+ixmYObCHWvuEJUV5cuXx/Lly1P/7ePjgz179tixRJbL0uF+8uRJhIaG4tdff8WyZctw+vRpbNy4ERs2bMCNGzesXUbionr00KFKFesOX713T4AvvlDwJvCAsed/375kFC7smqHAV19pMW4cf41FpWLQo4cPbt3i33Ixp5w7J8Tx46YVWi8vDsOG0doz1tK1qw61apmeTwYDg9GjZWCzkEdST7Ft+flxmDnTusG1Xg8MGSLDunX8C4YLBByWL1ehd2/X/ExLlmQRGZkMb2/+a/66dRJ8/bXUpiENywIREeZHz9BeC9bh4wN8+y3/+fTLLxJcvZr5KvCJEyLe0RatW+tcdiFMe5s2TcM7QvTRI2G6IwLTc+SICB07Kkx2+0rRoIEOW7cmw9N0t2+nJxQCK1ao0Lw5/zX/+XMBwsMVePXKtiHNhg0yvHhhek5WqGBAixY0esZa8uXjkJT0GosXj0SnTmXRpIk/2rUrjq++aov9+y9m+vs50/Smu3fvonHjxgCAJ0+ewMfHB9evX7dzqfhlKaCZNWsWhg0bhnPnzkEqlWL9+vW4desWateujfDwcCsXkbgqoRBYtMh6w1dv3TIu8vbyJf9hXa6cAXv3JqNAAdcMZ1J8/bUGgwaZm2cswMiRpbB5s3E3C1s0SswN4x82TAMfn5z/+e6CYYwLBvPt6vXXXyKsX5+50VPv34N3Wlzp0gaULetao88cSY8eOlStaloZVasZTJ6cueBapwP695dhyxb+cEYo5LB6tQpdurhmOJOifHkWO3Ykw9OT/4K3fLkHxo2T4q+/hNDaYPDKzp1i3rXRAgNZdOtGo2es6csvdfj8c9PziWUZjBmT+SluFFrbXnrB9XffeWR6Z669e0Xo2lXOu/g9ADRrpsOmTUrIbduXZVNiMbB2rZL33ACM4Vd4uAK7dokQG5vzQY1azWDJEgXvc1OmONdugo5OJAJmzeqOBw9uYNKkX/Dbb1fw7bdbUKlSGKKj32V63UJnmt6UN29ep9ltOktv3b1799C1a1cAgFAohEqlgqenJ6ZMmYIffvjBmuUjLs5aw1evXhWgZUsFYmP5D+kKFQzYvTsZefK4djgDGBvq8+apzS4cm5AgwldfeaNSJS8EB+dC374yrFolwY0bAquvx3D6tBCnTpk28n18WAweTKNnrK1MGdbsjlgzZkgzVdHav1/Me9Nt25amN+UkgcB8cL1vnxgHD1oWXGs0QK9ecvz5J384IxZzWLdOiXbt3KNhWa2aAZs2JUMq5b8H/PqrB5o08UThwl5o0UKBOXM8cPSoCNbePdNgAObP568gjh+vhoT/4yJZxDDGnSMlEtPP/e+/RVizxvI3XKMxdh59Kn9+FjVq0PSmnNS9u/ngetIky4PrP/8UoVcvOe+9DQDatNHht9+UbjGKTSoFfv89GdWr84c0d+4I0bOnAiVLeqFaNU+MGCHD77+L8ehR9haU5RMZGYDXr01D6ypV9Gja1LlGzzRurLDpV2bFx8fj0qVzGD16NipXrot8+QqjbNlq6NZtHGrWbI7oaAHi499j1KhRKFGiBAIDA9GqVas0M2QePXqELl26oGTJkihRoiAGD/4cly8fT/Nzdu9ehSpVqiBv3rwoWbIkevbsmfqcRqPBhAkTUKJECeTNmxfNmjXD33//nfr86dOn4ePjg5MnT6JJkyYoWLAgmjRpgn///Ze3DAULFkT9+vVx4sSJdH/3j6c4VaxYEQBQt25d+Pj4oEWLFoiKikLu3LkRExOT5v99/fXXaN68eebe6GzK0gpbcrkcmv+22smfPz8ePXqEsmXLAgDi4uKsVzriFqZN02DnTjHi4tKGK48eCfHjjx6YODH9hvzFi8Z5xAkJ/DfcatX02L492a1GawgEwI8/qqBUApGR5iugL14IEBkpQWSk8d9eXhxq1NCjRg0DatbUo0oVQ5YrKhxnfvTM8OFal5rX7UjGjtVg+3YJnjxJez7FxwswdaoUv/zCv07Rp2j3JvupXNmAPn20WLPG9OSbMEGGunUT092CWaUCevSQ48gR/s9QKuWwfr0SjRs7V8U3u+rUMeC335To1k0OnY7/fqFWM4iKEiEqylg9Egg4hISwqFlTj1q1jNfGvHmz3jr54w8x7twxbYgEBRlcfiSTvZQowWL0aA3vgunffCNFq1Y6i7ZPPn5cxFvPaNNG53A9xa5GIDAGbfXre4Lj0n4GBw6IsX+/CM2bp38927zZuDA4y/Kf+x07arF8ucqtduJSKIAtW5LRurUnrl83P0fv/n0h7t8XYv16Y30yXz7jNTGlrhgczGZ5il9yMrBuXX7e5yZPdr4dBS9edOwDyNPTE56enrh0aTeKFg2FSJT2uqhUAu3adUKePD7Ytm0bvLy8sHbtWrRp0waXL1+Gr68vkpKS0KRJE3z99VRER8uwd+8mTJnSEb/99jfy5g3Ev/9exsyZE/HLL7/gs88+w7t373Du3LnUnzF9+nTs3r0bK1asQGBgIH788Ue0a9cOV65cga+vb+rr5syZg5kzZyJfvnwYO3Yshg8fjoMHDwJAahmmTp0KqVSKTZs2oXPnzrh48SICAwMzfB+OHTuGBg0aYOfOnShTpgwkEgl8fX0RFBSELVu2YOTIkQAAvV6PrVu3YsaMGdZ4+y2WpVtKtWrVcOHCBQBIfXMWLVqE4cOHo1q1alYtIHF96Q1f/f779IevRkUJ0bat+XCmZk09/vjDvcKZFEIh8MsvKjRtanmlPyGBwaFDYsyeLUXz5sbe5ObNFZg92wOHDokQH2/5zz91SoizZ01vVL6+rNkpWCT75HJjRZbPli0SnDyZcS0qPh44dsz0sytXzoAyZWh6ky1Mm6aBv7/pe/3kiQA//mg+NU1KAjp2VJgNZ+RyDlu2JLtdOJOiSRM9Vq9WQiCwLGRhWQbXrwvxyy8e6NVLgdKlvVCliieGDpVh/XoxHjywvDdZrwciIsyNntFAbJ813N3C6NEaFC9uOsolIYHBlCmWLRgcGUnTm+ypUiUWffua35lLlU7fw7p1YgwZYj6c6dlTixUr3CucSeHjA0RGJqN0actHgb16JcAff0gwcaIMdevmQtGiXujQQY7Fiz0QFSXM1OLN69bJERdnem6FhurRqJF73qdykkgkwk8//YStWzehZctADB/eCKtWzcSDBzcBAFeunMLdu7exatU6VK5cGcWLF8ecOXPg7e2NnTt3AjAuvtunTx8EBQUjX76S6NdvOvLnD8LZs/sAAImJ0VAoFGjatCkKFy6MihUrYvDgwQCA5ORkrFmzBrNnz0bjxo1RpkwZLFmyBDKZDOvXr09T1qlTp6JWrVooU6YMRo8ejQsXLkD938GVUobg4GAUL14cU6dORVBQEPbv32/R++Dv7w8A8PX1Rd68eVODoR49emDjxo2przt48CBUKhXatm2b1bc8S7IU0MydOxdVq1YFAEyaNAn169dHZGQkAgMDsXTpUqsWkLiH7t11qFYtc8NXT5wQokMHBZKS+G+49erpsH17MnLlsmpRnYpYDKxbp0Tdulm7yWk0DM6dE+G776To2FGBokW9EBbmifHjpYiMFOPlS/73Pr3RM6NGadz6M7GFRo30CA/nr8iOHSuDJoN8bO9eMe8IAxo9Yzu+vpkPrt+/Bzp0UOD0af5WRq5cHHbsSMbnn7v3dIw2bfRYtsyykWR8Hj4U4vffJRgxQo6qVXOhdOlc6NlTjhUrjAvPmtsJY/t2Me7fNw1IixUzoFMnOrdyklRqPriOjJTwrrf1MbXaOO3zUwULsggNde/zyZamTVObDa5/+IE//Fy5UoJRo+QmI29SDBigwQ8/qNx6kefcuY073gUFZe1YTkhgcOSIGN98I0WLFsbOvWbNFJg50wMHD5rv3EtKApYtM7f2jPONnnEWbdq0wZ07d/D775tQs2ZDXLt2GgMHhuHAgQ24d+8KVKoklCpVDAULFkz9evLkCR49egTAGLJMnz4ddetWR8uWhdC8eT5ER99DTEw0AKBZs3ooVKgQKlWqhIEDB2Lr1q1QKpUAjFOTdDodqlevnloesViMKlWq4O7du2nKGRwcnPr3vHnzAgBiY2PTlKF69eooXLgwChYsiHv37uHZs2fZem+6du2Khw8f4uJF44LJGzZsQHh4OBSKzE8ny44sZcVBQUGpf5fL5Vi8eLG1ykPclHHdBcuHrx48KELPnnLeLYABoEkT4zxiadZ20nQpUimwfXsyVq6U4OefJXj2LOu1EI5jcPOmEDdvCrFqlfGxIkXSDv8vWZLF8eMinD9vennJnZtF//60CKYtzJunxtGjYpMtRO/fN04dnDDBfErz55/UU+wIunXT4bff9CZDpjUaBhMnyrBlizL1sXfvGLRvL8fff/Pf1r29OURGJqNqVWpMAsZdz0qWTMKsWVKcPy+EXp/1lsDr1wLs2iXArl3G88bTk0NoqB41axqH/1etaoBEAixYwN+AnDhR45Y997ZWr54BHTtqsXWr6bTfceOkOHs2yezUwaNHRbzbMdP0Jtvy8QFmzVJj+HDTFXx/+MEDnTvrULTohwBnyRIJpk83Px90xAgNZs+mRWgBIH9+DidOJGH+fCm2bhXj7dusH9haLYPz5431wB9+ABiGQ9mybGo9sWZNPQoW5LB6tcRkeQPAOPq9Xj0aPZOTpFIpGjasj+rV6+Pffydj4cJh+N//5qJNm/7w88uHH37Yh8BANk2Hqvd/axNMnz4dR48exYAB3yJfvuLw8JBixowe0Ot1EAo55M+fC6dOncKZM2dw7NgxzJ07FxERETh27Bi4/4acMp+cdBzHmTwm/mhYacpz7H9bkqaU4ZtvvkGxYsUgk8nQs2dPaLO50n9AQACaNWuGjRs3IigoCIcPH7bL1txZrhLEx8dj165dePToEUaOHAlfX19cvXoVefLkQYECBaxZRuImKlVi0a+fFqtXm1ZiJ02SoV4947oLu3aJ0K+f+TUEWrbUYc0aJS22+BGJxLjuS//+Cbh48RWePQvCpUtSnDsn4t1NJDOePBHgyRMJNm82vuH+/qzZxsaoURqX3LbSEeXPz2HqVDUmTjStnC5e7IH27XUoXty0J/LdOwbHj5t+gCEhxvCN2I5AACxcqEKDBp4mQ/MPHvwQXL95wyA8XIGbN/nPZT8/Fn/8kYyKFenz+1hoqAF79iRDqQQuXRLi3DkRzp8X4q+/RGa337VEUhKD48fFOH7cWLkUizkULcri4UPTz6dkSQM6dKDg01bmzFHjwAGxybToR4+EWLzYA1On8gfXFFo7jq5djcH1X3/xBdfS1OB6wQIPsyN5AeOi3DRKIy0fH2Pnzty5aty7J8D588ap6ufPi0zWtcsMjmNw+7YQt28LsXq18bHChVm8e8f/5k+a5LyhWWiocwVLnp7GOkKRImVw5swelCxZCXFxMRAKRRCJCqNIEdP1hc6dO4cOHbqiVq3WAACVKgmvXj0F8GH3JoFAhHr16qFevXqYOHEiihQpglOnTqFhw4aQSCQ4f/586loxOp0OV69exZAhQywu97lz59C1a1e0atUKgHFNmqdPn1r8/yX/NRJTAp+P9ezZE/369UOBAgVQtGhR1KhRw+Lvay1ZCmhu3ryJ8PBweHl54enTp+jVqxd8fX2xZ88eREdH45dffrF2OYmbmDpVjT/+ME3uU4avlijBYvBgGQwG/it3+/Za/PyziubypyNfPh1CQ9Xo0sX47/h4/NfTYWyg/P230Gz4ZQlzvS558hgDOGI7/ftrsWmTGFevmlZkx42TIjJSaVIJ2r/fg3c0ATVE7CMluF61yjS4njhRhrJlk9CpkwJ37/KHM3nysNi5M5m2Rk+HXA7UrWtA3brG0UV6PXDzpgBnz4pSQxtzOwRaQqdjcO8e/+czcaLGradW2FqePMapg2PGmAbXP/7ogY4ddShVKu25olLxT28qVIhFtWo0Is3WUoLr+vVNg+tDh8TYt0+ES5eE+P578+HMtGlqjB1La+GZwzBA6dIsSpdm0auX8d7//DmTWlc8e1aE27cFZqeNWeLpU/5rau3a+tRrsTM6fDiT+1TbWFxcHHr16oXu3bsjODgYnp6euHz5KrZs+QG1a7dA1ar1ERz8GaZO7YKBA2dDqSwOln2Jw4cPo0WLFqhcuTKKFi2KPXt2o3TpFgAYrF37DTjOeN309eVw4MABPH78GLVq1YKPjw8OHz4MlmVRsmRJKBQK9O3bF9OnT4evry8KFSqEH3/8EUqlEj169LD49yhatCh2796NZs2agWEYfPvtt6mjcywREBAAmUyGI0eOoECBAvDw8EgdIdSwYUN4eXlh0aJFmDJlSqbeX2vJUkDz9ddfo2vXrpg9ezYKFSqU+njjxo3Rv39/qxWOuJ/0hq9+950H9HqYvSF07arF0qXuPY84K3x8gGbN9GjWTA9AA5UK+PvvtL3J5hZhzoyvvtJAbvqxkhwkFAI//MA/AuP4cTF27BCb9N7v2sVfqaX1Z+zn66+NwfWbN2krtE+fClCjRi6o1fznZ8GCxnCmRAkKZzJDJDIGY5UqaTF0qBYcBzx4IMC5cx+ui3yjYTKrTBkDBZ920Lu3Mbj+dOqgTsdg9GgZ9uxJThNcHz4s4l3rrm1bndP28ju7ihXNB9f9+snNXhMB4NtvVRg2jDqLMqtgQQ7t2+vQvr3xmhUfD/z114fOvcuXhWa3L8+MyZOdd/SMM1AoFKhWrRqWL1+OR48eQa/Xo2DBgujSpRdatRoPhmEQEbEDq1fPxsKFQxEf/wZ58uRFWFgtBAQEADCuRdunzwgMH94I3t7+6Nx5NJKTE8EwHDw9jVOhdu/ejYiICGg0GhQrVgy//vpr6o7PM2fOBMuyGDRoEJKSklC5cmVERkbCJxM7usydOxfDhw9H06ZN4e/vj1GjRiExMdHi/y8SiTB//nwsWLAAc+fORc2aNbF3714AgEAgQJcuXfDdd9+hc+fOlr+5VsTEx8dner/IwoUL4+TJkyhatCgKFSqEM2fOICgoCE+fPkVoaKjJ/uHEdtRqNaKjoxEYGAipky7AwrJAs2YKk+Gr6enbV4NFi9Q0FzwDWTk+DAbg1i0Bzp0TpTZQYmIy90bny8fiypX0twYmOWfCBClWrjStyObJw+KvvxLh42M8Nm7ceIlmzSqajFCrUMGAU6eSbFRawmfjRjGGDbM84SxcmMWuXUkICsr6ltAfc4V7izW9esWkNkzOnRPh5k2B2R1izPnf/5IRHu5cw+H5OOOxceOGAPXqefKOxl2xQplmy/O+fWWIjDSdM33sWBKqVHHenn5byanjIz4eCA3NlanRbYsXq2gkbw5Rq4ErVz6E2OfPZ75z7/PP9di507FHoKSIjY1NDSxcAccB//4r4J3eq1BwKFmSTQ3OEhPBu+C9vz+LwoWtU+cAjNOPtFotJBIJBDZu4I0cORKvX7/G5s2bM3xtThwLWfptPTw8kJCQYPL4/fv3kTt37mwXiri3lAWDLd0GdcgQDRYvpnAmpwiFQIUKLAYN0uJ//1Phzp1EXLmSiOXLlejRQ4sSJTKuoI4bp6Fwxo6mTlUjXz7TURSvXwswZ86HCvPx4z68DRbq5be/Ll10qFHDssZ88eIG7NtnvXCGmMqXj0N4uB7z56tx6lQSHj9OwI4dyRg3To3atfWQStN/70NCDGjd2vnDGWdVvjyLIUP4G+pTp0pT18ZQKo0bFXyqcGEWlStTOGNPPj7A7NmW7efMMByWLVNSOJODpFKgZk0DxozRYOtWJR49SsDp04lYuFCFdu20yJ8/45GcU6ZkYn9uYlUMAwQGsmAY03tXcjKDt28/1A3j4/mDNx8f569zvH//HidOnMC2bdswaNAgu5UjS03aL774AgsWLIBO96HSHh0djZkzZ6Yu1kNIdlSoYNluP2PGGBczo+GQtsMwQNGiLLp21WHpUhUuXUrCv/8m4LffkjF0qAaVK+shFH64SHfvrkXfvlQpsicvLyAign+L2V9/leDyZWNPyJEjfryvaduWPj97S1l3IaPgukwZA/buTUahQs5fUXImXl5Aw4Z6TJ2qwd69yXjyJAGHDiVh1iwVmjbVwcfnQ+OkSBEW//ufkjoV7GzSJDUKFjRtNL59K8CMGcbg+vBhEZRKmt7kqDp31qFmzfSDTqGQw6pVKnTvTh0NtiQUGoPQAQO0WLNGhdu3E3H1agJWrFCiVy8tSpX6EHCKxSxmzkxE9eoUetqTTGZcp4vPixcMdDrjSBu+gEYk4tLs+OSsunbtii5duqB3796oX7++3cqRpSlOCQkJ6NixI/755x8kJSUhf/78ePXqFUJDQ7F9+3ab7xVOPnDGocbmZDR8dcoUNcaPpxX4M8NWx0dSknHNBm9vjnrxHQTHAV9+KceRI6a9weXLG7BhQxwqV85tMk2jcmU9jh93jiHH7mDiRCl++YV/u+aQEAP+/DMZuXNb/5xzpXuLPbCs8ZqoVALBweZ3unNGznxs7NkjQvfu/HXWAweS8PPPEvz5p+n0phMnElGpEq3tZImcPj5u3hTg88/5p6uJxRx+/VVJo9Uc1Js3DB4+1IFlo1GpUn6nun642hSnFAYDcOeOgHc9IT8/Fn5+nE2mNwH2neKUGQ4zxcnLywsHDhzAb7/9hpkzZ2LAgAHYsWMH9u/fn+PhzMmTJzFs2DCEhoaiQIECKFu2LLp06YKrV6+avHbIkCHw8fEx+QoNDc3RMhLrSG/46uzZKkyYQOGMo/L0NC7iR+GM42AY49RBvqkXN24I0auXD+8aGjS9ybFMnqxGnjymDcMqVfTYvTtnwhmSfQIBULIki4oVXSuccXYtW+rRvDn/Ne6rr2Q4eNA00C5a1EBb1juQkBDjKI1PeXhw2LCBwhlHljs3hwoV9PD3p8/IUQiFxh3q+MTFCfDiBX904OtLdQ9rylRAc+nSJRw+fDj1359//jn8/f2xevVq9OvXD6NGjYJGk7Pb1q1ZswZPnz7F4MGDsXXrVkRERODNmzdo1KgRTp48afJ6mUyGw4cPp/las2ZNjpaRWE/nzjr07PnhxuvhwWHRIhVGjqQpF4RkVlAQh/Hj+a/RV6/y703fpg0FNI7ExwdYs0YJmexDZah+fR3++COZKkiEZMH8+SrI5abnzp07QqhUNL3JGUybpk4z1cnfn8WWLclo2pQa/oRklre3+fVk+KZ8ikTG3ZuI9WSqHyciIgJhYWFo3LgxAODWrVsYNWoUunTpglKlSmHp0qXIly8fJk+enCOFBYBFixaZDCNq2LAhqlSpgu+++w6ff/55mucEAgGNmHFiDAP8+KMKvXtr8fixAFWq6GlUBiHZMGKEBlu3inH3bsbbBFetqkeRInS+OZqwMANu3EjEyZMi5MnDIizMQA1GQrKocGEOkyerMW2aZSvZh4dTaO1oFApg9+5knDolQmIiULeugQJrkqMYhgHLsg499SY7ChZkkZBg2e6EPj6c29ZBWJYFkwO/fKaOqhs3bqQJQCIjI1G1alUsWbIEw4cPx/z58/Hnn39au4xp8M3x8vT0ROnSpfH8+fMc/dnEPhgGqFLFgHbtdBTOEJJNEgnw3Xf8CwZ/iqY3Oa7cuTm0b69DnToUzhCSXYMHa1GuXMYLlBYvbkD58jS9yRGJRECDBnq0aaOncIbkOC8vL7x9+xYs65rXA4kEyJ/fsvPIFXZvygqWZfH27Vt4eXlZ/XtnagRNfHx8moAkKioKDRs2TP135cqV7RKSvH//HteuXUPdunVNnlOpVChVqhTevHmDfPnyoUWLFpgyZQp8fX0t+t5qtXNt+abVatP8ScjH6PggAFC1KtC5sxCbN6ffY9ysWRLUatesfJDMoWsHMcdVjo0FCwxo2ZJ/J7sUrVuroNE4V73Q3lzl+CA5w5mPD6lUitjYWHsXI8dwHBATI0ZiovleIGOQo4VSaf2f7wyLBMvlcrAsa5IXZHfB60wFNAEBAXjy5AkKFSoErVaLa9eupZnOlJSUBJEdVr8bP348lEolxo0bl+bxkJAQhISEoFy5cgCMgdLy5ctx8uRJHDt2DJ4WTJh78eIFDAbn2/YtJibG3kUgDoyOD9Kvnwj794fg/Xv+a3b58knguCeIjrZxwYhDo2sHMcfZj428eYG2bQ344w/zu3F89tkTREdbNgKRpOXsxwfJWXR8OCa1Wo6BA8uC4/hDmi+/fI1y5d7kaBkcObxLSEgweUwoFKJYsWLZ+r6ZSlMaNWqEWbNmYebMmdi7dy9kMhlq1qyZ+vytW7dQtGhRi7/f6dOn0apVK4tee+rUKVSoUMHk8Tlz5mDr1q1YsGABKlWqlOa5YcOGpfl3/fr1Ub58efTq1Qvr1q0zeZ5PgQIFLCqfo9BqtYiJiUHevHkhkZhuDUncGx0fJEVgIDBjRjLGjPHmff7LLzkEBgbauFTEUdG1g5jjSsfG3LkcTp1i8fataW9tyZJ61KuXm6YUZpIrHR/E+uj4cGyBgUDv3iqsXSvnfb5rV1GO1RXd+djIVEAzdepU9OjRAy1atICnpyeWL1+e5g3bsGEDGjRoYPH3K1myJJYsWWLRa/k+/IiICCxatAjTpk3DwIEDLfo+rVq1gkKhwKVLlyx6fXaHKNmLRCJx2rKTnEfHBwGA3r2Bbdv0OHfO9FbQvj1HxwgxQdcOYo4rHBv58wNz56oxaJBpY6RtWz1kMuf+/ezJFY4PknPo+HBcM2fqsG8fi5iYtMF1vnws6tYVQijMeNOJ7HDHYyNTAU3u3Lmxf/9+vH//Hp6eniYfyLp166BQKCz+fvny5UPPnj0zU4RUERERiIiIwKRJkzB27NhM/V+O4xx2Lps15PSJQpwbHR8khUAALFmiRIcOCiQlfegW7tRJh4IF3XPRN2IeXTuIOa50bHTsqMPhw1ocP/6hiuzvz2LAAI0dS+XcXOn4INZHx4dj8/YGli5VYtgwWZpdnaZPVyOnPzp3PTaY+Ph4p6uFL1iwAHPnzsW4ceMwderUTP3fP/74A3369MG8efMwZMiQHCohIYQQQgghhBBCiOWcLqBZunQppk2bhkaNGmHixIkmz4eGhgIAnj59igEDBqBdu3YoVqwYGIZBVFQUVqxYgaJFi+LIkSOZGu1DCCGEEEIIIYQQklOcLqBp0aIFoqKizD4fHx+f+ufw4cNx/fp1xMbGwmAwIDAwEC1btsSYMWPg7c2/MCYhhBBCCCGEEEKIrTldQEMIIYQQQgghhBDialx3pVxCCCGEEEIIIYQQJ0EBDSGEEEIIIYQQQoidUUBDCCGEEEIIIYQQYmcU0BBCCCGEEEIIIYTYGQU0LiIpKQmTJk1CmTJlkDdvXoSFhWHHjh32LhZxAKdPn4aPjw/v18WLF+1dPGJDiYmJmD59Otq2bYvixYvDx8cH8+bN433t1atX0aZNGxQsWBCFCxdG9+7d8fjxY9sWmNiMpcfGkCFDeK8loaGhdig1sYWTJ09i2LBhCA0NRYECBVC2bFl06dIFV69eNXktXTfcj6XHB1073M/169fRsWNHhISEIF++fAgKCkLjxo2xZcsWk9fStcP9WHp8uOO1Q2TvAhDr6NGjB/7++2/MnDkTxYsXx/bt29GvXz+wLIsvv/zS3sUjDmD69OmoU6dOmsfKli1rp9IQe4iLi8P//vc/hISEoEWLFvjtt994X3fv3j20atUKISEhWLt2LdRqNebNm4fmzZvj9OnTyJ07t41LTnKapccGAMhkMuzatSvNY1KpNKeLSOxkzZo1iIuLw+DBg1G6dGm8ffsWy5YtQ6NGjbBjxw58/vnnAOi64a4sPT4Auna4m/fv36NgwYJo37498ufPD6VSiW3btmHQoEF4+vQpxo8fD4CuHe7K0uMDcL9rB22z7QIOHTqEjh07YvXq1ejQoUPq423btsWdO3dw8+ZNCIVCO5aQ2NPp06fRqlUrrFu3Dm3atLF3cYgdcZzxcs8wDN6+fYvixYtj4sSJmDx5cprX9e7dG6dPn8aVK1fg5eUFAHj69CmqVq2KoUOHYtasWTYvO8lZlh4bQ4YMwa5du/D8+XN7FJPYQWxsLAICAtI8lpSUhCpVqqBs2bLYuXMnALpuuCtLjw+6dpAUjRo1wqtXr3Dz5k0AdO0gaX16fLjjtYOmOLmAPXv2wNPTE+Hh4Wke79atG16+fIlLly7Zp2CEEIfCMAwYhkn3NXq9HgcPHkTr1q1TK0oAULhwYdSpUwd79uzJ6WISO7Dk2CDu6dPGNwB4enqidOnSqRVmum64L0uOD0I+5u/vn9pxTNcO8qmPjw93RQGNC/jnn39QqlQpiERpZ6wFBwenPk/IuHHj4O/vj8DAQLRr1w7nzp2zd5GIA3r06BFUKlXq9eNjwcHBePjwIdRqtR1KRhyFSqVCqVKl4Ofnh3LlymH8+PF49+6dvYtFbOj9+/e4du0aypQpA4CuGyStT4+PFHTtcE8sy0Kv1+PNmzdYvXo1jh49iq+++goAXTtI+sdHCne7dtAaNC4gLi4OQUFBJo/7+vqmPk/cl5eXFwYPHoywsDD4+fnh4cOHWLp0KVq2bImtW7eiYcOG9i4icSAp14uU68fHfH19wXEc4uPjkS9fPlsXjTiAkJAQhISEoFy5cgCAqKgoLF++HCdPnsSxY8fg6elp5xISWxg/fjyUSiXGjRsHgK4bJK1Pjw+Arh3ubOzYsVi7di0AQCKRYP78+ejTpw8AunaQ9I8PwD2vHRTQuIj0hqbTsHX3VrFiRVSsWDH137Vq1ULLli1Ru3ZtTJ8+nQIawouuKYTPsGHD0vy7fv36KF++PHr16oV169aZPE9cz5w5c7B161YsWLAAlSpVSvMcXTeIueODrh3ua8yYMejZsydiY2Nx4MCB1ABvxIgRqa+ha4f7yuj4cMdrBwU0LsDPz493lEzK0C++VJq4Nx8fHzRt2hRr1qyBSqWCTCazd5GIg/Dz8wPAP/Lu3bt3YBgG3t7eti4WcWCtWrWCQqGg9c7cQEREBBYtWoRp06Zh4MCBqY/TdYMA5o8Pc+ja4R4CAwMRGBgIAGjSpAkAYNasWejSpQtdO0i6x4e5Hbxc/dpBa9C4gHLlyuHevXvQ6/VpHr99+zYA2kqZ8Pt41xZCUhQtWhQymSz1+vGx27dvo1ixYi69tSHJGo7jIBBQlcKVRUREICIiApMmTcLYsWPTPEfXDZLe8ZEeuna4nypVqkCv1+Px48d07SAmPj4+0uPK1w7X/K3cTMuWLZGUlGSyP/ymTZuQP39+VKtWzU4lI44qPj4eBw8eRPny5enGR9IQiURo1qwZdu/ejcTExNTHo6OjU7dsJ+RjO3fuhFKppHuNC1uwYAEiIiIwbtw4TJo0yeR5um64t4yOD3Po2uGeTp8+DYFAgKCgILp2EBMfHx/muPq1g6Y4uYDGjRujfv36GDNmDBITE1G0aFHs2LEDR44cwcqVK91+qzJ3179/fxQqVAiVK1dOXSR42bJleP36NZYvX27v4hEbO3z4MJRKZWpF6O7du9i5cycA47VELpdj8uTJaNCgATp16oTRo0dDrVZj3rx58Pf3x/Dhw+1ZfJKDMjo23rx5gwEDBqBdu3YoVqwYGIZBVFQUVqxYgbJly6Jnz572LD7JIUuXLsXcuXPRqFEjNG3aFBcvXkzzfGhoKADQdcNNWXJ8PH36lK4dbmjUqFHIlSsXqlatioCAALx9+xY7d+5EZGQkRo4cmTp9ha4d7smS48Ndrx1MfHw8Z+9CkOxLSkrCN998gz///BPv3r1DyZIlMWbMGLRv397eRSN29v333yMyMhJPnjxBcnIyfH19UaNGDYwZMwZVqlSxd/GIjZUvXx7R0dG8z127dg1FihQBAFy9ehUzZszAxYsXIRKJUKdOHcyZMwdFixa1ZXGJDWV0bHh7e2P48OG4fv06YmNjYTAYEBgYiJYtW2LMmDG0ToCLatGiBaKiosw+Hx8fn/p3um64H0uOj/j4eLp2uKENGzZg48aNuHfvHt6/fw+FQoGQkBD07NkTnTp1SvNauna4H0uOD3e9dlBAQwghhBBCCCGEEGJntAYNIYQQQgghhBBCiJ1RQEMIIYQQQgghhBBiZxTQEEIIIYQQQgghhNgZBTSEEEIIIYQQQgghdkYBDSGEEEIIIYQQQoidUUBDCCGEEEIIIYQQYmcU0BBCCCGEEEIIIYTYGQU0hBBCCCGfmDdvHsLCwuxdDEIIIYS4ESY+Pp6zdyEIIYQQQmzFx8cn3ee7dOmChQsXQqvVws/PzzaFIoQQQojbE9m7AIQQQgghtnT37t3Uv0dGRmLevHm4ePFi6mNSqRSenp72KBohhBBC3BhNcSKEEEKIW8mbN2/ql5eXl8lj3t7eJlOchgwZgq5du2Lx4sUoWbIkChcujIiICOj1ekybNg1BQUEoV64c1q9fn+ZnvXjxAn369EGRIkVQtGhRdOnSBU+ePLHp70sIIYQQ50ABDSGEEEKIBU6fPo1Xr15h3759+PbbbxEREYFOnTrBx8cHR48eRZ8+fTBmzBg8e/YMAKBUKtGqVSsoFArs27cPBw4cgKenJzp06ACtVmvn34YQQgghjoYCGkIIIYQQC/j4+GD+/PkoWbIkevTogZIlS0KpVGLs2LEoXrw4xowZA4lEggsXLgAAduzYAYFAgKVLlyI4OBilS5fGTz/9hGfPnuHMmTN2/m0IIYQQ4mhoDRpCCCGEEAuULVsWAsGHvq2AgACUK1cu9d9CoRC+vr6IjY0FAFy7dg0PHz5EoUKF0nwftVqNR48e2abQhBBCCHEaFNAQQgghhFhAJEpbbWIYhvcxlmUBACzLolKlSli1apXJ9/L398+5ghJCCCHEKVFAQwghhBCSAypWrIjIyEjkzp07dTFiQgghhBBzaA0aQgghhJAc8OWXX8Lf3x9du3bF2bNn8fjxY5w5cwYTJ07E8+fP7V08QgghhDgYCmgIIYQQQnKAXC7Hvn37UKhQIfTo0QPVq1fH8OHDoVarkStXLnsXjxBCCCEOhomPj+fsXQhCCCGEEEIIIYQQd0YjaAghhBBCCCGEEELsjAIaQgghhBBCCCGEEDujgIYQQgghhBBCCCHEziigIYQQQgghhBBCCLEzCmgIIYQQQgghhBBC7IwCGkIIIYQQQgghhBA7o4CGEEIIIYQQQgghxM4ooCGEEEIIIYQQQgixMwpoCCGEEEIIIYQQQuyMAhpCCCGEEEIIIYQQO6OAhhBCCCGEEEIIIcTOKKAhhBBCCCGEEEIIsTMKaAghhBBCCCGEEELsjAIaQgghhBBCCCGEEDujgIYQQgghhBBCCCHEziigIYQQQgghhBBCCLEzCmgIIYQQQgghhBBC7IwCGkIIIYQQQgghhBA7o4CGEEIIIYQQQgghxM4ooCGEEEIIIYQQQgixMwpoCCGEEEIIIYQQQuyMAhpCCCGEEEIIIYQQO6OAhhBCCCGEEEIIIcTOKKAhhBBCCCGEEEIIsTMKaAghhBBCCCGEEELsjAIaQgghhBBCCCGEEDujgIYQQgghhBBCCCHEziigIYQQQgghhBBCCLEzCmgIIYQQQgghhBBC7IwCGkIIIYQQQgghhBA7o4CGEEIIIYQQQgghxM4ooCGEEEIIIYQQQgixMwpoCCGEEEIIIYQQQuyMAhpCCCGEEEIIIYQQO6OAhhBCCCGEEEIIIcTORPYugDNRq9V48eIFChQoAKlUau/imDVwoAxHj5p+tLlycShQgEOBAiwKFWJRsKDxq1Ah42P+/gDD2KHAxKU5y3lDiKOhc4eQzKPzhpDMo/OGkMzLqfOGAppMMhgM9i5Chm7fFuLtW9PBUW/fAo8fm/9/MhmHwEA29atwYe6jv7PIl4+DgMZckSxwhvOGEEdE5w4hmUfnDSGZR+cNIZmXE+cNBTQuKDo6aymKSsXg3j0h7t0T8j4vFnMoWNA0uEn5e8GCHMTi7JScEEIIIYQQQghxTxTQuJiEBOD9+5yZp6TTMXj8WGh2FI5AYJxC9Wl4kxLoFCrEgkZNEkIIIYQQQgghpiigcTFv3gjg58ciLs72c5FYlsGzZwyePRPg3Dn+1+TNawxtihRh0aiRHu3b6yCR2LachBBCCCGEEEKIo6GAxsUUK8bi4cNEJCUZpzpFRwvw9Kngv78zqX+PibHPYjIxMcaffekSsGOHBIsWGTB7thpffKGnBYoJIYQQQgghhLgtCmhclKcnULYsi7JlWd7n1Wrg2bO0wc2HIEeAFy8YsGzOJyYPHgjRrZsCYWF6zJmjQqVK/OUlhBBCCCGEEEJcGQU0bkoqBUqUYFGiBH8gotMBL14waUKbj0fiPHsmgE5nvQDnzBkR6tf3RJcuOkydqkaBApzVvjchhBBCCCGEEOLoKKAhvMRioEgRDkWKGACYbh9mMAAxMYzZKVTR0QKoVJkLcDiOwe+/S/Dnn2KMGKHByJEaKBRW+oUIIYQQQgghhBAHRgENyRKhEChQgEOBAgZUr24a4HAc8OYNwzuF6p9/hHjyxPwaOEolg/nzpfjtNwmmTlWjSxcdBPZZMocQQgghhBBCCLEJCmhIjmAYICCAQ0CAAVWqpH3OYAA2bRJjzhwpXr0yn7y8fCnAsGFy/PKLAXPmqFC3rmkQRAghhBBCCCGEuAIal0BsTigEunfX4dKlREyYoIZMlv56M9evC9G6tSe6dpXj/n06ZAkhhBBCCCGEuB6nbO2ePn0aPj4+vF8XL15M89qrV6+iTZs2KFiwIAoXLozu3bvj8ePH9ik4ScPTE5gyRYNLlxLRubM2w9fv2ydGjRqemDRJinfvaE9uQgghhBBCCCGuwykDmhTTp0/H4cOH03yVLVs29fl79+6hVatW0Gq1WLt2LZYtW4YHDx6gefPmePPmjR1LTj5WsCCHn39W4cSJRNSqpU/3tXo9g59/9kDlyp5YvlwCbca5DiGEEEIIIYQQ4vCcOqApXrw4QkND03x5enqmPj937lxIJBJs2bIFTZo0QevWrbFlyxa8efMGS5cutWPJCZ9KlVjs3ZuM9euTUbRo+uvNxMcLMGWKDDVqeGL3bhE42pWbEEIIIYQQQogTc+qAJj16vR4HDx5E69at4eXllfp44cKFUadOHezZs8eOpSPmMAzQqpUeFy4kYe5cFby9009eHj4UokcPBVq0UODqVZc9nAkhhBBCCCGEuDin3sVp3Lhx6Nu3L+RyOUJDQzF+/HjUrFkTAPDo0SOoVCoEBweb/L/g4GAcP34carUaUqk03Z+hVqtT/679bz6NlubV2ETfvmqEhyfi++8VWLtWDr3e/LozZ8+KUK9eLnz5pQqTJyehQAHWhiUl6aHzhpCsoXOHkMyj84aQzKPzhjgSljV22jMOvuSoufMmo3whI04Z0Hh5eWHw4MEICwuDn58fHj58iKVLl6Jly5bYunUrGjZsiLi4OACAr6+vyf/39fUFx3GIj49Hvnz50v1ZL168gMGQdrpNTEyM9X4ZkqGBA4GmTT2wdGkhnDxp+nl+bNs2GXbtkqBHjxj06PEKcjkFNY6CzhtCsobOHUIyj84bQjKPzhtiTwYDcPiwH9asyY8xY6JRo0aCvYtkkY/PG6FQiGLFimXr+zllQFOxYkVUrFgx9d+1atVCy5YtUbt2bUyfPh0NGzZMfY5JJ3pL77kUBQoUSP27VqtFTEwM8ubNC4lEksXSk6wIDATCwrQ4cyYOM2fmws2bYrOv1WiEWL26AHbvzotJk5LQsaMaQqENC0vSoPOGkKyhc4eQzKPzhpDMo/OG2JNOB2zfLsXSpQo8fGiMJzZsCEKHDu8cehRNTp03ThnQ8PHx8UHTpk2xZs0aqFQq+Pn5AUDqSJqPvXv3DgzDwNvbO8PvyzdESSKRZHvoEsmaRo2A+vWV2LxZjDlzpHj50vy6MzExQowe7Y01azwxZ44Kn3+e/sLDJGfReUNI1tC5Q0jm0XlDSObReUNsSaMBfv9dgu+/98DTp2nbdBcuSHD5sgJhYY7ffrP2eeNSq6py/23lwzAMihYtCplMhtu3b5u87vbt2yhWrBhdgJyUUAh066bDpUuJmDRJDbk8/YWEb9wQok0bT3TuLMe//7rUIU8IIYQQQgghTkOpBH7+WYLKlXNh9GiZSTiTYuFC92yru0xrNT4+HgcPHkT58uUhlUohEonQrFkz7N69G4mJiamvi46OxunTp9GqVSs7lpZYg0IBTJqkwaVLiejaVQuGST+oOXBAjJo1PTFhghRxcQ48Xo4QQgghhBBCXEhSErBkiQQVK+bCpEkyvHiRfhRx8qQIly653zoVThnQ9O/fHzNnzsTOnTtx+vRprFu3Do0bN8br16/xzTffpL5u8uTJUKlU6NSpEw4fPozdu3ejU6dO8Pf3x/Dhw+34GxBrKlCAw/LlKhw/noSwMH26r9XrGaxc6YHKlXNh2TIJNBobFZIQQgghhBBC3Mz798DChR4oXz4Xpk+XITY24wiiRAkDli9XomJFx5/iZG1OGdAEBwfj6NGjGDFiBMLDw/HNN9+gdOnSOHToEOrVq5f6ulKlSmHPnj0Qi8Xo1asXhg0bhqJFi2Lfvn3InTu3/X4BkiMqVWKxe3cyNm5MRvHi6Z/M798zmDpVhho1PLFzpwhc+oNvCCGEEEIIIYRYKC6OwZw5Hihf3gvffivFu3cZRw9lyxrw669KXLiQhK5ddRCb3xfGZTHx8fHUNLWQWq1GdHQ0AgMDaf0aB6fVAr/+KsH8+R6Ij8/4YlCzph7ffqtGlSrul9LmNDpvCMkaOncIyTw6bwjJPDpviDW9fs1g2TIP/PqrBMnJli0rUaGCAePHq9GihR4CJxlCklPnjZP8+oRkjkQCDBmixZUrSRg6VAORKP0c8tw5ERo08MTAgTI8e0br0xBCCCGEEEKIpV68YDBpkhQVK+bCkiUeFoUzoaF6bN2ajJMnk9CqlfOEMzkpR7fZLlKkCBgLNy9//PhxThaFuClfXw5z56rRr58WM2ZIsWdP+uPktm6VYNcuMYYP1+CrrzTw9LRRQQkhhBBCCCHEyTx5wuDHHz2wYYMEWq1lbf/atfWYMEGNunUNsDAucBs5GtDMmzcv9e9xcXFYtGgRGjZsiNDQUADAxYsXcfToUYwfPz4ni0EIihdnsWGDEmfOCPH11zJcu2Z+RXC1msGiRVKsXy/B11+r0aWLe85/JI7h3TsG+/aJsHu3GDdvGo/b3LlZBARwH30Z/50nD4fcuVnkycPB35+DKEev8IQQQgghxF09eCDAd995YMsWMfR6y1KWBg10GDdOg1q1aFkJc2y2Bk2PHj1Qp04dDBw4MM3jK1euxIkTJ/D777/bohjZQvMzXQPLAlu2iDF7thQvX2Y8ji5/fha9e2vRu7cWefPSkk2ZRedN5r1+zWDvXjF27RLh9GmRxTe9T/n5sf+FNhzy5GH/+/NDoPNxuKNQWPmXINlG5w4hmUfnDSGZR+cNyYw7dwRYvNgDO3aIwbKW1VGbNTMGM9WquU4wk1Pnjc36V48dO4ZZs2aZPN6wYUPexwnJKQIB0KWLDq1b67BsmQd+/NEDSqX5i8vLlwLMmyfFokUeaNNGh/79tahenYbjEet6/pzB7t1i7NolxvnzQotveOmJixMgLs6y18rlaQMbc3/Pk4eDry9Hc4QJIYQQQtzI9esCLFokxe7dInCcZfXU1q11GDdOjQoV2BwuneuwWUDj6+uLPXv2YOTIkWke37t3L3x9fW1VDEJSKRTAxIka9OypxZw5Uvz+uzjdi41Ox2D7dgm2b5egfHkDBgzQoEMHHeRyGxaauJTHjxns2mUMZS5dsu98JKWSwZMnDJ48yTh5EQqNo3Jy5zYGN5+O0gkMZFGligG5ctmg4IQQQgghJMdcvizEwoUeOHDAsjUfBAIO7dvrMGaMBmXLUjCTWTZrEUyePBkjRozAmTNnUteguXTpEo4cOYIlS5bYqhiEmMifn8NPP6kwaJAGX38tw+nTGZ8WN24IMXKkHNOns+jRQ4d+/TQICqLpTyRjd+8KUkOZGzfMr4XkyAwGBjExDGJiAID/dxAKOVSsaEDt2gbUrq1HjRp6+PjYspSEEEIIISSrzp4VYtEiDxw7ZlkwIxJx6NTJGMwUL07BTFbZbA0awBjI/PLLL7h79y44jkOZMmUwaNAgVKtWzVZFyBaan+n6OA44cECEmTOluHvX8sYzw3Bo0kSPAQO0aNCAtoj7mLufNxxnHBKaMn3p3r2shzLlyhlQuDCLN28YxMYKEBvLpDs9z5EIBBxCQljUrq3/78sAX18KNdPj7ucOIVlB5w0hmUfnDUnBccCpU0IsWCBFVJRlYzkkEg7du2sxapQGRYq4T93O6degAYBq1ao5TRhD3BPDAM2b69G0aRJOnBBh1SoJDhzIeJ4lxzE4eFCMgwfFKFbMgP79tejaVUsjBtwUyxqHg+7aJcbu3SI8fpz1UKZSJT1at9ajdWsdSpQw7Y1ITgZiYz8ENil/f/2awZs3DF6/Fvz3J4O4OPslhyzL4Pp1Ia5fF2LFCg8wDIdy5dIGNrlzu89NnRBCCCHEUXAccPiwCAsXeuDiRcsiAqmUQ+/eWowYoUHBglSHsxabBjQsy+Lhw4eIjY0Fy6ZtaNSuXduWRSEkXQIB0KCBHg0a6PH4MYO1az3w229ivHuXcQP34UMhpkyRYc4cKTp10qJ/fy2Cg2mYn6szGIBz54yhzJ49Yrx4kbUwhGE4VK9uQMuWOrRqpcuwJ0KhABQKDkFBGa+Kr9fjv9E3DN68MYY4puHOh39rtTk3OofjGNy6JcStW0KsXOkBAChTxpAa1tSuradd0wghhBBCchDLAnv3irBokRTXrlnWoahQcOjXT4vhwzXIk4fqatZmsylOFy9eRP/+/REdHQ2OS/sjGYZBnKVbjdgRDf9zbyoVsGOHGKtWeVh8AUtRq5YeAwdq0KKFHmLLpnG6DFc+b3Q64PRpEXbtEmHvXjFiY7MWyggEHMLCDGjdWoeWLXXIl8/+NzuOA96/B968MYY1xhE5piNzjM8JkJBg/TCnRIkPa9jUrq13u94ZVz53CMkpdN4Qknl03rgfgwH4808xFi/2wO3blrVrvLw4DByowdChWvj5uVedjI/TT3EaPXo0KleujK1btyJv3rxgaI9i4mRkMqB7dx26ddPh0iUhVq2S4I8/xNDpMj6Wz54V4exZEfLnZ9Gnjxa9emlpdICTUquB48dF2LVLjP37RYiPz1ooIxZzqFdPj1atdGjRQg9/f8c6HhgG8PEBfHxYlCiR8es1GuNUqxcvBPjrLyGiokQ4d06Y5fcHAO7fF+L+fSHWrZMAAIKC0gY27jTPmRBCCCEku3Q6YNs2Mb77zgP371sWzPj6shg6VIsBAzS0fIMN2GwETYECBXDmzBkUK1bMFj8uR1C6TD71+jWDdeskWLtWkqkpLWIxh/BwHQYM0CI01ABXzitd4bxJTgaOHDGGMgcPipGUlLUPTCrl0LChcT2Zpk11Ln+TY1ng1i0BoqJEiIoS4exZId6+td46OIUKfVjDJizMgKJFWZc6l1zh3CHE1ui8ISTz6LxxD+fPCzFqlMzijVACAliMGKFB375aeHrmcOGckNOPoKlatSoePnzo1AENIZ/Kk4fD+PEafPWVBvv2ibBypYdFK57rdAy2bZNg2zYJKlQwYMAADTp00EEms0GhiUXevwcOHjTuvHT0qAgqVdZa/p6eHJo00aF1ax0aNdK71Q1OIADKl2dRvrwWgwdrwbLGbcaNgY1xlM3r11kPbJ49E2DLFgm2bDGOsMmfn02zhk3Jkq4V2BBCCCGEZFZiIjB7thSrV0sy3PgEAAoUYDFypAY9e2ohl9uggCQNm42g2b17N7799luMGDECwcHBEInSNmJDQkJsUYxsoXSZWOL2bQFWr5Zg82ZJprZA9vVl0aOHDn37ahAU5DpTN5zpvHn7lsHevSLs2SPG8eMii6av8fH25vDFF8ZFfhs00MPBf2274Tjg/n1BalgTFSXK8uLKfPLkYVGr1ofApkwZFgL7bWSVac507hDiKOi8ISTz6LxxXUeOiPDVVzI8e5ZxBSgwkMXo0Rp066aFh4cNCufkcuq8sVlA4+vra/rDGQYcx9EiwcQlxccDmzZJsHq1BA8eWL6oMMNwaNpUjwEDtKhfX+9UDUo+jnze6HTAjRtCnD8vxIEDYkRFCWEwZC2UyZ2bRcuWOrRurUedOu63GLQ1cBzw+LEAZ858CGyio613Avj5sahV68MaNiEhjh3YOPK5Q4ijovOGkMyj88b1xMUxmDxZmjrKOD3FihkwZowGnTrpqP6aCU4f0Dx9+jTd5wsXLmyLYmQLXbxIVrCscVHZlSslOHRIZNHQwhTFixvQv78WXbtq4e2dg4XMQY503rx5w+Cvv4T/fYlw5Yowy1OXAOMQUGMoo0PNmgYIM7e5F7HAkydMalgTFSXE48fWe5O9vTnUqKFHWJgetWoZUKGCwaEqJo507hDiLOi8ISTz6LxxHRwH/PGHGBMmSPHmTfq9UKVLGzBunAZt2+ogstnCJ67D6QMaV0AXL5Jdjx8zWLPGA7/9Js7U7jYKBYdOnbTo31+LcuXYHCyh9dnrvDEYgDt3BPjrLxEuXBDi4kVhpkYymVOkCIvWrY2hTNWqBocegeGKnj9PG9hYugOBJRQKDp99ZpwSVauWHlWqGOw6PY3uOYRkHp03hGQenTeu4cULBmPHyrB/f/q9TVIphylT1Bg6VEvBTDa4RECzefNmrF27Fk+ePMGhQ4dQuHBhLF++HEWKFEGLFi1sVYwso4sXsRalEtixQ4yVKz1w40bmGpi1a+sxcKAGX3zhHNNobHXevH8PXL5sDGP++kuIy5dFSEiwzgqxpUoZ0Lq1cU2ZChVo4VlH8uoVg7NnPyw6fOeO9QIbDw8O1aoZ/lvHRo/QUAMUCqt9+wzRPYeQzKPzhpDMo/PGubEs8NtvYkyfLsuw7hsWpseSJSoUK+ZcHb6OyOl3cfr1118xd+5cDBkyBIsXLwbLGg8Kb29vrFixwikCGkKsRS4HevTQoXt3Hf76S4hVqyTYuVNs0aK0KaMHChRg0aePFr16aZEnj3sNhOM44OFDQWoY89dfIvzzjyBT08cyUr68Aa1aGUfKlClDNzFHlS8fh3btdGjXTgfAOI3t40WHb93KemCj0XwYrbNwISAScahc2YBatYyhTY0aeqedekgIIYQQ5/fggQAjR8oy3EXWy4vDN9+o0KOHjkZ/OzibjaCpXr06pk2bhpYtW6JQoUI4c+YMgoKCcPv2bbRs2RIPHz60RTGyhdJlkpNiYhisWyfB2rUSvHyZuStnQACLQoVYFCrE/fdn2n8HBHB2uxhb47xRKoErV4Rppiu9fWvdX0gg4FClSspIGT2KFqVQxhW8e8fg7NkPgc2NGwKwrHWCPIbhUL48mzrCplYtA/z9rXdLpXsOIZlH5w0hmUfnjfPR64GffpJg3jwp1Or06zXNm+uweLEKBQq4V4duTnP6ETRPnjxBhQoVTB738PCAUqm0VTEIcVh583KYMEGD0aM12LtXhJUrPXD2rGWnaGysALGxAly5wv+8RMKhYMEPgU3BgiwCA9P+29PTir9MNnAc8OwZg4sXP0xXunFDCL3euvOKvLyM64189pkB1asb1xvJlcuqP4I4AF9fDi1a6NGihR6AcSrc+fMinD0rwtmzQly5kvVji+MYXL8uxPXrQvz8s3E/yjJlDKlbe9eqpUf+/FQZIoQQQoj13LghwPDhcly7lv4o4dy5WSxcqEZ4uI6m5zsRmwU0RYoUwY0bN0x2azp8+DBKly5tq2IQ4vDEYiA8XI/wcD1u3RJg9WoJtmyRQKnM+pVVq2Xw6JEQjx6Zf42vL4uCBY2BjTG8MQY4xmCHRb58XI4sJKbVAtevC1NHxvz1lwgvXlh/uE+pUgaEhhrDmM8+M6BUKcfeYpnkDG9voGlTPZo2NQY2SUnApUsfRthcviyERpP1c+3OHSHu3BFizRrjv4sWNaSGNbVq6VGkCEeVJEIIIYRkmloNLFzogR9/9Miwc6lzZy3mzlXDz486ipyNzQKaESNGYPz48dBoNOA4DpcvX8b27dvx/fffY8mSJbYqBiFOJTiYxfffqzFjhhq//y7B6tUSPHyYM3s5v3snwLt3wM2b/N9fKOSQPz+XGt58PCIn5cvbGxk2Pl+/ZlLXjbl40TiCIaOhmZkllxunK6WEMaGhBrpBEV6enkC9egbUq2cAoIFaDfz9tzGwOXvWeJwmJ2f9+DQGo0Js2CABABQsyP43Hco4JapkSVp0mhDiOGJjGZw4IcKpUyK8eMHA09M4jdrfn0Pu3ClfbOrf/fw4CHOmWkII+ci5c0KMHCnDv/+mf8IVKsTihx9UaNRIb6OSEWuz6S5O69atw8KFC/H8+XMAQIECBTBx4kT07NnTVkXIFpqfSeyNZYFjx0RYtUqCQ4dEVl0U1xo8PU3XwMmbV4Nnz+Lx4EEeXL4swaNH1q/JFS7Mpk5X+uwzPUJCWNo2kFiFTmcc4ZWy8PC5c9bbHQwwNnxSFh2uVUuP4OAPI7vonkNI5tF5kzkqlXHa5/HjIhw7JjLbSWMOw3Dw9eUQEMB9FOKwH4U5HPz9jf8OCDAGOnR/djx03jiuxERg9mwpVq3ySPd1DMOhf38tpk9X05R9G3Hqbbb1ej22bt2Khg0bIm/evHj79i1YlkVAQEBO/2iroosXcSSPHzM4cECMhw8FeP5cgGfPBHj2jLH64rmORiLhUKmScVRMSihD63wQWzEYgFu3BP+tYWMcZfPmjfXOOW9vDjVrGhcdrlpVCW/vxyhevBDdcwixENXV0seyxvUrTpwwhjLnzomyNa0zK3x90wY4uXN/GKETEJD23/7+HMRimxbPLdF545gOHxZh9GgZnj1Lv55RqpQBS5eqUL26wUYlI4CTBzQAkD9/fly4cMFkDRpnQhcv4gyUSqQJbIx/fvj38+cCq08pykl58rCoXv1DGFOxogF0+hFHwXHAvXuC1LAmKsr6ayjly2dA0aIcChdmUaTIh6+gIBb589P0AkI+RnU1U8+fMzh+XIQTJ4xf1gyVbcHHh/1oNA6HgAA29e+5cxvXygsKMq6VR2vLZQ2dN47l7VsGkydLsXWrJN3XiUQcvvpKg3HjNFQ3tgOn38WpatWquH79ulMHNIQ4A7kcKFmSRcmS/NtEc5zxwv/sGYPoaGNwYwx0PoQ5MTGMXaZPCQQcQkJYVK+uTx0hQ4uqEkfGMEDp0ixKl9aiTx/j+fXkCZO66PDZs0I8fpy9BOXVKyFevQLOnTN9Tiw2rgv1IbjhEBT04d9+fnT+EOJuEhOBM2dEqaHMvXvOneLGxwsQHw/cv5/+6zw8jEF2UBCbeh38+E+a9kEcHccBkZFiTJwozTBIrVRJj6VLVShfnr++T5yXzQKa/v37Y+rUqXjx4gUqVaoEuVye5vmQkBBbFYUQt8YwSO2JqlSJ/6Ku1QIvXvCPvnn2TIDoaAGSkrLf6vPxYf9bN8aA0FA9qlY1OMx234RkBcMAQUEcgoJ06NZNB8DYe33unAhRUUKcPSvC3bvWayzpdAwePhSaXTzc0/NDg+Xj0TcpXwqF1YpCCLETvR64ckWI48eNoczFi8IMd3ixRP78LPR6Y6cOyzp+0qvRMPj3X6HZRVT9/c2HNwUL0to4xL6eP2cwZowMBw+mP6dPKuXw9ddqDBmipWPWReX4FKdhw4Zh3rx5KFKkiOkPZxhwHAeGYRAXF5eTxbAKGv5HiBHHAe/fIzW8+XQETnS0AC9fMjAY0lboSpc2pC7k+9lnxh1saDgycTexsQzOnhWmrmNz86bAbgt+BwSYhjYpjZaCBWntB+J83KGuxnHAo0eC1EDm1CnrLF7u7c2hbl096tc3fhUtauzEYVkgPp7BmzcMYmONf759K0j999u3DN68Mf7b+Jzp/d/RiUTGTQ5SApyPv4oU4eDj49qjEd3hvHFULAusWyfB9OlSJCamf5CFhemxZIkKxYrRqBlH4LRr0Pj5+eHu3btQqVTpvi47U59+++03jBw5EgqFInWHqBRXr17FjBkzcOnSJQiFQtStWxdz5sxBUFBQpn9OyodQqFAhqFQqGAy0EJO1KRQKk9FVxDkZDMCrVwwePtTj1avXCAvzQ/786a9AT4g7io837qKSso7NlStCh2jcCAQcChbk0oQ2H3/lzevaDRbinFy1ofnuHYNTp4Q4dkyM48dFePo0+70bIhGH0FADGjQwBjKVKhms0iPPssD795kLdKwx4icneXlxn4Q2H/4eGMhCkv5SIQ7PVc8bR/fggQAjR8oQFZX+ieflxeGbb1To2VNH910H4rQBja+vL+7du5djOza9ePECNWrUgEKhQEJCQpqA5t69e2jYsCFCQkIwevRoqNVqzJs3D/Hx8Th9+jRy586dqZ+V8iH4+PjA09MTMpnM2r+OW+M4DgkJCeA4Dj4+PvYuDrESuukTkjlJScBff4lw5QqL27dViIvzxrNnxgaZrXdbSY9U+iG8KVaMRfHixq9ixQwoVIgWLyb24Sr3HK0WuHBBmLrb0pUrQquMtCtd2oB69YyBTO3aeodYlyVlVO6bN4KPAh0m9d/Gv6cNdRwp0GGYtGH2p0FOQIBpmM1xxo4srdb4pdMx//2d4Xks7d9TXqPTffz3tI9pNJ8+b/y78U/jdLCPH9NoOAiFWtSsCTRvbhxJRVNgc45eD/z0f/buO7yp6g8D+HuTNG2TUtpCZZcWZJUyZPwUZG+ZgsiesjcUEFCGLFuWInvJRhQEZYjsISAqqICAgAiFAoKFUmibpGmS+/sjtlBy06Zt0iTt+3mePkIS29OQc8+97z3ne5YqERHhleHGHW+9lYwFC7QoWpQ7lroatw5o/vrrr0yHIbbq3LkzBEGAv78/du/enSag6dOnD06ePInff/8dvr6+AIA7d+6gevXqGDp0KKZPn56pn5Xyj+Dr64tChQrZ9feg52JiYtxuC3ayLrecLBPltJf7jskEPHwoICpKhtu3Lb/u3XNOcW8pnp4iQkJeDG6MqX8uUoQ7rZDjuOuYI4rAn3/KUgv7nj6tgEaT/f5csKAJDRsa0KCB+atYMfe/yEsJdB4/luHBAwF37sgQFSVLPTZGRcnw4IHrHGRUKhH584sWAYyrHK+leHqKqFvXgKZNDWjePBnBwe7/uXEVFy/KMGKEChcupH8XIzDQhLlzdXj7bc6acVVuvYtT9erVIWTwyYqKisr09/3qq6/w448/4qeffsKsWbPSPGcwGHDgwAF06dIlNZwBzEup6tati71792Y6oCEiInIWmQwoUkREkSJG1KplucRWrzfXhTIHNkLqhUpKgPP4cc5dsCQlCbh6VY6rVy1PQL29zeFNSnCTMvOmdGkTXnmFy6Yo73j4UEidIXP8uMIuoYKXl4hatQypoUxYWO6r9SYIgJ+feaOB0qWBN9+0PB5qtUgT3LwY3ty+LUNiYs4daDQawS5hW05KShJw+LAHDh/2wIQJ3ihTxohmzQxo1iwZtWoZ3X5JlzPodMC8eZ5YuNAzw2XMXbro8fHHOgQEMBjLi3IkoJk0aVKakMQeYmJiMGnSJEybNg3FihWzeP7WrVvQarWoWLGixXMVK1bEsWPHoNPpMky7dDpd6p/1ej0AwGQywWRicSZHMZlMad53cm8p/Sblv0Rkm6z0naJFzV+1alk+l5AgIDpajjt35Lh92/xf85cMd+7IodHkzFWcVivgyhU5rlyRA0hbhVitNi+RCgkxolQpw3//NSIkxIACBRjeUMZcccwRRSAmRoYbN+T4+2/zttenTinx55/2qcJdqVIy6tXTo359Pf73Pz1ePLV1obchRwkCULKk+at+/bTPiSLw6JGAO3cUqcfC27eff92/77zC7a4qZXespUs9oVabUL++Hk2aJKFRIz0KF+Y1UUZ+/tkDY8f64saN9C+9ixUzYt68Z2jUyNxxeTnk2qyNN9mdTZMjAc0777xj9yUrY8eORZkyZdCvXz/J51N2hfL397d4zt/fH6IoIi4uDoULF07359y/f9+iGLBer3epgT+30el0ePbsmbObQXb28OFDZzeByC3Zs+/4+AChoeavF4kiEBenwL17nrh/X/nff1O+lPjnHyWMRscHOImJMvzxhwx//GF54erjY0CJEkkICtIhKCgJJUo8/6+vL4v2U1rOGHN0Ohnu3PHE7dteab7u3PFEYqL9TrlfeUWP119/htdff4aaNZ8hIMCQ+lxMjN1+TK73yivmr5o10z6enCzgwQPzcfD5lxL373vi7l1PJCTk7b2NExNl2LfPC/v2mS9Cy5VLxJtvPsWbbz5FxYqJrD/2goQEGZYuLY6vvw5I93WCIKJTp38xZMg9qNUmREfnUAPJLl4cb+RyOUqVKpWt7+fwI0xGS5uyYteuXdi/fz9++OGHDL9/es/b0raiRYum/lmv1+Phw4dQKpVQcm5flnzxxRf44IMP0l3S5uXlxRo/uUhKvylUqBD7DVEm5HTfCQoCKld+8RETAC0ALQwG4J9/ZC/MupEjOlqOqCg5bt1S5MjyqYQEBf78U4E//7SsXBkQYEJIyPMZNy/OvsmXj1PE8xJH9xuTCbh/X4a//1akzoj5+285btxQ4N49x1yZqtUmvPlmMurVS0L9+nq8+qrxv9lk6v++yN4sr6+S//tKQFyckDrbJuV4mPL3u3flLlPA2NNThIeHCKUSUCpFeHik/Nf8mIeH+TFPTxGCYMIff8jx+HHm+8y1a2pcu6bG2rVFERBgQsOGSWjSRI8GDZLg7593j7+HDysxYYJvhseFMmUM+OSTZ/8FhZarQsh1OWq8cXhAI4r27ZgJCQkYP348Bg4ciMKFCyMuLg4AkJycDACIi4uDh4cHAgLMSWXKTJoXPXnyBIIgIH/+/Bn+PKkpSjKZDDI3WtCb0Y5IXbt2xfLly3OkLSmhWHrvn0wmc6vCfmQbpVLJf1eiLHCVvlOmjPnLzPjfl1lcHHDrlhx//y3DjRsy3Lwpw99/m7/i4hw/XsbGyhAbq8Svv1o+FxhoQvnyJrRrl4wuXfTw8XF4c8gFZLffPHsG3Lghx40bMvz1l+y//5o/41qtYy/AZTIR1aubd1tq1MiAGjWM8EidVOaBl5cGUs4qXNj89frrgDnINsEc3ph357l3L20NsDt3ZDAY8F9A8mJYkhKiIDUwefl5pTLlsRefT/vnlNe8+JhcjkwtCdXpdLh9OxpPn4bg+HE1Dh5U4NdfM79zWGysDDt2eGPHDm/IZCL+9z8jmjY1164JCzPliWWqjx8LmDTJC9u2pX/BrlCIGD06CePGJcHLSw6AU4/clb3P0xwe0Dx58sSu3+/x48f4999/sWTJEixZssTi+eDgYLRs2RIbN26Et7c3rly5YvGaK1euoFSpUnZ9I5s2zdk7GIcOJdr82mvXrqX+eefOnYiIiMDZs2dTH3v5fUhOToaHBwd/IiKyjZ8f8NprRrz2muVSo9hYITWs+fvv5+HNzZtyPHvm+LP1mBgZYmJkOHlSgRkzvNCtmx4DB+pRqhTrJuR1BoO5kOxff6UNYW7ckOHhw5y9EVeqlDG1sG/dugZkcG+NXJRCAZQsKaJkSSPq1XOvpZcyGVC5sgH/+18S3n8/CY8eCTh8WIFDhxQ4fNgDT59m7nhtMgn46ScFfvpJgZkzvVC0qCk1rKlf35ArwnLz7FIBd+/KcO+eDLduybBihTLDWaWvvWbA4sVahIVxHCJLbreIslChQtizZ4/F4wsXLsTp06exfft2FChQAAqFAi1atMCePXswffp05MuXDwAQHR2NkydPYujQoXZt19mzrvtWvrhcKKVYc8pjt2/fRrly5bBu3TqsWbMG586dw4IFC9CjRw9s3rwZixYtwu3btxEUFIRBgwahf//+qf9flSpVsHHjRqxatQq//vorSpUqhU8//RT/+9//Un/eli1bEBERgcePH6NRo0Z44403cvA3JyIiZwsIEBEQYETNmmkvVlIKdb4Y3vz9t3mGwq1bjtll5dkzAStWeGLlSiWaNjVg0CA9GjY05Lpdbiit2FhBMoS5eVOG5GTn3NIPDDShdm0jGjVKRoMGBpQsmXeXgpBrKlhQRJcuyejSJRkGgxZnz8px8KACBw964PLlzM/2uH9fhg0blNiwQQmlUsSbb6Zs421A6dKuF1SkjFF378pw966Ae/dk/wUxzwOZBw8EmEy2H0O8vUV88IEOQ4booXDdS0dyMiEuLi5XjAhDhgzB7t27ce/evdTHrl+/jkaNGqFy5coYM2YMdDodIiIi8OTJE5w8eRIFCxbM1M9I2evc19fXokaKn1/Gy6XsKS7uaZb+vy1btmDSpEm4c+cOgOdBS1BQEGbNmoXKlSvD09MTBw8eREREBObOnYvKlSvj4sWLGDVqFGbPno1u3bql/n9ly5bFzJkzUbp0acycORO//fYbfv/9dygUCpw7dw5NmzbF1KlT0aZNGxw+fBgREREQRTH150uJiYmxe1Fpcp6UflOiRAmXWKZB5C7yct8RReDBA+GFGTfy1D/fvCmDTme/i+pXXzVi4EA9unbV4797OeSmYmIEnD5twrlzCXj0qABu3fLAX3/JEBvrnAROqRRRqpQJr75qQpkyxv/+a/7Ky7U5yPVkdry5e9c8u+bAAQ+cOKHI9jbipUqlbONtwJtvGuDpma1vZ5OnT4F792QWwUvKn+/flyEpyX5jTZ06BixapOXszVzEUedpuTq7K1u2LPbu3Ytp06ahd+/eUCgUqFu3LrZs2ZLpcCa3GzJkCNq2bZv693nz5mHWrFmpjwUHB+PatWtYv349unXrlvq64cOHo3nz5gDM26m/8cYbuHnzJsqWLYsVK1agcePGGDNmDADg1VdfxS+//ILDhw/n4G9GRETuRhCAIkVEFCliRJ06RqTUdwBSirQKaWbcpIQ3UVEy6PWZO6G+cUOO99/3xsyZXuja1bz86dVXeQLtDuLigNOnFfjhBwVOnlT8t3U7APjlaDsKF5YOYYKCTNzRhnKl4sVF9OmTjD59kqHTAT/+qMCBAwocPKjArVuZ/9DfvCnHihVyrFjhCbVaRL16BjRvnoymTQ0oVizzYaZOZ56xc/fu89kuL858uXdPliNLbAHA11fEzJla9OqVnCdq8FD25ZqAZvny5ZKFbqtWrYpdu3Y5oUXu5bXXXkv986NHj3D37l2MGDECo0aNSn3cYDCkLpFKERYWlvrnlC3LY2JiULZsWVy7dg2tW7dO8/qaNWsyoCEioiyTycwXB8WLG1G/ftplU0YjEB0t4ObN58HN2bNy/Pprxqc78fECVq3yxKpVnmjSJBmDBunRuDGXP7mSxETgp5/MgcwPP8hx4YI8U8sLskOlElG69MshjBGlS5s484ryNC8voFEjc0HrOXOAGzdk/y2FUuD0aUWmlxEmJgr4/nsPfP+9uR5mxYrG1LCmZk3zDmYPHlguOUr587175rpjrqBly2TMn69F0aKcMUe2yzUBjbPVrGlwdhOyRaVSpf7ZZDLfOfzss89Qo0aNNK97efclhcQCypT/3947eBEREaVHLgeCg0UEBxvQqNHzx8+fl2HlSk/s2OFh0wybw4c9cPiwB0qXNqJ/fz26ddPDho0fyc6SkoCzZ+WpM2TOnZM7tGaMIIgoXly0CGFefdWEokVFhnVENnj1VRNefVWPoUP1iI8HTpxQ4NAhDxw6pMD9+5nvRJcvy3H5shyffAKo1SJ0OsBodO2pKDVqGDB8eBLatTNw1gxlGgMaO8nMrkqu7pVXXkHRokURFRWFTp06Zfn7lC9fHufOnUvz2Mt/JyIicrSqVU1YvlyLGTN02LBBic8/V+KffzK+UPj7bzkmTfLG7Nnm5U8DBuhRtiyXPzmKwQCcPy9PnSHz008Ku9YbSuHrKx3ClCplgre33X8cUZ6VLx/QurUBrVsbIIrApUsyHDxoDmt++SXzM+AcUTw+s/LnF1GsmAklSphQrJgJxYqJKF7c/OfixU0oUkTMkRo6lHsxoCFJEydOxIQJE5AvXz40bdoUSUlJ+P333xEXF4fhw4fb9D0GDRqEZs2a4bPPPkOrVq1w9OhRLm8iIiKnCQwUMW5cEkaNSsLevR5YuVKJn37K+FQoIUHA6tWeWL3aE40amZc/NW3K5U/ZZTIBly/L/gtkFPjxRwXi4+1zASaXiwgONlmEMGXKmBAYKPKuNlEOEwSgUiUTKlVKwtixSYiNFXD0qHkp1OHDCqcV836Rl5f4X9Ai/he+pAQxz//OJY3kaAxoSFKvXr3g7e2NRYsWYdq0aVCpVAgNDcWQIUNs/h41a9bEokWLEBkZicjISNSvXx/jxo3DvHnzHNhyIiKi9Hl4AO3bJ6N9+2RcuCDDqlWe+PprD5t27Dh61ANHj3ogJMSIAQP06N6dy59sJYrm+hQpgczJk3K7XZQVLGhCvXoG1KqlQ1DQHdSqFQhf37y1+xmROwkIENGxYzI6dkyG0Qj8+uvzbbwvXrR/dW25XESRIs9nu7w488UcxIgICGB4S86Xa7bZzgnpbbNN9sNttnOXvLxVMFF2sO/krEePBGzcaF7+dO+e7aGBWi2iSxfz7k/lynH508vu3BFeCGQUNi0ts4Wvr4g6dQyoV8/8VaGCCYLAfkOUFa7Wb/75R8ChQ+aw5vhxBRISMk5NAgPTBi/m8OV5CFOokAiJ0plEWcZttomIiIgcpGBBEeHhSRg5MgnffafAypWe+PHHjE+TEhMFfP65Jz7/3BMNGpiXPzVrZsiz2ys/fCjg5MnnOy1FRdnnjVCpRNSqlRLIGFG5sjHPvsdEuV2RIiJ69UpGr17J0OuBM2fkOHLEA9HRwn81YMTUmi/Fi4soWtQEF8iViOyCAQ0RERHRfxQKoF07A9q1M+CPP8zLn7Zv97CpWO3x4x44ftwDJUuaMGBAEnr00MPPz/FtdqYnTwScOvV8p6WrV+2TmiiVImrWNKbOkKle3Qil0i7fmojciFIJ1K9vRP36Rmc3hShHMKAhIiIiklCpkgmLF2sxfboOGzd6YM0aT9y9m/ESndu3ZZg82Rsff+yFzp3Ny58qVMgdy5/i44GfflKkLlu6eFEGUcx+0QaZTES1as8Dmf/9zwiVyg4NJiIiciMMaIiIiIjSERAgYvRoPYYP12PfPgVWrfLEqVMZn0JpNALWrfPEunWeqFfPgEGDktCihesuf0pONtfiiYkR8OiRDDExKX8WEBMjw19/yfDbb3IYDPapohkW9jyQqVXLwGLLRESU5zGgISIiIrKBQgG0bWtA27YGXLokw+rVnti2zQNabcaBRcqMk6AgE/r3T0LPnsnw93fsPg0mExAX9zxkSQlaXgxdnv9ZQFycY7e5LVPmeSBTp44RBQpwnwoiIqIXMaDJIlEUIXAfNrszmUx8X4mIyOWFhZnw2WdafPSRDps2eWD1ak9ER2cccNy5I8PUqd6IiPBCp07JGDgwCRUr2r78KTEREjNc0gYtMTGy1EDGaHTemFq8uAn165sDmbp1DShalIEMERFRehjQZIGnpyeePXuG/JyLa1cmkwmPHz/m+0pERG7D31/EyJF6DBumx/ffm3d/Onky49MrrVbAhg1KbNigRJ06BvTrp0f+/KLFsqIXQ5fHjwVoNK57E+OVV0ypM2Tq1TOgZEkRvOdCRERkOwY0WeDl5QWdToeYmBhnNyVXEQQB+fPnh5LbNBARkZuRy4HWrQ1o3dqAK1dkWL1aiS+/VNq0/OnUKYVNNW1cjZ+fCXXqPF+2VK6ciYEMERFRNrjf2YCL8Mvt+2YSERFRloSGmvDppzpMm6bDpk1KrF7tiTt3HFvfxdG8vEQEBoooX96YumSpUiWTyxY8JiIickcMaIiIiIgcwM8PGDFCj6FD9ThwQIFVq5Q4ftzD2c0CAMjlIgoWNH8FBpoQGCiiQAFzCBMYaPrv8ed/VqvB2TFEREQOxoCGiIiIyIHkcqBlSwNatjTg6lXz8qetW5V2ryfj52cOWl4MXl4OWsx/FuHnJ0Lm3pN6iIiIch0GNJkk51xeokxjvyHKGvad3Kd8eRMWLNBh6lQdvv7aA5s3K60uf/L2FhEQYJ7Z8vzLhIAAcwBToICIgABz8OLvD7CEmxn7DVHmsd8QZZ4j+o0QFxfHPQ+JiIiIiIiIiJyIk1uJiIiIiIiIiJyMAQ0RERERERERkZMxoCEiIiIiIiIicjIGNERERERERERETsaAhoiIiIiIiIjIyRjQEBERERERERE5GQOaDJw8eRJ+fn6SX2fPnnV284icLj4+HlOnTkX79u1RunRp+Pn5ISIiQvK158+fR7t27VCsWDEEBQWhR48eiIqKytkGE7kIW/vOkCFDJMegmjVrOqHVRM5z4sQJDBs2DDVr1kTRokVRoUIFdO3aFefPn7d4Lccbouds7Tscb4ieu3jxIjp16oSwsDAULlwYwcHBaNq0Kb766iuL19pzzFFks915xtSpU1G3bt00j1WoUMFJrSFyHbGxsVi/fj3CwsLQqlUrbNy4UfJ1169fR5s2bRAWFoZ169ZBp9MhIiICb731Fk6ePImCBQvmcMuJnMvWvgMA3t7e2L17d5rHvLy8HN1EIpeydu1axMbGYvDgwShXrhweP36MJUuWoEmTJtixYwfq168PgOMN0cts7TsAxxuiFE+fPkWxYsXwzjvvoEiRItBoNNi+fTsGDRqEO3fuYPz48QDsP+YIcXFxoiN+odzi5MmTaNOmDTZs2IB27do5uzlELkcUzYcQQRDw+PFjlC5dGhMmTMCkSZPSvK5Pnz44efIkfv/9d/j6+gIA7ty5g+rVq2Po0KGYPn16jredyJls7TtDhgzB7t27ce/ePWc0k8hlxMTEIDAwMM1jCQkJqFatGipUqIBdu3YB4HhD9DJb+w7HG6KMNWnSBA8ePMClS5cA2H/M4RInIsoWQRAgCEK6rzEYDDhw4ADatm2beuACgKCgINStWxd79+51dDOJXI4tfYeInnv5AhMAfHx8UK5cudQLSo43RJZs6TtEZJsCBQpALpcDcMyYw4DGRuPGjUOBAgVQokQJdOjQAWfOnHF2k4jcxq1bt6DValGxYkWL5ypWrIibN29Cp9M5oWVE7kGr1aJs2bIICAhAaGgoxo8fjydPnji7WURO9/TpU1y4cAHly5cHwPGGyFYv950UHG+I0jKZTDAYDHj06BHWrFmDI0eOYPTo0QAcM+awBk0GfH19MXjwYNSpUwcBAQG4efMmFi9ejNatW2Pbtm1o3Lixs5tI5PJiY2MBAP7+/hbP+fv7QxRFxMXFoXDhwjndNCKXFxYWhrCwMISGhgIATp8+jWXLluHEiRM4evQofHx8nNxCIucZP348NBoNxo0bB4DjDZGtXu47AMcbIiljx47FunXrAABKpRJz5sxB3759AThmzGFAk4EqVaqgSpUqqX+vXbs2WrdujTfffBNTp05lQEOUCekt5+BSDyJpw4YNS/P3hg0bolKlSujduzc2bNhg8TxRXjFr1ixs27YNc+fORdWqVdM8x/GGyDprfYfjDZGl8PBw9OrVCzExMdi/f39quDlixIjU19hzzGFAkwV+fn5o3rw51q5dC61WC29vb2c3icilBQQEAHieMr/oyZMnEAQB+fPnz+lmEbmtNm3aQK1W49y5c85uCpFTREZGYv78+ZgyZQoGDhyY+jjHG6L0Wes71nC8obyuRIkSKFGiBACgWbNmAIDp06eja9euDhlzWIMmi17cfYOI0hcSEgJvb29cuXLF4rkrV66gVKlS3MKRKJNEUYRMxmGc8p7IyEhERkZi4sSJGDt2bJrnON4QWZde30kPxxui56pVqwaDwYCoqCiHjDnsaVkQFxeHAwcOoFKlShzkiWygUCjQokUL7NmzB/Hx8amPR0dHp25lT0S227VrFzQaDWrUqOHsphDlqLlz5yIyMhLjxo3DxIkTLZ7neEMkLaO+Yw3HG6K0Tp48CZlMhuDgYIeMOUJcXJxozwbnNv3790fx4sXx2muvpRYJXrJkCW7duoWvv/4aDRo0cHYTiZzu0KFD0Gg0iI+Px/Dhw/H222+jffv2AICmTZtCpVLh+vXraNSoESpXrowxY8ZAp9MhIiICT548wcmTJ1GwYEEn/xZEOS+jvvPo0SMMGDAAHTp0QKlSpSAIAk6fPo3ly5cjJCQEhw8fhlqtdvJvQZQzFi9ejClTpqBJkyaYMGGCxfM1a9YEAI43RC+xpe/cuXOH4w3RC0aNGoV8+fKhevXqCAwMxOPHj7Fr1y7s3LkTI0eOxIwZMwDYf8xhQJOBTz/9FDt37sTt27eRmJgIf39/vPHGGwgPD0e1atWc3Twil1CpUiVER0dLPnfhwgWULFkSAHD+/HlMmzYNZ8+ehUKhQN26dTFr1iyEhITkZHOJXEZGfSd//vwYPnw4Ll68iJiYGBiNRpQoUQKtW7dGeHg4a2lQntKqVSucPn3a6vNxcXGpf+Z4Q/ScLX0nLi6O4w3RCzZv3owtW7bg+vXrePr0KdRqNcLCwtCrVy907tw5zWvtOeYwoCEiIiIiIiIicjLWoCEiIiIiIiIicjIGNERERERERERETsaAhoiIiIiIiIjIyRjQEBERERERERE5GQMaIiIiIiIiIiInY0BDRERERERERORkDGiIiIiIiIiIiJyMAQ0RERERERERkZMxoCEiIiJ6SUREBOrUqePsZhAREVEeIsTFxYnObgQRERFRTvHz80v3+a5du2LevHnQ6/UICAjImUYRERFRnqdwdgOIiIiIctK1a9dS/7xz505ERETg7NmzqY95eXnBx8fHGU0jIiKiPIxLnIiIiChPKVSoUOqXr6+vxWP58+e3WOI0ZMgQdOvWDQsWLECZMmUQFBSEyMhIGAwGTJkyBcHBwQgNDcWmTZvS/Kz79++jb9++KFmyJEJCQtC1a1fcvn07R39fIiIicg8MaIiIiIhscPLkSTx48AD79u3D7NmzERkZic6dO8PPzw9HjhxB3759ER4ejrt37wIANBoN2rRpA7VajX379mH//v3w8fFBx44dodfrnfzbEBERkathQENERERkAz8/P8yZMwdlypRBz549UaZMGWg0GowdOxalS5dGeHg4lEolfv75ZwDAjh07IJPJsHjxYlSsWBHlypXD0qVLcffuXZw6dcrJvw0RERG5GtagISIiIrJBhQoVIJM9v7cVGBiI0NDQ1L/L5XL4+/sjJiYGAHDhwgXcvHkTxYsXT/N9dDodbt26lTONJiIiIrfBgIaIiIjIBgpF2tMmQRAkHzOZTAAAk8mEqlWrYvXq1Rbfq0CBAo5rKBEREbklBjREREREDlClShXs3LkTBQsWTC1GTERERGQNa9AQEREROcC7776LAgUKoFu3bvjxxx8RFRWFU6dOYcKECbh3756zm0dEREQuhgENERERkQOoVCrs27cPxYsXR8+ePfH6669j+PDh0Ol0yJcvn7ObR0RERC5GiIuLE53dCCIiIiIiIiKivIwzaIiIiIiIiIiInIwBDRERERERERGRkzGgISIiIiIiIiJyMgY0REREREREREROxoCGiIiIiIiIiMjJGNAQERERERERETkZAxoiIiIiIiIiIidjQENERERERERE5GQMaIiIiIiIiIiInIwBDRERERERERGRkzGgISIiIiIiIiJyMgY0REREREREREROxoCGiIiIiIiIiMjJGNAQERERERERETkZAxoiIiIiIiIiIidjQENERERERERE5GQMaIiIiIiIiIiInIwBDRERERERERGRkzGgISIiIiIiIiJyMgY0REREREREREROxoCGiIiIiIiIiMjJGNAQERERERERETkZAxoiIiIiIiIiIidjQENERERERERE5GQMaIiIiIiIiIiInIwBDRERERERERGRkzGgISIiIiIiIiJyMgY0REREREREREROxoCGiIiIiIiIiMjJGNAQERERERERETkZAxoiIiIiIiIiIidjQENERERERERE5GQMaIiIiIiIiIiInIwBDRERERERERGRkzGgISIiIiIiIiJyMgY0maDT6XDz5k3odDpnN4XIbbDfEGUN+w5R5rHfENlu4UIlSpfOl+aralUfnDold3bTiFyeo8YbhV2/Wx5gNBqd3QQit8N+Q5Q17DvZFx8P/POPDF5eIry9kfpfBc+Aci32G6KM/fqrHDNnesFoFNI8/vgx0K6dGvPn69C3r95JrSNyD44Yb3h6QkR5WlwcsGCBF65ckSEszIQePfQoU8bk7GYRUTbpdEB4uDe2bvWAKAoWz3t4mIMab28RXl4p/7V8TOrv5telDXzS+7uXFyBYNoGIyCk0GmDQIG+LcCaF0ShgzBhv3Lghw4wZOsg5oYYoxzCgIaI869kzoEULH1y9aj7zOHIE+OwzTzRokIz+/fVo0cLAu+xEbkgUgVGjvPHVV0qrr0lOFpCcDDx7ljPJSUYBUIECIlq0SEa7doYcaQ8R5V0ffeSFGzcyTl2WLvXEzZsyrF6tgY9PDjSMiNwzoDlx4gS2bduGX375Bffu3UP+/PlRtWpVTJgwAVWrVk193ZAhQ7B161aL/79MmTI4e/ZsDraYiFyNKAIjRqhSw5kXHT/ugePHPVC8uAl9++rRq5cegYGiE1pJRFnx+efKdMMZZ9BqBWi1Ap48sf6arVuVeP99HT74ICnnGkZEecqxYwqsWuVp8+u//94Db73lgy+/TESxYjwXInI0tywSvHbtWty5cweDBw/Gtm3bEBkZiUePHqFJkyY4ceJEmtd6e3vj0KFDab7Wrl3rpJYT2UdCAjBxohcKF/ZFSEg+LFmihImrcjJlxQoldu3ySPc1d+/KMHOmFypWzIeBA73xyy9yiDw3IXJpv/wix6RJXs5uRpbNneuF06e5noCI7C8uDhg2zFvyucBA6/Vm/vhDjiZNfHD+vFteOhK5FbecQTN//nwEBgameaxx48aoVq0aPvnkE9SvXz/1cZlMhpo1a+Z0E4kc5tkz4N131fj5Z3P31ekETJ7sjadPBXz4Ie+62uKXX+SYMsX2Czi9XsC2bUps26ZE5cpG9O+fhI4dk6FSObCRRJRp//4roHdvFZKT3bvgy7Bh3jh9OgFqtbNbQkS5yfvve+P+fcuQxdtbxLJl1/DoURBGj/ZFUpLlMfSff2Ro2dIHq1dr0KoVl2ISOYpbBjQvhzMA4OPjg3LlyuHevXtOaBFRzoiLAzp2VOPcOcuuO2+eFypVMqJtWw6a6Xn0SEDfvioYDFm7gLt4UY6RI1WYOtWE7t2T0a+fHqVKcfoSkbMZDMB776nwzz/Sd3jDw3VQqczFg7VaATodoNEIaf6esgzp+Z/NIbhWC6vFNB0hKkqOjz7ywrx53CqaiOzj228V2LZNeunn5MnxCA5OQt26OpQqJUf37io8emR5LNVoBPToocLMmToMG6Zn8XMiB3DLgEbK06dPceHCBdSrVy/N41qtFmXLlsWjR49QuHBhtGrVCh988AH8/f2d1FKirHnyRED79iqcP2+92w4ZosKrryYgNJSBgRSjERg40Bv37lmedAiCiEGD9Pj+ew/cvp3xFN64OBmWLvXE0qWeaNrUXFS4SRMDdzogcpLp071w6pT08XHcOB0mT876DENRBJKTkSawMQc5z0McjQZp/v78Nc+DH6nn4uIEyWKdq1d7om3bZNStyy2jiSh7Hjww78okpUGDZPTtq0XKPe7XXzfi8OEEdO6sxrVrlscmUTTP3P77bxnmztXBI/3V4kSUSUJcXFyuqKgwcOBA7Ny5E4cPH04tFLx06VIAQGhoKADg9OnTWLZsGYoXL46jR4/Cx4Zy5Drd87tXer0eDx8+RKFChaBUulbxQcrdHj8W0LmzPy5dyngULFnSgP37Y+Hv7xpd25X6zfz5asyfL93vx45NwPjxiTAagSNHlFi3ToVjx2wvogcAQUEG9O6tRdeuWgQEuMb7T+7LlfqOq9u92xMDB/pJPtegQRK2bIlz2fDUaATat/fHL79Y/hsHBRlw7Fgs1GoeT2zFfkOUligC3bv74ehRy3Oa/PlNOHbsMQoW1Fn0m6dPBQwcmB8nTlg/F6pfPwmrVj1F/vw8RlHeY2288fLKXh28XBHQzJo1C/Pnz8fcuXMxcODAdF+7a9cu9O7dG7Nnz8awYcMy/N43b96E0ci7V+Q8sbEKDBtWFjdu2F7w5I03nmLhwr9c9oLEGX76yRcjR5aBKFrOx3399af47DPL9ys62hNffx2IPXsKIj7e9gmHnp4mNG0ai3ff/RehoZrsNp2I0nHrlhd6964ArdbygFekSBI2brwCPz/XHsdv3/ZE9+4VkZRkOXvv3Xf/xfvv33FCq4goN9i5syAiIoIln5s58yZatIi1+v8aDALmzSuBnTtfsfqakBAtPv30LxQrZr3IMFFeIZfLUapUqWx9D7cPaCIjIxEZGYkpU6Zg7NixGb7eZDKhRIkSaNasGdatW5fh6zmDhpzp339l6NjRH9evS4cDHh6i1WKYQ4cmYurUBEc2zyau0G/u3ZOhadMCiI21vPgpUsSIQ4ceo2BB64dCjQb49lsvrFunwh9/ZG4u72uvJaNvXw3attUhm4E65TGu0HdcXXy8gLfeCsCNG5bHSE9PEbt3x6JKFfeoy7VypQrTpuWTfO7rr2NRp05yDrfIPbHfED0XFSVHo0YB0Ggsz3/atNFh1aqnEIT0+40omo9P06f7SN7kAoACBUxYvz4ONWvyOEV5h6Nm0Lh1DZqUcGbixIk2hTMpRFGETGbbNnFSb7BSqcz2G0+Ukfv3BXTooJasTQAAQUEm7NiRiGHDvPHLL5ZdedkyNapVE9Cxo2sMls7qN3o9MGSIWjKcUShErF+vRfHi6S9l8vIC3nsP6NtXg7Nn5VizRolvv/WAXp9xdbzff/fA77/nx/Tp+dCzpx59++pRsqRb5+KUwzjmSBNFYMAAlWQ4AwDz52vx+usKuMupzvDhJnz/vQE//WTZ3vBwP/z4YzxsWJlN/2G/obzOaARGjVJLhjOFCpnw2Wd6eHun7SPW+s3o0SaULatB//4qaDSW5z6PH5tvKC5dqnWZ806inGLv8cZtN7OfO3cuIiMjMW7cOEycONHm/2/Xrl3QaDSoUaOGA1tH1ly6JEPz5mqULp0P/fqZC4yRpbt3BbRqZT2cCQkxYt++BJQpY8LGjRoUKSJdFHjECG9cuJC33+Np07wkAywAmDFDh9dft33pgyAA//ufEatWaXH5cjymTNGheHHbCjI/fizDwoVeqFo1H7p0UeHIEQVMrOVMlGWLFyuxZ4/0jLbevfXo2dO9LhLkcmDpUi28vS0D3Dt3ZPjoI4YNRGS7RYs88fPP0uc/S5ZkvlZey5YG7NuXYPWcMylJQP/+KsyZ4wmR96GIsswtlzgtXrwYU6ZMQZMmTTBhwgSL52vWrIk7d+5gwIAB6NChA0qVKgVBEHD69GksX74cISEhOHz4MNRqdaZ+rk6nQ3R0NEqUKMG7Mllw86YM9ev7ID7+efLu6yti+XINWrVyjynoOeH2bQFt2/pY3Uno1VeN2L07EUWLPu+6587J0bKlWnJGR/HiJhw/npDuEh5Hcma/2bVLgd69pft527bJ2LBBk+0tIg0GYP9+BdasUeL48cwtfypd2oj33tOje3c9/Pyy1w7KfTjmWHfihBzt26thMll24GrVDPj++0R4Zq7Gt8tYtkyJDz6Q3m1l164E1K/v2vV0nI39hgi4eFGGxo19JJfB9+2bhE8/1aV5LDP95v59AV26qHHxovVCh5066bF4sdZtj8NEtnDUeOOWAU2rVq1w+vRpq8/HxcUhLi4Ow4cPx8WLFxETEwOj0YgSJUqgdevWCA8PR/78+TP9cznoZ53JBLRqpcaZM9JJfni4Dh9+mJTni9pGRQlo3doHd+9KhzPlypnDmUKFLLvt5s0eGD5cupBwnToGfPNNolO2QnRWv7lxQ4aGDdMGgilKlzbi2LEE+Pra92devy7DmjVKfPmlEs+e2Z78eHuL6NQpGf37J6FSJU6rITOOOdLu3hXQoIEPHj2yPE4WKGAOpEuUcLtTm1TpjZdBQSYudcoA+w3ldUlJQMOGPrhyxfKkOiTEiJMnEyyOIZntNwkJ5iWm339v/cSyVi0DNm/WoEAB9z0eE6WHAY0L4KCfdcuXKzFpkvQdwRQNGyZjzRptnj2Q//23DG3aqHH/vnQ4ExpqxK5diQgMtP7+vP++F1atkr5dMWhQEubM0Uk+50jO6DcaDdCkifTJiZeXiMOHExAW5rggJCEB2LZNiTVrlJJtSM8bbxjQv78ebdsmg/Ut8zaOOZaSkoCWLdX49VfL8EImE/HNN4m5YobJzZsyvPmmD7Ray6C3X78kLFiQ88dyd8F+Q3nd1KleWLTI8lxQJhPx/feJkku7s9JvjEbzz1q61Po0meBgI7Zt06Bs2dx/8+m33+RYu1aJq1dlMBqB0FATKlY0omJFI8LCTHn2+iY3c3pAs2LFCpu/6eDBg7PcIFfGQT9r/v5bhjp1pE80X1a8uAmbNmnw2mvuf4KdGdevy9C2rRoPHkiHM5UqGfHtt4kZHtyTk4G331bj9Glra4416NEjZ+sy5HS/EUVg6FBvbN0qnW4sXapB9+458x6IIvDjj+aiwnv2eMBgsH1WzSuvmNCrl7mocLFiHNTzIo45lsLDvbB2rfTFwLRpOowZk5TDLXKcFSuUmDiRS50yi/2G8rLTp+Vo3VotudtSeLgOU6dKHyOz02/WrVNi3DgvGI3S5zj584vYuDF3hOcv0+uB3bs9sHKlEmfPpl+QvnBhE8LCjKhY8XlwU6aMiTfj3JjTA5rKlSvb9g0FARcuXMhWo1wVB/3MMxrNU7WldqWwxtNTxLx5WvTq5V4FHrPqzz9laNdOjX//lQ5nqlY14JtvNPD3t+0i/dEj8/R/qWVSSqWIffsSUaNGzg2SOd1vNm70wMiR0ku9evY0r4l2hn/+EbBhgxLr1yutBnFS5HIRLVsa0L9/EurVM2a7Zg65D445aW3Z4oFhw6T7duvWydi0Kfs1pVyJyQS0bq3Gjz9ajp8lSpiXOuWT3pU7T2O/obwqPh548818uHPH8hwjLMyIo0cTrIYB2e03x44p0Lu3yuryboVCxCef5J5z+5gYAevXK/H555k7p3uZh4eIcuVM/82yeR7eSJUyINfj9ICGOOhnxdKlSnz4ofQdQA8PUbJ4WYrevfWYM0eL3PxWX7pkDmceP5Y+uFevbsCOHYmZLiB74YIMLVpIz1oqUsRcoyGnDv452W8uXpShaVMfJCVZ/t5hYUYcOpQA7/RX2jlccjLw3XcKrF7taXWmkzXlyhkxcKAeffro83y9pryAY85z58/L0Ly5dN9+9VXzhYe9a0q5glu3zEudpLa1fe+9JHzyCZc6vYz9hvKqESO8sWmTZQKjVIo4diwBFStaX2Zkj35z9aoMnTqpJQOiFCNHJuGjj3SQuekGo+fPy7BypSd27PCQ3JjDXgIDU2bZPJ9tU66cKVdfE7kjR403bto9yB3cuCHDzJnSH9YBA5Lw/feJKFrU+mCxYYMSb72lRnR0Lrol+oLz5801Z6yFM6+/bsDOnZkPZwCgShUTFi2Sninyzz8y9OqlQlLuWQkAAIiLA3r3VklewPn6iti4UeP0cAYAPDyAt9824LvvEvHjj/Ho1y8JarVtYdm1a3KMHeuNLl1U0DpnIhBRjouNFdCrl1qyb6vVIjZt0uTKcAYAQkJMmDZNOoRZu9YTx48zqSUi4PvvFZLhDABMnqxLN5yxl/LlTThyJAH/+5/1nVkXLfJEr14qJCY6vDl2YzAA336rwFtvqdGgQT5s3ap0aDgDADExMhw/7oGlSz0xdKgK9evnQ7FivqhVywf9+3vj0089cfCgAvfuCdzSPBfK8gyae/fu4fvvv8fdu3eh1+vTPPfxxx/bpXGuhndlbGc0mgs5/vyz5QyBkiVNOH3avAtFTIyAvn1VOHXK+kyCgAAT1q7VoEGD3LN29bffzFvEPn0qfYCvVcuAbdsSsz19fcoULyxeLF2voU+fJCxc6Pi7rznRb0QR6NFDhe++k95NYNOmRLRp47pbuT97Bnz5pbmo8PXrtl1wDRmShIgI3j3PzTjmmMeSTp1UOHJEum+vXatBhw65Y8q8NSYT0KaNdG2x4sXNS51ya0CVFew39mM0grM13cCjRwJq1fJBTIzlDb9atQzYuzcxw39He/YbnQ4YNswbO3ZYL65StaoBW7dqUKSI66YLjx+bl6Z//rkS9+7ZPqfB11dEYKAJN2/KJGsB2Zu/vynNTJuwMBPKlzdCJb0imOzIUeNN5ubX/+fEiRPo2rUrSpYsib/++gsVKlTAnTt3IIoiqlSpYrfGkftavlwpGc4A5iKtKdv7BQaK+PbbRMyYIV1xHgBiY2Xo0EGNKVOSMHp0ktvXGDh7Vo533lFbXadbt64BX36ZCLU6+z/ro490uHxZhqNHLS9u1q/3RJUqJvTtq5f4P93LkiVKq+HM8OFJLh3OAICvLzBwoB4DBujxww9yrF7tiX37FDCZrH/Yly/3RIsWybmy6B5RijlzPK2GM0OHJuX6cAYAZDLzuFm7dj6LpU5378owdapXjoTtlHccO6bAuHFeuH1bhtq1jVi2TIPixV33QjovE0Vg9GhvyXDGx0fE8uWaHA/ZvLyANWu0KF3ahLlzpS9az59XoEkTH3z5ZSIqVXKtHZ4uXTIvY9q+3QM6ne0XHWXLGjFokB6dO+vh4wMkJgJXr8px+bIMly7JcfmyHJcuya3enM2qJ09kOHVKluZmt0wmonRpy2VSQUGi219H5QVZmkHTqFEjNG7cGB9++CGKFy+OU6dOoWDBghgwYACaNGmCfv36OaKtTse7Mrb56y8Z6tb1kTyoDRyYhLlzpU8kd+1SYNgwFRISrB85WrdOxrJl7jud/cwZOTp1UiM+Xvp3bNgwGVu2aOyaej95IqBhQzWioixHaA8PEbt3J6JWLcdd5Du635w5Y96xQGr3gDfeMGDPnkR4SF/fubS7d80F6DZsUEqeeAHmu+enT8cjf/4cbhzliLw+5uzfr0CXLtJJde3aBuza5Z59O6tWrVLi/fel12l+800iGjZ07SA6p+T1fpNdp07J8fbb6jS7DoaEGHH8eALHGhe0dasHhgyRPmlctEhjc1FeR/Wbr77ywIgR3laXBPn4iPj8cw2aN3fu8ctgMC8TW7Ei8/UBmzdPxuDBejRoYMgw/BBF4N49AZcvy//7kuHyZTn++ktmdRcse/L1FVPDmmrVjGjdOtltr6lcgUsVCS5evDhOnjyJkJAQlCxZEvv370eFChXwxx9/oFu3bvjjjz/s1kBXwkE/Y0Yj8NZbavzyi+XBLSTEiFOnEtKdGXLtmgw9eqjw11/W4/5XXzVi82YNypd3rcQ9I6dOydG5sxqJidIH4KZNzbuQOOKjdeWKuXiu1M9+5RUTjh1LcNhWzo7sN//+K6BePR/JCvoFC5rwww8JKFrUve/6JSUB337rgVGjvCVDzy5d9FixggVpcqO8PObcvClDgwY+kjMNc7rQuaswmYC2bdWSS4K51Om5vNxvsis6WkDDhj549MhyTM2NO6W5u+hoAW++mU/yONmiRTK2brX938uR/ebMGTm6d1chNlb6ZpNMJuLjj3UYNEif45+vJ08EbNrkgdWrPREdbfsypnz5RHTvbp75XLp09q9HdDpzkeXnwY0cly7JrNaptJfgYCN2705EUFDeGk/txaWKBKtUKiT9V2G0SJEiuHXrVupzsbGx9mkZuaVly5SS4QwALFmizXDZTrly5gJjbdtaT/xv3JCjcWMffPON+9w6PXFCjnfftR7OtGiRjM2bHRPOAEBoqAnLl2skn/v3X3MopnOzGfJGI9C/v0oynBEE8x0Zdw9nAMDTE+jcOdlqodAvv1Ri9+4srVYlckkaDdCzp/R2rQqFiPXrNXkunAHMS52WLNFIFhW/e1eGKVNcoAo6uS2NBujRQy0ZzgDA3r0eWLrUek0RylkmEzB0qPRxskAB80YRrhKm1aplxJEjiShTRnq2tskkYOJEb4wf7wVDDk2k+fNPGcaM8UJoaD5MneptczhTurQRc+ZoceXKM0RG6uwSzgDmZWFVq5rQvXsyPv5Yh127EnHjRjyuXn2GHTsSMWOGFp066VGxohEeHvYb/6Ki5OjVy/2uAXK7LAU0NWrUwM8//wwAaNasGSZPnoz58+dj+PDhqFGjhl0bSO7jr79kmD1bOmEYNCgJb75p2zIaX19gwwYNZszQQiaTPgglJpqLC3/4Yc4dzLPqyBEFOndWS255DQBt2iRj40YNPKVL8NhN27YGjBsnfQT+/XcFxozxdqtK8BERnvjhB+lg4oMPknJdbZZBg/SoV0/6wz5mjDcePnSRMzGibEipp3D5svQsyo8/1uH113NX386M4GARH30kfRzfsEGJo0cZ1lLmpfS7CxfSL1YybZoXzpxh1WBXsGKFEidPSvf3hQu1eOUV1zqhCwkx4dChBKvnMQCwZo0nunRR4dkzx7TBaAT27VOgXTs1atXKh3XrPK2em7+sSZNkbN+eiLNnEzBokD7bm3jYQhCAwoVFNG5swMiReqxapcXp0wm4d+8ZTp2Kx8qVGowcmYTGjZNRqFDWg6Lz5xUYP54BvyvJ0hKnqKgoJCQkICwsDBqNBlOmTMGZM2dQqlQpfPzxxwgKCnJEW52O02aty+7SJmtOnJDjvfdU6U7xe/NNA9at07jcYAQABw4o0LOnyura2/btzQfcnKqjYDIBXbuqcOCA9A+MiNBiyBD7Fg12RL85dEiBd9+V/kA1aZKMbds0kDl2VqhT2HM6M7m+vDjmpFdnpVMnPVaudJ27ws5iMgHt2qklL85Ylypv9pvsWrJEicmTbbtAK1LEvHw4MND1zrnyiqtXZahf3wdJSfZb9pxT/SY5GQgP97a6JTgAhIYa8eWX9lt2ExcHbNmixOrVSsl6jNao1SK6dTMvYypb1vXLKsTECLhy5XlB4suX5bh6VSb5OZGSmZpFZOZSNWjyKg761i1erJScXi0IIr77LhG1a2f9jufduwJ691bh11+t3xksUsSEDRs0+N//XOfO6nffKdCnjwrJydIHxnff1WP5ci0UOXzD8+lToEkTH8k6P3K5iJ07E+06+8Te/SY62lx35skTywSmeHETTpxIQIECufewZq+CgOT68tqY8/PPcrRqlbY4aYqKFY04dCiB24b+JyrKHNZKLZvt1UuPRYvybl2qvNZvsuvYMQXeeUeV7q6BL6tf34CdOzPeupnsLzkZaNpUjfPn7RvQ5mS/EUXzdcO0aV5Wt6EODDRh61YNatTI+vno9esyrFqlxNatSqslBqQEBxsxcKAe3bvr3T7sNhiAGzdkaQoS//KLXPIcWqkUsX9/IqpVc51rKVfHgMYFcNCXdv26edcmqYR28OAkREZmf2FjUhIwcaIX1q2zvg7Iw0NERIQO/frlfJGxl+3apUC/firJCw0A6NpVjyVLtE47ufnrLxkaN5YuwBkQYC4aXLKkfQ4N9uw3er15ppZUWOfhIWLfvkTUrJm7BxZRBHr1UmHPHstZUD4+Ik6dikdwMA/ruUFeGnMePhTQoIEP/vnH8qTR11fEiRMJCAlx/TuYOenzz5UYO1Z61sOOHYlo3NjF1/86SF7qN9kVFWXud3Fxlv0uf34RHTrorZ53jR+vw4cfJjm6ifSS2bM9MW+e9Od69+4E1KuXtXMgZ/SbPXsUGDhQZXWZkZeXiOXLtWjf3vYbTyYTcPiwAitXKnHkSOampzdokIxBg/Ro1szg1PBRr9fj2bNnEB1Ud0CjEfDbb3LJEhFeXkD16oY8tUNiVgmCAE9PTzx48MA1Ahp/f38I6VwB59ZCwRz0LRmNQPPmapw7Z3nBXKqUeWmTPe94bt7sgbFjvdOdrtelix6ffKJ12p3WnTs9MGCAt9Xt8nr10mPhQq3Tl+AcOKBAly4qybsXYWFGHDiQtWVpL7Nnv3n/fS+sWiV9sjhnjhaDBtl3eZarevRIQO3aPvj3X8sPUa1aBuzdyzubuUFeGXOSk81Ldn78UXo64ZdfJqJFi7wZNqTHZALeflstWYurWDHzrk7ufvc3K/JKv8muhASgWTMfXLliOVgIgojt2zVo1MiAd99VWb3Q3b49EU2bsm/mlHPn5GjeXC15fjlkSBIiIrJ+Q9RZ/eb33+Xo0kWFhw+tnxRPmaJDeHhSujdfnz0Dtm5VYtUqJf7+2/YTIJVKRJcu5mVMFSo4/yaAXq/H06dPUaBAAcgceKEQFwfcuiX9PuXLJ6J0aZPTb3a7OpPJhH///Rfx8fGusYvT5s2bsWnTptSvdevWYcyYMShcuDAWLlxot8aR61uyRCkZzgiCiKVL7R+S9OiRjAMHElCihPWD6JdfKtGsmQ+ionL+yPLVVx7o3996ONOvX5JLhDMA0Ly5werdr0uX5BgxwrWKBu/c6WE1nGnfXo+BA/NGOAMABQuKVpcwnDmj4E4b5FY++sjLajgzfryO4YwVMhmweLEGPj6WB+p792Q21xShvEcUgWHDVJLhDABMm6ZDkyYGyGTAqlVaFC8ufc41cKA3oqN5FZcTNBpg8GDp88ty5YyYOtU9t+F57TUjjhxJQMWK1mf+zJzphaFDvZEkccr6998yTJjghYoVfTFhgrfN4UyJEibMnGnejemTT3QuEc4AwLNnzxwezgCAnx+sFhaOjxfwzz/s1xmRyWQoWLAgPBww3ciuS5y2b9+OnTt3YuvWrfb6li6Fd2XSunZNhnr1pJc2ZTfJz0hsrIABA7zTnb6YP7+I1as1aNYsZ07uN2/2+C/UkD6oDRyYhDlzdC6VSIsi0Lu3Crt3S7+P06drMWpU9oIPe/Sb69dlaNTIBwkJlm9emTJGHD2akCMV9V3NyJHe2LjRMoxRKkUcO5aAihVd44SDsiYvjDk7d3rgvfekk/wmTZLx1VcazgbLwNq1SoSHS4cxX3+diCZN8k7AZTIBv/5qQGLiPbzxRqFc22+ya8ECT8ycKf3edOigx+efpy3GffasHC1bqiVr6lWvbsD33ydCyfsCDjV+vBdWr7a8SaVQiDh8OAFVq2ZvvHf2eBMfD/Tvb30TCwCoXduAzZs18PcXceyYeRnTwYMKq+fdUurUMWDw4CS89ZZzlzFZExMTg8DAwBz5WaJoDrji46Xfv5AQI/z8cqQpbstkMiE6OhqFCtl3vLFrPFejRg2cOHHCnt+SXJTBgP/SbMtOXbq0EVOmODbJDwgQsW2bxuq20QDw9KmAzp1ViIz0hMnB16kbNnhg+HDp5UIAMGyY64UzgHkLv2XLNAgNlb5z8dFHXjh82LnbtiYmmkMkqXDG21vEhg2aPBnOAMDs2VqULGn54dbrBQwapJK820TkKv78U4YRI6SDhaAgE1avdl6dLnfSt68e9etLhzAjR3ojLi5n2+Msv/wix+uv+6Bp0wJ4++3KGDHCF9q8WyvZqgMHFJg1S3o2aliYEYsXW+6UVrOmEbNmSZ9v/fqrApMnMwhzpGPHFJLhDAC8/35StsMZV5AvH/DFFxoMHmz9xOXHHxVo3FiN11/3QYcOahw44GFTOOPlJaJXLz1OnYrH3r2JaN3aNcOZnCYIQMmSJiiV0nM17tyRQeeeE7Pcnt0CGq1Wi5UrV6Jo0aL2+pbkwpYsUUoWanXU0iYpcjkweXISvvgiEb6+0gcXURQQGemFLl1UDjtJXbNGiVGjrP/CY8boMGuW64UzKXx8gC1bNPDzsxzgRVFAv34q/P23c9ZkiSIwZow3/vxTeiT99FMtQkPd/8Qkq/LlA5Yv10AQLD//ly7JMWeO9aLaRM709CnQs6dKcmcNLy8RmzYlwt/fhdZYujBBsL7U6f59GT78MHcvdRJF8zjcqpU6ze6E27d7o2tXFTQaJzbOxfz1lwwDBkjfTAoIMGHLlkSrtecGDtSjfXvpGbWrVnli505WFXWEuDhg2DDpPly9ugHh4bnnToxcDkRG6jBvnhYymfTx/9YtOa5fty1dKVbMhGnTdLhyJR6LFmkRFpZ3zxet8fAAgoNNkueRRqOAW7dkMObuvTdcUpauukqWLIng4ODUr5IlS6J48eLYsmULZsyYYe82kou5elWGjz+WvlsydKgeb7yRsz25ZUsDjh1LsDoLBAAOHvRAgwY++OMP+wYNy5crMW6c9ZPf8eN1mDo1/cJmriAkxIR166QHxKdPBXTvrkJ8fM63a8MGD2zbJj1vuk+fJHTpwi2la9c2YsQI6ZPmhQs98fPPvE1ErkUUgaFDVbhxQ/qzuWCBFlWq8EQ6M4KCRMycKX2rc8sW8zKA3CilLse4cd6Sy2+OH/dAp05qJCQ4oXEu5ulToFs3leTujXK5iHXrNOnu3igIwKJFWpQpI32uNXKkN65fd4ECe7nM+PHeuH/f8n319haxcqUWilzYtQcM0GPbNg3y5ctaSF+rlgEbNiTiwoV4jBmThIAAhv3pUauB4sWl3yOdTkB0tOD0mpR+fn7Yu3ev1edv374NPz8/XLx40a4/t1KlSli2bJldv6ctsnQk/fjjj9N8zZkzB1999RX++OMPtGzZ0t5tzJaEhARMnDgR5cuXR6FChVCnTh3s2LHD2c1yWylLm/R6ywH+1VeNmDzZOXPhSpc24dChBHTsaL1eSlSUHM2a+eCrr+xzl2fxYiUmTbIeznzwgXkLSlcPZ1I0bGjA9OnS/35Xr8oxeLDK4UvFXnT+vAzvvy/9/laubLTL9u25xYcf6iQDSpNJwKBB3rw4IZeycKEnvvtO+jj83ntJ6N6dwWtW9OmjR4MG0u/dqFG5b6lTVJTw35iefvGTU6cUePddtVNuMrgKkwkYNEiVZobRi2bN0qF+/YxvruXLB2zYoIG3t+XVWkKCgN69VUhMzHZz6T/ffOOB7dulP98zZujw6qu5N8hu0sSAAwcSrBaofplSKaJbNz2OH4/H998nol07Q64MrxylQAERAQHS7/WTJzLExKR/MTNkyBD4+fnBz88PBQoUQFhYGMLDwxFnp4Hn2rVraNq0qV2+lzvIUkDTvXt3dOvWLfWrS5cuaNKkCfxcsJJQz549sXXrVkyYMAHbt29HtWrV0K9fP2zfvt3ZTXNLixd74rffrC9t8nbiTGq1Gli9WovISC0UCumoV6s11+YYP94L+mzUvl2wwBNTplj/ZadN0+H9991v2unw4Xq8+670G/Pddx6YNy9nlszExQG9e6slg0BfXxEbNyaCtR+f8/QEVq7UwMPD8nMfFSXHlCl8s8g1HD8ux8yZ0seRGjUMDi0un9ulzHCQuuv8zz8yfPBB7lnqdPCgAvXr58OlS7bNEDxzRoEOHdR4+tTBDXNRERGe2L9fOhTt0kWPwYNtPyEKDTXh00+li/v8+accY8a41g6Q7uqffwSEh0uP3Q0bJqNfv9y/c2VoqAlHjiSgenXrhc6LFDFh8mQdLl+Ox7Jl2lxRj8cZBAEoUUKUDF8B4P59IcObfU2aNMG1a9dw8eJFLFq0CPv378fYsWPt0r5ChQrB0zPvLNu3OVu8dOmSzd80LCwsS42xt4MHD+LYsWNYs2YNOnbsCACoV68eoqOjMXXqVHTo0AFyVomy2Z9/yhARId05hg3T4/XXnb9IURCAwYP1qFLFiD59VHj4UDqDXL3aExcuyLF+vQZFi2buTGLOHE9ERFi/4J05U2t1yYmrEwTgs8+0uHZNjosXLftGRIQXKlUyomVLx+0KYjIBgwercPu29L/dihUaBAfz7O9llSqZ8MEHSZg+3fKzuW6dJ956y5BjO5oRSYmONte0Mpksg9eCBU3YsEGDPHT+5RDmpU5ajB5tWRftiy+UaNcuGc2bu+9xwGQC5s71xJw5npnauQUAzp5VoH17NXbuTMxTO5Ps3q3AvHnS5yyvvWbAp59aFgXOSJcuyfjppySsX2/ZYbdtU6J2bQP69OFMuKwSRfOSsSdPLM+D8ucXsWSJFg7ehdllFCokYu/eRIwa5Z1myfv//mfAoEF6tG2bDAfscuxymja1UhzKzkwmc33Hl7dzF0VzPZpy5UxWd2xTKpUoVKgQAKBYsWJo3749vvjii9TnN2/ejEWLFuH27dsICgrCoEGD0L9/fwCAXq/Hhx9+iN27dyMuLg6vvPIK+vbti/DwcADmJU6bN29G69atAQC//vorRo8ejevXr6NChQoWQdCWLVswadIk3LlzJ/WxvXv3okePHqmzem7duoUPPvgA586dg0ajQdmyZTFt2jQ0aNAgy++fvdgc0NStWxeCIED8LxYX0jmax8bGZr9ldrB37174+Pjg7bffTvN49+7d0b9/f5w7dw6vv/66cxrnZtJb2lSmjBEffuhadz1r1TLixIkE9Omjwk8/SX/Mf/lFgQYNfLB2rQZ16mQcLokiMHu2J+bPtx7OREZqM3UnyhWpVMCWLYlo2NAHjx5ZngEMGqTC4cMJKFfOMXcpFi9WWr3TN2pUkkPDIXc3cmQS9u9X4OefLT/zI0Z448yZBK7FJqfQ6cy7sT1+bHlMkclEfP65BsWK8bNpD717J2PXrmQcO2Z5HB092htnzsS7ZUARFwcMHKjCwYPWr8Z8fUVMmBCPBQu8ERtr+brfflOgbVsffPttYp44Fl65IsOQIdKbGAQGmrB5sybLM58jI3X47TeF5M2c99/3RtWqRs5myKL165U4dEj6cz5/vjbPHSu9vYFVq7QYPToJ167JUb68ERUq5K3P1tmzObdeKzjY9N/mIGmv+QwGAVFRMrz6qinDgDAqKgpHjhyBx3/p2YYNGxAREYG5c+eicuXKuHjxIkaNGgWVSoVu3bph5cqV+P7777Fu3ToUL14c9+7dw7179yS/d2JiIjp37ox69eph1apVuH37NiZOnJjp3zMhIQHNmjXD5MmT4eXlha1bt6JLly44e/YsSpQokenvZ082568XLlzA+fPnceHCBWzatAklS5bEggUL8MMPP+CHH37AggULEBISgo0bNzqyvZny559/omzZslC8tAixYsWKqc+TbRYt8sTvv1seHGQy5y9tsqZwYRF79iRi0CDrS43+/VeGdu3UWLpUme6UXFE0bzmdXjizYIH7hzMpSpQQsX69BnK55ZsSHy+gWzfH7Ip16pQcM2ZIv8e1axscvn27u5PLgRUrtFCrLf/dHj6UITzci1PPySkmTvSSXB4LmJeE2lL/gmyT0VKn9GqnuaqLF2Vo0MAn3XAmNNSIY8cS0K+fFitXXkOhQtKfqYsX5WjTRo1Hj9ykQFwWPXliLvAvtVOaQiFi48bshaJeXsDGjdK7aOr1Anr3Vue6ukc54eZNGT78UPo8qH17PTp2zLszk0JDTWjfPjnPhTM5zdcXKFJE+tiQmCjg/n3pY+eBAwdQrFgxFC5cGFWrVsXVq1cxatQoAMC8efMwa9YstG3bFsHBwWjbti2GDh2K9evXAwCio6NRqlQp1KpVC0FBQahVq1bq6peXbd++HUajEUuWLEGFChXQokULjBw5MtO/Z6VKldC3b19UrFgRpUuXxuTJkxEcHIzvv/8+09/L3myO44KCglL/3KdPH8yZMwfNmjVLfSwsLAzFihXD7NmzU6cfOVtsbCyCg4MtHvf39099PiO6FzaA1/9XtESfneIlbujPP+WIjPSVfG7QIA0qV06EzoWvm6dP16FKFS+MHesLrdbyoGI0CvjwQ2/88ouATz55ZnFxaw5nfLBypfTce0EQMX9+PLp317r0+5BZNWoAM2aY8OGHlv/2f/8tx3vveWHTpjhktErQ1n7z778yvPdegMW0SgAIDDRi+fInMBhMMHACTbqKFAE++kjE+PGW/27ffqtEs2ZadOiQiz6ouVhuGXO++MJLcikEALRqpcPAgc9y1bHTFQQGAh99BIwda3kc2LpViZYtE9G0qXt8rrZv98L48T7Q6awHKu3bazF//jOo1eb+Ehysw7Zt/6Jr11dw/77lIHX5shytWqnw9ddPEBiY+y72jEagb18/3LolPUDPnh2P117L/jlL4cLA4sUm9O7tZ/Hc7dsyDBzohfXr4/LMcpzsMhiAgQP9odFYftYLFTJi9uw4JCU55i5Lbhlv3J3JZIIpJ3fksNKGwEAgMRF49syy88bEyODtbYS/f9p21qlTBwsWLIBWq8WmTZtw48YNDBgwAP/++y/u3r2LESNGpAY2AGAwGODr6wuTyYSuXbuiQ4cOqFGjBho3boxmzZqhUaNGab6/KIowmUy4evUqwsLC4OXllfpe1ahRI81rUlb8vPhevvxYYmIi5s6diwMHDuDBgwcwGo3QarWIjo62+P+s/ZukfM+X+41XNgtlZmm+1JUrV1CyZEmLx0uWLIlr165lq0H2lt5SrPSeS3H//n0YX9oA/uHDh9lul7swGAQMHVpecmlTyZJadOt2FdHRrn9LvmZN4PPPvfH++6Vx9650p9m1ywt//CFi7twbKFnSPOtGFIH580tg2zbptZ+CIGLq1CjUq/cY0dEOa77TNG0K/PxzSezeHWjx3NGjnvjwQxOGDZOegviy9PqNwQAMH14W//5reTIpk4mYMeMG9Pr4XPkeO0L9+sCbb76K06f9LJ6bMEGNoKAoFCqUd+/CuRt3HnP+/FOFiRPLSz4XHKzFuHF/4u7d3HeB7Arq1gXeeKMMfvopv8VzY8ao8dVXUfD1dd2ZS8nJAj79tAS2b7dsfwq53ITRo++ic+d/ERsLvHjfTaW6h6VLYzBkSDk8eGAZEF67pkCbNj5Yvvw6ChbMXcfDxYuL4fhx6VC0ffsYNGp0227jaWgo0KtXMWzcWMTiuYMHPRERkYxevR7Y54flcuvWFca5c9IFPiZN+huJic8cvkuWO483uYFSqXR6SJby8wsXFqDTeUGvtwxpoqNlUCj08PQ0j99GoxHe3t4oXrw4AGDGjBno0KEDIiIi8N577wEA5s+fj2rVqqX5PjKZDHq9HhUqVMAvv/yCI0eO4OTJk3jvvfdQt25dfP7556mvNRgM0Ov1MBqNMJlMad6n5OTk1P/q9frUkObF12i12jS/3+TJk3H8+HFMmzYNISEh8PLyQv/+/aHT6VJfI4oijEZjhv8mL/YbuVyOUqVKpfv6jGQpoClbtizmz5+PxYsXpyZESUlJmD9/PsqWLZutBtlTQECA5CyZJ0+eAHg+kyY9RYsWTf2zXq/Hw4cPUahQISitVUjKZRYuVOPPPy3DCZlMxLJlWpQpU9wJrcqaEiWAI0eeYcQIAQcPSp+43LzpjT59KmLx4mdo3jwJEyfmw7Zt0uu3ZTIRixc/wzvvqABIvyY3WLTIhLt39fjtN8vP/Pr1RVCrljfatbO+jMyWfvPxxz749VfpEGzixAS0b+8HwC8Lrc+7li1LRsOGJsTGph1Y4+MVmDu3PL78knc1XZ27jzmxsQI++KCA5MmdWm3Cxo2JKFu2mBNalncsXapHgwYmxMen/Td49EiJFSvKY/HiZ05qWfr++UeGIUPyW71YBYBXXjFi9eqneP11TwDP6wW82G9KlFBiz55neOcdf9y5Y3nKGxXljWHDKuLrr5+gaNHcERR+840XNm6UDrVq1tRj4UITPD3tW1/h44+B69f1+Okny3+vZcuKoWFDFWrXzl0hmL1duqTA6tUBks/16qVBly75AVgPK7PL3ceb3OLp06eS73+NGjk3ffzFnx8cbMKNG4JFcX9RFHD3rhfKljVALjeHEjKZLM3/O3HiRHTq1An9+/dHkSJFcPfuXXTt2tXqzy1QoAA6deqETp064e2338a7776LxMTE1Ot1hUIBpVKJChUq4Ouvv04NhQBzKRYA8PDwSC1WnJCQgOTkZKjV5uuLq1evpvn9fvnlF3Tr1i21Vm1CQgKio6PT/B6CIEAul1vtEykzaOzdb7IU0Hz66afo0qULKlasmLpj06VLlyAIAr766iu7NS67QkNDsWPHDhgMhjR1aK5cuQIAqFChQobfQ2qKklKpzPbUJXdw+bIMCxZIXzSPGKHHm2/KAbjXLlheXsCXX+qwYIGIjz+W3gUiIUGGvn39UK2awWrNBLlcxJo1WrRvDwC5+7Pg5QVs2aJDgwYKyV2xxozJj4oVExAWlv7JrbV+s3+/AosWSX/OmjdPxrhxJshkufs9doSSJc2V+Hv3tnxvf/jBE5s3+2LgwLw3lfn6dRmWLPFEbKyAKlWM6NVLj0KFXHsWoDuOOUYjMHy4CnfvSo8RS5dqUbmyB4A8sP2GE5UuDcyercPIkZY3EbZv90aHDia89ZZrrRs9dUqOvn1ViImxniDXqmXAunUaFC5s/Twkpd+UKQPs26dB27Zq3Lxp+dqbNxXo0CEAu3cnIijItY8FGblwQYbwcB/J54oUMWHTJh3y53fMsWT9eh3q1VPg33/T/rsZjQKGDPHDDz8kuPyx1ll0OmDkSB8kJ1uek4aEGPHxx8k5Nga443iTm8THx0Mmcffs8GEHT51K4/nPV6vNdSlv37b8bOr1Au7cUaBUqefn/y+2vV69eihfvjwWLlyISZMmYcKECfD19UXTpk2RlJSE33//HXFxcRg+fDiWLl2KwoULo1KlSpDJZNi9ezcKFSoEf3//1O8pCAJkMhk6deqE2bNnY9SoURg3bhzu3LmDJUuWpHnN//73P6hUKsyaNQuDBg3Cr7/+iq1bt6ZpY6lSpbB371689dZbEAQBs2fPhiiKqd8jxct/f1HK0id795ss3T+tXr06Lly4gClTpqBixYoIDQ3F1KlTceHCBVSvXt1ujcuu1q1bIyEhAbt3707z+NatW1GkSJHU9WpkKTkZGDpUJTlYlCtnxKRJ7lswQCYDxo9PwvbtGvj5WQ8VrIUzCoWItWs1aN8+79wNKlJExKZNGnh4WJ5caTQCundXIzY28wUXo6IEDBokPfuoRAkTVqzIO1tJOkK7dgZ06iQdwkyb5oW//spbb+7OnR6oW9cHGzcqsXevB2bP9kJYWD4MHOiN335zr7DZ1UVEeOLoUenwZcSIJLz9tmuFArlZz57JaNJEerwaM8YbT564RrFcUQSWLlWiXTt1uuHMoEFJ2L07EYUL236xX7y4iO++S0SZMtJLuqKi5GjVygdRUa7xXmTFo0fmsViq1p5SKWLzZk2m3rPMKlxYxJo1Gshk0kXq+/VTsYacFbNne+HKFekl3itXauEjnbkR5YiAANFqra5nzwQ8fGj9uDls2DBs2LABjRo1wqJFi/DFF1+gdu3aaNWqFb744ovUkik+Pj5YuHAhGjZsiEaNGuHOnTvYtm2bZDDi4+ODL7/8ElevXkW9evUwc+ZMfPTRR2le4+/vj5UrV+LQoUOoXbs2vv76a4udnj7++GP4+fmhefPm6Nq1Kxo3bozKlStn8t1xDCEuLi5Xx9nt27fH77//junTpyMkJAQ7duzAhg0bsGrVKnTq1ClT30un0yE6OholSpTI9enyvHmemD3b8neUyUQcOpSI6tVdd916ZkRFCejVSy25TaQUDw8RGzZo8uxWzxs3ekjeiQWA+vUN2LEjES9tmma13yQlAc2bq3H+vGUQplSKOHAgEa+9ljs+Z84UFwfUrp0P9+9bDnLVqhlw8KDlv1luI4rAggWemDUr/eN2zZoGDBqkR7t2yfBwgYkd7jrm7NunQLdu0rPi6tQx4Ntvc/9nztXcuyegVq18ePbM8kS6Uyc9Vq3SOqFVzyUkACNGeOObb6xPEVepRHz2mRbvvpv+zZH0+s3DhwLatVPj6lXpMb94cRN2705Mc0fYHSQnA+3bq3HqlHTHWrJEgx49cuam0oIFnpg5U/p4NXasDlOmWF8SnRedPi1H69ZqyRndOfl+uet4k9vExMQgMNCy7qOzmUzAjRsyyV3hABGlS5vgK72fTK5mMpkQHR2NQoUKOWcGzb59+1IL8Ozbty/dL1eyadMmdO7cGR9//DE6duyIc+fO4fPPP890OJOXXLokw9y50jVaRo5MyjXhDAAEB4s4cCAB3bplvNTD01PEli15N5wBgF69ktGvn/TJwokTCkybZvvB6YMPvCTDGQCIiNAxnLETPz9g2TKN5HO//abAggXSfT23SEoChgzxzjCcAYCzZxXo31+FypXzYd48T8TEuO/ddGf5+28ZBg+WDnGLFjVh7VoNwxknKFZMxOzZ0iHMtm1K7NvnvH+Uv/6SoUkTn3TDmZAQIw4dSsgwnMlIoUIi9uxJRGio9Phy964MrVqp3W524eTJXlbDmYEDk3IsnAGAMWOS0KyZ9M9bsMALBw7wAJDi2TNgyBCVZDhTqZIREyYwzCLXIJOZ69FIzaQHBERFyZDEj6vd2DyDxt/fH9evX0dgYGC6xXUFQbBp+2p3lBfS5eRkoHFjH8kZJeXLG3H8eAJy468uisD69Uq8/76X5LIuLy8RX3yhQaNGeTecSaHXA+3aqXHmjPRJ1sqVGnTu/PzkTKrfbNvmgYEDpS/i3n3XfDfXhk3WKBPef98Lq1ZZhjEKhXlWXG4MxGJjBXTvrrL6Wc2Ip6eId95JxqBBSahSJefvqLvbmJOYCDRt6iM5Vd/Dw7zE5H//y32fM3chikCnTiocOmQ5PaxQIRN++ikB/v45O6l6714FhgxRIT7e+gG/RYtkrFihgZ+fbd/Tln7z+LGAt99W448/pGfSFCpkwq5diShf3vVn0mzZ4oFhw6TH0zp1DPjmm8QcnxH45ImAevV8EB1tGXT5+Zlw4kQCSpbM1RP4bTJ8uDc2b7YMJpVKEcePJyA0NOc+f+423uRWrjqDJkVCgnkmjVSo6O0tomxZU54qTeD0GTRPnjxJ/cA8efLE6lduDWfyik8/9ZQMZ2QyEUuXanNlOAMAggD07avH998nWuzkoFKJ+OqrRIYz/1EqgQ0bNChWTPrEYdQob5w/b/3QcvWqDKNHe0s+V66cEZ9+ynDGET76SCdZf8FgEDBokDe0zl3hYHfmu/LWg0RbJCUJ+OILJerXz4e33lLj228VrKFghSgCo0d7S4YzgHlWHMMZ5xIEYOFCLXx9pWuETJiQcwO80QjMmOGJHj3UVsMZQRAxebIOX3xhezhjqwIFROzenYjXXpPu0A8fytC6tRqXL7v2lcavv8oRHi49nhYvbsL69RqnLNf09zcvB5e62x4XJ0OfPqo8f7d93z6FZDgDAFOm6HI0nCGylY8PULSodLiq1QqIjhYgMnvNNruNPHFxcfb6VuQkly7JMG+e9HKHUaNy19Ima2rUMOLEiQQMGpSE8uWNaN48GYcOJaB+/dz/u2fGK6+YCw56eVkehXU6c6HCf/+V2iEL6N1bBY3G8jm1WsTGjRoWw3MQlQpYuVILudzy3+z6dTmmT8896evJk3I0bSq9Ywtg3oVt+nQthg1LkrxYlXLmjAJ9+qhRpUo+fPqpJx4/Zor4opUrldi+Xfpio0sXPfr1y3s7hrmiYsVEfPyx9aVO333n+OUnjx8LeOcdFT75xPoxx9/fhK+/1mDcuCSH3Y319xfxzTeJVrevffRIhjZt1Lh40TVDmocPBfTsqUJSkvSd7C1bElGwoPOulKpVMyIiQnpDid9/V+DDD3PPmJNZjx4JGDVKOlirXduAoUN5vCTXFRgowt9fOkCMjZXx/MgOsjTqLFy4EDt37kz9e+/evRESEoIKFSrgjz/+sFvjKOekt2tT+fJGTJyYd251BAaKmDNHh59+SsBXX2lQsSLvYkh57TUjFi6UPtG/d0+G3r1VSH5hGXrKHfZr16Qvmhcu1KJcOb7XjlStmhHjxkn35RUrPHHihPvvZLR5swfat1cjLk56ePP1FbFtmwajRukxe7YOV648w/z5Wqu7u7zs3j0Zpk/3QsWK+TBihDcuXXLNi7ecdOaMHJMnS19shYUZ8cknnBXnSrp3T7ZaI2TMGO8s7chnq99+k6N+fR8cP259WkflykYcO5aAxo0dP13Nzw/YuTMRb7wh/bNiY2Vo21ad7qxQZ9DrgV69VJLF3wFg8WKtU5ZlvqxfPz06dpQOG9as8cT27S5QjT2HpZwLSe1U5uMjYtkyDeTuPxRTLiYI5q23pW7SAsDduwISc3JX8FwoSyPOunXrUKxYMQDAsWPHcPz4cezYsQNNmjTB1KlT7dpAyhmffCK9tEkuF7FsmRaeubuOKGVRly7JGDpU+oL/zBkFJk16ftG2YYM3vv5a+g57//5J2S7+SLYZNy7J6rT+YcNUcNfJkCYTMH26J4YPV8FgkL7ALFHChAMH0l74+fgA/fvr8fPPCdi5MxHNm9v2OdTpBGzapESdOvnQurUae/YoYMyDE+0ePBDQp4/0e54/v4jNmxOhki6PQU6S3lKnf/913FKnjRs90KKFGnfvWj/17N5djwMHEhAcnHMzP3x9ga+/TkTt2tLHxbg4Gdq29cG5c65z1Txhghd+/ll6ttPIkUno2NE1xtOUz1q5ctIHx9GjvXH1qmuFX462dasH9u6VDqYiIrQ5+tknyiq5HAgJMUnOyhZFAbduydLcpKXMydJR8eHDh6kBzf79+9G+fXs0atQIo0aNwm+//WbXBpLjXbyY/tKmatXy4FUH2WzGDB3q15c+sV2zxhNbtnjj8mUVpk7NJ/ma114zYPZs6WnQZH8eHsCKFVrJOx9378owcaL0tGtXptEAffqo8Omn1i8sa9Y04MiRBFSoIH1XWSYDGjUy4KuvNPj113gMGpSEfPlsO1E+dUqBnj3VqFo1HxYvVrptyJVZyclA374qPHxoeSohCCJWr9bwYsNFFS0qIjJSegbk9u1K7N1rv6VOOh0wcqQ3Ro5UQa+XDk89PER8+qkWS5Zo4e2EQ5CPD7B9eyLq1ZMey549E9C+vRo//+z8kGbdOiXWrZM+Z2vUKBnTprnWeOrjY65bp1JZHgsSEwX07q1CQoITGuYEd+4ImDBB+gP+1lvJObrbFrkmDw8PPH36FKIbFHLx8gKCgqTPqZKTzTs7ucGvkWWiKOLp06cwOKA4oc27OL2ofPny2LBhA15//XXUqFEDkydPxttvv42//voLjRo1QnR0tN0b6gpyY4VzvR5o1MgHly5ZnnRUqGDetYmzZygjsbECGjTwwZ07lhdqHh4i/PySERNjOXuGuzk4z/LlSkyaJH2iuHFjItq2dY9quA8eCOjWTYXffrN+Qdm+vR7LlmX+wu/ZM+CLL5RYtUpptZ6NFJVKROfOegwcqLcaCNnCVcccUQT++UfA/PmeWLtWeoCYOFGXp5bGuiNRBLp0UeHAAcu7+a+8Yt7VKSAge8fmO3fMF+C//269fxYrZsKGDRrUqGGfm0HZ6TdaLdC9uwpHj0rPcPDxMW8a8OabzrlxdeaMHG3bqiWXowcHG3HsWGKO78Rlq+3bPTBggPR0uo4d9Vi9OncvhTSZgLZt1ZLboRcsaMKPPybglVec92/nquNNXqTRaJDoRmuEbt2S4fZt6TkfQUEmlCrl/OWWjuLh4YGYmBi795ssBTTjx4/H/v37Ubp0aVy8eBEXL16Ej48Pdu7ciYULF+KHH36wWwNdSW48eEVEeGLOHMvfRS4XceRIAqpWzb2diuzr0iUZmjXzkSwAbM1XXyWieXP3CAJyG5MJaN9ejRMnLE8WAwJMOHMmAYUKueaJfopLl2To0iX9JRPjxunwwQfZKzRqMgGHDyuwcqUSR45krmZCgwbJGDRIj2bNDJmuK+AKY45WC1y9KselSzJcviz/70uG2Fjrb2izZsn48ktNntpq013984+AN97Ih6dPLY/bHTvqsWZN1rd3O35cjvfeU6X7Walb14C1azUIDLTfsSa7/UanM9d3OXhQuq+rVCK2bk3M8c0D7t0T0LChD/791/L9VKtFHDqUs9syZ8XYsV74/HPpUHfBAm2uLia+dKkSH34ofZdg06ZEtGnj3HMhVxhvyD0ZjcA776is1hZzp5t+meWofpOlgCY5ORkrVqzA3bt30a1bN1SpUgUAsGzZMvj4+KBXr152a6AryW0Hr4sXZWjUyEeydsC4cTpMnsy7n5Q5335r3unGFuHhOkydys+YM929K6B27Xx49szyGNC8ufki21XvaB48qMB776mQkGB9ycSiRVp07WrfKePXr8uwapUSW7cqkZho+5sTHGzEwIF6dO+uR/78tv0/OTnmiCIQHS2kCWEuX5bjxg0ZTCbbf8+SJU04fjzBZe/ik6WtWz0wZIj0zIasXDiKIrBwoSdmzvRM97MzalQSpkzRQWHnjaPs0W+SkszL9/btk77g8PISsXWrBg0b5sxFh04HtGyptjpT0F0ugJKSgBYt1JIzqpRKEfv3J+bKZfVXr8pQv76P5I5bXbvqsXx51oNQe8lt1ziUsx4/FlC/vo/kDbN8+cw3/cuWde0AOStcKqDJq3LTwUuvBxo29MHly5a3dENDzTsocGkTZcWMGZ7pbp8KAHXqGPDtt4l2PzGnzPvySw8MHix9cbZokQa9ernemviVK5WYNMnL6sWfv78JmzdrHLoMIS4O2LJFiVWrPK1O7ZWiVovo1s28/KlMmfRPVhw15iQkAH/++TyEuXTJHMpIBXWZ4eUl4uDBBFSunPtOwnKz9JY6BQaalzoVKGDbqeLTp+YdIb/7zvpMMx8fEUuXatCunWMCBXv1G70e6N9fhd27pX8XT08Rmzdr0LSpY4MRUQSGDvXG1q3SRfbd7Yba7dvmCzmpnfZKlDDhhx9yV8Cr1wNNm/rgwgXL8+3ixU04fTre5tDekXLTNQ45x++/y9G8uVqy1li5ckYcPpyAfNLlKN2Wo/pNlicgf/nll2jRogXKly+PO3fuADDPoPnuu+/s1jhynPnzPSXDGfOuTRqGM5RlH36YhKZNrV/UFypkwuefaxjOuIjOnZPRtq30v9cHH3gjKsp1ptAYDMD48V6YMMHbajjz6qtGHD7s+BoRfn7AsGF6/PZbPL74ItFqoeyXJSYKWL3aEzVr5kPHjiocOqSAyUF5hslkXhu+Z48CkZGe6NlThWrVfFCihC+aNvXB6NEqrF7tiTNnFNkOZwDg00+1DGfcUMpOO/nzW14Ux8TI8P77tp10/vmnDI0b+6QbzpQta8TRowkOC2fsSakEPv9cgw4dpJfdJCUJ6N5dhe+/d+xgtnKl0mo407x5Mj74wH3CGQAoWVLEihXSM0aio2UYPNjbYcdEZ5g3z1MynAGA5cs1LhHOENnDa68ZMX++dN++dk2OESO8c3XRYHvKUkDz+eef48MPP0STJk3w9OlTmP47kubPnx/Lly+3awPJ/i5ckOGTT6QTmDFjklh3hrJFLgdWr9agdGnLC2S5XMTatRqXr22SlwiC+cL6lVcs+31CgoAhQ1QusX30s2dA167mQMGaOnUMOHQoEaVL59wxTC4HWrY0YNeuRPz4Yzz69EmCt7dtn+/Dhz3w7rtq1Kzpg5UrlYiPz3o7nj0DfvpJjjVrlBgzxgvNmqkRFOSL117Lh5491YiM9MKePR64eVMOUbRv6Obvb8K8efZfTkY5p0gREXPmSJ9Y79ihxK5d6YcQO3d6oEkTH9y4Yb3QUtu2yW43zd3DA1i1SotOnaRDGr1eQM+eKuzZ45iQ5sQJOT78UDogK1PGiFWr3LPWU4sWBoSHS+82deCABxYudO+7hKII/PyzHAMGeGPBAunfZejQJNSt6wKDK5Ed9eqVjJ49pY+X336rxJIl0mEzpZWlJU6vv/46pkyZgtatW6N48eI4deoUgoODceXKFbRu3Ro3b950RFudLjdM/8toadPx4wlQsu+QHVy7JkPLlmo8fvz87DEyUovBg3NvEUB3duCAAp07S9cPmjFDi5EjnffvFh0toHNnNa5csX7xuuzW3AAAmJ9JREFU1727Hp9+qnWJ49eTJwI2bfLAqlWe6RYwflm+fCK6dzcvfypVyiQ55hiN5lkxly/L8Mcf8tSaMVI7qDlCoUImhIUZUbGiCRUrGlGxohFly5pc4n2n7BFFcwi6f7/lDJiCBc1LnQoWTHvKmJwMTJvmhWXLrF9Qy2Qipk/XYfhwfY7UtHLEuZrRCIwY4Y0vvpD+oMvlItas0aJ9e/uFlLdvm4sCSxVZ9vU113TIaJmkKzMYgLfflt7VSCYT8e23iahXz70CDI0G+PprD6xe7Yk//rA+XpUvbz7fdqVLidxwjUOuQacz15o6f96yb8vl5r6dW8JJl6pBU7hwYfzyyy8ICgpKE9D8/fffePPNN/HgwQO7NdCV5IaD1+zZnpg3j7s2Uc6IjhawcqUc0dEadO6sQMuWbnirLw8ZNcobGzZYXoAolSKOHk1AWFjOHx9+/VWOrl1VkjuXpJg2TYfRo5NcrqCxwQDs26fAypWeOH3a9jvsgiCiWTMDevdOwLNnD/HoUVFcu+aFy5dl+PNPObRax/+iSqWI8uVTwhgjwsKMCA012XW3HXI9Dx4IeOMN6fog7dvrsW7d81k2//4roE8fFX780fpnu2BBE9au1eTohbajztVMJmDMGOljJGAOFVau1OLdd7Mf0mg0QLNmPrh0yfIiXxBEfPmlJlfsgPjwoYB69Xzw8KHl5y0w0FyPpkgR1z/m3Lwpw5o1SmzZopTcEe1FCoWIw4dd73w7N1zjkOu4c0dAgwbSAXNgoAknTiSgaFHX79sZcVS/ydKczJIlS+KPP/5AUFBQmscPHTqEsmXL2qVhZH/nz1tf2hQezqVNZH8lSoiYPDkh9eAFcNB3ZbNmaXH8uMKi6K1eL2DQIBWOHs3Z4uG7dikwaJAKOp30Ca+Xl4iVKx1XbDS7FAqgbVsD2rY14I8/ZFi1yhPbt3tY/X1SiKKAAwc8cOCAPwB/h7ezWDFTagiTMjPm1VdNrBOVBxUuLGLOHB0GDbIsHP7NN0q8/XYy2rUz4Oef5ejTR4V//rEenFavbsDGjRoUK+b+J+EAIJOZl4MqFKLkVtEmk4BBg7xhMCBby/1EERg+3FsynAHMdd5yQzgDAIUKmZc9t22rhtGY9rgYEyPDe++psGePa24oYDQChw4psGaNEocPW6+79LIJE3i+TblfUJCIzz/XokMHlcWy6pgYGXr3VuG77xI5+9aKLN3OHjFiBMaPH4+dO3dCFEX8+uuvmD9/PmbMmIFRo0bZu41kB3q9eWeFlwdAAKhY0Yjx492ryBwR2V++fMCKFRoIguUF1eXLckRG5kw6I4rAJ594ondvtdUw45VXTPjuu0SXDWdeVqmSCYsXa3H5cjymTtWhaNGcP0H39hZRrZoBPXvqERmpxd69Cbh16xkuX47Htm0aTJ2ahHfeSUb58gxn8rJOnZLRsqV0wBAe7o2FC5Vo3Vqdbjjz3ntJ2LcvMdeEMylkMmD+fB0GD5Y+ZzKZBAwd6o2NG22/YH/ZokVK7NwpfdXStm0yxo7NXedrb75pxNSp0vVozpxRYOZM17qxExsr4LPPlHjttXzo0kVtczgjCCImTtTlun8/ImsaNjRY3WHu7FmF1fpalI1ttjds2IB58+bh3r17AICiRYti4sSJaNy4MYoWLWrXRroKd57+N2uWJ+bPt2yzQmFe2lSlCtN8cgx37jd51bRpXvjsM8swRiYTsW9fIt54w3HLFfR6YPRo67UeAHO9rK++SkSJEu578ZecDHz3nQIrVnjip5/sn4YEBT2vERMWZkRYmAkhISbIrZdFIEr18KF5qdOTJ5m7j+flJWLBAi26d3deweicGHNEEZg61QuLF1sPrT/5RIv33stc7a7DhxV4913LO86A+bh38GACfHwy3VyXZzLhvx2xpMOOLVsS0aqVc8P4336TY/VqJXbu9EBSku3LTP38TOjRIxn9+ukREuK659o8VyNHMJmAHj1U2LdPum+vWKFBly7uu8GAS9WgedHjx49hMplgNBqxYMECbNq0iTVoXMzvv8vRpInl9FEAmDBBh0mTmOaT47hrv8nLkpLMxcSlivIGBxtx6pRjLhKePBHQo4cq3XotTZsm4/PPNfD1tf/Pd5bz52VYudITO3Z4QK/PXH0ZtVpMDWJSlieFhhq5dStl2/btHhgwwHKpkzVBQSZs2pTo9Bs+OTXmiCIwc6YnPvnE+s+YO1eLgQNtC2lu3pShYUMfyRomfn4mHDuW6NIX+NkVFwfUr5/PYoktYC6K/MMP8QgOztlQXqcz71C2Zo0Sv/2WuSC9ShUj+vc3z0pU2d6NnIbnauQoT5+azylv3rQ8p/TyEnHwYAIqV3bPY5uj+k2mbo3ExcVhwIABKF26NMqXL48VK1bA398fq1evRrVq1XDu3DksWbLEbo2j7EtKAoYO9ZYMZ8LCjJxqSUQWPD2BlSs18PCwPBmOipJj8mT7n7z9/bcMTZqo0w1nBg5MwtatuSucAYCqVU1Yvty8/OmDD3QoXFj6RCUkxIg2bZIxcaIOmzYl4vff4xEd/QwHDybi00916N9fj1q1GM6QfXTsmIxWrWy7s9m4cTKOH89bs3EFAZgyJQkTJkgvzwGA99/3xtKlGRdZiI8HunVTSYYzMpmIdeu0uTqcAQA/P2DDhkR4elqOO8+eCejVSw2d9bfarm7fFjBtmhdCQ/Nh6FCVzeGMUimiUyc9Dh1KwPHjCejZ0z3CGSJHyp8f2LxZA5XKsm/rdAJ69VIhLi7n2+XKMjWDZuzYsdi/fz/at2+PI0eO4Nq1a2jcuDF0Oh0mTJiAOnXqOLKtTueO6fLMmZ5YsEB6adPRo+6bWJL7cMd+Q2YLFyrx0Ufeks9t25aIZs3sM+X81Ck5evZUWV1OIZOJiIzU2Xwn2t3p9cCxYwpcu2aCVvsYder4okoVea5c2kCuzZalTuPH6zBxYpLLLJ9zxpgzb54nZs+2/rM++kiL0aOlj18mE9CzpwrffSe9BGDmTC1GjMgbxz4AWL/eA6NHS6caffokYeFCx6Q0JhNw9KgCq1crcfCgQnKZmTXFi5vw3nt69Oypd9ud7niuRo729dce6N9fum83a5aML7/UQOZmm726xAyaAwcOYOnSpZg1axa2bt0KURRRunRp7NmzJ8fCmRMnTmDYsGGoWbMmihYtigoVKqBr1644f/68xWuHDBkCPz8/i6+aNWvmSFud7fff5Vi4UHp99LhxSQxniChdI0bo8cYb0iHMiBHeePw4+9s9f/GFB9q3V1u9APTxMW8pm1fCGQBQKoHmzQ0YOFCDDh0eoXr1ZIYz5BSFComYN0/6gtjXV8TWrYn48EPXCWecZfz4JHz0kdbq8x995I1586TPx+bN87Qazrz7rh7Dh+edYx8A9O6djM6dpX/n9es9sXVr1gswS4mLA5YuVaJGDR907KjGgQMeNoczDRokY8uWRJw/H4/w8CS3DWeIckLHjslWC6wfPOiBuXNzcJtQF5epBZUPHjxAuXLlAADBwcHw8vJCr169HNIwa9auXYvY2FgMHjwY5cqVw+PHj7FkyRI0adIEO3bsQP369dO83tvbG7t3707zWF5IhtNb2lSpEpc2EVHG5HJg+XIt6tTxQWJi2mPJw4cyhId7Y/16DYQs5DQmE/Dxx9LFy1MUL27Cl18mIiyMYTKRs7zzTjLOnElKs7V0aKgRmzdrUKoU+2aK0aP18PAAPvxQetbh7NleSE4GJk1KSj1m7tunQESE9DGwcmUjPvtMm6XjqzsTBHOB5YsX5fjzT8vkLzzcG5Urm2tuZcfFizKsWeOJ7ds9oNXa/ib7+oro2lWP/v31KFOGn3+izJg5U4cLF+Q4c8YygpgzxxPVqhntNjvbnWUqoDGZTPDweJ5cy+VyqHJ4ceX8+fMRGBiY5rHGjRujWrVq+OSTTywCGplMlmdmzLxozhxPyYFNoRCxbJkGHva9AUFEuVRIiAkff6zFqFGWx/pduzywfbsHOnXKXAV+rRYYMsQb335rvTZDtWoGbN2qQaFCvCNJ5EyCYN5aum5dA379VYFKlYxo1y4ZnrzZaWHYMD0UCmDCBOmQZu5cLxgM5to116/LMGiQ9Dl0gQImbN6cmGfrl6jVwMaNGjRs6IOEhLThiVYroHdvFY4dS0C+fJn7vnq9edxas0aJn3/OXNHf0FAjBgzQ49139ZzRSJRFHh7AunUa1K/vg4cP086cFkUBAwaocOJEzhcEdzWZOjqJooihQ4dCqTSfVOt0OoSHh1uENJs3b7ZfC1/ycjgDAD4+PihXrlzqlt953W+/WV/aNH58EipVYuJPRLbr1SsZ+/Yl48ABy2R33Dhv1K5tQPHitg2m//4roFs3Fc6dsz78tGuXjOXLNXn24oTI1QgC8PbbBrz9Nu9sZmTQIPNMmvBw6ZDmk0+8kJAg4MgRBeLjLWduyOUiNmzQICgob1+glCljwqJFWrz3nuVAcOOGHCNHemPtWttmGN29K2D9eiU2bFAiJsb26g4KhYi2bZNTC7DntdlMRI5QuLCI9es1aNNGDYMhbad6+lRAz55qHDiQkKfPATNVg6Zr164oWLAgfH194evri06dOqFw4cKpf0/5ymlPnz7FhQsXUL58eYvntFotypYti4CAAISGhmL8+PF48uRJjrcxp+h05qVNJpPlKFK5shHh4VzaRESZIwjAokVaBARYhrvPngkYNkwFkw2575UrMjRu7JNuOBMersO6dQxniMh9vfeeHosWaSAI0iHLqlWe+Ptv6cI9ERE61KljdGTz3EaHDskYOFD6vPWbb5RYtcr6LExRBE6ckKNHDxWqVMmH+fO9bA5nihQxYdIkHS5disfatVrUrs1whsieatUyYtYs6fpmf/whR3i4N8Q8nFFnagbNsmXLHNWObBk/fjw0Gg3GjRuX5vGwsDCEhYUhNDQUAHD69GksW7YMJ06cwNGjR+FjwxxF3Qt7+un1+jT/dUWzZ/vg6lXLQd/DQ8TChXEwGg0wctynHOQO/YYylj8/MGeOCQMG+Fk8d+KEAsuWCejf33qRzGPHlBgwIB8SEqRPkD08RMyd+wxdu+rAj4oZ+w5R5rlKv+nUSQdRTMbo0b42F53t0kWLnj2f5dh20u5g8mQdzp3zx2+/WYYxkyd7ISxMi+rVny+zjY8XsG2bF9avV+GvvzK3jKl2bT369tWgRYuk1FIAeeXfwlX6DeUdvXvr8MsvwM6dlrMNv/xSiapVdejTx/p5pSuw1m+yW+82U9ts29vJkyfRpk0bm177ww8/oHLlyhaPz5o1C/Pnz8fcuXMxcODADL/Prl270Lt3b8yePRvDhg3L8PU3b96E0U0SjcuX1XjvvfKSs2cGDbqH/v3/cUKriCg3mTo1BN9/X8DicU9PEzZvvoLgYMuz2a+/DsT8+UGSRcsBwNfXgLlz/0b16vF2by8RkTPt3x+AadNCJM/NXhQWloAVK67B0zMP3za24sEDJXr0CMXTp5aBS6FCSdi8+U88fqzA9u2v4PvvC0CjsX1bMZXKiJYtH6Njx39RunQeSWOIXIRWK0PfvuXx99+W06YVChNWrbqGSpUSndCyrJPL5ShVqlS2vodTA5oHDx7g4MGDNr22TZs28Pf3T/NYZGQkIiMjMWXKFIwdO9am72MymVCiRAk0a9YM69aty/D1L8+gefjwIQoVKpRah8dV6HRA06YFJO8WVK6cjO++i2VhYHIKV+43lHlPnwpo2LAA7t+3PAGuWjUZe/Y8P9YYjcBHH/lg9Wq11e8XEmLA5s1xKF3aPYLwnMS+Q5R5rthvdu/2xJAh+a2G1K+8YsSBA7EoUoQ1Aq05elSJ7t39JGcjFSxoxKNHmdvrvUwZA/r21eDdd3XIl4+hmCv2G8obbt6Uo3nzAMTHW86wLlLEiIMHYxEY6JrHRmv9JrszaDI398/OChcunOVtulPCmYkTJ9oczqQQRREymW3rUKXeYKVS6XJbdXt4mAt5zp4th04nvPC4iOXLdciXz7XaS3mPK/YbyjwvL/PW2+3aWS4RPX/eA8uW5ceECUmIjwf691dJFhZOUbu2AZs3axAQ4AGACbI17DtEmedK/aZTJ8DbW4P33lMhOTltwODhIWLTJi1CQnhRnJ6WLYFx45Iwb57lv6mt4YxcLqJVKwP6909C3bopdWW4HdmLXKnfUN4QGgqsXKlFt26WN/P++UeOIUP88e23iVA4NbVIn737TaaKBLuKuXPnIjIyEuPGjcPEiRMz9f/u2rULGo0GNWrUcFDrnEMuB0aM0OPkyQTUrPl8l4UJE5JQsaJrpo5E5J7q1zdi0CDpwo1z53pi714F3nrLJ91wpmtXPb75JhEBAbxzSUS5X5s2BmzcqEmzhEkuF7FwoRavv84ZhLaYODEJ9etnfiexV14xYfx4HS5ejMfGjRrUq8eiv0SupGVLA8aNk15iePWqDFFRbhlZZJkLZ1HSFi9ejI8//hhNmjRB8+bNcfbs2TTP16xZEwBw584dDBgwAB06dECpUqUgCAJOnz6N5cuXo0KFClmeuePqypQxYf/+RCxbpsS+fR4YPZq7NhGR/U2bpsPRowr89VfaO5dGo4AePawvaQKAKVN0CA9P4gkyEeUpb71lwM8/x2P5ck+YTECnTsmoWZPhjK3kcmDNGg3q1fPBP/9kfMFWq5YB/fvr0aZNMrhqh8i1TZqUhN9+k+Po0ec392rWNGD9eg2KFctbN/OcWoMmK1q1aoXTp09bfT4uLi71v8OHD8fFixcRExMDo9GIEiVKoHXr1ggPD0f+/Pkz/bN1Oh2io6NRokQJt5j+ZzIBNq7kInIYd+s3ZLvffpOjaVO11boKL/PyErF8uRbt2ydn/GJi3yHKAvab3O+nn+Ro1Up67FGpRHTqpEe/fnpUqsQZ5LZivyFXEBsroH59H0RHyzBgQBJmz9a5dLjqqH7jdjNovvvuO5te5+fnh82bNzu4Na6N4QwROVK1akaMH5+EyMiMB6XAQBO++ELDu8VERJQtb7xhxOLFWowc6Q2DwRzSlC5tRL9+enTrpoefn3PbR0RZExAgYtOmRPz5pxxdu+bdm3luF9AQEZHrGDs2CQcOKPD779aHkwoVjPjyy0SULOlWEzaJiMhFdeuWjNq1DTh7VoHgYBOqVzfyxiRRLlC1qglVq+bt2W8MaIiIKMs8PMzV9+vV80mzg1yKRo2SsW6dBllYVUpERGRVcLCI4OC8e5ediHInZs2ZJJfbtpUfET3HfpO7lS1rwiefaFGggCnN18iROmzbxnAmO9h3iDKP/YYo89hviDLPEf3G7YoEExERERERERHlNpxBQ0RERERERETkZAxoiIiIiIiIiIicjAENEREREREREZGTMaAhIiIiIiIiInIyBjRERERERERERE7GgIaIiIiIiIiIyMkY0BARERERERERORkDmgycPHkSfn5+kl9nz551dvOInC4+Ph5Tp05F+/btUbp0afj5+SEiIkLytefPn0e7du1QrFgxBAUFoUePHoiKisrZBhO5CFv7zpAhQyTHoJo1azqh1UTOc+LECQwbNgw1a9ZE0aJFUaFCBXTt2hXnz5+3eC3HG6LnbO07HG+Inrt48SI6deqEsLAwFC5cGMHBwWjatCm++uori9fac8xRZLPdecbUqVNRt27dNI9VqFDBSa0hch2xsbFYv349wsLC0KpVK2zcuFHyddevX0ebNm0QFhaGdevWQafTISIiAm+99RZOnjyJggUL5nDLiZzL1r4DAN7e3ti9e3eax7y8vBzdRCKXsnbtWsTGxmLw4MEoV64cHj9+jCVLlqBJkybYsWMH6tevD4DjDdHLbO07AMcbohRPnz5FsWLF8M4776BIkSLQaDTYvn07Bg0ahDt37mD8+PEA7D/mCHFxcaIjfqHc4uTJk2jTpg02bNiAdu3aObs5RC5HFM2HEEEQ8PjxY5QuXRoTJkzApEmT0ryuT58+OHnyJH7//Xf4+voCAO7cuYPq1atj6NChmD59eo63nciZbO07Q4YMwe7du3Hv3j1nNJPIZcTExCAwMDDNYwkJCahWrRoqVKiAXbt2AeB4Q/QyW/sOxxuijDVp0gQPHjzApUuXANh/zOESJyLKFkEQIAhCuq8xGAw4cOAA2rZtm3rgAoCgoCDUrVsXe/fudXQziVyOLX2HiJ57+QITAHx8fFCuXLnUC0qON0SWbOk7RGSbAgUKQC6XA3DMmMOAxkbjxo1DgQIFUKJECXTo0AFnzpxxdpOI3MatW7eg1WpRsWJFi+cqVqyImzdvQqfTOaFlRO5Bq9WibNmyCAgIQGhoKMaPH48nT544u1lETvf06VNcuHAB5cuXB8DxhshWL/edFBxviNIymUwwGAx49OgR1qxZgyNHjmD06NEAHDPmsAZNBnx9fTF48GDUqVMHAQEBuHnzJhYvXozWrVtj27ZtaNy4sbObSOTyYmNjAQD+/v4Wz/n7+0MURcTFxaFw4cI53TQilxcWFoawsDCEhoYCAE6fPo1ly5bhxIkTOHr0KHx8fJzcQiLnGT9+PDQaDcaNGweA4w2RrV7uOwDHGyIpY8eOxbp16wAASqUSc+bMQd++fQE4ZsxhQJOBKlWqoEqVKql/r127Nlq3bo0333wTU6dOZUBDlAnpLefgUg8iacOGDUvz94YNG6JSpUro3bs3NmzYYPE8UV4xa9YsbNu2DXPnzkXVqlXTPMfxhsg6a32H4w2RpfDwcPTq1QsxMTHYv39/arg5YsSI1NfYc8xhQJMFfn5+aN68OdauXQutVgtvb29nN4nIpQUEBAB4njK/6MmTJxAEAfnz58/pZhG5rTZt2kCtVuPcuXPObgqRU0RGRmL+/PmYMmUKBg4cmPo4xxui9FnrO9ZwvKG8rkSJEihRogQAoFmzZgCA6dOno2vXrg4Zc1iDJote3H2DiNIXEhICb29vXLlyxeK5K1euoFSpUtzCkSiTRFGETMZhnPKeyMhIREZGYuLEiRg7dmya5zjeEFmXXt9JD8cboueqVasGg8GAqKgoh4w57GlZEBcXhwMHDqBSpUoc5IlsoFAo0KJFC+zZswfx8fGpj0dHR6duZU9Ettu1axc0Gg1q1Kjh7KYQ5ai5c+ciMjIS48aNw8SJEy2e53hDJC2jvmMNxxuitE6ePAmZTIbg4GCHjDlCXFycaM8G5zb9+/dH8eLF8dprr6UWCV6yZAlu3bqFr7/+Gg0aNHB2E4mc7tChQ9BoNIiPj8fw4cPx9ttvo3379gCApk2bQqVS4fr162jUqBEqV66MMWPGQKfTISIiAk+ePMHJkydRsGBBJ/8WRDkvo77z6NEjDBgwAB06dECpUqUgCAJOnz6N5cuXIyQkBIcPH4ZarXbyb0GUMxYvXowpU6agSZMmmDBhgsXzNWvWBACON0QvsaXv3Llzh+MN0QtGjRqFfPnyoXr16ggMDMTjx4+xa9cu7Ny5EyNHjsSMGTMA2H/MYUCTgU8//RQ7d+7E7du3kZiYCH9/f7zxxhsIDw9HtWrVnN08IpdQqVIlREdHSz534cIFlCxZEgBw/vx5TJs2DWfPnoVCoUDdunUxa9YshISE5GRziVxGRn0nf/78GD58OC5evIiYmBgYjUaUKFECrVu3Rnh4OGtpUJ7SqlUrnD592urzcXFxqX/meEP0nC19Jy4ujuMN0Qs2b96MLVu24Pr163j69CnUajXCwsLQq1cvdO7cOc1r7TnmMKAhIiIiIiIiInIy1qAhIiIiIiIiInIyBjRERERERERERE7GgIaIiIiIiIiIyMkY0BARERERERERORkDGiIiIiIiIiIiJ2NAQ0RERERERETkZAxoiIiIiIiIiIicjAENERER0UsiIiJQp04dZzeDiIiI8hAhLi5OdHYjiIiIiHKKn59fus937doV8+bNg16vR0BAQM40ioiIiPI8hbMbQERERJSTrl27lvrnnTt3IiIiAmfPnk19zMvLCz4+Ps5oGhEREeVhXOJEREREeUqhQoVSv3x9fS0ey58/v8USpyFDhqBbt25YsGABypQpg6CgIERGRsJgMGDKlCkIDg5GaGgoNm3alOZn3b9/H3379kXJkiUREhKCrl274vbt2zn6+xIREZF7YEBDREREZIOTJ0/iwYMH2LdvH2bPno3IyEh07twZfn5+OHLkCPr27Yvw8HDcvXsXAKDRaNCmTRuo1Wrs27cP+/fvh4+PDzp27Ai9Xu/k34aIiIhcDQMaIiIiIhv4+flhzpw5KFOmDHr27IkyZcpAo9Fg7NixKF26NMLDw6FUKvHzzz8DAHbs2AGZTIbFixejYsWKKFeuHJYuXYq7d+/i1KlTTv5tiIiIyNWwBg0RERGRDSpUqACZ7Pm9rcDAQISGhqb+XS6Xw9/fHzExMQCACxcu4ObNmyhevHia76PT6XDr1q2caTQRERG5DQY0RERERDZQKNKeNgmCIPmYyWQCAJhMJlStWhWrV6+2+F4FChRwXEOJiIjILTGgISIiInKAKlWqYOfOnShYsGBqMWIiIiIia1iDhoiIiMgB3n33XRQoUADdunXDjz/+iKioKJw6dQoTJkzAvXv3nN08IiIicjEMaIiIiIgcQKVSYd++fShevDh69uyJ119/HcOHD4dOp0O+fPmc3TwiIiJyMUJcXJzo7EYQEREREREREeVlnEFDRERERERERORkDGiIiIiIiIiIiJyMAQ0RERERERERkZMxoCEiIiIiIiIicjIGNERERERERERETsaAhoiIiIiIiIjIyRjQEBERERERERE5GQMaIiIiIiIiIiInY0BDRERERERERORkDGiIiIiIiIiIiJyMAQ0RERERERERkZMxoCEiIiIiIiIicjIGNERERERERERETsaAhoiIiIiIiIjIyRjQEBERERERERE5GQMaIiIiIiIiIiInY0BDRERERERERORkDGiIiIiIiIiIiJyMAQ0RERERERERkZMxoCEiIiIiIiIicjIGNERERERERERETsaAhoiIiIiIiIjIyRjQEBERERERERE5GQMaIiIiIiIiIiInY0BDRERERERERORkDGiIiIiIiIiIiJyMAQ0RERERERERkZMp7PFNrl69irt370Kv16d5vGXLlvb49kREREREREREuVq2ApqoqCh0794dV65cgSAIEEURACAIAgAgNjY2+y0kIiIiIiIiIsrlsrXEacKECShZsiT++usvqFQq/PTTT9i3bx9ee+017N27N9PfLz4+HlOnTkX79u1RunRp+Pn5ISIiQvK158+fR7t27VCsWDEEBQWhR48eiIqKknztypUrUbNmTbzyyiuoXLkyIiMjkZycnOn2ERERERERERE5QrYCmrNnz+KDDz5AwYIFIZPJIJPJUKtWLUyd+v/27jssiuvrA/h3l6X3Jop0pBeRYkdFxd67sdfYE41G/SVqjD2amMTYa4zdYOwNOyhKUUABAUEQRRHpve2+f/BKJDOLwC67C3s+z+OTOHd29qjD7OyZe89ZiaVLl9b5eJmZmTh06BBKSkrQv39/ofvFxcVh4MCBKC0txcGDB/HHH38gISEBffv2xYcPH6rtu2XLFixbtgwDBw6En58fpk+fjl9++QWLFy+uc3yEEEIIIYQQQgghDUGkJU4VFRXQ0NAAAOjp6eHt27ewsbGBmZkZXrx4UefjmZmZITk5GRwOBxkZGTh8+DDrfuvXr4eSkhJOnjwJLS0tAICbmxs8PDywbds2rF69GkBlwmfLli2YNGkSVq5cCQDw9vZGWVkZ1q5di9mzZ8Pe3r4+f3RCCCGEEEIIIYQQsRFpBo2joyOePXsGAPD09MTvv/+Ohw8fYtOmTbCwsKjz8TgcTlX9GmHKy8tx7do1DBo0qCo5A1Qmd7y9vastrbpx4waKi4sxbty4ascYN24cBAIBLl26VOcYCSGEEEIIIYQQQsRNpATN4sWLwefzAQDff/89UlJS0LdvX/j7+2Pjxo1iCfC/Xr58iaKiIjg5OTHGnJyckJiYiOLiYgBATEwMgMpE0qeaN28OfX39qnFCCCGEEEIIIYQQaRJpiVOPHj2q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"},"metadata":{}}],"execution_count":10,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"4c07f098-c85e-40bf-8e34-b3edcec1c9da"},{"cell_type":"markdown","source":["### Step 4: Model Training and Tracking"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"cedea140-767a-48da-b863-3b7366e198c9"},{"cell_type":"markdown","source":["#### Adding and massaging data.\n","1. Sets Up Date Range: Creates a 3-year monthly date range for generating sample data.\n","2. Simulates Seasonality: Adds a sinusoidal pattern to represent a recurring seasonal effect in sales.\n","3. Adds a Linear Trend: Creates an increasing sales trend over time by adding a linear component.\n","4. Introduces Noise: Adds random noise to make the data more realistic and less predictable.\n","5. Combines Components: Combines the seasonal, trend, and noise elements into a final sales dataset with a baseline value.\n","6. Scales Sales Data: Uses MinMaxScaler to scale the sales data (helpful for models like SARIMAX that require scaling).\n","7. Plots Simulated Data: Visualizes the simulated sales data over time, showing the trend and seasonality."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"f7230619-239d-4208-8b2c-80728b78497b"},{"cell_type":"code","source":["import numpy as np\n","import matplotlib.pyplot as plt\n","\n","# Let's create a sample 'simulated_sales_df' DataFrame with a trend and seasonality\n","date_range = pd.date_range(start=\"2022-01-01\", periods=36, freq='MS') # 3 years of monthly data\n","np.random.seed(42) # For reproducibility\n","\n","# Simulate a basic seasonal pattern with a sinusoidal component\n","seasonal_pattern = 10 * np.sin(2 * np.pi * np.arange(len(date_range)) / 12)\n","\n","# Add a linear trend component (e.g., increasing sales)\n","trend_component = np.arange(len(date_range)) * 5\n","\n","# Add some random noise to make the data more realistic\n","noise = np.random.normal(0, 5, len(date_range))\n","\n","# Combine these components to create the 'sales' data\n","sales_data = 50 + trend_component + seasonal_pattern + noise # Start with a base sales level\n","\n","# Create DataFrame to mimic 'simulated_sales_df'\n","simulated_sales_df = pd.DataFrame({\n"," 'order_date': date_range,\n"," 'sales': sales_data\n","})\n","\n","# Scale the sales data as done typically for SARIMAX\n","from sklearn.preprocessing import MinMaxScaler\n","scaler = MinMaxScaler()\n","simulated_sales_df['scaled_sales'] = scaler.fit_transform(simulated_sales_df[['sales']])\n","\n","# Plot the adjusted simulated data\n","plt.figure(figsize=(12, 6))\n","plt.plot(simulated_sales_df['order_date'], simulated_sales_df['sales'], label='Simulated Sales with Seasonality and Trend', marker='o')\n","plt.xlabel('Order Date')\n","plt.ylabel('Sales')\n","plt.title('Adjusted Simulated Sales Data')\n","plt.legend()\n","plt.show()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":13,"statement_ids":[13],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:11:25.6513032Z","session_start_time":null,"execution_start_time":"2024-11-02T23:11:26.1060884Z","execution_finish_time":"2024-11-02T23:11:27.1730469Z","parent_msg_id":"bbbda893-71b5-48f7-bc84-57edded8bc80"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 13, Finished, Available, Finished)"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"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ypXat2+f8vLyFB4erh49eujmm2+u0wk89RmXxJxolFoxJxqzbpJ3zIlS49asuvHU54fNuo5LYl40Sq2YF41ZN4l50RU1mzZtmtatW6dDhw6pqKhIzZs3V0pKiu69916dccYZdX4NjTEvEugAAAAAAAAYDHvoAAAAAAAAGAyBDgAAAAAAgMEQ6AAAAAAAABgMgQ4AAAAAAIDBEOgAAAAAAAAYDIEOAAAAAACAwRDoAAAAAAAAGAyBDgAAAAAAgMEQ6AAAAK8WERGhESNGNPYwAAAAXIpABwAAuNVnn32m66+/XsnJyYqNjVVSUpKGDRump59+WsXFxY09PJdatmyZIiIiKn5FRkaqdevW6tatm6655ho999xzys3Ndcm1RowYoYiICJc8FwAA8Hy+jT0AAADQNJSVlWnKlClavHixQkJCNGTIELVr107Hjx/Xp59+qvvvv1+LFi3SihUr1K5du8YerksNGDBA559/viSpoKBAGRkZ2rJliz744AOlpqbqiSee0KWXXtq4gwQAAIZCoAMAANxixowZWrx4sXr27KmXX35ZCQkJFW02m02zZ8/WnDlzdMUVV2j9+vUKCwtrxNG61sCBAzV58uRKj9lsNi1btkz33XefbrzxRoWFhWnw4MGNNEIAAGA03HIFAAAa3N69e/X0008rMjJSr776aqUwR5LMZrP+9a9/6corr9S+ffs0b968Su1du3ZV165dZbFYdO+99yo5OVnR0dFatmxZRZ+lS5eqT58+iouLU3JysqZPn17jLVx5eXmaOXOmzj//fMXHxysxMVF//etftWXLlip9y29nKikp0SOPPKIePXooJiZGqampp/yemM1mXXfddXrsscdks9l0//33y+FwVLT/8ssvmj59uvr376+2bdsqLi5OvXr10oMPPqj8/PxKzxUREaFNmzZV/L781y233FKp3w8//KAbbrhBHTp0UPPmzdWlSxfdc889ysnJOeXXAQAAGgcrdAAAQINbvny57Ha7JkyYoNjY2Gr73XPPPXr99de1bNky3X///ZXarFarRo0apfz8fA0bNkx+fn4VzzVnzhzNnDlTsbGxuu666+Tn56e33npLP//8s9Pr5Obmavjw4dq1a5f69OmjwYMH6/jx43r//fc1cuRILV68WH/5y1+qfN7f/vY3/fDDDxo8eLAiIyOVlJR06m/K78aMGaPU1FTt2rVLO3fuVHJysiRp9erVeumll5SSkqILLrhAdrtdX3/9tZ544glt2rRJ77//vvz8/CRJ9913n5YvX6709HTdd999Fc/dtWvXit+///77uv7662U2m3XJJZeoZcuW+vnnn7Vw4UJ9+umn+uSTT9iDBwAAAyHQAQAADW7r1q2STuwlU5OzzjpLLVq0UEZGhn799Ve1atWqoi0zM1PJyclas2aNgoKCKh7ft2+f5syZo4SEBG3YsEHNmzeXJE2dOlUXXnih0+vce++92rVrl+bPn69x48ZVPP7bb79p8ODBuvPOOzVkyBAFBgZW+rzDhw9r06ZNioyMrN8bUAMfHx/16dNHBw8e1LffflsR6IwZM0a33Xab/P39K/WfPXu2UlNT9fbbb+uqq66SJE2bNk2ff/650tPTNW3atCrXyMnJ0cSJExUTE6MPP/xQrVu3rmh74403dNNNN+mRRx7R//73P5e9LgAA0LC45QoAADS43377TZLUsmXLWvuW98nMzKzS9tBDD1UKcyTp9ddfV1lZmW699daKMEeSwsLCNGXKlCrPkZ2drbfeeksDBgyoFOZIUmxsrG6//XZlZWVp/fr1VT532rRpLg1zyrVo0UKSKt36lJCQUCXMkaSbb75ZkpyOrzqvvPKKjh8/runTp1cKcyTpiiuu0Nlnn6233nrrFEYOAAAaCyt0AACARynfR8ZkMlV6PDAwsGL1ysl++OEHSVLfvn2rtPXp06fKY99++61sNptKSkqc7oGzb98+SdKePXs0bNiwSm29evWq46uon5P3zjn5sZdfflnLly/Xrl27dPz4cdnt9or2I0eO1Pn5v/7664qP5a/vZCUlJcrOzlZ2draio6NP4RUAAAB3I9ABAAANLjY2Vrt379ahQ4d05pln1tg3IyOj4nNOFhMTUyXkkaTjx49XtDu77p/l5uZKkr744gt98cUX1Y6joKCgTs/nCuXhzMlhyr333quFCxeqVatWuuSSSxQfH1+xYmf27NkqKSmp8/OXv+aFCxfW2K+goIBABwAAgyDQAQAADe68887T559/rg0bNmjgwIHV9tu9e7cOHz6shISESvvnSFVX7JQrP948KytLiYmJldrKb/U6WbNmzSRJkyZN0sMPP1yfl1HtGE6H3W7X5s2bJUk9e/aUJB09elTPP/+8kpOTtXbtWgUHB1f0z8zM1OzZs+t1jfLXvHnzZnXu3NlFIwcAAI2JPXQAAECDu+aaa+Tj46MlS5YoKyur2n5z586VJI0dO7bOz92lSxdJqghFTubsCPKePXvKZDLpq6++qvM1GtKrr76q9PR0de7cWZ06dZIkpaWlyeFwaODAgZXCHMn5a5JOHIMuSTabrUrbOeecI0ke85oBAMDpI9ABAAAN7owzztDEiROVk5Ojq6++usr+L3a7XXPmzNGKFSvUtm1b3X777XV+7iuvvFJms1nPPPOMjh49WvH48ePHKwKik8XFxemyyy7T1q1b9dRTTzndv+brr79WYWFhPV5h/dlsNr300ku6++67ZTabNXPmzIoVQOUbF3/55ZeV9s05dOiQHnzwQafPV75Z86FDh6q0jR07Vs2aNdN///tf7dq1q0p7YWEhYQ8AAAbDLVcAAMAtHnroIR0/flwvv/yyevXqpYsvvlht27ZVXl6ePv30U+3du1ft27fX66+/XnEbVV20a9dO9957r1JTU9WvXz9deuml8vX11apVq5ScnKw9e/ZU+ZxHH31Ue/bs0fTp0/Xqq6+qd+/eCgsL06FDh7R9+3bt3btXP//8c5XVMadq/fr1Ki4uliQVFRUpIyNDmzdvVkZGhiIjI/Xss89WuhUtPj5eo0aN0qpVqzRw4EANGDBAv/32m9asWaP+/fsrLS2tyjX69++vlStXasKECbrooosUGBiozp07a+jQoYqJidHzzz+vCRMm6IILLtCQIUN05plnqqSkRAcPHtTmzZvVu3dvvfnmmy55vQAAoOGZLBZL1f+WAgAAaCDr16/X4sWLtXXrVmVlZSk4OFgdOnTQqFGjdOONN1Y5llySunbtKkn6/vvvq33epUuX6plnntG+ffvUvHlzXX755frXv/6lFi1aqF+/fnrvvfcq9S8qKtLChQv11ltvac+ePbLb7YqNjVWXLl00cuRIXXHFFfL1PfF/XyNGjNCmTZtksVjq9VqXLVum2267reLPJpNJISEhioqKUufOnTV48GBdddVVioiIqPK5+fn5mjVrllatWqXMzEy1atVKV199te688041b968ymsqKyvTf//7X7355ps6cuSIysrKdM0112jBggUVffbs2aOnnnpK69evV2ZmpoKDg5WQkKCUlBSNGTOmYg8fAADg+Qh0AAAAAAAADIY9dAAAAAAAAAyGQAcAAAAAAMBgCHQAAAAAAAAMhkAHAAAAAADAYAh0AAAAAAAADIZABwAAAAAAwGAIdAAAAAAAAAyGQAcAAAAAAMBgCHQAAAAAAAAMhkAHAAAAAADAYAh0AAAAAAAADIZABwAAAAAAwGD+Hw/R7tMxwwtIAAAAAElFTkSuQmCC"},"metadata":{}}],"execution_count":11,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"ae86a4b6-108c-4d7d-a157-58137af2824f"},{"cell_type":"markdown","source":["#### Scaling data."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"e57ae0b4-e6eb-4cbb-8559-4b0046f8fd8f"},{"cell_type":"code","source":["# Scaling the sales data only if it's not already scaled properly\n","scaler = MinMaxScaler()\n","scaled_sales = scaler.fit_transform(simulated_sales_df[['sales']])\n","\n","# Update simulated_sales_df with the scaled values for the model to train on\n","simulated_sales_df['scaled_sales'] = scaled_sales"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":14,"statement_ids":[14],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:11:30.4199926Z","session_start_time":null,"execution_start_time":"2024-11-02T23:11:30.8233941Z","execution_finish_time":"2024-11-02T23:11:31.2042125Z","parent_msg_id":"f54f687a-17c0-4be0-9072-09e270f149d1"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 14, Finished, Available, Finished)"},"metadata":{}}],"execution_count":12,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"40cd93f5-b144-47f7-ba31-3ff1f692d192"},{"cell_type":"markdown","source":["#### Model training.\n","1. Define Hyperparameter Ranges: Sets ranges for SARIMAX model parameters (p, d, q) and creates combinations for both non-seasonal (pdq) and seasonal parameters (seasonal_pdq with a 12-month seasonality).\n","2. Initialize Best Model Tracking: Sets placeholders for the best AIC (model performance metric), and corresponding parameters.\n","3. Iterate Through Parameter Combinations: Tests each combination of (pdq) and (seasonal_pdq) by fitting a SARIMAX model to the scaled_sales data.\n","4. Track Best Model: If a model's AIC score is lower than the current best, updates best_aic, best_param, and best_param_seasonal to store the optimal parameters.\n","5. Print Best Parameters: Outputs the optimal (pdq) and (seasonal_pdq) parameters along with the lowest AIC score.\n","6. Fit Final Model: Fits a SARIMAX model using the best parameters found for scaled_sales."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"d6fc8522-d375-4623-9933-70528a62dd19"},{"cell_type":"code","source":["# Hyperparameter tuning for SARIMAX\n","p = d = q = range(0, 2)\n","pdq = list(itertools.product(p, d, q))\n","seasonal_pdq = [(x[0], x[1], x[2], 12) for x in pdq]\n","\n","best_aic = float(\"inf\")\n","best_param = None\n","best_param_seasonal = None\n","for param in pdq:\n"," for param_seasonal in seasonal_pdq:\n"," try:\n"," mod = sm.tsa.statespace.SARIMAX(simulated_sales_df['scaled_sales'],\n"," order=param,\n"," seasonal_order=param_seasonal,\n"," enforce_stationarity=False,\n"," enforce_invertibility=False)\n"," results = mod.fit(disp=False)\n"," if results.aic < best_aic:\n"," best_aic = results.aic\n"," best_param = param\n"," best_param_seasonal = param_seasonal\n"," except:\n"," continue\n","\n","print(f'Best ARIMA{best_param}x{best_param_seasonal}12 - AIC:{best_aic}')\n","\n","# Fit the best SARIMAX model on scaled data\n","mod = sm.tsa.statespace.SARIMAX(simulated_sales_df['scaled_sales'],\n"," order=best_param,\n"," seasonal_order=best_param_seasonal,\n"," enforce_stationarity=False,\n"," enforce_invertibility=False)\n","results = mod.fit(disp=False)"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":15,"statement_ids":[15],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:11:34.4235122Z","session_start_time":null,"execution_start_time":"2024-11-02T23:11:34.8689054Z","execution_finish_time":"2024-11-02T23:11:40.6091719Z","parent_msg_id":"e904a639-f4d2-4105-b337-b1fbc5c2d795"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 15, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stderr","text":["/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n"]},{"output_type":"stream","name":"stdout","text":["Best ARIMA(1, 0, 0)x(0, 0, 0, 12)12 - AIC:-109.61193341586926\n"]}],"execution_count":13,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"32dd0e0b-1ab0-4905-b378-f084c56ced09"},{"cell_type":"markdown","source":["#### Model diagonostics for SARIMAX model.\n","- Residuals Plot: Look for randomness around zero. Any patterns or trends indicate model inadequacy.\n","- Histogram and KDE Plot: Check for normal distribution centered around zero. Skewness or heavy tails suggest poor fit.\n","- Q-Q Plot: Points should lie along the 45-degree line. Deviations indicate non-normal residuals.\n","- Correlogram (ACF Plot): Significant autocorrelations suggest the model is not capturing temporal dependencies."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"e87f82b8-a4fc-4830-9759-408b7ea4c7a3"},{"cell_type":"code","source":["# Print model summary\n","print(results.summary())"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":16,"statement_ids":[16],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:11:44.7803494Z","session_start_time":null,"execution_start_time":"2024-11-02T23:11:45.2423172Z","execution_finish_time":"2024-11-02T23:11:45.6235055Z","parent_msg_id":"91c5bfe2-a049-4c57-b802-ebccc6e63d17"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 16, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":[" SARIMAX Results \n==============================================================================\nDep. Variable: scaled_sales No. Observations: 36\nModel: SARIMAX(1, 0, 0) Log Likelihood 56.806\nDate: Sat, 02 Nov 2024 AIC -109.612\nTime: 23:11:45 BIC -106.501\nSample: 0 HQIC -108.538\n - 36 \nCovariance Type: opg \n==============================================================================\n coef std err z P>|z| [0.025 0.975]\n------------------------------------------------------------------------------\nar.L1 1.0369 0.013 77.347 0.000 1.011 1.063\nsigma2 0.0023 0.001 2.333 0.020 0.000 0.004\n===================================================================================\nLjung-Box (L1) (Q): 1.08 Jarque-Bera (JB): 2.87\nProb(Q): 0.30 Prob(JB): 0.24\nHeteroskedasticity (H): 1.15 Skew: -0.13\nProb(H) (two-sided): 0.81 Kurtosis: 1.62\n===================================================================================\n\nWarnings:\n[1] Covariance matrix calculated using the outer product of gradients (complex-step).\n"]}],"execution_count":14,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"f78183d9-b20c-4955-b961-90ab290e03cc"},{"cell_type":"code","source":["# Plot diagnostics\n","results.plot_diagnostics(figsize=(15, 12))\n","plt.show()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":17,"statement_ids":[17],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:11:48.1730157Z","session_start_time":null,"execution_start_time":"2024-11-02T23:11:48.7278865Z","execution_finish_time":"2024-11-02T23:11:49.8751635Z","parent_msg_id":"4d7101d1-4424-46d0-bb74-a0012e7b1bdd"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 17, Finished, Available, Finished)"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"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nMpYFfB1fVDdlMd4IR+fv6goNek9qqxq2mdfIJDILaX4+HiPv7UruO3U02wblF1cXJz69eun119/XTabTREREZUdUrURHx8vyfNvodPT02UymVSrVq2KDqtaGzhwoKKioqjFVYJp06bp6aef1iOPPKLbbrutcDuv2fLhbXy94XXrn8aNG6tx48aSpL59+0qSHnvsMV1zzTW8doFqrGXLlpo5c6ZffQveI0782dv7Rt26dcs30CBwKmMllf7zq6o71fFCPr6/o6LUtPeosqppn32BQCK3lJKTk7V48WI5nc4idXZSUlIkSW3atKms0KqtE1fNRPlp1qyZIiIiCl+7J0pJSVHz5s0VHh5eCZFVb4ZhyGymPLk306ZN07Rp0zRx4kSNGzeuSBuv2VPna3x94XVbeh06dNDrr7+uXbt26eyzz+a1C1RTDRo00A033FAuxzrxfaM6fpk9lbEq6+dXVVaer62ajO/vqAg18T2qvFT3z75A4FtZKQ0YMEBZWVlatmxZke0LFixQYmKiOnXqVEmRVU8ZGRn6/PPP1b59e77klrOQkBBdcskl+uijj5SZmVm4fe/evaW6lQv+W7p0qXJycnif8OKpp57StGnTNH78eE2cOLFYO6/ZU1PS+HrD67Zs1q5dK7PZrKSkJF67APxy4vsG/lHWzy9A4vs7Ao/3qFPDZ1/pMSO3lPr06aNevXpp7NixyszMVLNmzbR48WKtXLlSc+bMkcViqewQq6xbb71Vp512ms4555zCxc5efPFFHTp0SC+//HJlh1flrFixQjk5OYVJg19++UVLly6VlP86joyM1AMPPKCLLrpIw4cP17333qvc3FxNnTpVderU0ZgxYyoz/KBW0tgeOXJEI0eO1JAhQ9S8eXOZTCZ98803mjVrltq0acPsCg9eeOEFTZkyRb1791a/fv20YcOGIu3nnnuuJPGaLSN/xnfPnj28bsvgnnvuUUxMjDp27Kh69erp6NGjWrp0qT744APdfffdhTMLeO0CKODv+wb8vz7AP/z5DlCT8P29bHgd+Yf3KP/x2Vd+TBkZGUZlB1HVZGVl6YknntCSJUuUnp6uli1bauzYsRo6dGhlh1alzZgxQx988IF2796t7Oxs1a5dW+eff77Gjh2rDh06VHZ4VU779u21d+9ej21bt25V06ZNJUlbtmzRo48+qg0bNigkJEQ9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Nmw4lWHzy4wZMwr//dxzzykmJqbEfcaPH6/WrVtLkpYuXarff/+92sQBAABQVu+++64kyWQyeUwKltaiRYvUqVMnvfjii0pJSdHx48eVm5urPXv26L333lO/fv00YcIEud3uEo/15ptvqnfv3nrnnXe0e/du5ebmnlLfLVu2qFOnTpowYYLWrFmjQ4cOyeFw6OjRo/r66681YcIE9ejRo8TrYV9eeOEFde3aVXPnztVvv/2m7Oxs5eTk6Pfff9cbb7yh7t27F7mG9GT8+PG65pprtGrVKh09elQ2m02///67XnjhBfXs2VNbt271O5709HT16dNHEydO1Pfff6+jR48W+x5yzz336JprrtGrr76qzZs369ixY3I6nUpPT9cPP/yg6dOn69xzz9W3337r1znfe++9wlJi+/btU25urv7880+9/PLL6tevX2EyuuC70tKlS/XXX38pLy9Pu3fv1syZM9W/f39lZWX5/TgBlB9KKwCoMu655x69/vrrOn78uP7973/roosuKtNxtm3bpuHDh+uvv/4qsj01NVWff/65Pv/8c73++utasGBBiYtDbNy4UVdffbWOHDlS4nl/+uknXXnllYUXR1L+7XJLlizR8uXLtXjxYnXp0kVr1qzR9ddfr+PHjxf2y83N1aJFi7RixQr973//U3JycrHjr127VgMHDiy23W63648//tAff/yh9957T/fee68effTREuMti23btmnz5s2SpI4dO+r888/3a7+QkBCNHDlS48aNk9vt1rvvvqtJkyZV+TgAAADK6vjx4/rpp58kSaeffrqaN29+SsdbuXKlbrvtNhmGoYiICI0ePVq9e/dWWFiYNm/erOeee05//fWX5syZo/DwcD3++ONej7V582YtXLhQiYmJGjNmjDp27CjDMPT999/LarWWuu+OHTs0YMAAZWVlKSoqSjfffLPOPfdcNW7cWMePH9eqVav06quvaufOnRo6dKhWr16tWrVqlerxv/nmm3rkkUckSXFxcbrnnnsKy7WtX79ezz33nNLT0/XYY48pJiZGt956a7FjPP/883rttdckSQ0bNtS9996rDh06KC8vT1988YVeeukljRgxQjabza+Y7rzzTqWkpGjYsGEaMmSIGjRooAMHDsjlchX2cblcSkpK0oABA9SxY0eddtppCgkJ0Z49e7RmzRq98847SktL03XXXaf169erXr16Xs/3888/a/HixWrevLnGjBmjtm3bKjMzU++8844WLlyo3377TY888ogGDhyoRx55ROeee65uu+02tWzZUkePHtUrr7yi5cuX68cff9TTTz+tyZMn+zv8AMoJiVwAVUbt2rU1evRoTZ8+XT/88IP+97//6bLLLivVMQ4cOKCBAwcqLS1NknTVVVdp2LBhqlevnv744w/NmTNH3377rdavX69hw4bp008/lcVi8XisgoW0bDabxo4dq169eik6Olq//PKLmjRpUqSvzWbTddddJ7vdrkmTJqlbt26yWCxauXKlnn32WeXk5Oj222/XkiVLdP311ysmJkYPPvigOnXqJKfTqWXLlmnWrFnKyMjQ3XffrZUrVxaLx+VyKSoqSn379lXPnj3VsmVLxcTE6MiRI9q+fbteeeUV7d27VzNmzFCLFi103XXXlWrs/LFu3brCf5f2ubnssss0bty4YsepynEAAACUVUpKSmFC71QXYXU4HLrnnnsKk7jLli3TueeeW9jesWNHDRkyRJdccol27typF198UVdddVXhXWUn27Fjh1q3bq1PP/1UtWvXLtzeuXPnUvc1DEO33nqrsrKy1KZNGy1ZskQJCQlFjnHBBRfoiiuuUP/+/fXHH3/ohRde0MMPP+z3409LS9NDDz0kSapbt66WL19eJDHeuXNnDR48WH379tWhQ4f0yCOPaNCgQapfv35hn9TUVE2dOlWS1KRJE61cubJIe9euXdWnTx8NHDhQdrvdr7i2bdumGTNm6KabbircdvJz/cADDygpKUkmk6nI9nPOOUeDBw/WLbfcon79+unIkSN65ZVXfI7LTz/9pPPOO08ffvihIiMjC7f37NlTeXl5Wrp0qRYvXqwVK1Zo0KBBeuONN4p8F7rwwgt1ySWXaMOGDXr77bf18MMPKySEtBJQkSitAKBKufPOOwsvAKdMmeKzBIInDz74YGESd9q0aXr11VfVp08fnX322RoyZIj+97//aciQIZKk77//vvA37p6kpaUpIyNDn3zyiSZNmqQePXronHPO0dVXX60zzzyzSN8jR44oKytLX3zxhcaOHavzzjtPnTp10sSJE/Xvf/9bkrRnzx717dtX9erV05o1azRq1Ch16tRJ559/vqZMmaK77rpLUv4sYE+3bLVv317btm3TG2+8oZtuukndu3fX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FUsqt27dWlJ+vVpfC4pt27bNr/q4/jixtq+3JK70T51hANUfiVwAVVZoaKgmTJggSdq3b19hTVtvCi7gJGnjxo0++xZcwErFL+KC0Yn1f70tqiYF/iIvOTlZ55xzjqT8Mfz+++/92s/pdGru3LmFP19++eXVIg4AAIBTcd1116lBgwaSpLlz52rNmjV+77t06VJlZ2dLknr16lW4/Z133vG6z7fffqtffvml2D6B1L9//8J/P/vsswE5R8Fjyc7O1gcffOC135IlS3T8+PEi+xS44IILJEnHjx/3OVHgvffeO9VwCxWUnfBVD/jgwYP69NNPy+2cAIIbiVwAVdrw4cMLfzs9Y8YMn3Vfe/ToUXibvK8L2OPHj+vDDz+UlH9rfVnqb1W0E2vm+rrQKynZXR7uvffewn//3//9n1+Ljc2YMaNwZeD27duXyxeHYIkDAACgrCIiIjRnzhxZLBa53W5dc801PhORUv7iYePHj9eIESMKZ472799fjRo1kiTNnDnTY83djIwM/d///Z+k/DJkI0eOLNfH4s3AgQMLJ07Mnz+/xJnHu3bt0vvvv1+qc1x77bWFC+NOnjzZ45oSu3fv1iOPPCIpf9xvuOGGIu3XXHNN4Z1ujzzyiMc7/L7//nu99tprpYrNl+bNm0uSfv/9d3333XfF2nNycjRy5MiArH0BIDiRyAVQpVksFk2cOFFSfjmE+fPne+3boEEDDRw4UJK0du1aj0lNwzA0btw4paWlSZJuv/32AERd/gou8iR5HYO5c+eWusxAWQwaNEjDhg2TJKWkpOiqq67yumqv2+3WCy+8oH//+9+S8p/PGTNmVKs4AAAATkXPnj314osvymq1KicnRzfffLMuuugiPf/881q9erW2bNmib775Ru+9955uu+02nX322cWSiaGhoXr++edlMpmUnZ2t/v3768knn9T69eu1adMmzZ07Vz169NCOHTskSXfddVdhyYNAM5vNeuONNxQbGytJmjhxogYMGKB58+Zpw4YN2rJli1avXq0XXnhBl19+uTp06KBly5aV6hx16tQpvM5LTU1Vr169NHPmTG3YsEEbNmzQCy+8oF69ehVeKz7xxBOqX79+kWMkJibq/vvvl5RfBuLCCy/Ua6+9pk2bNmn9+vV68sknNXjwYDVo0KBwYeVTXRjt6quvlpR/rTps2DA9++yz+uabb/TDDz8UPmdr167V+eeff0rnAVB1sIILgCrviiuu0DPPPKNt27aVuPjAlClTtGbNGqWlpWncuHH6/vvvddVVV6lOnTratWuXXnnllcJas507d9att95aEQ/hlJ111llKTk5WSkqK3njjDR07dkzDhg1TgwYNtG/fPi1cuFBLly7V+eefr2+//Tbg8cyYMUNHjhzRF198ofXr1+vcc8/VtddeqwsvvFAJCQnKysrSzz//rPnz5xfWIZPyb6fr1KlTtYsDAADgVFxzzTVq1qyZJkyYoB9//FGbNm3Spk2bvPavU6eO7r///sLkqCT17t1bc+bM0V133aXs7Gw9/fTTevrpp4vtO3LkSE2ePDkQD8OrM844QytWrNCIESO0Y8cOff311/r666+99i9L7d4bb7xRx48f12OPPaa0tDRNmjSpWB+LxaKHH37Y63eAe++9V3v37tUbb7yhffv2afz48UXa69Spo7feekvXX3+9JCk8PLzUcZ6oQ4cOeuCBBzR16lQdO3ZMjz/+eLE+Y8aMUZs2bSrkGh9A5SORC6DKM5lMevDBBwsXg/AlMTFRy5Yt0/Dhw7Vv3z699957HutYdenSRfPnz5fFYglEyOXOZDJp9uzZGjRokDIyMvTBBx8Uu+0uOTlZb775ZuFCDYEUFRWl//73v3riiSf0yiuv6Pjx45o1a5ZmzZrlsX9cXJxmzpypQYMGVcs4AAAATtX555+vNWvWaMWKFfr888/17bffKjU1VRkZGYqMjFRiYqLOPvts9evXT5dddpnHJOJVV12lLl26aPbs2friiy+0d+9e2e121a9fX127dtXNN9+s8847rxIeXX4y95tvvtGHH36ojz76SJs2bdKRI0fkdDpVu3ZttWjRQueee64uueQSde3atUznuPvuu9WvXz+98sor+uqrr7R//35J+d8Revbsqdtuu63IuhonM5lMmjFjhvr06aPXXntNmzdvls1mU8OGDdWnTx/dfffdatSoUWGd3RMT6WV1//3365xzztHs2bO1adMm5eTkqF69eurQoYNuvvlm9erVS+++++4pnwdA1WDKyMgwKjsIAPBk7dq1haUQnn32Wd18880++1988cVFFin7/vvvva7ump2drddff12ffPKJfvnlF2VlZSk+Pl5nnXWWrrrqKl155ZVeb4UaPXq0FixYoMaNG+unn37yGZO/ffv3769vvvlG3bp10yeffOK1X/v27bV3715dc801HpORe/fu1YwZM7RixQodPHhQ0dHRat68uS6//HKNHDlS4eHhiouLk5R/UfjAAw8U2f/dd9/VnXfeKUnaunVrudQH3r17txYuXKhVq1Zp165dOnr0aJGVfpOSkrR69WrVrl37lM9VFeIAAABA9bVv3z61bdtWUn494pNr7QLAqSCRCwCocC6XS9dee60+++wzSfm10ApqHdfEOAAAAFA9zJw5s7Bsw7p16woXcgOA8kAiFwBQKQoW2ihYNXnGjBm66aabamwcAAAACG42m00ZGRlKTEz02L5161YNGDBAmZmZat++vdauXVvBEQKo7syVHQAAoGYqqF972mmnSZLGjRtX6hWIq1McAOCvzMxMTZo0SVdccYVatGihuLg4TZ061e/9Dx8+rNGjR6t58+ZKTExUnz59tGbNGo99v/zyS/Xp00eJiYlq3ry5Ro8ercOHD5fXQwGAKiUtLU1nn322br75Zs2fP18bNmzQ1q1b9fnnn+u+++7TJZdcoszMTJlMJv373/+u7HABVEMsdgYAqDQJCQlavHhx4cJsv//+u+x2u6xWa42MAwD8kZaWpjfffFPt2rVT//799fbbb/u9b15engYPHqxjx45p2rRpqlevnl599VUNHTpUS5YsUffu3Qv7fv3117ryyivVt29fzZ8/X4cPH9bkyZM1ePBgrV69WmFhYYF4eAAQ1PLy8jwuLFwgNDRUM2bMUM+ePSs4MgA1AaUVAAAAgCrEMPIv300mk44ePaoWLVp4XMDSk9dee03jx4/X8uXL1blzZ0mS0+lU9+7dFRUVpVWrVhX2veiii5STk6Ovv/5aISH58z++++479evXT88884xuueWWADw6AAheTqdTn3zyiVasWKFNmzbpyJEjSk9PV0REhBo3bqwLLrhAt912m5KSkio7VADVFDNyAQAAgCrEZDKVed+PP/5YLVu2LEziSlJISIiGDRumxx9/XPv371fDhg21f/9+bdq0SY8++mhhEleSzjvvPJ1++un6+OOPSeQCqHFCQkI0ePBgDR48uLJDAVBDUSMXAAAAqCG2b9+utm3bFttesG3Hjh2F/U7cfnLfgnYAAABUHBK5AAAAQA2Rlpam2rVrF9tesC0tLa3I3976FrQDAACg4pDIBQAAAGoQX6UZTm7z1vdU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yvv73yniAgAAeElubq7mzJmjLl26KCIiQvHx8UpLS3Pp2KFDhyo0NLTK/zIyMqqNHTNmTH29NAAAAFSDGblNmPHzz2WZMkV+R444jSvu1095q1fLERPjmcQAAABQqZtuuklHjhzRggUL1LFjR23evFmTJ0+W3W7XDTfc4PTYJ598Ujk5OeW25eXlaezYsbrssssUERFRbl9MTIyee+65cttatGhRNy8EAAAANUYhtymy22V+9lkFLlggQ35+lWGOgADlP/SQCqdNk4xM3gYAAPCmHTt2aPfu3Vq7dq3Gjh0rSRowYIBOnTqlefPmafTo0TKZTFUe36VLlwrbXnrpJRUVFemmm26qsM9iseiqq66quxcAAACAWqE618QYTp1S8MiRssyZ47SIa/vVr5S7Z48Kp0+niAsAAOADtm3bppCQEF3/iwVnJ0yYoDNnzujw4cM1PueGDRsUEhKi0aNH11GWAAAAqC/MyG0qHA75v/SSLHPnyvDjj1WHmUwquOceFdx7r+Tv78EEAQAA4Mzx48fVuXNn+fmVfwvfrVu3sv19+vRx+XxffvmlDh48qJtvvlkhISEV9p84cUIxMTHKyclR27ZtNWbMGM2aNUsWi8Wl8+c7mTRQFwoLC8v9Cd/AffFd3Bvfxb3xXdwb39TY7ktgYKDLsRRymwDD2bOy3HWX/P/5T6dxtthYWZ95RrYrrvBQZgAAAHBVZmamYipZs6Bly5Zl+2tiw4YNklRpW4W+fftq9OjRio2NVX5+vnbu3Kmnn35aBw8e1LZt22R04RNb6enpstlsNcrJHT9fpA2+g/viu7g3vot747u4N76pMdwXk8mkDh06uBxPIbeR83vtNVn+/GcZz51zGlcwZYry58+XXJxhAQAAAPft379fw4cPdyl237596tmzpyTJYDBUGeds3y8VFxcrNTVVXbt2rbQP7oMPPlju68GDBys6OloPPfSQXn/9dZdyj4qKcjkfdxQWFiojI0MREREym831ei24jvviu7g3vot747u4N76pKd+XRlHIzcnJ0RNPPKGPPvpIH374oc6dO6f77rtPc+fOden4jRs36o477qh032effVZhBd8GITtbljlzZP7b35yG2du0Ud6qVbINHOihxAAAABAbG6vly5e7FNu2bVtJUlhYWKWzbrOysiT9b2auK3bs2KGMjAzdddddLh8zbtw4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WbVqlTp37lxuW+nCG41BbcepoKBAI0eO1Pnz55WcnKzw8HA999xzGjNmTIUZNY3BTTfdpCNHjmjBggXq2LGjNm/erMmTJ8tut+uGG25w6RyN5Zlydyya2jMj1f65aSzPTHVq8/2oqT1XdfFvXFN5rlB/PvroI5fiUlJSlJKSUmF7q1attGbNGpfOkZiYqMTExBrl5wl18b4Adeuvf/2rMjMzNWXKFF166aU6d+6cVq5cqUGDBiktLU0DBw70dor4SXp6uh588EFFRkbqxx9/9HY6Td7LL7+s22+/XaNGjdKaNWsUHByskydP6syZM95Orcn69NNPdc0116hTp05avHixwsLCdODAAT3++ON6//33lZqa6u0UmwxX33t//vnnGj58uLp3767/+7//U35+vhYvXqxrr71W+/fv18UXX+zhzOsXhVzUqejoaH399dcyGAw6d+6c24XcuLg4XX755XWcne+o7Tht2LBBx44d044dO9S7d29JJTNn4uPjNX/+fL3xxhv1kbZX7NixQ7t379batWs1duxYSdKAAQN06tQpzZs3T6NHj5bJZKr2PI3hmarNWDSlZ0aqm+emMTwzrqjN96Om9lzVxb9xTeW5AupLXb0vQN1aunSpwsPDy2377W9/qyuuuEJPPfUUhVwfcvfdd6tfv35q2bKltm7d6u10mrT09HT9+c9/1h/+8Ac9+eSTZdsHDBjgxaywefNm5efna8OGDWrfvr0kaeDAgcrIyNALL7yg7OxshYaGejfJJsLV996LFi2S2WzW3//+dzVv3lySdNlll+nKK6/UihUr9PDDD3sy7XpHawXUKYPBIIPB4O00fF5tx2nbtm2KjY0tK5xIkp+fn2688Ua99957Sk9Pr4s0fcK2bdsUEhKi66+/vtz2CRMm6MyZM+UWbGnsajMWTemZkXhuaqI234+a2nPFv3GA9/H93Tf9sogrSSEhIbr00kt1+vRpL2SEyvz973/XgQMHyhUN4T3r16/XhQsXdNddd3k7FfyMn1/JfMfSgmCpFi1ayGg0yt/f3xtpNUmuvPcuLi7Wv//9b40YMaLcPYuOjlZCQoK2bdtW32l6HIVc+KRx48YpLCxMMTExmjhxoo4dO+btlHzK8ePH1a1btwrbS7d9+umnnk6p3hw/flydO3cu+we1VOlrPX78uEvnaQzPVG3Goik9M1LdPDeN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rCwaGhqYP39+u+5LREREREREHj8KckXk/8KwYcMoLCzEZDKRk5NDSUkJRqMRHx8foqOjmThxot34cePG4e3tTUpKCt988w1//vknfn5+LFiwgPfff/++d0ROnTqVwMBAUlNTKSoqIjs7G3d3d/r06cPs2bOJi4uzjXVycmLr1q0sXbqUjIwM2+FrEyZMuGeQC/Dmm2+Sm5tLSkoKR44cITs7m549exIYGMjUqVNt49577z1cXFzYtGkTaWlpeHh4EBkZyZIlS3jnnXfu677u5bXXXqO8vJx169aRk5PDl19+aduF6urqislkIjY21uG6rl27sm/fPhYvXkxBQQHl5eUEBweTlZWF2Wx2CHKjoqJsh4Lt3LmTrl27EhYWxrZt21o8VOx+bNy4kcWLF5OZmcnVq1exWCwEBwffd5BrMBhYv349kZGRbNmyhf3793P9+nW8vLx4+umnWbFiBa+++ioAfn5+fPDBBxw+fJj8/HwuXbpEz549eeGFF5g9ezbh4eEP5N5ERERERETk8WGoq6uzPOxFiIhIx2fdhWs2m1m1ahUzZ8582EsSEREREREReWwoyBURkVa7du0aUVFR/Pzzz6xbt85uJ7KIiIiIiIiI/HtUWkFERFrNzc2N9PR0tm7dytmzZ7l27Rpubm4Pe1kiIiIiIiIijzztyBURERERERERERHp4Do97AWIiIiIiIiIiIiISMsU5IqIiIiIiIiIiIh0cApyRURERERERERERDo4BbkiIiIiIiIiIiIiHZyCXBEREREREREREZEOTkGuiIiIiIiIiIiISAenIFdERERERERERESkg1OQKyIiIiIiIiIiItLBKcgVERERERERERER6eD+AzDRUnjmj86yAAAAAElFTkSuQmCC"},"metadata":{}}],"execution_count":15,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"f01ecd42-e187-428a-bca2-099c25ffd318"},{"cell_type":"markdown","source":["#### Plotting forecasted data."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"16c243a6-90c4-4c9d-844d-e3330d2c2a71"},{"cell_type":"code","source":["# Forecasting the next 12 months\n","forecast_steps = 12\n","forecast = results.get_forecast(steps=forecast_steps)\n","forecast_index = pd.date_range(start=simulated_sales_df['order_date'].iloc[-1] + pd.DateOffset(months=1), periods=forecast_steps, freq='MS')\n","forecast_scaled = forecast.predicted_mean.values.reshape(-1, 1)\n","\n","# Apply inverse transformation to get the forecast back to original scale\n","forecast_original_scale = scaler.inverse_transform(forecast_scaled)\n","forecast_df = pd.DataFrame({'order_date': forecast_index, 'forecast': forecast_original_scale.flatten()})\n","\n","# Plot the observed data and forecast\n","plt.figure(figsize=(12, 6))\n","plt.plot(simulated_sales_df['order_date'], simulated_sales_df['sales'], label='Observed Data', marker='o')\n","plt.plot(forecast_df['order_date'], forecast_df['forecast'], label='Forecast', marker='x')\n","plt.xlabel('Order Date')\n","plt.ylabel('Sales')\n","plt.title('Forecasted Chicago Sales')\n","plt.legend()\n","plt.show()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":19,"statement_ids":[19],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:12:07.2622138Z","session_start_time":null,"execution_start_time":"2024-11-02T23:12:07.7666218Z","execution_finish_time":"2024-11-02T23:12:08.8432013Z","parent_msg_id":"0318e3c6-6334-4e2d-bed4-3ebbba47dfa8"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 19, Finished, Available, Finished)"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"iVBORw0KGgoAAAANSUhEUgAABG0AAAJECAYAAACsHdkDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAADAvElEQVR4nOzdd3xT1fsH8E+SNkn3ohNaCsguyEZG2SBQKYKKIspQNjhAEFBARUZFviiggrL3nrJXgTJEtmgru8xSSvfKaHJ/f/TX2NAk3WnafN6vFwr3nHvvk5xeaJ6e8xxRUlKSACIiIiIiIiIisijisg6AiIiIiIiIiIjyYtKGiIiIiIiIiMgCMWlDRERERERERGSBmLQhIiIiIiIiIrJATNoQEREREREREVkgJm2IiIiIiIiIiCwQkzZERERERERERBaISRsiIiIiIiIiIgvEpA0RERERERERkQVi0oaIiIjKNVdXV7i6umLOnDllHQqAkonn/v37uuusX7++BKOjshYSEgJXV1eEhISUdShERFQO2JR1AEREZL0iIiLQq1evAvefNGkSpkyZUooREQFZWVnYu3cvjh49igsXLiAuLg4pKSlwcnKCr68vmjZtip49e6Jr166wseG3UuVJUlIS1q9fj6NHjyIyMhKJiYmQSqWoVKkSvLy80KBBA7Rp0watW7eGj49PWYdLRETEpA0RERHl7/79+3j55ZcBAD///DMGDBhQxhGVjgMHDuDLL7/E3bt387QlJiYiMTERkZGRWLt2LSpXrowvv/wS7777bhlESoV16NAhjB49GvHx8XrHVSoV0tLSEB0djT///BPLly+Hl5cXbt68WUaREhER/YdJGyIisggffvghPvzwQ5N9PD09zRQNWaMffvgBM2bMgCAIAIDg4GD07NkTdevWhZubG5KSknDv3j0cOnQIR48exePHjzF58uRSSdpUrVoVSUlJJX5da3Xu3Dm89957UKvVEIvF6Nu3L3r06IFq1apBLBYjISEB169fR3h4OE6fPl3W4RIREekwaUNERBahUqVKqFevXlmHQVZq06ZN+OabbwAAHh4eWLFiBdq3b5+nX/v27TF48GBER0fjq6++Qnh4uLlDpSL48ssvoVarIZFIsHXrVnTq1ClPn06dOuGTTz5BXFwcdu3aZf4giYiIDGDShoiIiKxaTEwMPvvsMwCAvb09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3Lt3D1u3bsWiRYvw5Zdf5rlOUlISpk+fjgMHDiA1NRX16tXDhAkT0LNnT71+CoUCS5cuxaZNm/Dw4UNoNBp4enqiadOmGD9+POrXr6/Xf9++ffj1119x7do1KBQKVK9eHe+++y5Gjx4NieS/qXXr16/HmDFj8PPPP6NSpUr48ccfcf36dbi5uWHJkiUICQnBe++9h59++ilP7I8fP0aDBg3Qtm1b7NmzR3c8NTUVixYtwp49exAdHQ2pVIrmzZtjwoQJaNWqVZ7rREVF4euvv8aZM2cgFovRsmVL3ddxSWndujV27NiBNm3aYOHChRg8eDCqVKkCIDthunLlShw+fBh3795FfHw8PDw80L59e0yePBnVqlXTXSckJARnzpwBAPTq1Ut33N/fH9evXweQvVxu8+bNOH/+PGJiYgAANWvWxODBgzF48OASfV1ERERERFROKTMhW/49bM8fz9MkylJDsLG12oQNYIFJG2M8PDwQFxcHIHs5zqFDh/DOO+/ozdoICAhAcHAw9u7dq/uwe/ToUSgUCgwYMEDvegMGDMC3336Lffv2lXrS5kJc6S3DupOiwR3kTeqYy4YNG6DVajF48OA8CZvcJk6ciK1bt2L9+vV5kjZqtRq9e/eGQqFA//79kZycjB07dmDAgAH49ddf0a9fP13fUaNGYefOnahfvz7effddyGQyPHr0CBEREejUqZNe0mbGjBmYP38+KleujNDQUDg5OeHs2bOYNm0aLl68iNWrV+eJc/fu3Th+/DheffVVfPjhh0hLS0Pr1q0REBCAPXv2YN68eZDL5XrnbN26FVqtFm+//bbuWGJiInr27ImoqCi0atUKnTp1QkpKCvbv349evXph1apVeO2113T9IyMj0b17d6SlpaFXr16oUaMGLl26hO7du+dJRBXXSy+9hD59+mDTpk3Yt28fRowYASB79trs2bMRHByM1157Dfb29rh58ya2bduGw4cP4+TJkwgICAAAvPvuuwCAM2fOoH///rrjLi4uuvssWLAAd+/eRfPmzeHn54fk5GQcPXoUn376KW7duoVZs2aV6OsiIiIiIqLyRRT7CPKF0yB5ZLjupoDsxI3t7jVWm7ix2KSNVquFVqtFUlISdu3ahWPHjuH7778HANy7dw+ZmZkGP8zWr18f4eHhUCgUkMvliIqKAgDUq1dPr5+Pjw88PDx0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Yvz48ahbty6aNGmC1atXl0iQRERERGQ+311Nxc7oTINtnSvL8G1zFzNHREREZJ2KnLT53//+h2+++QZOTk66YzNmzMDKlSuRlpaGR48eYdy4cTh58mSJBEpEREREpW/XvUyEXTW8U1QtFxus6OAOG267TUREZBZFTtpcunQJwcHBEImy/9FWq9VYv349mjZtilu3buHatWuoVKkSfvnllxILloiIiIhKz9XnKoyKMLxTlKtUhE1dPODCnaKIiIjMpsj/6sbFxaFKlSq6P1+8eBGpqakYMmQI5HI5fH190bNnT/z9998lEigRERERlZ6nGRq8eywemRohT5uNCFjd0QPVnblTFBERkTkVOWkjFouhVCp1fz537hxEIhGCg4N1x9zd3REfH1+8CImIiIioVGVmCXj3WDyeZBjeKWruK65o78edooiIiMytyEmbgIAARERE6P68e/duVK1aFQEBAbpjT548gbu7e/EiJCIiIqJSIwgCPjqTiMvPDe8UNayuAz6ow52iiIiIykKRkzZvv/02/v77b3Tp0gU9evTA9evX8cYbb+j1+euvv1C9evViB0lEREREJUujFRARo8SQE4nYdtfwTlEd/GSY04I7RREREZWVIi9MHj58OC5fvozdu3dDEAR06dIFn332ma798uXLiIqKwpQpU0okUCIiIiIqGXuiMzH5fJLR5VAA8JKzDVZxpygiIqIyVeSkjUwmw8qVK5GSkgKRSKS39TcAVK1aFadOndJbLkVEREREZWtPdCYGhScgb7nh/7hIRdjUxR2uMu4URUREVJaKvQWAs7OzweMeHh7w8PAo7uWJiIiIqJjS1Fpcea7GhWdKzL2WajJhAwDL27vhJRdbs8RGRERExhU7aXPt2jVs374dN2/eRGZmJnbv3g0AePDgAS5duoQOHTrAzc2t2IESERERUf60goAbSVm4GKfS/YpKyoI2v0xNLjIJZ9gQERFZgmIlbaZPn46ffvoJgpD9XYBI9N+aZ0EQMHToUMycOROjRo0qXpREREREBI1WwNlYFWIzNfC2k6C1txQJSm2uBI0al5+rkKouRIbGgNhMTQlFTERERMVR5KTNunXrsGjRInTv3h3Tpk3D9u3b8cMPP+jaq1atiqZNm+LAgQNM2hAREREVk6HiwRIRoClefsYgbztJyV+UiIiICq3Ic1+XL1+O2rVrY+3a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daO+voE6t37U2DdQ59aN+vqGllbnVrcQscNRsXeSwWBQly5dFBwcrF27dtVot2vXLiUnJ7eoYgEAAAAAAN/RqkIbs9mstWvXqnfv3goKCpKfn5/GjRunNWvWqKCgoKpdZmamNm/erAkTJniwtwAAAAAAALVrsY9H3XDDDerQoYP69+9ftRDxokWLdPToUS1evLiq3ezZszV69GhNnDhRM2bMUElJidLT0xUTE6Pp06d78A4AAAAAAABq12JDm5SUFK1atUovvviiioqKFBUVpSFDhui5557TgAEDqtqdfvrpeu+993TvvfdqypQp8vPzU2pqqpYvX67Y2FgP3gEAAAAAAEDtWmxoM2PGDM2YMcOltv369dO7777r5h4BAAAAAAA0nVa1pg0AAAAAAEBrQWgDAAAAAADghQhtAAAAAAAAvBChDQAAAAAAgBcitAEAAAAAAPBChDYAAAAAAABeiNAGAAAAAADACxHatGImk8nTXYAbUV/fQJ1bN+rrG6hz60eNfQN1bt2or29oiXU2mM1mh6c7AQAAAAAAgOqYaQMAAAAAAOCFCG0AAAAAAAC8EKENAAAAAACAFyK0AQAAAAAA8EKENgAAAAAAAF6I0AYAAAAAAMALEdq4waeffqpp06Zp0KBBSkxMVI8ePXTVVVdp586dNdru3LlTF110kdq3b6+kpCRNnjxZGRkZ1dr8/PPPuvvuu3X22WcrKSlJnTt31tixY/Xuu+/WON/q1at1/fXXq3///mrbtq169+6tP//5z9q3b1+D7sGVfknS4sWLNXnyZPXp00eRkZEaP358g67TEvlKfZcvX67IyMhaP5544okGXbOl8WSdN23apIsvvljdu3dXfHy8TjvtNE2YMEHr1q1r0D0wjmvnK/X19XEsebbWJ3vooYcUGRmpoUOHNugeGMu185X6+vpY9mSd6/rcZ2VluXwPjOO6+UqNGcue/5r9/vvv64ILLlDHjh2VmJioIUOGaOnSpS7fgyfGMqGNG7z44os6cOCApk6dqpUrV2revHnKzs7WmDFj9Omnn1a127t3ryZMmCCr1aqXXnpJixYt0r59+3T++ecrOzu7qt2GDRu0bt06paWl6eWXX9aSJUuUnJysKVOmaP78+dWu/c9//lPFxcW69dZb9eabb+ruu+/Wt99+q7PPPlu7d+92qf+u9kuSXnrpJWVmZmrEiBGKjY09hc9ay+Er9R07dqzWr19f42PUqFGSpAsvvPBUPo1ez5N1zs3NVffu3TV37lytWrVKTzzxhPz9/XXFFVfo9ddfd6n/jOO6+Up9fX0cS56t9Ym+/fZbLVy4UPHx8Q3qP2O5br5SX18fy95Q56effrrG5z86Otql/jOO6+crNWYse7bOTzzxhK6++mr17NlTL730kl599VVdf/31slqtLvXfU2PZYDabHad0BtRw7NgxxcXFVXutsLBQAwYMUI8ePaqSv2uvvVabN2/W119/rfDwcEnSgQMHNHDgQP3lL3/R/fffL0nKyclRdHS0DAZDtXNOnDhRmzdv1i+//KLAwMBar3348GH16dNHV155pRYuXFhv/13tlyTZ7XYZjRXZ39ChQxUdHa3333/f5c9VS+RL9T1ZUVGRunXrpt69e+vDDz+s91otmSfr7ExZWZn69u2rTp06ufS5ZxzXzZfqezJfGseSd9S6vLxco0aN0rBhw/T9998rNzdX27Ztc6n/jOW6+VJ9T+ZLY9mTdV6+fLmmTZumjRs3qn///o3qP+O4fr5U45Mxlpunzjt37tTo0aN177336m9/+1uj+u+pscxMGzc4+S+iJIWFhalbt246ePCgpIpv8GvXrlVaWlpVwSUpKSlJqampeu+996pei4mJqfEXUZIGDBig4uJi5eXl1Xntdu3aKTExseradWlIvyRV/UX0Jb5U35OtWrVKhYWFuvrqq+u9VkvnyTo74+/vr4iICPn5+dXbd8Zx/XypvifzpXEseUetn3jiCeXl5emee+5pUN8Zy/XzpfqezJfGsjfUubEYx67xpRqfjLHcPHV+/vnnFRgYqBtvvLFRfffkWPbNrwoecPz4cX3zzTfq3r27JOmXX36RxWJRSkpKjbYpKSnav3+/SkpK6jzn5s2bFRsb6/Qv/4kyMjKUmZlZde26NEW/fJGv1PeVV15ReHi4Lr744nqv1Ro1d53tdrvKy8t1+PBhzZ07Vz///LOmT59ebz8Zx43jK/X19XEsNW+tf/zxRz366KN6/PHHFRYW1qB+MpYbx1fq6+tjubm/Zk+cOFHR0dHq3LmzJk+erF27drnUT8Zx4/lKjRnLzVPnrVu36vTTT9fq1at1xhlnKDo6Wj179tR9993n0uNRnhzLhDbN5LbbblNxcbFmzpwpqWJNA0mKioqq0TYqKkoOh0Nms7nW8y1btkyff/65Zs6cKZPJVGu78vJyTZ8+XWFhYfrLX/5Sbz9PtV++yhfqu3fvXm3fvl2XXnqpQkJC6r1Wa9Tcdb788ssVGxurHj166Nlnn9WLL76osWPH1ttPxnHj+EJ9GccVmqvWdrtd06dP14QJE3Teeec1uJ+M5cbxhfoylpuvzgkJCZo5c6aeeuoprVmzRnfddZe+/vprnXvuufruu+/q7SfjuPF8ocaM5ear8+HDh7V//37dcccduummm/TOO+/o//7v/7Rw4UJNmzat3n56cizXPw8bp+yhhx7SypUrtWDBAvXr16/aMWfTueo7tn79es2cOVMXXXSRbrrpplrf73A4NH36dG3btk3Lli1Thw4dqo7Z7XbZ7fZq1zrxL3Vj+uWrfKW+//73vyVJ11xzTa3vbc08UecFCxbo+PHjOnLkiFauXKnrrrtOzzzzjC677DJJjOOm5Cv19fVxLDVvrZ9++mnt27dPr776ap19Yiw3HV+pr6+P5eas85gxYzRmzJiqPw8fPlznnXeehg8frrlz51bVn3HctHylxozl5quz3W5XQUGB/vWvf+nSSy+VJI0YMUJFRUV65plnNHv2bCUnJ3vlWGamjZvNmzdPjz76qO65555qz89VrkRemdidKC8vTwaDQRERETWOffLJJ7r66qs1atQoLVmypNa/GA6HQ7fccotWrlypxYsX19hibNq0aYqNja36SEtLO6V++SpfqW9ZWZlee+019erVq9ELtLVknqpz165dNWDAAF1wwQVaunSpzj77bM2cObPqGwnjuGn4Sn19fRxLzVvrzMxMzZ07V3fccYf8/f1lNptlNptls9lkt9tlNptlsVgkMZabiq/U19fHsqe+Zp+oU6dOGjJkiHbs2FH1GuO46fhKjRnLzVvnyvOec8451V4/99xzJUnffPONJO8cy8y0caN58+Zp3rx5mjVrlm699dZqx7p06aLg4GCnz0ru2rVLycnJCgoKqvb6J598okmTJmn48OFatmyZAgICnF638gf65cuXa+HChZo4cWKNNrNmzao2OCqfw25Mv3yVL9X3o48+0rFjx3Tbbbc57VNr5qk6OzNgwAB9/PHHys7OVnx8POO4CfhSfX15HEvNX+uMjAxZLBbNmjVLs2bNqnHezp07a+rUqVV9YiyfGl+qry+PZW/6mu1wOKotNMo4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t2+XVLG2S11OP/10tWvXTocOHdJvv/2mDh06VB3LyspSSkqK1q5dq+Dg4KrX9+/frwULFigxMVGffvqp4uLiJEmzZs3SOeec4/Q6t99+u3bv3q1FixZp8uTJVa8fPXpUo0eP1t///neNGTNGQUFB1d53+PBhbdmyRVFRUQ37BNTBaDRq6NChOnDggL766quq0GbixImaNm2aAgICqrWfP3++0tPT9fbbb+uKK66QJM2ePVuff/65MjMzNXv27BrXyM3N1dSpUxUbG6uPPvpIHTt2rDr25ptv6oYbbtDDDz+sRx55pMnuCwAAnDoejwIAAG539OhRSVL79u3rbVvZJisrq8axBx54oFpgI0lvvPGGysvL9Ze//KUqsJGk8PBwzZw5s8Y5cnJytGrVKp199tnVAhtJio+P1y233KLs7Gxt2rSpxntnz57dpIFNpXbt2klStceUEhMTawQ2knTjjTdKktP+1ebVV19Vfn6+5syZUy2wkaTLLrtMffv21apVqxrRcwAA4E7MtAEAAF6lcl0Xg8FQ7fWgoKCqWSgn+v777yVJw4YNq3Fs6NChNV776quvZLPZVFpa6nRNmv3790uSfvrpJ40bN67asYEDB7p4Fw1z4lo2J772yiuvaMWKFdq9e7fy8/Nlt9urjh85csTl8+/YsaPq18r7O1FpaalycnKUk5OjmJiYRtwBAABwB0IbAADgdvHx8dq7d68OHjyoP/zhD3W2PXToUNV7ThQbG1sjyJGk/Pz8quPOrnuyvLw8SdIXX3yhL774otZ+FBUVuXS+plAZwJwYmNx+++1asmSJOnTooPPPP19t27atmnkzf/58lZaWunz+yntesmRJne2KiooIbQAA8CKENgAAwO3OPPNMff755/r00081cuTIWtvt3btXhw8fVmJiYrX1bKSaM28qVW4Nnp2draSkpGrHKh/LOlGbNm0kSdOnT9dDDz3UkNuotQ+nwm63a+vWrZKkAQMGSJKOHTumF154QSkpKVq/fr1CQkKq2mdlZWn+/PkNukblPW/dulU9e/Zsop4DAAB3Y00bAADgdldddZWMRqNefvllZWdn19ru0UcflSRNmjTJ5XP36tVLkqqCjxM52757wIABMhgM+vLLL12+hju99tpryszMVM+ePdWjRw9JUkZGhhwOh0aOHFktsJGc35NUsYW4JNlsthrHzjjjDEnymnsGAACuIbQBAABud9ppp2nq1KnKzc3VlVdeWWM9FrvdrgULFmjlypXq0qWLbrnlFpfPffnll8tkMmnx4sU6duxY1ev5+flVIdCJEhIS9Mc//lHbt2/XU0895XQ9mR07dqi4uLgBd9hwNptN//73v3XrrbfKZDJp7ty5VTN5KhcL/s9//lNtHZuDBw/qvvvuc3q+ygWSDx48WOPYpEmT1KZNGz344IPavXt3jePFxcUEOgAAeCEejwIAAM3igQceUH5+vl555RUNHDhQ5513nrp06aKCggJt2LBB+/btU9euXfXGG29UPfLkiuTkZN1+++1KT0/X8OHDdfHFF8vPz0+rV69WSkqKfvrppxrveeyxx/TTTz9pzpw5eu211zR48GCFh4fr4MGD2rlzp/bt26c9e/bUmOXSWJs2bVJJSYkkyWKx6NChQ9q6dasOHTqkqKgoPfvss9UeG2vbtq3S0tK0evVqjRw5UmeffbaOHj2qtWvXasSIEcrIyKhxjREjRujdd9/Vtddeq3PPPVdBQUHq2bOnxo4dq9jYWL3wwgu69tprddZZZ2nMmDH6wx/+oNLSUh04cEBbt27V4MGD9dZbbzXJ/QIAgKZhMJvNNf97CQAAwE02bdqkpUuXavv27crOzlZISIi6deumtLQ0XX/99TW29Jak3r17S5K+++67Ws+7bNkyLV68WPv371dcXJwuueQS3XnnnWrXrp2GDx+u999/v1p7i8WiJUuWaNWqVfrpp59kt9sVHx+vXr16acKECbrsssvk51fx/1vjx4/Xli1bZDabG3Svy5cv17Rp06r+bDAYFBoaqujoaPXs2VOjR4/WFVdcocjIyBrvLSws1Lx587R69WplZWWpQ4cOuvLKK/X3v/9dcXFxNe6pvLxcDz74oN566y0dOXJE5eXluuqqq/TMM89Utfnpp5/01FNPadOmTcrKylJISIgSExOVmpqqiRMnVq2pAwAAvAOhDQAAAAAAgBdiTRsAAAAAAAAvRGgDAAAAAADghQhtAAAAAAAAvBChDQAAAAAAgBcitAEAAAAAAPBChDYAAAAAAABeiNAGAAAAAADACxHaAAAAAAAAeCFCGwAAAAAAAC9EaAMAAAAAAOCFCG0AAAAAAAC8EKENAAAAAACAF/p/FJJsJR2GbtoAAAAASUVORK5CYII="},"metadata":{}}],"execution_count":17,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"412c2f7f-a4d5-402b-ac2b-7b51e60e064d"},{"cell_type":"markdown","source":["#### Validate forecasted results and load the model."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"4c7dec16-72b7-447d-802f-dd72da9bc317"},{"cell_type":"code","source":["import numpy as np\n","import pandas as pd\n","import statsmodels.api as sm\n","import matplotlib.pyplot as plt\n","from sklearn.metrics import mean_absolute_error, mean_squared_error"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":4,"statement_ids":[4],"state":"finished","livy_statement_state":"available","session_id":"6fce11ce-2088-4da8-9a6d-87a0f8d9111b","normalized_state":"finished","queued_time":"2024-11-03T01:16:23.1937245Z","session_start_time":null,"execution_start_time":"2024-11-03T01:16:23.6174133Z","execution_finish_time":"2024-11-03T01:16:46.3815426Z","parent_msg_id":"fe34ebe0-9b2e-477b-89fa-3e2fa56f8b9d"},"text/plain":"StatementMeta(, 6fce11ce-2088-4da8-9a6d-87a0f8d9111b, 4, Finished, Available, Finished)"},"metadata":{}}],"execution_count":3,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"a4ab0d70-711b-4bdf-8013-53409b894aad"},{"cell_type":"code","source":["# Get the maximum date from the index\n","max_date = simulated_sales_df.index.max()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":21,"statement_ids":[21],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:12:14.7557645Z","session_start_time":null,"execution_start_time":"2024-11-02T23:12:15.1793216Z","execution_finish_time":"2024-11-02T23:12:15.5263214Z","parent_msg_id":"1055fe66-adc8-40bb-a161-caff66b687f8"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 21, Finished, Available, Finished)"},"metadata":{}}],"execution_count":19,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"f95f7b6f-9c14-43fd-a590-cf02471b0705"},{"cell_type":"code","source":["import pandas as pd\n","from statsmodels.tsa.statespace.sarimax import SARIMAX\n","\n","# Sample data creation (replace this with your actual DataFrame)\n","date_range = pd.date_range(start='2022-01-01', end='2024-12-01', freq='M')\n","sales_data = pd.DataFrame({'sales': range(len(date_range))}, index=date_range)\n","\n","# Define training and validation periods\n","train_end = '2023-12-31' # Last date for training (end of December)\n","validation_start = pd.Timestamp('2024-01-31') # Start of validation period (end of January)\n","validation_end = pd.Timestamp('2024-06-30') # End of validation period (end of June)\n","\n","# Ensure the index is a DatetimeIndex\n","if not isinstance(sales_data.index, pd.DatetimeIndex):\n"," print(\"The index is not a DatetimeIndex.\")\n","else:\n"," print(\"The index is a DatetimeIndex.\")\n","\n","# Fit the model (adjust the order parameters as needed)\n","model = SARIMAX(sales_data['sales'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))\n","results = model.fit(disp=False)\n","\n","# Check the fitted model\n","print(results.summary())\n","\n","# Get predictions for the validation period\n","try:\n"," print(\"\\nPASS\\n\")\n"," predictions = results.get_prediction(start=validation_start, end=validation_end, dynamic=False)\n"," predicted_values = predictions.predicted_mean\n"," print(\"Predicted Values:\")\n"," print(predicted_values)\n","except KeyError as e:\n"," print(f\"KeyError: {e}\")\n"," print(f\"Available index in the model: {sales_data.index}\")"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":22,"statement_ids":[22],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:12:24.7295456Z","session_start_time":null,"execution_start_time":"2024-11-02T23:12:25.240496Z","execution_finish_time":"2024-11-02T23:12:26.2918542Z","parent_msg_id":"490e57df-a45f-46be-b1b2-dc0f49b620b7"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 22, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["The index is a DatetimeIndex.\n SARIMAX Results \n==========================================================================================\nDep. Variable: sales No. Observations: 35\nModel: SARIMAX(1, 1, 1)x(1, 1, 1, 12) Log Likelihood 230.177\nDate: Sat, 02 Nov 2024 AIC -450.354\nTime: 23:12:25 BIC -444.899\nSample: 01-31-2022 HQIC -449.069\n - 11-30-2024 \nCovariance Type: opg \n==============================================================================\n coef std err z P>|z| [0.025 0.975]\n------------------------------------------------------------------------------\nar.L1 3.758e-06 1.87e-18 2e+12 0.000 3.76e-06 3.76e-06\nma.L1 -4.708e-10 1.87e-18 -2.51e+08 0.000 -4.71e-10 -4.71e-10\nar.S.L12 7.682e-14 3.52e-35 2.18e+21 0.000 7.68e-14 7.68e-14\nma.S.L12 -7.682e-14 2.92e-35 -2.63e+21 0.000 -7.68e-14 -7.68e-14\nsigma2 1.605e-11 4.92e-10 0.033 0.974 -9.48e-10 9.8e-10\n===================================================================================\nLjung-Box (L1) (Q): nan Jarque-Bera (JB): nan\nProb(Q): nan Prob(JB): nan\nHeteroskedasticity (H): nan Skew: nan\nProb(H) (two-sided): nan Kurtosis: nan\n===================================================================================\n\nWarnings:\n[1] Covariance matrix calculated using the outer product of gradients (complex-step).\n[2] Covariance matrix is singular or near-singular, with condition number inf. Standard errors may be unstable.\n\nPASS\n\nPredicted Values:\n2024-01-31 24.0\n2024-02-29 25.0\n2024-03-31 26.0\n2024-04-30 27.0\n2024-05-31 28.0\n2024-06-30 29.0\nFreq: M, Name: predicted_mean, dtype: float64\n"]},{"output_type":"stream","name":"stderr","text":["/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n"]}],"execution_count":20,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"e08c035b-2a37-4793-95b1-dc7bcf039fda"},{"cell_type":"code","source":["# Log the model and parameters\n","model_name = f\"{EXPERIMENT_NAME}-Sarimax\"\n","with mlflow.start_run(run_name=\"Sarimax\") as run:\n"," mlflow.statsmodels.log_model(results,model_name,registered_model_name=model_name)\n"," mlflow.log_params({\"order\":(0,1,1),\"seasonal_order\":(0, 1, 1, 12),'enforce_stationarity':False,'enforce_invertibility':False})\n"," model_uri = f\"runs:/{run.info.run_id}/{model_name}\"\n"," print(\"Model saved in run %s\" % run.info.run_id)\n"," print(f\"Model URI: {model_uri}\")\n","mlflow.end_run()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":23,"statement_ids":[23],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:12:31.4621724Z","session_start_time":null,"execution_start_time":"2024-11-02T23:12:32.0087068Z","execution_finish_time":"2024-11-02T23:12:52.5566216Z","parent_msg_id":"7e7962c1-3919-435b-8aea-c83bc663f222"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 23, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stderr","text":["2024-11-02:23:12:44,932 ERROR [shared_platform_utils.py:82] Create MLModel failed, status_code: 400, b'{\"requestId\":\"5065c1a6-0977-4fcd-a530-83c6ac92c01d\",\"errorCode\":\"ItemDisplayNameAlreadyInUse\",\"message\":\"Requested \\'orders-sales-forecast-Sarimax\\' is already in use\"}'\nRegistered model 'orders-sales-forecast-Sarimax' already exists. Creating a new version of this model...\n2024/11/02 23:12:49 INFO mlflow.store.model_registry.abstract_store: Waiting up to 300 seconds for model version to finish creation. Model name: orders-sales-forecast-Sarimax, version 5\nCreated version '5' of model 'orders-sales-forecast-Sarimax'.\n"]},{"output_type":"stream","name":"stdout","text":["Model saved in run 9afe4db1-5c3b-475a-96cd-1dca63a255ff\nModel URI: runs:/9afe4db1-5c3b-475a-96cd-1dca63a255ff/orders-sales-forecast-Sarimax\n"]},{"output_type":"display_data","data":{"application/vnd.mlflow.run-widget+json":{"info":{"artifact_uri":"sds://onelakemsit.pbidedicated.windows.net/3f4eeb28-7210-44e7-bd10-efcda197a9f7/9a6fa9c6-d583-4646-90be-948000a94098/9afe4db1-5c3b-475a-96cd-1dca63a255ff/artifacts","end_time":1730589170,"experiment_id":"6e249cc0-0384-4a0a-8c72-bad492a83d86","lifecycle_stage":"active","run_id":"9afe4db1-5c3b-475a-96cd-1dca63a255ff","run_name":"","run_uuid":"9afe4db1-5c3b-475a-96cd-1dca63a255ff","start_time":1730589152,"status":"FINISHED","user_id":"e83b0ff5-f802-4776-bae4-11fe73ba932a"},"data":{"metrics":{},"params":{"order":"(0, 1, 1)","seasonal_order":"(0, 1, 1, 12)","enforce_stationarity":"False","enforce_invertibility":"False"},"tags":{"mlflow.user":"1b884fa3-ac7e-44f0-a171-1f215a13ecd4","synapseml.notebook.artifactId":"4ef083b9-cbcc-4f39-a126-7c3611447a5d","synapseml.user.name":"Vindhya Banda","synapseml.user.id":"d7eaa3fc-8cbd-4cef-bc38-50830ac05ed0","synapseml.livy.id":"69bf9935-062b-4346-914c-f3056e2ebcc2","mlflow.runName":"Sarimax","synapseml.run.artifactJobId":"7f403eb5-f92c-4da7-b0ef-ebd8df4b1b59","mlflow.rootRunId":"9afe4db1-5c3b-475a-96cd-1dca63a255ff","synapseml.experimentName":"orders-sales-forecast","synapseml.experiment.artifactId":"9a6fa9c6-d583-4646-90be-948000a94098"}},"inputs":{"dataset_inputs":[]}}},"metadata":{}}],"execution_count":21,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"7f16653c-6f45-4993-85be-3a6179bb3401"},{"cell_type":"code","source":["# Load the saved model\n","loaded_model = mlflow.statsmodels.load_model(model_uri)"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":24,"statement_ids":[24],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:12:55.4569138Z","session_start_time":null,"execution_start_time":"2024-11-02T23:12:55.9034108Z","execution_finish_time":"2024-11-02T23:12:58.9442392Z","parent_msg_id":"a38ab591-3bb5-4746-abda-a6a64b11855f"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 24, Finished, Available, Finished)"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"Downloading artifacts: 0%| | 0/9 [00:00 0:\n"," # Calculate the Mean Absolute Percentage Error (MAPE)\n"," mape = mean_absolute_percentage_error(valid_rows['Actual_Sales_x'], valid_rows['Forecasted_Sales']) * 100\n","\n"," # Assign MAPE back to final_data or create a new column\n"," final_data['MAPE'] = np.nan # Initialize MAPE column with NaN\n"," final_data.loc[valid_rows.index, 'MAPE'] = mape # Assign calculated MAPE to valid rows\n","else:\n"," print(\"No valid data available for MAPE calculation.\")\n"," final_data['MAPE'] = np.nan # Ensure MAPE column remains NaN where no valid data exists\n"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":31,"statement_ids":[31],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:14:37.0981562Z","session_start_time":null,"execution_start_time":"2024-11-02T23:14:37.5513296Z","execution_finish_time":"2024-11-02T23:14:37.9412798Z","parent_msg_id":"b699fea2-f925-4e1f-bd13-2ded61198aea"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 31, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Number of valid rows for MAPE calculation: 0\nNo valid data available for MAPE calculation.\n"]}],"execution_count":28,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"0a5eed96-a4b9-49c5-83d2-09eab6134195"},{"cell_type":"markdown","source":["## Case 2: Forecasting sales for a specific product in a particular region."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"749733a2-61f1-41c4-9f9d-3de44bd5e6b8"},{"cell_type":"markdown","source":["Forecasting the sales of eggs in the Chicago. We have the daily sales data for Eggs in Chicago, with each date showing the total sales amount in dollars. Some dates may show zero sales, which could indicate days with no orders for Eggs."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"e4f86c82-5647-4c95-9fa6-8015ed03ec07"},{"cell_type":"markdown","source":["### Import required libraries"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"009a32a6-7576-40f2-b9d9-c5a1d85f2e06"},{"cell_type":"code","source":["import pandas as pd\n","import json\n","from prophet import Prophet\n","import warnings\n","import itertools\n","import numpy as np\n","import matplotlib.pyplot as plt\n","warnings.filterwarnings(\"ignore\")\n","plt.style.use('fivethirtyeight')\n","import pandas as pd\n","import statsmodels.api as sm\n","import matplotlib\n","matplotlib.rcParams['axes.labelsize'] = 14\n","matplotlib.rcParams['xtick.labelsize'] = 12\n","matplotlib.rcParams['ytick.labelsize'] = 12\n","matplotlib.rcParams['text.color'] = 'k'\n","from sklearn.metrics import mean_absolute_percentage_error\n","from datetime import timedelta"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":4,"statement_ids":[4],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:19:58.4648686Z","session_start_time":null,"execution_start_time":"2024-11-05T03:19:59.0539178Z","execution_finish_time":"2024-11-05T03:20:15.3592152Z","parent_msg_id":"1ae553f7-0c03-47e5-956d-0c4a45da2509"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 4, Finished, Available, Finished)"},"metadata":{}}],"execution_count":2,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"10de6dbf-47e6-415d-93b4-5cdb5b1440e2"},{"cell_type":"markdown","source":["### Load the data"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"d8c94611-3236-40d5-8450-176e557f3537"},{"cell_type":"code","source":["# Read from Kusto\n","ordersQuery = \"['orders'] | mv-expand li = parse_json(line_items) | project order_date, store_id, order_id, product_id = toint(li.product_id), quantity = toint(li.quantity), price = toreal(li.price), item_total = toreal(li.item_total), order_total\"\n","inventoryQuery = \"['inventory'] | project date_time, store_id, product_id, in_stock, retail_price\"\n","productsQuery = \"['products'] | project product_id, name, category, photo_path, price_range, stock\"\n","\n","kustoUri = \"https://trd-g8jnmstet4k7q79z9v.z1.kusto.fabric.microsoft.com\"\n","database = \"contosohypermarket\"\n","accessToken = mssparkutils.credentials.getToken(kustoUri)\n","\n","orders_df = spark.read\\\n"," .format(\"com.microsoft.kusto.spark.synapse.datasource\")\\\n"," .option(\"accessToken\", accessToken)\\\n"," .option(\"kustoCluster\", kustoUri)\\\n"," .option(\"kustoDatabase\", database)\\\n"," .option(\"kustoQuery\", ordersQuery).load()\n","\n","inventory_df = spark.read\\\n"," .format(\"com.microsoft.kusto.spark.synapse.datasource\")\\\n"," .option(\"accessToken\", accessToken)\\\n"," .option(\"kustoCluster\", kustoUri)\\\n"," .option(\"kustoDatabase\", database)\\\n"," .option(\"kustoQuery\", inventoryQuery).load()\n","\n","products_df = spark.read\\\n"," .format(\"com.microsoft.kusto.spark.synapse.datasource\")\\\n"," .option(\"accessToken\", accessToken)\\\n"," .option(\"kustoCluster\", kustoUri)\\\n"," .option(\"kustoDatabase\", database)\\\n"," .option(\"kustoQuery\", productsQuery).load()\n","\n","# Convert Spark DataFrames to Pandas DataFrames\n","orders_df = orders_df.toPandas()\n","products_df = products_df.toPandas()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":5,"statement_ids":[5],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:20:18.0228977Z","session_start_time":null,"execution_start_time":"2024-11-05T03:20:18.4875288Z","execution_finish_time":"2024-11-05T03:20:45.9496343Z","parent_msg_id":"bee9a4cd-0829-447f-a25f-46c365a1c73e"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 5, Finished, Available, Finished)"},"metadata":{}}],"execution_count":3,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"48b39ec1-4daf-4756-b6da-95e5c1b6ef5a"},{"cell_type":"markdown","source":["### Data Preprocessing"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"007f637a-5e3c-4ece-84d2-5162990100e8"},{"cell_type":"code","source":["# Filter the inventory for the Chicago region and convert to Pandas DataFrame\n","chicago_inventory = inventory_df[inventory_df['store_id'] == 'CHI'].toPandas()\n","\n","# Merge inventory with products to get product names\n","chicago_inventory_with_names = pd.merge(chicago_inventory, products_df[['product_id', 'name']], on='product_id')\n","\n","# Find the product with the maximum stock\n","max_stock_product = chicago_inventory_with_names.loc[chicago_inventory_with_names['in_stock'].idxmax()]\n","\n","# Display the product name and stock quantity\n","print(\"Product with the highest stock in Chicago:\")\n","print(f\"Product: {max_stock_product['name']}, Stock: {max_stock_product['in_stock']}\")"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":6,"statement_ids":[6],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:20:49.3226112Z","session_start_time":null,"execution_start_time":"2024-11-05T03:20:49.878258Z","execution_finish_time":"2024-11-05T03:20:57.0553621Z","parent_msg_id":"ca0e9f45-5fe3-49d2-8ab4-2569182171c9"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 6, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Product with the highest stock in Chicago:\nProduct: Strawberry, Stock: 10000\n"]}],"execution_count":4,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"bd96b363-5b96-45f6-b946-b3adc0cff117"},{"cell_type":"code","source":["# Check column names\n","print(\"Orders DataFrame columns:\", orders_df.columns)\n","print(\"Products DataFrame columns:\", products_df.columns)\n","\n","# Merge orders with products to get product details\n","merged_df = pd.merge(orders_df, products_df, on='product_id')\n","\n","# Check merged DataFrame columns\n","print(\"Merged DataFrame columns:\", merged_df.columns)\n","\n","# Filter data for Eggs in Chicago\n","product_name = 'Strawberry'\n","region = 'CHI'\n","filtered_df = merged_df[(merged_df['name'] == product_name) & (merged_df['store_id'] == region)]\n","\n","# Check if filtered_df is empty\n","if filtered_df.empty:\n"," raise ValueError(f\"No data found for product '{product_name}' in region '{region}'.\")"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":7,"statement_ids":[7],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:20:59.9397675Z","session_start_time":null,"execution_start_time":"2024-11-05T03:21:00.3349123Z","execution_finish_time":"2024-11-05T03:21:00.7159952Z","parent_msg_id":"051aa189-200a-4e53-8b37-6ba3906cb428"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 7, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Orders DataFrame columns: Index(['order_date', 'store_id', 'order_id', 'product_id', 'quantity', 'price',\n 'item_total', 'order_total'],\n dtype='object')\nProducts DataFrame columns: Index(['product_id', 'name', 'category', 'photo_path', 'price_range', 'stock'], dtype='object')\nMerged DataFrame columns: Index(['order_date', 'store_id', 'order_id', 'product_id', 'quantity', 'price',\n 'item_total', 'order_total', 'name', 'category', 'photo_path',\n 'price_range', 'stock'],\n dtype='object')\n"]}],"execution_count":5,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"c0aef7db-4f2b-4a8a-9fa8-e87886f3988e"},{"cell_type":"markdown","source":["### Sales Forecasting"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"265401a2-2ff9-4384-a0ca-217b04fd6f63"},{"cell_type":"code","source":["# Prepare data for Prophet\n","sales_data = filtered_df.groupby('order_date').agg({'quantity': 'sum'}).reset_index()\n","sales_data.columns = ['ds', 'y']\n","\n","# Check the sales_data DataFrame\n","print(sales_data.head())\n","print(sales_data.info())\n","\n","# Handle missing values\n","sales_data = sales_data.dropna()\n","\n","# Ensure there are at least 2 non-NaN rows\n","if sales_data.shape[0] < 2:\n"," raise ValueError('Insufficient data for forecasting. Please ensure there are at least 2 non-NaN rows.')\n","\n","# Fit the model\n","model = Prophet()\n","model.fit(sales_data)\n","\n","# Make future predictions\n","future = model.make_future_dataframe(periods=30) # Forecast for the next 30 days\n","forecast = model.predict(future)"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":8,"statement_ids":[8],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:21:05.2381158Z","session_start_time":null,"execution_start_time":"2024-11-05T03:21:05.6450507Z","execution_finish_time":"2024-11-05T03:21:06.6439494Z","parent_msg_id":"2923ae4a-d877-4037-aff8-fa3938a0bad5"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 8, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":[" ds y\n0 2024-09-26 13:21:01.705 4\n1 2024-09-26 13:22:01.964 8\n2 2024-09-26 13:23:02.225 2\n3 2024-09-26 13:25:02.748 5\n4 2024-09-26 13:27:03.110 5\n\nRangeIndex: 777 entries, 0 to 776\nData columns (total 2 columns):\n # Column Non-Null Count Dtype \n--- ------ -------------- ----- \n 0 ds 777 non-null datetime64[us]\n 1 y 777 non-null int32 \ndtypes: datetime64[us](1), int32(1)\nmemory usage: 9.2 KB\nNone\nDisabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.\ninput tempfile: /tmp/tmpcnr8w6eh/35f5m6b4.json\ninput tempfile: /tmp/tmpcnr8w6eh/jneh1p9t.json\nidx 0\nrunning CmdStan, num_threads: None\nCmdStan args: ['/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/prophet/stan_model/prophet_model.bin', 'random', 'seed=91172', 'data', 'file=/tmp/tmpcnr8w6eh/35f5m6b4.json', 'init=/tmp/tmpcnr8w6eh/jneh1p9t.json', 'output', 'file=/tmp/tmpcnr8w6eh/prophet_modellra6azuw/prophet_model-20241105032105.csv', 'method=optimize', 'algorithm=lbfgs', 'iter=10000']\nChain [1] start processing\nChain [1] done processing\n"]},{"output_type":"stream","name":"stderr","text":["03:21:05 - cmdstanpy - INFO - Chain [1] start processing\n03:21:06 - cmdstanpy - INFO - Chain [1] done processing\n"]}],"execution_count":6,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"b9ff1f2f-69ed-44e7-9ef1-0a66acbb257e"},{"cell_type":"code","source":["# Filter orders for 'Strawberry' in Chicago ('CHI')\n","product_name = 'Strawberry'\n","product_id = products_df[products_df['name'] == product_name].iloc[0]['product_id']\n","filtered_sales_df = orders_df[\n"," (orders_df['product_id'] == product_id) & \n"," (orders_df['store_id'] == 'CHI')\n","]\n","\n","# Aggregate daily sales for the specific product and store\n","actual_sales = filtered_sales_df.groupby('order_date')['quantity'].sum().reset_index()\n","actual_sales.rename(columns={'order_date': 'ds', 'quantity': 'y'}, inplace=True)\n","actual_sales['ds'] = pd.to_datetime(actual_sales['ds'])\n","\n","# Fill in missing dates with zero sales to create a continuous time series\n","date_range = pd.date_range(start=actual_sales['ds'].min(), end=actual_sales['ds'].max(), freq='D')\n","actual_sales = actual_sales.set_index('ds').reindex(date_range, fill_value=0).rename_axis('ds').reset_index()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":9,"statement_ids":[9],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:21:10.347817Z","session_start_time":null,"execution_start_time":"2024-11-05T03:21:10.8112399Z","execution_finish_time":"2024-11-05T03:21:11.1673416Z","parent_msg_id":"d43d268a-df8d-48cf-93ce-591bf18cde66"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 9, Finished, Available, Finished)"},"metadata":{}}],"execution_count":7,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"da702183-cfbc-4251-8509-7f775328135a"},{"cell_type":"markdown","source":["### Plot forecasted data"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"5eaccb9b-a8af-4304-bed6-675dca98be9c"},{"cell_type":"code","source":["# Plot the forecasted data\n","fig = model.plot(forecast)\n","plt.title('Sales Forecast')\n","plt.xlabel('Date')\n","plt.ylabel('Sales Quantity')\n","plt.show()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":10,"statement_ids":[10],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:21:14.0267751Z","session_start_time":null,"execution_start_time":"2024-11-05T03:21:14.4240392Z","execution_finish_time":"2024-11-05T03:21:15.4680752Z","parent_msg_id":"fd19c285-b769-418f-b931-b86049925b12"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 10, Finished, Available, Finished)"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"iVBORw0KGgoAAAANSUhEUgAAA9IAAAJgCAYAAABm5lsUAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAADdjElEQVR4nOzdeXwU5eE/8M/M7JXdzX0nQCAcIqcIeFa5FP164VXPimJBrfanULVSQZTWq60UWq1txRbF9qui9ap+tZ6gtioocotCQgLkvpO953h+f4REQu5kk51NPu/XKy/I7Mzsk3022fnMc0lCCAEiIiIiIiIi6hI50gUgIiIiIiIiiiYM0kRERERERETdwCBNRERERERE1A0M0kRERERERETdwCBNRERERERE1A0M0kRERERERETdwCBNRERERERE1A0M0kRERERERETdwCBNRERERERE1A0M0kRERB244YYbIEkShg8fHumiEBERkUkwSBMRkWn5fD48/fTTuOCCCzB06FDExMTA5XJh+PDhOOmkk3DjjTfi2WefRUFBQaSLamqSJHX5a+bMmZEuLhERkelZIl0AIiKitnzxxRe46qqr2gzJhYWFKCwsxJYtW7Bu3ToAgN/vh8Ph6OdSEoXX8OHDUVhYiOuvvx7PPPNMpItDRETtYJAmIiLT2bdvH+bOnYv6+noAwPnnn48f/vCHOO644+BwOFBdXY0dO3Zg48aNePfdd+H3+yNc4ugwbdq05hsP7XG5XP1UGiIioujFIE1ERKazbNmy5hD99NNP48c//nGrfWbPno3Fixejvr4ezzzzDBRF6e9iRh2Xy4UJEyZEuhhERERRj0GaiIhMRdd1vPnmmwAaW1DbCtFHi4uLw+23394fRSMiIiICwMnGiIjIZCoqKpq7ao8cObJX5zIMAx9++CHuuusunH766UhJSYHVakVCQgJOOOEE3HXXXTh48GA4io1AIIAnnngCZ511FjIyMmCz2ZCamopZs2bhiSeeQDAY7PD4r7/+GosWLcLYsWPhdrtht9uRnZ2NKVOmYOHChdiwYUOn5+hLn3/+OW644Qbk5ubC6XQiLi4OEyZMwM9+9rMOX8OCgoLmicyaxvy+9tpruPDCC5GdnQ2LxYITTjih1XElJSVYvnw5pk2bhqSkpObX49JLL8Ubb7zRpTL7fD784Q9/wNy5c5GVlQW73Y709HRMnToVt99+Oz799FMIIdr8WZcvX46ZM2c212VcXBzGjRuHn/zkJ9izZ0+nz71//34sXrwYkyZNQmxsLGw2GzIzMzFp0iRce+21WL9+PRoaGpr3nzlzJiRJQmFhIQDg2Wef5URwRERmJoiIiEykurpaABAAxKRJk3p1rvvvv7/5XO19OZ1O8corr7R7juuvv14AEDk5Oe3u89VXX4lhw4Z1+Dxjx44V+/fvb/P43//+90KW5U7L+s033/TodWg6fsaMGd0+1jAMsXjx4g7L5XA4xHPPPdfm8QcOHGje729/+5u44YYbWh0/efLkFsc888wzwul0dvic8+bNEx6Pp91yb9q0SWRkZHT6mh44cKDFcevWrev0GEVRxB//+Md2n/vll18Wdru90/O8/fbbzcfMmDGj0/17Un9ERNQ32LWbiIhMJTExEcOHD0dBQQF27NiBhx9+GEuXLoUsd78TlaZpyMzMxCWXXIJTTz0Vubm5cDgcOHToEP773//iySefhMfjwTXXXIOtW7fi+OOP7/Zz7NmzBzNmzIDH44HL5cJPfvITnHrqqRg2bBjq6+vxzjvv4IknnsDevXtx7rnn4ssvv0R8fHzz8Tt27MCSJUtgGAaGDx+O2267DVOmTEFycjK8Xi/27duHTZs24fXXX+922cJh2bJlWLNmDQBgyJAhWLp0KaZPn45gMIh3330Xq1atgt/vx/z585GYmIjzzz+/3XOtWbMGO3bswGmnnYZbb70Vxx13HBoaGrB3797mfZ599lnccMMNAIChQ4fi//2//4fx48cjIyMDRUVF+N///V+88MILeP3117FgwQJs2LCh1fP85z//wVlnnQVVVSHLMq666ipceumlGD58OFRVxXfffYd3330Xr732WqtjNU1DYmIiLrroIsyYMQOjR4+Gy+VCcXExtm7dij/84Q+orKzET3/6U4wdOxazZ89ucXxZWRmuv/56BINBpKam4tZbb8Vpp52G1NRUBAIB5Ofn4z//+U+r5163bh28Xi/OOeccFBcXY968eXjwwQdb7MOJ4IiITCTSSZ6IiOhYq1evbtESN2zYMPHTn/5U/O///q/Yt2+fMAyjS+c5cOCACIVC7T5+6NAhkZ2dLQCIH/3oR23u01GLtGEYYvLkyQKAGD9+vCgpKWnzHFu2bGluYV2+fHmLx+677z4BQLhcrnaPF0IIr9cr/H5/u493pOl1nDZtmti5c2e7X99++22L43bt2tXcUj569GhRUVHR6tybN29u/tkyMzNFIBBo8fjRLdIAxDXXXCN0XW+znIcOHWo+19VXXy2CwWCb+z355JPN53v//fdbPBYIBMTQoUMFAGG328W///3vdl+XyspK4fP5Wmw7fPiw8Hq97R5TW1srJk2aJACIH/zgB60e/+tf/9pcth07drR7nlAoJOrr61ttz8nJEQDE9ddf3+6xREQUeQzSRERkOoZhiJtuuqndLq4pKSni0ksvFS+++KJQVbVXz7VmzRoBQMTFxbUZ0DsK0m+++WZzmTZv3tzh89x9990CgMjKymqxfdGiRQKAmDJlSq9+jo609zoe+3Xsz3jrrbc2P/bhhx+2e/5f/vKXzfv9/e9/b/HY0UE6Pj5e1NXVtXueu+66SwAQqampHYZZIYSYPn16czA/2tq1a5uf79FHH+3wHD312muvNT9HZWVli8ceeughAUAkJib26NwM0kRE0YGTjRERkelIkoS//OUv+OCDD3DBBRfAarW2eLyyshKvvPIKrrzySkycOBFff/11l85bX1+PAwcOYPfu3di1axd27doFp9PZ4rHuaOqem5OTg+nTp3e475lnngkAKC4ubjE5V1ZWFoDGLuKbN2/u1vP3tffeew8AkJubi1mzZrW736JFi1od05YLL7wQcXFx7T7e9Hqed955zfXSnqbX87PPPmuxvWnGd7vdjp/85CcdnqMrvF4vCgoKWrxnjn4/bt++vcX+TfVZU1MTse74RETU9zhGmoiITGv27NmYPXs2PB4PPvvsM2zevBlfffUVPv74Y1RVVQEA9u7dixkzZuCzzz7D+PHjW52joKAAq1atwhtvvNHpDN2VlZXIzc3tcvm+/PJLAEBhYSEkSerycaWlpRg2bBgA4Oqrr8YjjzyCYDCI008/Heeccw7OO+88/OAHP8CECRN6NDa8PTNmzMDGjRu7tG8wGMS+ffsAAKecckqH+2ZkZDSPa9+5c2e7+02ePLndx+rq6rB//34AjeOkn3322S6Vs7S0tMX3W7dubX6ujkJ7RyorK7Fq1Sq88sor2LdvX5szex+979EuuugiJCYmoqamBpdccglmzJiBCy+8EGeccQamTJkCi4WXXkREAwFbpImIyPTcbjfOPvtsLFu2DK+88gpKS0vxz3/+E0OGDAEANDQ0YPHixa2Oe/vttzF+/Hg88cQTXVrmqmnZra4qLy/v1v5NfD5f8/+PO+44bNiwAcnJydA0DW+99RZuu+02TJ48GSkpKbjiiivwzjvv9Oh5eqOmpqb5/2lpaZ3un5GRAQCorq5ud5/ExMR2H+vpa3lsnVVUVAAAMjMze3S+r776CmPHjsWjjz6K7777rsMQ3dbzJyUl4c0338SwYcMghMDGjRtx55134qSTTkJCQgIuuOACbNiwAYZh9Kh8RERkDrwtSkREUcdiseDSSy/F6NGjMW3aNIRCIXz44Yeorq5GUlISAKCqqgrXXHMNfD4f3G437rrrLpxzzjkYOXIk4uPjYbPZAAAffvgh5syZAwCdhqZj6boOADj55JPx9NNPd/m4ESNGtPh+3rx5mD17Nl566SW88847+OSTT1BaWoqamhq89NJLeOmll3Deeefh5ZdfRkxMTLfKGA5daW3vymunKEq7jzW9lgDw05/+FDfffHPXCteO7vQQaBIKhXDFFVegqqoKVqsV/+///T/MmzcPY8aMQWJiIux2OwAgPz+/eY3ztn7u0047Dd999x1ee+01vPnmm/jkk09QWFgIr9eLt956C2+99RZOOukkvPnmm0hNTe3Vz0lERJHBIE1ERFFr4sSJOPnkk/HJJ5/AMAzk5eU1B+mXXnoJtbW1AIBXX30VZ511Vpvn6KgFtTMpKSkoKytDWVkZJkyY0OPzAEBsbCxuvPFG3HjjjQCAffv24c0338QTTzyB/Px8/N///R+WLVuG3/3ud716nq46uvW4rKys0/2b9ml6/bsrJSWl+f8ej6fHr2dKSgoOHz6M4uLibh/74YcfIj8/HwDw5JNPYuHChW3u15X3jN1ux5VXXokrr7wSAHDo0CG8/fbbePLJJ7F9+3Zs3rwZN998M1555ZVul5OIiCKPXbuJiCiqNU3uBKDFeOLdu3cDaAx27YVo4Ptxzj0xZcoUAI3jsL/77rsen6cto0ePxpIlS/Dll18iPT0dANpcM7mv2O12jB49GgA6nQStrKwMBQUFABpvbvRESkoKhg4dCgB4//33e9z1eerUqQCAbdu2ob6+vlvHNr1nADQH4Lb05D0zdOhQ3HTTTdi8eXPzTYJ//etfrbqG96QlnYiI+h+DNBERRS0hBL766isAjQEkJyen+TFN0wAAgUCg3VDm8/nw3HPP9fj5L7744ub/P/LIIz0+T0cSExNx4oknAmg9sVVfO/vsswEA+/fvx8cff9zufkd3a286pifmzZsHADh8+HCP6+XCCy8E0NhN+8knn+zWsU3vGaBxtu62GIaBtWvX9qhsAGCz2XDGGWc0P19dXV2Lxx0OB4DGyd6IiMi8GKSJiMhUPB4PTjrpJLzxxhstxs225f7772+e6fmMM85o0T24qTXV5/O12ZKr6zoWLlzYoy7ATS655JLm1sVnnnkGf/jDHzrc/8CBA3j++edbbHv11VdbTOx1rOrq6uabBceOre5rt956a3Mr/y233NJmObdu3dp8EyEzMxOXX355j5/v7rvvbh4Dfvvtt+PTTz/tcP9PP/0UmzZtarHtRz/6UfMkdCtXrsS7777b7vFVVVUtWoSb3jNAY3225Re/+EXzzOBteeeddzp8TwUCAXzyyScAGrvzH/2eBb6fJC0vL6/dcxARUeRxjDQREZnOli1bMG/ePGRmZmLevHk49dRTMWLECMTFxaGhoQE7duzAc889h88//xxAYzfkVatWtTjHFVdcgXvvvRfBYBALFizA9u3bcdZZZyE+Ph67d+/G448/jq+++gqnn346/vOf//SonLIsY8OGDTj11FNRV1eHO+64A6+++iquu+46jBs3DjabDVVVVdixYwfeeecdfPjhh7jkkktw9dVXN5/j97//Pa699lqcd955mD17No4//ngkJiairq4O27dvxxNPPNE8o/Wtt97aw1e0Z8aPH4977rkHjzzyCL755htMmTIF99xzD6ZNm4ZgMIh3330Xq1atgs/ngyRJWLt2bfOEXD0xbNgwPP300/jRj36E+vp6zJo1C1dffTXmzZuH4cOHwzAMlJSU4KuvvsKrr76KnTt34vHHH8eMGTOaz2G32/GPf/wDc+bMQSAQwP/8z//g6quvxmWXXYacnByoqor9+/fjvffew8svv4xdu3Zh+PDhAIBzzjkHaWlpKC8vx/Lly1FYWIiLL74YKSkp2L9/P9auXYsPPvigw/fMCy+8gIsuughz5szBOeecgwkTJiA5ORlerxd79+7Fn/70J+zatQtA4/rbxy6Hddppp+Gjjz7Cli1b8Oijj+J//ud/4HK5AAAxMTHIzs7u8etLRERhJIiIiEzE7/eLjIwMAaBLX0OGDBEffPBBm+f629/+JmRZbvfYK6+8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on2uWtu3b5+w2+3ixRdfjClIp3q/aJoW/P7RRx9t8wXi+PHjwmKxiJtuuilk+/333y8kSRKfffZZh+fauHGjACD+9re/hWyfOnWqKC4uFqqqxtyutrBfuqZfnE6nuPDCC0OOc7vdwuFwiCuuuKLDc7Ffou8XXdeDj+2bb77pMEhnZGRE/ThOx36Jvl+ifa5UVRXHjx8PO3bdunUCgPjLX/4St3OxX6J/rr7++muhKIq49dZbQ47929/+JgCIp59+Om7nSvV+Of3Y4cOHxxwMYnl/4etY9/VLtO8vfB1Lzn6Jx+tYIiR0andBQUHYNrvdjmHDhuGrr74CAKiqig0bNmDmzJnIysoKHldSUoLJkydj/fr1wW29evWKWE173LhxaGpqQnV1ddi+hx56CNXV1bj//vtjanss7Xr33XfRu3dvVFRUhNzHZZddhsbGRmzatKnD80XzXJ3upptuwtSpUzF9+vRoH1bU50rWfgHQbnW91jZt2oTm5mbccMMNIdtvuOEGCCHw0ksvdXgf69evh91ux9VXXx12H4cOHcL27dtjbldb2C9d0y9GoxEOhyPkOIvFEvzqCPsl+n7pzhUP2C/R90u07y+KoiAvLy/s2HHjxgFAm+9FsZ6L/eIXbb9s27YNmqbhu9/9bsixl112GQDghRdeiMu50qFfYj02kljeX84U+yV60b6/8HUsOfslHq9jiZB060jX1dVh586dGD58OACgqqoKbrcb5eXlYceWl5djz549aG5ubvc+N2/ejPz8/LBf/P/85z+477778OSTT8Jut8fUzlja5fV6YTabw44LbPv4449jOnfA6c9Va7///e/x3nvv4YknnujUfXd0rmTtl1h8+umnAICzzz47ZHtRURF69eoV3N/RfQwdOhQGgyFke+B5ieY+zgT7pe37iLZfFixYgE2bNuEPf/gDampqcPjwYfz0pz9FXV0dbrvttk49BvZLfLjdbhQWFkJRFPTp0we33HJLxA8U0WK/RK+995fTvfXWWwAQ1bHRnIv90rZI/eL1egEg7HOG0WiEJElx+4yRDv0SD7G+7/N1LDXwdSyxuup1rKsZOj6ke82fPx+NjY34xS9+AQA4ceIEACA3Nzfs2NzcXAghUFNTg6Kiooj39/vf/x5btmzBqlWroChKcLuu6/jRj36EGTNmhP31IxqxtGvYsGF44403cPDg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SkoAANdffz0A4O2338acOXOCATo7Ozt4jqqqKkyaNAkulwvf/va3cdVVV+HYsWN44YUX8Nprr+HNN9/E+PHju/mRExERxReDNBERUQ8yceJErF69Gu+//z4AYOjQoTh8+DByc3NDjtu8eTMuvvhi3HfffXjmmWcA+IP0/v378fbbb+P666/HpEmTwu6/srISR44cwWuvvYapU6cGt99zzz0YM2YM5s6di48//rjrHiAREVE34NRuIiKiHqS4uBgAcPz4cQCAw+EIC9GAf+r28OHD8cYbb0R937t27cK///1vzJkzJyREA/7R8Llz5+KTTz7hFG8iIkp5HJEmIiLqQYQQYdu2bNmClStXYvv27Th+/DhUVQ3uM5lMUd/3tm3bAABHjhyJWPBs9+7dwf+PGDEixpYTERElDwZpIiKiHuTw4cMAgPz8fADAunXrcM0118But2PatGno378/bDYbJEnCn/70Jxw4cCDq+66urgYAbNy4ERs3bmzzuMbGxjN4BERERInHIE1ERNSDbNmyBQAwduxYAMDSpUthsViwY8cODBo0KOTY5557Lqb7zsrKAgA8/vjjuOWWW868sUREREmK10gTERH1EF988QX+/ve/w2w2Y/r06QD8VbaHDh0aFqIPHToUtvwVACiKAgDQNC1sX6Aa99atW+PddCIioqTCIE1ERNQDvPPOO5g2bRo8Hg/uvvtuOJ1OAEBJSQn27NmDo0ePBo9tbm7GzTffHHKtdECgMNnXX38dtm/cuHEYP3481qxZg7Vr14bt13Udb7/9drweEhERUcJIIlLVESIiIkop+/fvx4ABA1BWVoYf/OAHAACv14tjx45h+/bt+PTTT6EoCu6++2788pe/hCRJAIAnnngCt956K4qKijBr1iyoqop//vOfEELAbrfjo48+CilQ9p///AcjRoxAcXExfvjDH8LhcMDhcODmm28GAOzbtw+TJ0/GgQMHcO6556KiogIWiwUHDx7E1q1b8c0336C5ubn7nyAiIqI4YpAmIiJKA4Eg3ZrVakV2djaGDBmCCy+8EHPmzEFZWVnIMUIIPP3003j88cdRVVWF7OxsXHrppXjggQcwe/ZsvP3222GVvv/85z9j+fLl+OKLL+DxeFBSUoL9+/cH99fU1ODXv/41XnrpJVRVVUFRFBQVFWHs2LGYNWtWcFo5ERFRqmKQJiIiIiIiIooBr5EmIiIiIiIiigGDNBEREREREVEMGKSJiIiIiIiIYsAgTURERERERBQDBmkiIiIiIiKiGDBIExEREREREcWAQZqIiIiIiIgoBgzSRERERERERDFgkCYiIiIiIiKKAYM0ERERERERUQwYpImIiIiIiIhiwCBNREREREREFAMGaSIiIiIiIqIY/H9w+WMoB2oSGAAAAABJRU5ErkJggg=="},"metadata":{}}],"execution_count":8,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"a0fb27bb-f6f1-4c8a-bb35-35c2d56e3e34"},{"cell_type":"markdown","source":["### Scoring the model for accuracy"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"f48c2e1b-54f6-401a-81d3-3c6cfe2ef4ac"},{"cell_type":"code","source":["import pandas as pd\n","from sklearn.metrics import mean_absolute_error, mean_absolute_percentage_error\n","\n","# Rename actual DataFrame\n","actual = sales_data.rename(columns={'y': 'actual'})\n","\n","# Prepare forecasted DataFrame\n","forecasted = forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].rename(columns={'yhat': 'forecasted', 'yhat_lower': 'forecasted_lower', 'yhat_upper': 'forecasted_upper'})\n","\n","# Convert 'ds' in both DataFrames to datetime\n","actual['ds'] = pd.to_datetime(actual['ds'])\n","forecasted['ds'] = pd.to_datetime(forecasted['ds'])\n","\n","# Standardize to nanoseconds precision\n","actual['ds'] = actual['ds'].dt.floor('ns') # Convert to nanoseconds\n","forecasted['ds'] = forecasted['ds'].dt.floor('ns') # Keep as nanoseconds\n","\n","# Check column names and dtypes\n","print(\"Actual DataFrame columns:\", actual.columns)\n","print(\"Forecasted DataFrame columns:\", forecasted.columns)\n","print(\"Actual ds dtype:\", actual['ds'].dtype)\n","print(\"Forecasted ds dtype:\", forecasted['ds'].dtype)\n","\n","# Merge dataframes on 'ds'\n","merged = actual.merge(forecasted, on='ds', how='inner')\n","\n","# Calculate accuracy metrics\n","mae = mean_absolute_error(merged['actual'], merged['forecasted'])\n","mape = mean_absolute_percentage_error(merged['actual'], merged['forecasted'])\n","\n","print(f'Mean Absolute Error (MAE): {mae}')\n","print(f'Mean Absolute Percentage Error (MAPE): {mape}')"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":11,"statement_ids":[11],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:21:21.2700181Z","session_start_time":null,"execution_start_time":"2024-11-05T03:21:21.6990947Z","execution_finish_time":"2024-11-05T03:21:22.1023814Z","parent_msg_id":"64a298a1-f93d-4608-ae7e-9851e6e1258d"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 11, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Actual DataFrame columns: Index(['ds', 'actual'], dtype='object')\nForecasted DataFrame columns: Index(['ds', 'forecasted', 'forecasted_lower', 'forecasted_upper'], dtype='object')\nActual ds dtype: datetime64[us]\nForecasted ds dtype: datetime64[ns]\nMean Absolute Error (MAE): 16.135472447036864\nMean Absolute Percentage Error (MAPE): 2.2703632900055903\n"]}],"execution_count":9,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"e1418afd-a3c4-455d-816a-e170a3b06891"},{"cell_type":"markdown","source":["### Calculating forecasted data"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"6d5390e8-e8d5-4dfa-919a-68751079dcd8"},{"cell_type":"code","source":["forecast[['ds', 'yhat']].to_csv('forecast.csv', index=False)"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":12,"statement_ids":[12],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:21:30.9470509Z","session_start_time":null,"execution_start_time":"2024-11-05T03:21:31.3580641Z","execution_finish_time":"2024-11-05T03:21:31.7391434Z","parent_msg_id":"8635c807-cc9a-461e-89f3-e752c7f5de22"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 12, Finished, Available, Finished)"},"metadata":{}}],"execution_count":10,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"4bf2e2e3-fc56-485e-a5a4-4234d88dbc93"},{"cell_type":"markdown","source":["##### Preparing actual and forecasted data"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"80a0aaf6-d7bc-44a0-b38b-ee8d0ef97c0f"},{"cell_type":"code","source":["# Filter orders for 'Strawberry' in Chicago ('CHI')\n","product_name = 'Strawberry'\n","product_id = products_df[products_df['name'] == product_name].iloc[0]['product_id']\n","filtered_sales_df = orders_df[\n"," (orders_df['product_id'] == product_id) & \n"," (orders_df['store_id'] == 'CHI')\n","]\n","\n","# Aggregate daily sales for the specific product and store\n","actual_sales = filtered_sales_df.groupby('order_date')['quantity'].sum().reset_index()\n","actual_sales.rename(columns={'order_date': 'ds', 'quantity': 'y'}, inplace=True)\n","actual_sales['ds'] = pd.to_datetime(actual_sales['ds'])\n","\n","# Fill in missing dates with zero sales to create a continuous time series\n","date_range = pd.date_range(start=actual_sales['ds'].min(), end=actual_sales['ds'].max(), freq='D')\n","actual_sales = actual_sales.set_index('ds').reindex(date_range, fill_value=0).rename_axis('ds').reset_index()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":13,"statement_ids":[13],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:21:35.8897096Z","session_start_time":null,"execution_start_time":"2024-11-05T03:21:36.3128878Z","execution_finish_time":"2024-11-05T03:21:36.661125Z","parent_msg_id":"4b745b13-20e5-4e47-8e93-51b2dc16237c"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 13, Finished, Available, Finished)"},"metadata":{}}],"execution_count":11,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"43571449-9160-4f0a-b4f0-a2dbde8418c5"},{"cell_type":"code","source":["# Initialize and fit Prophet model\n","model = Prophet()\n","model.fit(actual_sales)\n","\n","# Forecast the next 30 days\n","future = model.make_future_dataframe(periods=30)\n","forecast = model.predict(future)"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":14,"statement_ids":[14],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:21:41.1291977Z","session_start_time":null,"execution_start_time":"2024-11-05T03:21:41.5068476Z","execution_finish_time":"2024-11-05T03:21:41.8766493Z","parent_msg_id":"ac1e7f28-ba1c-4c35-83c9-d35ea4d718ce"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 14, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stderr","text":["03:21:41 - cmdstanpy - INFO - Chain [1] start processing\n03:21:41 - cmdstanpy - INFO - Chain [1] done processing\n"]},{"output_type":"stream","name":"stdout","text":["Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.\nDisabling daily seasonality. Run prophet with daily_seasonality=True to override this.\nn_changepoints greater than number of observations. Using 19.\ninput tempfile: /tmp/tmpcnr8w6eh/4u6xy9zg.json\ninput tempfile: /tmp/tmpcnr8w6eh/3nr4slau.json\nidx 0\nrunning CmdStan, num_threads: None\nCmdStan args: ['/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/prophet/stan_model/prophet_model.bin', 'random', 'seed=53327', 'data', 'file=/tmp/tmpcnr8w6eh/4u6xy9zg.json', 'init=/tmp/tmpcnr8w6eh/3nr4slau.json', 'output', 'file=/tmp/tmpcnr8w6eh/prophet_model9b3p2hun/prophet_model-20241105032141.csv', 'method=optimize', 'algorithm=newton', 'iter=10000']\nChain [1] start processing\nChain [1] done processing\n"]}],"execution_count":12,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"74c17c5a-a4b7-446d-bee3-604e60ac4068"},{"cell_type":"code","source":["# Prepare forecast data for MAPE calculation\n","forecasted_sales = forecast[['ds', 'yhat']].rename(columns={'yhat': 'Forecasted_Sales'})\n","\n","# Merge actual sales with forecasted sales on 'ds' date\n","final_data = actual_sales.merge(forecasted_sales, on='ds', how='left')\n","\n","# Filter to remove rows where 'y' (actual sales) is NaN for valid MAPE calculation\n","valid_data = final_data.dropna(subset=['y'])\n","\n","# Filter out rows where actual sales (y) are zero to avoid division by zero in MAPE calculation\n","valid_data = final_data[final_data['y'] != 0].dropna(subset=['y'])\n","\n","# Calculate MAPE only on valid entries where y is not zero\n","if not valid_data.empty:\n"," valid_data['MAPE'] = mean_absolute_percentage_error(valid_data['y'], valid_data['Forecasted_Sales']) * 100\n","else:\n"," print(\"No valid data available for MAPE calculation (all y values are zero or missing).\")\n","\n","# Display first few rows of valid data with MAPE\n","print(valid_data[['ds', 'y', 'Forecasted_Sales', 'MAPE']].head())"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":15,"statement_ids":[15],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:21:46.1542353Z","session_start_time":null,"execution_start_time":"2024-11-05T03:21:46.601026Z","execution_finish_time":"2024-11-05T03:21:46.9453965Z","parent_msg_id":"3e221c63-10dc-4ab4-9241-25f654d2f946"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 15, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":[" ds y Forecasted_Sales MAPE\n0 2024-09-26 13:21:01.705 4 1.310092 67.247704\n"]}],"execution_count":13,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"c71d537b-e700-4ba2-aca8-0ce95eabdd7a"},{"cell_type":"markdown","source":["##### Simulating data"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"56bb490e-c1ff-4cdf-a25b-4b9f703a17f1"},{"cell_type":"code","source":["# Parameters for synthetic data generation\n","start_date = actual_sales['ds'].min() - timedelta(days=365) # Start one year earlier\n","end_date = actual_sales['ds'].min() - timedelta(days=1) # End right before actual data starts\n","date_range = pd.date_range(start=start_date, end=end_date, freq='D')\n","\n","# Generate seasonal pattern with some random noise\n","np.random.seed(42)\n","seasonal_pattern = 10 + 5 * np.sin(2 * np.pi * date_range.dayofyear / 365) # Yearly seasonality\n","noise = np.random.normal(0, 2, len(date_range)) # Random noise\n","\n","# Create synthetic sales data\n","synthetic_sales = pd.DataFrame({\n"," 'ds': date_range,\n"," 'y': pd.Series(seasonal_pattern + noise).clip(lower=0) # Ensure no negative sales\n","})\n","\n","# Concatenate synthetic sales with actual sales\n","extended_sales = pd.concat([synthetic_sales, actual_sales]).sort_values(by='ds').reset_index(drop=True)"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":16,"statement_ids":[16],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:21:56.7511226Z","session_start_time":null,"execution_start_time":"2024-11-05T03:21:57.1414116Z","execution_finish_time":"2024-11-05T03:21:57.5089829Z","parent_msg_id":"f6e94e07-932c-4250-885a-f3186f9ffa3e"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 16, Finished, Available, Finished)"},"metadata":{}}],"execution_count":14,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"840e1912-413f-459f-a0e3-b0853d8af473"},{"cell_type":"markdown","source":["##### Integrate simulated data with Prophet model"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"409560e9-df84-456d-87b4-0cb314204ed2"},{"cell_type":"code","source":["# Initialize and fit Prophet model with extended sales data\n","model = Prophet()\n","model.fit(extended_sales)\n","\n","# Forecast the next 30 days\n","future = model.make_future_dataframe(periods=30)\n","forecast = model.predict(future)\n","\n","# Prepare forecast data for MAPE calculation\n","forecasted_sales = forecast[['ds', 'yhat']].rename(columns={'yhat': 'Forecasted_Sales'})\n","\n","# Merge actual sales with forecasted sales on 'ds' date\n","final_data = actual_sales.merge(forecasted_sales, on='ds', how='left')\n","\n","# Filter to remove rows where 'y' (actual sales) is NaN for valid MAPE calculation\n","valid_data = final_data.dropna(subset=['y'])\n","\n","# Filter out rows where actual sales (y) are zero to avoid division by zero in MAPE calculation\n","valid_data = final_data[(final_data['y'] != 0) & (~final_data['Forecasted_Sales'].isna())]"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":17,"statement_ids":[17],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:22:12.01668Z","session_start_time":null,"execution_start_time":"2024-11-05T03:22:12.3966452Z","execution_finish_time":"2024-11-05T03:22:12.7834637Z","parent_msg_id":"46438ea9-fe81-4274-9958-793a8e0a3bcf"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 17, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stderr","text":["03:22:12 - cmdstanpy - INFO - Chain [1] start processing\n03:22:12 - cmdstanpy - INFO - Chain [1] done processing\n"]},{"output_type":"stream","name":"stdout","text":["Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.\nDisabling daily seasonality. Run prophet with daily_seasonality=True to override this.\ninput tempfile: /tmp/tmpcnr8w6eh/fpytl34j.json\ninput tempfile: /tmp/tmpcnr8w6eh/whzg23sw.json\nidx 0\nrunning CmdStan, num_threads: None\nCmdStan args: ['/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/prophet/stan_model/prophet_model.bin', 'random', 'seed=36194', 'data', 'file=/tmp/tmpcnr8w6eh/fpytl34j.json', 'init=/tmp/tmpcnr8w6eh/whzg23sw.json', 'output', 'file=/tmp/tmpcnr8w6eh/prophet_modelfj0kckb0/prophet_model-20241105032212.csv', 'method=optimize', 'algorithm=lbfgs', 'iter=10000']\nChain [1] start processing\nChain [1] done processing\n"]}],"execution_count":15,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"53aea9c4-eddd-4a9a-9a26-5cf7459d1b8f"},{"cell_type":"markdown","source":["##### Calculating MAPE"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"7dafbdb5-bdca-47d4-8cc4-5ce8055c31e8"},{"cell_type":"code","source":["# Check if valid_data is not empty before calculating MAPE\n","if not valid_data.empty:\n"," valid_data['MAPE'] = mean_absolute_percentage_error(valid_data['y'], valid_data['Forecasted_Sales']) * 100\n"," print(valid_data[['ds', 'y', 'Forecasted_Sales', 'MAPE']].head())\n","else:\n"," print(\"No valid data available for MAPE calculation (all y values are zero or missing).\")\n","\n","# Display the first few rows of the final data with MAPE\n","print(valid_data[['ds', 'y', 'Forecasted_Sales', 'MAPE']].head())"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":18,"statement_ids":[18],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:22:15.6725467Z","session_start_time":null,"execution_start_time":"2024-11-05T03:22:16.0734557Z","execution_finish_time":"2024-11-05T03:22:16.4378175Z","parent_msg_id":"20e0e7d2-1098-4eca-8656-b9440ce76bae"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 18, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":[" ds y Forecasted_Sales MAPE\n0 2024-09-26 13:21:01.705 4 3.175803 20.604931\n ds y Forecasted_Sales MAPE\n0 2024-09-26 13:21:01.705 4 3.175803 20.604931\n"]}],"execution_count":16,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"e5e5edb1-e546-463a-8f8a-0b2156bbbbfd"},{"cell_type":"markdown","source":["The updated output with a more reasonable MAPE value (around 20.6%) suggests that the adjustments made to filter out rows with zero values in y have worked well. This value is now within a plausible range, indicating that the MAPE calculation is functioning as expected, and the model's forecasts are in a more meaningful comparison with the actual sales data."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"0ed7e66f-77e8-4a20-9dfa-974eff1a3ea7"},{"cell_type":"markdown","source":["#### Recommendations for the future\n","- Experiment with adding yearly_seasonality=True or daily_seasonality=True when initializing the Prophet model to account for potential seasonal effects.\n","- Generating more synthetic data or investigating other external data sources to enrich the training set.\n","- Introducing additional relevant factors, like holidays or product promotions."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"f08d34f4-5eb8-453a-bbc5-650073288851"},{"cell_type":"markdown","source":["### Visualize in PowerBI"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"cf0da18a-60e7-4717-b707-318ca0b916fa"},{"cell_type":"code","source":["# Prepare future predictions DataFrame\n","future_predictions = forecast[['ds', 'yhat']].rename(columns={'yhat': 'Forecasted_Sales'})\n","future_predictions['Category'] = 'Future'"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":20,"statement_ids":[20],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:35:10.6036639Z","session_start_time":null,"execution_start_time":"2024-11-05T03:35:11.0704068Z","execution_finish_time":"2024-11-05T03:35:11.4887525Z","parent_msg_id":"85069a28-213a-4605-b401-1878623ab781"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 20, Finished, Available, Finished)"},"metadata":{}}],"execution_count":18,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"4065b5ac-2cbe-41ce-8d4e-29e3f6e2a999"},{"cell_type":"code","source":["# Prepare actual sales DataFrame (assuming 'actual_sales' has 'ds' and 'y' columns)\n","actual_predictions = actual_sales.rename(columns={'y': 'Actual_Sales'})\n","actual_predictions['Category'] = 'Actual'"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":21,"statement_ids":[21],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:35:13.3291876Z","session_start_time":null,"execution_start_time":"2024-11-05T03:35:13.794871Z","execution_finish_time":"2024-11-05T03:35:14.285944Z","parent_msg_id":"e50cffe4-ddfd-4808-a05f-286880dc3795"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 21, Finished, Available, Finished)"},"metadata":{}}],"execution_count":19,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"c831bc24-3c25-4cf4-823b-04196cb8b6e1"},{"cell_type":"code","source":["# Merge actual and forecasted DataFrames\n","combined_df = pd.merge(\n"," actual_predictions[['ds', 'Actual_Sales']],\n"," future_predictions[['ds', 'Forecasted_Sales']],\n"," on='ds',\n"," how='outer'\n",")\n","combined_df['Category'] = combined_df.apply(lambda row: 'Actual' if pd.notnull(row['Actual_Sales']) else 'Future', axis=1)"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":22,"statement_ids":[22],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:35:15.8414792Z","session_start_time":null,"execution_start_time":"2024-11-05T03:35:16.331134Z","execution_finish_time":"2024-11-05T03:35:16.7296294Z","parent_msg_id":"4ddee541-6605-4cc9-b258-bee6657445cb"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 22, Finished, Available, Finished)"},"metadata":{}}],"execution_count":20,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"1f0ae9ab-1c30-4eaa-8033-b23a1be0e941"},{"cell_type":"code","source":["from sklearn.metrics import mean_absolute_percentage_error\n","\n","# Filter out rows with null actual sales for MAPE calculation\n","valid_data = combined_df.dropna(subset=['Actual_Sales'])\n","\n","# Calculate MAPE (excluding zero values in 'Actual_Sales')\n","if not valid_data.empty:\n"," mape = mean_absolute_percentage_error(valid_data['Actual_Sales'], valid_data['Forecasted_Sales']) * 100\n"," print(f'MAPE: {mape:.2f}%')\n","else:\n"," print(\"No valid data available for MAPE calculation.\")"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":23,"statement_ids":[23],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:35:18.7566662Z","session_start_time":null,"execution_start_time":"2024-11-05T03:35:19.284397Z","execution_finish_time":"2024-11-05T03:35:19.6311776Z","parent_msg_id":"5a61ed09-40be-468f-a998-52cfdd7db6d8"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 23, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["MAPE: 767881500651486848.00%\n"]}],"execution_count":21,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"3fcb65d0-a075-4e2d-ba95-87b81f2e0a34"},{"cell_type":"code","source":["combined_df['Category'] = combined_df.apply(\n"," lambda row: 'Actual' if pd.notnull(row['Actual_Sales']) else 'Future', axis=1\n",")"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":24,"statement_ids":[24],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:35:21.7573387Z","session_start_time":null,"execution_start_time":"2024-11-05T03:35:22.156576Z","execution_finish_time":"2024-11-05T03:35:22.5354367Z","parent_msg_id":"6c0e4d87-0dc2-476f-ab07-7c16c5d9315b"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 24, Finished, Available, Finished)"},"metadata":{}}],"execution_count":22,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"b970ce06-7a78-4dd0-b956-bba9064a63b4"},{"cell_type":"code","source":["# Filter rows where 'Actual_Sales' is not null\n","filtered_combined_df = combined_df[~combined_df['Actual_Sales'].isnull()]"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":25,"statement_ids":[25],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:35:23.6044887Z","session_start_time":null,"execution_start_time":"2024-11-05T03:35:24.0540518Z","execution_finish_time":"2024-11-05T03:35:24.4330266Z","parent_msg_id":"4f28a7b0-db04-4cbd-ad23-971c355f0316"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 25, Finished, Available, Finished)"},"metadata":{}}],"execution_count":23,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"63468c4e-5b4a-4c64-89d3-d624e4a08ab6"},{"cell_type":"code","source":["# Create the input DataFrame from actual sales\n","input_df = actual_sales.reset_index()\n","input_df.rename(columns={'ds': 'Date', 'y': 'Actual_Sales'}, inplace=True)\n","input_df['Category'] = 'Your Category Name' # Change 'Your Category Name' to your use case\n","input_df['MAPE'] = np.nan\n","input_df['Forecasted_Sales'] = np.nan"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":26,"statement_ids":[26],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:37:05.8374085Z","session_start_time":null,"execution_start_time":"2024-11-05T03:37:06.3426543Z","execution_finish_time":"2024-11-05T03:37:06.7011932Z","parent_msg_id":"9459ff71-c9d8-4cbf-bef3-b366df84581a"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 26, Finished, Available, Finished)"},"metadata":{}}],"execution_count":24,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"edffddb2-6cec-442e-a186-1ab4e77d4dda"},{"cell_type":"code","source":["# Combine actual data with forecast data where 'Actual_Sales' is NaN\n","combined_df = pd.concat([input_df, forecast[['ds', 'yhat']].rename(columns={'ds': 'Date', 'yhat': 'Forecasted_Sales'})])\n","combined_df['Category'].fillna('Forecast', inplace=True)"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":27,"statement_ids":[27],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:37:08.6991979Z","session_start_time":null,"execution_start_time":"2024-11-05T03:37:09.1371946Z","execution_finish_time":"2024-11-05T03:37:09.4783961Z","parent_msg_id":"f52f3fb6-645d-40b9-8ef5-a7ce9f8f55ad"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 27, Finished, Available, Finished)"},"metadata":{}}],"execution_count":25,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"c899ca3b-ab6d-41d2-a346-a2bdc52cb851"},{"cell_type":"code","source":["# Write the final data to Delta Lake table\n","table_name = \"Strawberry_Chicago_Demand_Forecast_Table\"\n","spark.createDataFrame(combined_df).write.mode(\"overwrite\").format(\"delta\").save(f\"Tables/{table_name}\")\n","print(f\"Spark DataFrame saved to Delta table: {table_name}\")"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":28,"statement_ids":[28],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:37:11.3435008Z","session_start_time":null,"execution_start_time":"2024-11-05T03:37:11.7588443Z","execution_finish_time":"2024-11-05T03:37:26.4720364Z","parent_msg_id":"82e3e439-d58d-4a23-85b7-f04caf24286e"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 28, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Spark DataFrame saved to Delta table: Strawberry_Chicago_Demand_Forecast_Table\n"]}],"execution_count":26,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"350ab0c3-218c-4d16-ae7d-765dc74f9251"}],"metadata":{"kernel_info":{"name":"synapse_pyspark"},"kernelspec":{"name":"synapse_pyspark","language":"Python","display_name":"Synapse PySpark"},"language_info":{"name":"python"},"microsoft":{"language":"python","language_group":"synapse_pyspark","ms_spell_check":{"ms_spell_check_language":"en"}},"widgets":{"application/vnd.jupyter.widget-state+json":{"version_major":2,"version_minor":0,"state":{"5a03f075878b4064ab2f7d8cce157b08":{"model_name":"FloatProgressModel","model_module":"@jupyter-widgets/controls","model_module_version":"2.0.0","state":{"value":9,"max":9,"bar_style":"success","style":"IPY_MODEL_972cdd559ebf48189e9d445fe3122366","layout":"IPY_MODEL_36fcfa9fac014b779b6dbeb09ab35479"}},"972cdd559ebf48189e9d445fe3122366":{"model_name":"ProgressStyleModel","model_module":"@jupyter-widgets/controls","model_module_version":"2.0.0","state":{"description_width":""}},"ec44fa797cc54cf99c42dc4ba813aa50":{"model_name":"HTMLStyleModel","model_module":"@jupyter-widgets/controls","model_module_version":"2.0.0","state":{"description_width":"","font_size":null,"text_color":null}},"427479fe41cf407f8d0122dca3bc36df":{"model_name":"LayoutModel","model_module":"@jupyter-widgets/base","model_module_version":"2.0.0","state":{}},"76c4c8dd7d9847229100d098d6e5388e":{"model_name":"HTMLModel","model_module":"@jupyter-widgets/controls","model_module_version":"2.0.0","state":{"value":" 9/9 [00:00<00:00, 9.05it/s]","layout":"IPY_MODEL_109021a0d5e9460ebf1b762d0b925f30","style":"IPY_MODEL_ec44fa797cc54cf99c42dc4ba813aa50"}},"18bf4a1c2f914d728bf99d59e54e7946":{"model_name":"LayoutModel","model_module":"@jupyter-widgets/base","model_module_version":"2.0.0","state":{}},"8d87a517fc5e474a9f6a03e1b20247b8":{"model_name":"HBoxModel","model_module":"@jupyter-widgets/controls","model_module_version":"2.0.0","state":{"children":["IPY_MODEL_1e5e5a7e899d4ee6ac242857469e47e0","IPY_MODEL_5a03f075878b4064ab2f7d8cce157b08","IPY_MODEL_76c4c8dd7d9847229100d098d6e5388e"],"layout":"IPY_MODEL_18bf4a1c2f914d728bf99d59e54e7946"}},"1e5e5a7e899d4ee6ac242857469e47e0":{"model_name":"HTMLModel","model_module":"@jupyter-widgets/controls","model_module_version":"2.0.0","state":{"value":"Downloading artifacts: 100%","layout":"IPY_MODEL_427479fe41cf407f8d0122dca3bc36df","style":"IPY_MODEL_6b62b69da7c34c34bc0b2134c369f2c2"}},"36fcfa9fac014b779b6dbeb09ab35479":{"model_name":"LayoutModel","model_module":"@jupyter-widgets/base","model_module_version":"2.0.0","state":{}},"6b62b69da7c34c34bc0b2134c369f2c2":{"model_name":"HTMLStyleModel","model_module":"@jupyter-widgets/controls","model_module_version":"2.0.0","state":{"description_width":"","font_size":null,"text_color":null}},"109021a0d5e9460ebf1b762d0b925f30":{"model_name":"LayoutModel","model_module":"@jupyter-widgets/base","model_module_version":"2.0.0","state":{}}}}},"nteract":{"version":"nteract-front-end@1.0.0"},"spark_compute":{"compute_id":"/trident/default","session_options":{"conf":{"spark.synapse.nbs.session.timeout":"1200000"}}},"dependencies":{"lakehouse":{"default_lakehouse":"1e009111-e0de-44ad-adaf-9a5240002190","default_lakehouse_name":"SuperstoreForecast","default_lakehouse_workspace_id":"3f4eeb28-7210-44e7-bd10-efcda197a9f7"}}},"nbformat":4,"nbformat_minor":5} \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/fabric/orders_sales_forecast.ipynb b/azure_jumpstart_ag/artifacts/fabric/orders_sales_forecast.ipynb new file mode 100644 index 0000000000..cb0163e5c0 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/fabric/orders_sales_forecast.ipynb @@ -0,0 +1 @@ +{"cells":[{"cell_type":"markdown","source":["\n","#### Run the cell below to install the required packages for Copilot\n"],"metadata":{"jupyter":{"magics_cell_name":"magics-cell-markdown","magics_signature":"27ac753c3c60167f65c4d05fa7809cd85f1f0273d5b842aca4f65a01"},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"7a59fda1-4e93-45fb-8d19-7db1a882cc5e"},{"cell_type":"code","source":["# Run this cell to install the required packages for Copilot\n","%load_ext dscopilot_installer\n","%activate_dscopilot"],"outputs":[],"execution_count":null,"metadata":{"jupyter":{"magics_cell_name":"magics-cell-code","magics_signature":"6565d62221c469ab3707694ccbef2e4568d575dc1ba3ebac23f0f052","magics_version":"1.0"},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"201b7702-02d9-4d89-abc7-0cdbf6277f24"},{"cell_type":"markdown","source":["# Contoso Hypermarket Orders sales forecast ML notebook"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"ef02f63e-941b-42c0-8481-ce8aac727fa8"},{"cell_type":"markdown","source":["## Case 1: Forecast sales across products for a particular store location."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"75fcef09-e93e-421d-a93a-84aa5fac24ef"},{"cell_type":"markdown","source":["#### Set up MLflow experiment tracking"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"b1418874-4b23-4dae-8748-07e756bf70f4"},{"cell_type":"code","source":["# Set up MLflow for experiment tracking\n","import mlflow\n","\n","IS_SAMPLE = False # if TRUE, use only rows of data for training, otherwise use all data\n","SAMPLE_ROWS = 5000 # if IS_SAMPLE is True, use only this number of rows for training\n","EXPERIMENT_NAME = \"orders-sales-forecast\" # MLflow experiment name\n","\n","mlflow.set_experiment(EXPERIMENT_NAME)\n","mlflow.autolog(disable=True) # Disable MLflow autologging"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":3,"statement_ids":[3],"state":"finished","livy_statement_state":"available","session_id":"3945a8d4-06c7-4a20-bac5-81538ccc6266","normalized_state":"finished","queued_time":"2024-11-04T20:08:34.5715751Z","session_start_time":null,"execution_start_time":"2024-11-04T20:08:35.2969409Z","execution_finish_time":"2024-11-04T20:08:39.4325786Z","parent_msg_id":"e0263fb0-aea8-4e02-896f-df63ace091c0"},"text/plain":"StatementMeta(, 3945a8d4-06c7-4a20-bac5-81538ccc6266, 3, Finished, Available, Finished)"},"metadata":{}}],"execution_count":2,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"edac2e41-e4ec-4a84-adad-d57938e17562"},{"cell_type":"markdown","source":["### Step 1: Ingest data\n","#### Load orders data from KQL database to prepare for ML modeling\n","\n","> [!IMPORTANT]\n","> Make sure you have enough data generated using data emulator."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"9fa68416-1c4d-4481-8ec2-c2571310afbf"},{"cell_type":"code","source":["# Read from Kusto\n","# kustoQuery = \"['orders'] | mv-expand li = parse_json(line_items) | project order_date, store_id, order_id, product_id = toint(li.product_id), quantity = toint(li.quantity), price = toreal(li.price), item_total = toreal(li.item_total), order_total\"\n","ordersQuery = \"['orders'] | mv-expand li = parse_json(line_items) | project order_date, store_id, order_id, product_id = toint(li.product_id), quantity = toint(li.quantity), price = toreal(li.price), item_total = toreal(li.item_total), order_total\"\n","inventoryQuery = \"['inventory'] | project date_time, store_id, product_id, in_stock, retail_price\"\n","productsQuery = \"['products'] | project product_id, name, category, photo_path, price_range, stock\"\n","# The query URI for reading the data e.g. https://<>.kusto.data.microsoft.com.\n","kustoUri = \"{{KQL_CLUSTER_URI}}\"\n","# The database with data to be read.\n","database = \"{{KQL_DATABASE_NAME}}\"\n","# The access credentials.\n","accessToken = mssparkutils.credentials.getToken(kustoUri)\n","ordersDf = spark.read\\\n"," .format(\"com.microsoft.kusto.spark.synapse.datasource\")\\\n"," .option(\"accessToken\", accessToken)\\\n"," .option(\"kustoCluster\", kustoUri)\\\n"," .option(\"kustoDatabase\", database)\\\n"," .option(\"kustoQuery\", ordersQuery).load()\n","inventoryDf = spark.read\\\n"," .format(\"com.microsoft.kusto.spark.synapse.datasource\")\\\n"," .option(\"accessToken\", accessToken)\\\n"," .option(\"kustoCluster\", kustoUri)\\\n"," .option(\"kustoDatabase\", database)\\\n"," .option(\"kustoQuery\", inventoryQuery).load()\n","productsDf = spark.read\\\n"," .format(\"com.microsoft.kusto.spark.synapse.datasource\")\\\n"," .option(\"accessToken\", accessToken)\\\n"," .option(\"kustoCluster\", kustoUri)\\\n"," .option(\"kustoDatabase\", database)\\\n"," .option(\"kustoQuery\", productsQuery).load()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":5,"statement_ids":[5],"state":"finished","livy_statement_state":"available","session_id":"1aeb6edd-3450-4a72-a646-81cab3450974","normalized_state":"finished","queued_time":"2024-11-04T15:57:52.7175715Z","session_start_time":null,"execution_start_time":"2024-11-04T15:57:53.1854873Z","execution_finish_time":"2024-11-04T15:58:02.3738514Z","parent_msg_id":"01b395a9-39ce-49ef-bd5b-1d25ca30965d"},"text/plain":"StatementMeta(, 1aeb6edd-3450-4a72-a646-81cab3450974, 5, Finished, Available, Finished)"},"metadata":{}}],"execution_count":2,"metadata":{"microsoft":{"language":"python","language_group":"synapse_pyspark"},"jupyter":{"source_hidden":false}},"id":"941a85a3-eaf6-4f2d-b862-2822a11cba86"},{"cell_type":"markdown","source":["#### Verifying token availability"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"e877707b-df48-40ca-9f95-27615082c0de"},{"cell_type":"code","source":["import requests\n","\n","# Define a simple test query\n","test_query = \"['inventory'] | take 1\"\n","\n","# Define the request headers with the access token\n","headers = {\n"," \"Authorization\": f\"Bearer {accessToken}\",\n"," \"Content-Type\": \"application/json\"\n","}\n","\n","# Define the request payload\n","payload = {\n"," \"db\": database,\n"," \"csl\": test_query\n","}\n","\n","# Make the request to the Kusto cluster\n","response = requests.post(f\"{kustoUri}/v1/rest/query\", headers=headers, json=payload)\n","\n","# Check if the request was successful\n","if response.status_code == 200:\n"," print(\"Access token is valid and has the necessary permissions.\")\n","else:\n"," print(f\"Failed to validate access token. Status code: {response.status_code}, Response: {response.text}\")"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":6,"statement_ids":[6],"state":"finished","livy_statement_state":"available","session_id":"1aeb6edd-3450-4a72-a646-81cab3450974","normalized_state":"finished","queued_time":"2024-11-04T15:58:09.2861621Z","session_start_time":null,"execution_start_time":"2024-11-04T15:58:09.6630073Z","execution_finish_time":"2024-11-04T15:58:10.7161928Z","parent_msg_id":"00ba4704-6677-43f0-81df-205cd8d56524"},"text/plain":"StatementMeta(, 1aeb6edd-3450-4a72-a646-81cab3450974, 6, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Access token is valid and has the necessary permissions.\n"]}],"execution_count":3,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"dca0ec6b-628f-4e91-9c60-5d7b1e78e0ed"},{"cell_type":"markdown","source":["### Step 2: Perform Exploratory Data Analysis"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"d3363923-eb3e-4c3a-928e-3f304fc85fd0"},{"cell_type":"markdown","source":["#### Import libraries\n","\n","Before any analysis, you need to import the required libraries."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"0b764c51-1738-49a5-a8cf-e340518e9d8a"},{"cell_type":"code","source":["# Importing required libraries\n","import warnings\n","import itertools\n","import numpy as np\n","import matplotlib.pyplot as plt\n","warnings.filterwarnings(\"ignore\")\n","plt.style.use('fivethirtyeight')\n","import pandas as pd\n","import statsmodels.api as sm\n","import matplotlib\n","matplotlib.rcParams['axes.labelsize'] = 14\n","matplotlib.rcParams['xtick.labelsize'] = 12\n","matplotlib.rcParams['ytick.labelsize'] = 12\n","matplotlib.rcParams['text.color'] = 'k'\n","from sklearn.metrics import mean_squared_error,mean_absolute_percentage_error"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":7,"statement_ids":[7],"state":"finished","livy_statement_state":"available","session_id":"1aeb6edd-3450-4a72-a646-81cab3450974","normalized_state":"finished","queued_time":"2024-11-04T15:59:02.4045828Z","session_start_time":null,"execution_start_time":"2024-11-04T15:59:02.8317392Z","execution_finish_time":"2024-11-04T15:59:10.0846956Z","parent_msg_id":"2207d7d8-0dfb-47d7-a8c8-f514e39ba2d2"},"text/plain":"StatementMeta(, 1aeb6edd-3450-4a72-a646-81cab3450974, 7, Finished, Available, Finished)"},"metadata":{}}],"execution_count":4,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"eece5426-68f6-4a0b-a478-2d4381322ac3"},{"cell_type":"markdown","source":["#### Display raw data"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"e48037a1-e1cb-4d33-9aa5-57faea8be1a2"},{"cell_type":"code","source":["# Display data in dataframes.\n","ordersDf.show()\n","productsDf.show()\n","inventoryDf.show()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":8,"statement_ids":[8],"state":"finished","livy_statement_state":"available","session_id":"1aeb6edd-3450-4a72-a646-81cab3450974","normalized_state":"finished","queued_time":"2024-11-04T15:59:16.8616111Z","session_start_time":null,"execution_start_time":"2024-11-04T15:59:17.2765554Z","execution_finish_time":"2024-11-04T15:59:58.8909583Z","parent_msg_id":"7c7b2b1b-596d-4377-bbd3-25919e0d1097"},"text/plain":"StatementMeta(, 1aeb6edd-3450-4a72-a646-81cab3450974, 8, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["+--------------------+--------+------------------+----------+--------+-----+------------------+------------------+\n| order_date|store_id| order_id|product_id|quantity|price| item_total| order_total|\n+--------------------+--------+------------------+----------+--------+-----+------------------+------------------+\n|2024-09-26 13:25:...| NYC|20240926132502-003| 12| 8| 3.0| 24.0| 60.95|\n|2024-09-26 13:25:...| NYC|20240926132502-003| 4| 10| 3.0| 30.0| 60.95|\n|2024-09-26 13:25:...| NYC|20240926132502-003| 9| 10| 0.2| 2.0| 60.95|\n|2024-09-26 13:25:...| NYC|20240926132502-003| 2| 3| 0.15| 0.45| 60.95|\n|2024-09-26 13:25:...| NYC|20240926132502-003| 8| 8| 0.5| 4.0| 60.95|\n|2024-09-26 13:25:...| NYC|20240926132502-003| 7| 2| 0.25| 0.5| 60.95|\n|2024-09-26 13:25:...| SEA|20240926132502-004| 9| 9| 0.2| 1.8| 32.2|\n|2024-09-26 13:25:...| SEA|20240926132502-004| 10| 3| 0.3|0.8999999999999999| 32.2|\n|2024-09-26 13:25:...| SEA|20240926132502-004| 12| 2| 3.0| 6.0| 32.2|\n|2024-09-26 13:25:...| SEA|20240926132502-004| 8| 7| 0.5| 3.5| 32.2|\n|2024-09-26 13:25:...| SEA|20240926132502-004| 5| 8| 2.5| 20.0| 32.2|\n|2024-09-26 13:25:...| SEA|20240926132502-005| 9| 9| 0.2| 1.8|51.099999999999994|\n|2024-09-26 13:25:...| SEA|20240926132502-005| 3| 8| 0.7| 5.6|51.099999999999994|\n|2024-09-26 13:25:...| SEA|20240926132502-005| 11| 4| 2.0| 8.0|51.099999999999994|\n|2024-09-26 13:25:...| SEA|20240926132502-005| 5| 9| 2.5| 22.5|51.099999999999994|\n|2024-09-26 13:25:...| SEA|20240926132502-005| 4| 2| 3.0| 6.0|51.099999999999994|\n|2024-09-26 13:25:...| SEA|20240926132502-005| 2| 6| 0.15|0.8999999999999999|51.099999999999994|\n|2024-09-26 13:25:...| SEA|20240926132502-005| 8| 9| 0.5| 4.5|51.099999999999994|\n|2024-09-26 13:25:...| SEA|20240926132502-005| 10| 6| 0.3|1.7999999999999998|51.099999999999994|\n|2024-09-26 13:25:...| CHI|20240926132502-006| 11| 5| 2.0| 10.0| 65.0|\n+--------------------+--------+------------------+----------+--------+-----+------------------+------------------+\nonly showing top 20 rows\n\n+----------+------------+----------+--------------------+--------------------+-----+\n|product_id| name| category| photo_path| price_range|stock|\n+----------+------------+----------+--------------------+--------------------+-----+\n| 1| Red Apple| Fruits|static/img/produc...|{\"min\":0.2,\"max\":...| 8000|\n| 2| Banana| Fruits|static/img/produc...|{\"min\":0.15,\"max\"...|10000|\n| 3| Avocado|Vegetables|static/img/produc...|{\"min\":0.7,\"max\":...| 5000|\n| 4| Bread| Bread|static/img/produc...|{\"min\":3.0,\"max\":...| 2000|\n| 5| Milk| Dairy|static/img/produc...|{\"min\":2.5,\"max\":...| 1000|\n| 6|Orange Juice| Beverages|static/img/produc...|{\"min\":3.25,\"max\"...| 1000|\n| 7| Chips| Snacks|static/img/produc...|{\"min\":0.25,\"max\"...| 5000|\n| 8| Red Pepper|Vegetables|static/img/produc...|{\"min\":0.5,\"max\":...| 1000|\n| 9| Lettuce|Vegetables|static/img/produc...|{\"min\":0.2,\"max\":...|10000|\n| 10| Tomato|Vegetables|static/img/produc...|{\"min\":0.3,\"max\":...|10000|\n| 11| Strawberry| Fruit|static/img/produc...|{\"min\":2.0,\"max\":...|10000|\n| 12| Eggs| Eggs|static/img/produc...|{\"min\":3.0,\"max\":...|10000|\n+----------+------------+----------+--------------------+--------------------+-----+\n\n+--------------------+--------+----------+--------+------------+\n| date_time|store_id|product_id|in_stock|retail_price|\n+--------------------+--------+----------+--------+------------+\n|2024-09-29 07:29:...| DAL| 3| 1834| 1.86|\n|2024-09-29 07:29:...| DAL| 2| 6580| 0.23|\n|2024-09-29 07:29:...| DAL| 1| 6899| 0.38|\n|2024-09-29 07:29:...| DAL| 9| 6936| 0.36|\n|2024-09-29 07:29:...| DAL| 8| 68| 0.98|\n|2024-09-29 07:29:...| DAL| 10| 5998| 0.47|\n|2024-09-29 07:29:...| DAL| 11| 6498| 3.5|\n|2024-09-29 07:29:...| DAL| 7| 1927| 0.72|\n|2024-09-29 07:29:...| DAL| 12| 7081| 3.09|\n|2024-09-29 07:29:...| DAL| 5| 574| 3.94|\n|2024-09-29 07:29:...| NYC| 2| 6615| 0.28|\n|2024-09-29 07:29:...| NYC| 7| 1719| 0.68|\n|2024-09-29 07:29:...| NYC| 12| 7218| 4.1|\n|2024-09-29 07:29:...| NYC| 11| 7019| 2.38|\n|2024-09-29 07:29:...| NYC| 6| 637| 4.44|\n|2024-09-29 07:29:...| NYC| 4| 643| 3.16|\n|2024-09-29 07:29:...| NYC| 10| 7033| 0.36|\n|2024-09-29 07:29:...| NYC| 5| 757| 3.11|\n|2024-09-29 07:29:...| NYC| 1| 7410| 0.25|\n|2024-09-29 07:29:...| NYC| 9| 6904| 0.32|\n+--------------------+--------+----------+--------+------------+\nonly showing top 20 rows\n"]}],"execution_count":5,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"1f672306-d3c7-4f1a-89f7-0851e8a90082"},{"cell_type":"markdown","source":["##### Demonstrate the impact order date on the sales for all sales in Chicago.\n","1. Filters sales data for the Chicago store.\n","2. Computes total sales per order by multiplying price and quantity.\n","3. Groups and sums daily sales data, then resamples it to monthly totals.\n","4. Converts data to Pandas and ensures order_date is in datetime format.\n","5. Plots the monthly sales trend over time, showing the impact of order date on sales in Chicago."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"54f2e3b3-4c12-4a3c-a6b3-44b4ca0cd519"},{"cell_type":"code","source":["import pandas as pd\n","import matplotlib.pyplot as plt\n","\n","# Filtering Chicago data\n","sales_chicago_df = ordersDf.filter(ordersDf.store_id == 'CHI')\n","\n","# Creating a 'sales' column by multiplying price and quantity\n","sales_chicago_df = sales_chicago_df.withColumn('sales', sales_chicago_df['price'] * sales_chicago_df['quantity'])\n","\n","# Selecting relevant columns: order_date, sales\n","sales_chicago_df = sales_chicago_df.select('order_date', 'sales')\n","\n","# Converting the DataFrame to Pandas\n","sales_chicago_pd_df = sales_chicago_df.toPandas()\n","\n","# Confirming that 'order_date' is in datetime format\n","sales_chicago_pd_df['order_date'] = pd.to_datetime(sales_chicago_pd_df['order_date'])\n","\n","# Group by 'order_date' and sum the sales\n","sales_chicago_pd_df = sales_chicago_pd_df.groupby('order_date')['sales'].sum().reset_index()\n","\n","# Resample the data to get monthly sales\n","sales_chicago_pd_df.set_index('order_date', inplace=True)\n","sales_chicago_monthly = sales_chicago_pd_df['sales'].resample('MS').sum().reset_index()\n","\n","# Plot sales over time\n","plt.figure(figsize=(12, 6))\n","plt.plot(sales_chicago_monthly['order_date'], sales_chicago_monthly['sales'], marker='o')\n","\n","# Adding labels and title\n","plt.xlabel('Order Date')\n","plt.ylabel('Total Sales')\n","plt.title('Impact of Order Date on Sales in Chicago')\n","\n","plt.show()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":9,"statement_ids":[9],"state":"finished","livy_statement_state":"available","session_id":"1aeb6edd-3450-4a72-a646-81cab3450974","normalized_state":"finished","queued_time":"2024-11-04T16:00:45.5593816Z","session_start_time":null,"execution_start_time":"2024-11-04T16:00:45.9707825Z","execution_finish_time":"2024-11-04T16:00:55.1084841Z","parent_msg_id":"07537c0d-3bf2-49e4-a350-205625e0c308"},"text/plain":"StatementMeta(, 1aeb6edd-3450-4a72-a646-81cab3450974, 9, Finished, Available, Finished)"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"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iIio0jxQ52DFZRV+js3AY62wjNL2ViIMay5FiK8MHlJxOY+wZmNgiIiIiIiIiIgq3PV0LRZHqfDLdTWyhS0QgqutBT7ylWF4cykcWHK+TDAwREREREREREQV5mxSNhYqlNgVp4HAivNoZC/GOH97DGxiBxtLJpQuSwwMEREREREREVG5MhgMOBSfhYWXlDj6IFtwv1Z1rBAql6FXA1uIWXK+XDAwRERERERERETlQqc3YNvtTCxSqKBIEV5yvpOHBKFyGV51Z8n58sbAEBERERERERGVKbVOjw3X1FgapUKcSljJeQsR0LuBLcbLZXjOmSXnKwoDQ0RERERERERUJlKz9IiIUSE8JgOPNMIySkvEwLtN7DDW3x7etRimqGg840RERERERET0TO6pdFgercKaWDUydMJSSteyFmFECylG+cjgZseS85WFgSEiIiIiIiIiKpUraVosUqjw6w01BMaD4G5ngdG+MgxtLkUta5acr2wMDBERERERERFRiZxMzMJChQp772oE92la2xJj/WUY0NgOEjETSlcVDAwRERERERERUbH0BgP239NgkUKFE4nCS863cbHCeLk9grxsYMEKY1UOA0NEREREREREVCit3oAtNzOxWKFETJpOcL8u9SQIbWmPDm7WLDlfhTEwRERERERERET5ZOYAK2MzER6bhnsZwkrOi0VA30a2GCe3h9zJqpxHSGWBgSEiIiIiIiIiMkrW5GC5Qo2IK7ZI16kF9bEVizC4mR3G+MnQ0J6hhuqEs0VEREREREREuKPSYWmUCuuuqpGZYwBQ/OVfDtYijPSRYZSvFM42LDlfHTEwRERERERERGTGolK0WKxQYuutTOQILDlfXyrGaD8ZhjSzg8yKJeerMwaGiIiIiIiIiMyMwWDAP4nZWHhJiQP3swT3a+FgifFye/TztoWVBRNK1wQMDBERERERERGZCb3BgD13NFikUOJ0klZwv5dcrTFeLkOgJ0vO1zQMDBERERERERHVcNk5Bmy6ocaSKBWupgsvOd+tnhU+bVUbL7lJynF0VJkYGCIiIiIiIiKqoZRaPVbHZmD5ZRUS1HpBfSxFQHADCd5yTEOnFnVgY8OgUE3GwBARERERERFRDfMwMwfh0SpEXMlAerawjNJSSxGGNLPDaD8ZXCx1uHs3tZxHSVUBA0NERERERERENcStxzosiVJh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Tp48WSNjDRgwQP7+/jXSFwAAuHzc6noCAAAAl0NpaakSExO1fPly+fr6qm/fvoqMjNTp06f1+eef65lnntGbb76pNWvWKDIysq6nW6N69eqlG2+8UZKUn5+vjIwMff311/roo480e/ZszZ07V3fccUfdThIAANQJEkMAAMApzJgxQ8uXL9e1116rt99+W02bNrU/V1ZWphdffFEvvfSShg0bpq1bt6pRo0Z1ONuadcstt2jy5MkOj5WVlWnVqlV68skn9cADD6hRo0bq06dPHc0QAADUFW4lAwAAV7yDBw/qtddeU0BAgN59912HpJAkubq66umnn9Zf/vIX/fLLL1qwYIHD87GxsYqNjVVubq6eeOIJRUdHq0mTJlq1apW9zcqVK9WtWzeFhoYqOjpa06ZNO++taXl5eZo1a5ZuvPFGhYWFKSIiQnfeeae+/vrrSm0rbtMqKirSCy+8oGuuuUZBQUGaPXv2Rb8mrq6uuvfee/XKK6+orKxMzzzzjGw2m/35n3/+WdOmTdPNN9+sVq1aKTQ0VF26dNFzzz0ni8Xi0Je/v7927txp//8Vf+Lj4x3a7d27V/fff7/at2+v4OBgxcTE6PHHH1dOTs5FrwMAAFwarhgCAABXvNWrV6u8vFxjx45VSEjIOds9/vjjWrt2rVatWqVnnnnG4bni4mINGjRIFotFt956q9zd3e19vfTSS5o1a5ZCQkJ07733yt3dXR988IH2799f5TgnT57U7bffrtTUVHXr1k19+vTR6dOn9e9//1txcXFavny5Bg4cWOm4e+65R3v37lWfPn0UEBCgli1bXvyL8n9GjBih2bNnKzU1VSkpKYqOjpYkbdy4UW+99ZZ69uypHj16qLy8XLt379bcuXO1c+dO/fvf/5a7u7sk6cknn9Tq1auVnp6uJ5980t53bGys/f//+9//1n333SdXV1fddtttatasmfbv36+lS5fq888/12effcYeRQAA1AESQwAA4Iq3a9cuSWf22jmfdu3aKTw8XBkZGTpy5Iiuuuoq+3OZmZmKjo7Wxx9/LG9vb/vjv/zyi1566SU1bdpU27ZtU3BwsCRp6tSp+tOf/lTlOE888YRSU1O1cOFCjR492v748ePH1adPHyUkJKhv377y8vJyOO7YsWPauXOnAgICqvcCnIeLi4u6deum3377Td999509MTRixAg9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"},"metadata":{}}],"execution_count":6,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"82b2d558-6189-4236-86d0-dd1fcb70a487"},{"cell_type":"markdown","source":["### Step 3: Statistical Analysis\n","1. Simulates Sales Data: Generates 36 months of random sales data to simulate monthly sales values.\n","2. Decomposes Time Series: Uses seasonal_decompose from statsmodels to break down the sales data into trend, seasonality, and residual components.\n"," - Trend: Shows the long-term movement in sales, whether increasing, decreasing, or stable.\n"," - Seasonality: Reveals recurring patterns or cycles within specific time intervals (like monthly or yearly).\n"," - Residual (Noise): Represents random fluctuations in the data that cannot be explained by trend or seasonality.\n","3. Organizes Data for Plotting: Prepares labels and corresponding data for the time series components.\n","4. Plots Components: Creates subplots to visualize seasonality, trend, residuals, and observed sales data, making it easier to analyze patterns in the simulated data."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"2012132c-890d-4803-b1ab-aac47bccb7f8"},{"cell_type":"code","source":["import statsmodels.api as sm"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":11,"statement_ids":[11],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:11:09.3863545Z","session_start_time":null,"execution_start_time":"2024-11-02T23:11:09.9853625Z","execution_finish_time":"2024-11-02T23:11:10.3651072Z","parent_msg_id":"3eafa0af-e142-40f7-8fc5-00a8404b59a4"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 11, Finished, Available, Finished)"},"metadata":{}}],"execution_count":9,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"e1188c21-b4d9-4b45-91ee-8fe49ba78162"},{"cell_type":"code","source":["import pandas as pd\n","import numpy as np\n","\n","# Simulate additional monthly sales data for testing\n","dates = pd.date_range(start='2023-01-01', periods=36, freq='MS') # Extended to 36 months for more data\n","np.random.seed(42) # For reproducibility\n","sales = np.random.rand(36) * 100 # Random sales data\n","\n","# Create a DataFrame with the simulated data\n","simulated_sales_df = pd.DataFrame({'order_date': dates, 'sales': sales})\n","\n","# Decompose the time series into its components using statsmodels\n","import statsmodels.api as sm\n","result = sm.tsa.seasonal_decompose(simulated_sales_df['sales'], model='additive', period=12)\n","\n","# Labels and corresponding data for plotting\n","components = [('Seasonality', result.seasonal),\n"," ('Trend', result.trend),\n"," ('Residual', result.resid),\n"," ('Observed Data', simulated_sales_df['sales'])]\n","\n","# Create subplots in a grid\n","import matplotlib.pyplot as plt\n","fig, axes = plt.subplots(nrows=4, ncols=1, figsize=(12, 7))\n","plt.subplots_adjust(hspace=0.8) # Adjust vertical space\n","axes = axes.ravel()\n","\n","# Plot the components\n","for ax, (label, data) in zip(axes, components):\n"," ax.plot(data, label=label, color='blue' if label != 'Observed Data' else 'purple')\n"," ax.set_xlabel('Time')\n"," ax.set_ylabel(label)\n"," ax.set_xlabel('Time', fontsize=10)\n"," ax.set_ylabel(label, fontsize=10)\n"," ax.legend(fontsize=10)\n","\n","plt.show()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":12,"statement_ids":[12],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:11:16.0894261Z","session_start_time":null,"execution_start_time":"2024-11-02T23:11:16.6780856Z","execution_finish_time":"2024-11-02T23:11:17.8287048Z","parent_msg_id":"87050ac5-3ebb-4738-ba9a-e82d9101e432"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 12, Finished, Available, Finished)"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"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CAwMxOPHj7Fr1y7s3LkTI0eOxIwZMwDYf8xhQJOBTz/9FDt37sTt27eRmJgIf39/vPHGGwgPD0e1atWc3Twil1CpUiVER0dLPnfhwgWULFkSAHD+/HlMmzYNZ8+ehUKhQN26dTFr1iyEhITkZHOJXEZGfSd//vwYPnw4Ll68iJiYGBiNRpQoUQKtW7dGeHg4a2lQntKqVSucPn3a6vNxcXGpf+Z4Q/ScLX0nLi6O4w3RCzZv3owtW7bg+vXrePr0KdRqNcLCwtCrVy907tw5zWvtOeYwoCEiIiIiIiIicjLWoCEiIiIiIiIicjIGNERERERERERETsaAhoiIiIiIiIjIyRjQEBERERERERE5GQMaIiIiIiIiIiInY0BDRERERERERORkDGiIiIiIiIiIiJyMAQ0RERERERERkZMxoCEiIiJ6SUREBOrUqePsZhAREVEeIsTFxYnObgQRERFRTvHz80v3+a5du2LevHnQ6/UICAjImUYRERFRnqdwdgOIiIiIctK1a9dS/7xz505ERETg7NmzqY95eXnBx8fHGU0jIiKiPIxLnIiIiChPKVSoUOqXr6+vxWP58+e3WOI0ZMgQdOvWDQsWLECZMmUQFBSEyMhIGAwGTJkyBcHBwQgNDcWmTZvS/Kz79++jb9++KFmyJEJCQtC1a1fcvn07R39fIiIicg8MaIiIiIhscPLkSTx48AD79u3D7NmzERkZic6dO8PPzw9HjhxB3759ER4ejrt37wIANBoN2rRpA7VajX379mH//v3w8fFBx44dodfrnfzbEBERkathQENERERkAz8/P8yZMwdlypRBz549UaZMGWg0GowdOxalS5dGeHg4lEolfv75ZwDAjh07IJPJsHjxYlSsWBHlypXD0qVLcffuXZw6dcrJvw0RERG5GtagISIiIrJBhQoVIJM9v7cVGBiI0NDQ1L/L5XL4+/sjJiYGAHDhwgXcvHkTxYsXT/N9dDodbt26lTONJiIiIrfBgIaIiIjIBgpF2tMmQRAkHzOZTAAAk8mEqlWrYvXq1Rbfq0CBAo5rKBEREbklBjREREREDlClShXs3LkTBQsWTC1GTERERGQNa9AQEREROcC7776LAgUKoFu3bvjxxx8RFRWFU6dOYcKECbh3756zm0dEREQuhgENERERkQOoVCrs27cPxYsXR8+ePfH6669j+PDh0Ol0yJcvn7ObR0RERC5GiIuLE53dCCIiIiIiIiKivIwzaIiIiIiIiIiInIwBDRERERERERGRkzGgISIiIiIiIiJyMgY0REREREREREROxoCGiIiIiIiIiMjJGNAQERERERERETkZAxoiIiIiIiIiIidjQENERERERERE5GQMaIiIiIiIiIiInIwBDRERERERERGRkzGgISIiIiIiIiJyMgY0REREREREREROxoCGiIiIiIiIiMjJGNAQERERERERETkZAxoiIiIiIiIiIidjQENERERERERE5GQMaIiIiIiIiIiInIwBDRERERERERGRkzGgISIiIiIiIiJyMgY0REREREREREROxoCGiIiIiIiIiMjJGNAQERERERERETkZAxoiIiIiIiIiIidjQENERERERERE5GQMaIiIiIiIiIiInIwBDRERERERERGRkzGgISIiIiIiIiJyMgY0REREREREREROxoCGiIiIiIiIiMjJGNAQERERERERETkZAxoiIiIiIiIiIidjQENERERERERE5GQMaIiIiIiIiIiInIwBDRERERERERGRkzGgISIiIiIiIiJyMgY0maDT6XDz5k3odDpnN4XIbbDfEGUN+w5R5rHfENlu4UIlSpfOl+aralUfnDold3bTiFyeo8YbhV2/Wx5gNBqd3QQit8N+Q5Q17DvZFx8P/POPDF5eIry9kfpfBc+Aci32G6KM/fqrHDNnesFoFNI8/vgx0K6dGvPn69C3r95JrSNyD44Yb3h6QkR5WlwcsGCBF65ckSEszIQePfQoU8bk7GYRUTbpdEB4uDe2bvWAKAoWz3t4mIMab28RXl4p/7V8TOrv5telDXzS+7uXFyBYNoGIyCk0GmDQIG+LcCaF0ShgzBhv3Lghw4wZOsg5oYYoxzCgIaI869kzoEULH1y9aj7zOHIE+OwzTzRokIz+/fVo0cLAu+xEbkgUgVGjvPHVV0qrr0lOFpCcDDx7ljPJSUYBUIECIlq0SEa7doYcaQ8R5V0ffeSFGzcyTl2WLvXEzZsyrF6tgY9PDjSMiNwzoDlx4gS2bduGX375Bffu3UP+/PlRtWpVTJgwAVWrVk193ZAhQ7B161aL/79MmTI4e/ZsDraYiFyNKAIjRqhSw5kXHT/ugePHPVC8uAl9++rRq5cegYGiE1pJRFnx+efKdMMZZ9BqBWi1Ap48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cXFxqX/meEP0nC19Jy4ujuMN0Qs2b96MLVu24Pr163j69CnUajXCwsLQq1cvdO7cOc1r7TnmMKAhIiIiIiIiInIy1qAhIiIiIiIiInIyBjRERERERERERE7GgIaIiIiIiIiIyMkY0BARERERERERORkDGiIiIiIiIiIiJ2NAQ0RERERERETkZAxoiIiIiIiIiIicjAENERER0UsiIiJQp04dZzeDiIiI8hAhLi5OdHYjiIiIiHKKn59fus937doV8+bNg16vR0BAQM40ioiIiPI8hbMbQERERJSTrl27lvrnnTt3IiIiAmfPnk19zMvLCz4+Ps5oGhEREeVhXOJEREREeUqhQoVSv3x9fS0ey58/v8USpyFDhqBbt25YsGABypQpg6CgIERGRsJgMGDKlCkIDg5GaGgoNm3alOZn3b9/H3379kXJkiUREhKCrl274vbt2zn6+xIREZF7YEBDREREZIOTJ0/iwYMH2LdvH2bPno3IyEh07twZfn5+OHLkCPr27Yvw8HDcvXsXAKDRaNCmTRuo1Wrs27cP+/fvh4+PDzp27Ai9Xu/k34aIiIhcDQMaIiIiIhv4+flhzpw5KFOmDHr27IkyZcpAo9Fg7NixKF26NMLDw6FUKvHzzz8DAHbs2AGZTIbFixejYsWKKFeuHJYuXYq7d+/i1KlTTv5tiIiIyNWwBg0RERGRDSpUqACZ7Pm9rcDAQISGhqb+XS6Xw9/fHzExMQCACxcu4ObNmyhevHia76PT6XDr1q2caTQRERG5DQY0RERERDZQKNKeNgmCIPmYyWQCAJhMJlStWhWrV6+2+F4FChRwXEOJiIjILTGgISIiInKAKlWqYOfOnShYsGBqMWIiIiIia1iDhoiIiMgB3n33XRQoUADdunXDjz/+iKioKJw6dQoTJkzAvXv3nN08IiIicjEMaIiIiIgcQKVSYd++fShevDh69uyJ119/HcOHD4dOp0O+fPmc3TwiIiJyMUJcXJzo7EYQEREREREREeVlnEFDRERERERERORkDGiIiIiIiIiIiJyMAQ0RERERERERkZMxoCEiIiIiIiIicjIGNERERERERERETsaAhoiIiIiIiIjIyRjQEBERERERERE5GQMaIiIiIiIiIiInY0BDRERERERERORkDGiIiIiIiIiIiJyMAQ0RERERERERkZMxoCEiIiIiIiIicjIGNERERERERERETsaAhoiIiIiIiIjIyRjQEBERERERERE5GQMaIiIiIiIiIiInY0BDRERERERERORkDGiIiIiIiIiIiJyMAQ0RERERERERkZMxoCEiIiIiIiIicjIGNERERERERERETsaAhoiIiIiIiIjIyRjQEBERERERERE5GQMaIiIiIiIiIiInY0BDRERERERERORkDGiIiIiIiIiIiJyMAQ0RERERERERkZMp7PFNrl69irt370Kv16d5vGXLlvb49kREREREREREuVq2ApqoqCh0794dV65cgSAIEEURACAIAgAgNjY2+y0kIiIiIiIiIsrlsrXEacKECShZsiT++usvqFQq/PTTT9i3bx9ee+017N27N9PfLz4+HlOnTkX79u1RunRp+Pn5ISIiQvK158+fR7t27VCsWDEEBQWhR48eiIqKknztypUrUbNmTbzyyiuoXLkyIiMjkZycnOn2ERERERERERE5QrYCmrNnz+KDDz5AwYIFIZPJIJPJUKtWLUyd+v/27jssiuvrA/h3l6X3Jop0pBeRYkdFxd67sdfYE41G/SVqjD2amMTYa4zdYOwNOyhKUUABAUEQRRHpve2+f/BKJDOLwC67C3s+z+OTOHd29qjD7OyZe89ZiaVLl9b5eJmZmTh06BBKSkrQv39/ofvFxcVh4MCBKC0txcGDB/HHH38gISEBffv2xYcPH6rtu2XLFixbtgwDBw6En58fpk+fjl9++QWLFy+uc3yEEEIIIYQQQgghDUGkJU4VFRXQ0NAAAOjp6eHt27ewsbGBmZkZXrx4UefjmZmZITk5GRwOBxkZGTh8+DDrfuvXr4eSkhJOnjwJLS0tAICbmxs8PDywbds2rF69GkBlwmfLli2YNGkSVq5cCQDw9vZGWVkZ1q5di9mzZ8Pe3r4+f3RCCCGEEEIIIYQQsRFpBo2joyOePXsGAPD09MTvv/+Ohw8fYtOmTbCwsKjz8TgcTlX9GmHKy8tx7do1DBo0qCo5A1Qmd7y9vastrbpx4waKi4sxbty4ascYN24cBAIBLl26VOcYCSGEEEIIIYQQQsRNpATN4sWLwefzAQDff/89UlJS0LdvX/j7+2Pjxo1iCfC/Xr58iaKiIjg5OTHGnJyckJiYiOLiYgBATEwMgMpE0qeaN28OfX39qnFCCCGEEEIIIYQQaRJpiVOPHj2q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"},"metadata":{}}],"execution_count":10,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"4c07f098-c85e-40bf-8e34-b3edcec1c9da"},{"cell_type":"markdown","source":["### Step 4: Model Training and Tracking"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"cedea140-767a-48da-b863-3b7366e198c9"},{"cell_type":"markdown","source":["#### Adding and massaging data.\n","1. Sets Up Date Range: Creates a 3-year monthly date range for generating sample data.\n","2. Simulates Seasonality: Adds a sinusoidal pattern to represent a recurring seasonal effect in sales.\n","3. Adds a Linear Trend: Creates an increasing sales trend over time by adding a linear component.\n","4. Introduces Noise: Adds random noise to make the data more realistic and less predictable.\n","5. Combines Components: Combines the seasonal, trend, and noise elements into a final sales dataset with a baseline value.\n","6. Scales Sales Data: Uses MinMaxScaler to scale the sales data (helpful for models like SARIMAX that require scaling).\n","7. Plots Simulated Data: Visualizes the simulated sales data over time, showing the trend and seasonality."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"f7230619-239d-4208-8b2c-80728b78497b"},{"cell_type":"code","source":["import numpy as np\n","import matplotlib.pyplot as plt\n","\n","# Let's create a sample 'simulated_sales_df' DataFrame with a trend and seasonality\n","date_range = pd.date_range(start=\"2022-01-01\", periods=36, freq='MS') # 3 years of monthly data\n","np.random.seed(42) # For reproducibility\n","\n","# Simulate a basic seasonal pattern with a sinusoidal component\n","seasonal_pattern = 10 * np.sin(2 * np.pi * np.arange(len(date_range)) / 12)\n","\n","# Add a linear trend component (e.g., increasing sales)\n","trend_component = np.arange(len(date_range)) * 5\n","\n","# Add some random noise to make the data more realistic\n","noise = np.random.normal(0, 5, len(date_range))\n","\n","# Combine these components to create the 'sales' data\n","sales_data = 50 + trend_component + seasonal_pattern + noise # Start with a base sales level\n","\n","# Create DataFrame to mimic 'simulated_sales_df'\n","simulated_sales_df = pd.DataFrame({\n"," 'order_date': date_range,\n"," 'sales': sales_data\n","})\n","\n","# Scale the sales data as done typically for SARIMAX\n","from sklearn.preprocessing import MinMaxScaler\n","scaler = MinMaxScaler()\n","simulated_sales_df['scaled_sales'] = scaler.fit_transform(simulated_sales_df[['sales']])\n","\n","# Plot the adjusted simulated data\n","plt.figure(figsize=(12, 6))\n","plt.plot(simulated_sales_df['order_date'], simulated_sales_df['sales'], label='Simulated Sales with Seasonality and Trend', marker='o')\n","plt.xlabel('Order Date')\n","plt.ylabel('Sales')\n","plt.title('Adjusted Simulated Sales Data')\n","plt.legend()\n","plt.show()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":13,"statement_ids":[13],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:11:25.6513032Z","session_start_time":null,"execution_start_time":"2024-11-02T23:11:26.1060884Z","execution_finish_time":"2024-11-02T23:11:27.1730469Z","parent_msg_id":"bbbda893-71b5-48f7-bc84-57edded8bc80"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 13, Finished, Available, Finished)"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"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ypXat2+f8vLyFB4erh49eujmm2+u0wk89RmXxJxolFoxJxqzbpJ3zIlS49asuvHU54fNuo5LYl40Sq2YF41ZN4l50RU1mzZtmtatW6dDhw6pqKhIzZs3V0pKiu69916dccYZdX4NjTEvEugAAAAAAAAYDHvoAAAAAAAAGAyBDgAAAAAAgMEQ6AAAAAAAABgMgQ4AAAAAAIDBEOgAAAAAAAAYDIEOAAAAAACAwRDoAAAAAAAAGAyBDgAAAAAAgMEQ6AAAAK8WERGhESNGNPYwAAAAXIpABwAAuNVnn32m66+/XsnJyYqNjVVSUpKGDRump59+WsXFxY09PJdatmyZIiIiKn5FRkaqdevW6tatm6655ho999xzys3Ndcm1RowYoYiICJc8FwAA8Hy+jT0AAADQNJSVlWnKlClavHixQkJCNGTIELVr107Hjx/Xp59+qvvvv1+LFi3SihUr1K5du8YerksNGDBA559/viSpoKBAGRkZ2rJliz744AOlpqbqiSee0KWXXtq4gwQAAIZCoAMAANxixowZWrx4sXr27KmXX35ZCQkJFW02m02zZ8/WnDlzdMUVV2j9+vUKCwtrxNG61sCBAzV58uRKj9lsNi1btkz33XefbrzxRoWFhWnw4MGNNEIAAGA03HIFAAAa3N69e/X0008rMjJSr776aqUwR5LMZrP+9a9/6corr9S+ffs0b968Su1du3ZV165dZbFYdO+99yo5OVnR0dFatmxZRZ+lS5eqT58+iouLU3JysqZPn17jLVx5eXmaOXOmzj//fMXHxysxMVF//etftWXLlip9y29nKikp0SOPPKIePXooJiZGqampp/yemM1mXXfddXrsscdks9l0//33y+FwVLT/8ssvmj59uvr376+2bdsqLi5OvXr10oMPPqj8/PxKzxUREaFNmzZV/L781y233FKp3w8//KAbbrhBHTp0UPPmzdWlSxfdc889ysnJOeXXAQAAGgcrdAAAQINbvny57Ha7JkyYoNjY2Gr73XPPPXr99de1bNky3X///ZXarFarRo0apfz8fA0bNkx+fn4VzzVnzhzNnDlTsbGxuu666+Tn56e33npLP//8s9Pr5Obmavjw4dq1a5f69OmjwYMH6/jx43r//fc1cuRILV68WH/5y1+qfN7f/vY3/fDDDxo8eLAiIyOVlJR06m/K78aMGaPU1FTt2rVLO3fuVHJysiRp9erVeumll5SSkqILLrhAdrtdX3/9tZ544glt2rRJ77//vvz8/CRJ9913n5YvX6709HTdd999Fc/dtWvXit+///77uv7662U2m3XJJZeoZcuW+vnnn7Vw4UJ9+umn+uSTT9iDBwAAAyHQAQAADW7r1q2STuwlU5OzzjpLLVq0UEZGhn799Ve1atWqoi0zM1PJyclas2aNgoKCKh7ft2+f5syZo4SEBG3YsEHNmzeXJE2dOlUXXnih0+vce++92rVrl+bPn69x48ZVPP7bb79p8ODBuvPOOzVkyBAFBgZW+rzDhw9r06ZNioyMrN8bUAMfHx/16dNHBw8e1LffflsR6IwZM0a33Xab/P39K/WfPXu2UlNT9fbbb+uqq66SJE2bNk2ff/650tPTNW3atCrXyMnJ0cSJExUTE6MPP/xQrVu3rmh74403dNNNN+mRRx7R//73P5e9LgAA0LC45QoAADS43377TZLUsmXLWvuW98nMzKzS9tBDD1UKcyTp9ddfV1lZmW699daKMEeSwsLCNGXKlCrPkZ2drbfeeksDBgyoFOZIUmxsrG6//XZlZWVp/fr1VT532rRpLg1zyrVo0UKSKt36lJCQUCXMkaSbb75ZkpyOrzqvvPKKjh8/runTp1cKcyTpiiuu0Nlnn6233nrrFEYOAAAaCyt0AACARynfR8ZkMlV6PDAwsGL1ysl++OEHSVLfvn2rtPXp06fKY99++61sNptKSkqc7oGzb98+SdKePXs0bNiwSm29evWq46uon5P3zjn5sZdfflnLly/Xrl27dPz4cdnt9or2I0eO1Pn5v/7664qP5a/vZCUlJcrOzlZ2draio6NP4RUAAAB3I9ABAAANLjY2Vrt379ahQ4d05pln1tg3IyOj4nNOFhMTUyXkkaTjx49XtDu77p/l5uZKkr744gt98cUX1Y6joKCgTs/nCuXhzMlhyr333quFCxeqVatWuuSSSxQfH1+xYmf27NkqKSmp8/OXv+aFCxfW2K+goIBABwAAgyDQAQAADe68887T559/rg0bNmjgwIHV9tu9e7cOHz6shISESvvnSFVX7JQrP948KytLiYmJldrKb/U6WbNmzSRJkyZN0sMPP1yfl1HtGE6H3W7X5s2bJUk9e/aUJB09elTPP/+8kpOTtXbtWgUHB1f0z8zM1OzZs+t1jfLXvHnzZnXu3NlFIwcAAI2JPXQAAECDu+aaa+Tj46MlS5YoKyur2n5z586VJI0dO7bOz92lSxdJqghFTubsCPKePXvKZDLpq6++qvM1GtKrr76q9PR0de7cWZ06dZIkpaWlyeFwaODAgZXCHMn5a5JOHIMuSTabrUrbOeecI0ke85oBAMDpI9ABAAAN7owzztDEiROVk5Ojq6++usr+L3a7XXPmzNGKFSvUtm1b3X777XV+7iuvvFJms1nPPPOMjh49WvH48ePHKwKik8XFxemyyy7T1q1b9dRTTzndv+brr79WYWFhPV5h/dlsNr300ku6++67ZTabNXPmzIoVQOUbF3/55ZeV9s05dOiQHnzwQafPV75Z86FDh6q0jR07Vs2aNdN///tf7dq1q0p7YWEhYQ8AAAbDLVcAAMAtHnroIR0/flwvv/yyevXqpYsvvlht27ZVXl6ePv30U+3du1ft27fX66+/XnEbVV20a9dO9957r1JTU9WvXz9deuml8vX11apVq5ScnKw9e/ZU+ZxHH31Ue/bs0fTp0/Xqq6+qd+/eCgsL06FDh7R9+3bt3btXP//8c5XVMadq/fr1Ki4uliQVFRUpIyNDmzdvVkZGhiIjI/Xss89WuhUtPj5eo0aN0qpVqzRw4EANGDBAv/32m9asWaP+/fsrLS2tyjX69++vlStXasKECbrooosUGBiozp07a+jQoYqJidHzzz+vCRMm6IILLtCQIUN05plnqqSkRAcPHtTmzZvVu3dvvfnmmy55vQAAoOGZLBZL1f+WAgAAaCDr16/X4sWLtXXrVmVlZSk4OFgdOnTQqFGjdOONN1Y5llySunbtKkn6/vvvq33epUuX6plnntG+ffvUvHlzXX755frXv/6lFi1aqF+/fnrvvfcq9S8qKtLChQv11ltvac+ePbLb7YqNjVWXLl00cuRIXXHFFfL1PfF/XyNGjNCmTZtksVjq9VqXLVum2267reLPJpNJISEhioqKUufOnTV48GBdddVVioiIqPK5+fn5mjVrllatWqXMzEy1atVKV199te688041b968ymsqKyvTf//7X7355ps6cuSIysrKdM0112jBggUVffbs2aOnnnpK69evV2ZmpoKDg5WQkKCUlBSNGTOmYg8fAADg+Qh0AAAAAAAADIY9dAAAAAAAAAyGQAcAAAAAAMBgCHQAAAAAAAAMhkAHAAAAAADAYAh0AAAAAAAADIZABwAAAAAAwGAIdAAAAAAAAAyGQAcAAAAAAMBgCHQAAAAAAAAMhkAHAAAAAADAYAh0AAAAAAAADIZABwAAAAAAwGD+Hw/R7tMxwwtIAAAAAElFTkSuQmCC"},"metadata":{}}],"execution_count":11,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"ae86a4b6-108c-4d7d-a157-58137af2824f"},{"cell_type":"markdown","source":["#### Scaling data."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"e57ae0b4-e6eb-4cbb-8559-4b0046f8fd8f"},{"cell_type":"code","source":["# Scaling the sales data only if it's not already scaled properly\n","scaler = MinMaxScaler()\n","scaled_sales = scaler.fit_transform(simulated_sales_df[['sales']])\n","\n","# Update simulated_sales_df with the scaled values for the model to train on\n","simulated_sales_df['scaled_sales'] = scaled_sales"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":14,"statement_ids":[14],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:11:30.4199926Z","session_start_time":null,"execution_start_time":"2024-11-02T23:11:30.8233941Z","execution_finish_time":"2024-11-02T23:11:31.2042125Z","parent_msg_id":"f54f687a-17c0-4be0-9072-09e270f149d1"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 14, Finished, Available, Finished)"},"metadata":{}}],"execution_count":12,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"40cd93f5-b144-47f7-ba31-3ff1f692d192"},{"cell_type":"markdown","source":["#### Model training.\n","1. Define Hyperparameter Ranges: Sets ranges for SARIMAX model parameters (p, d, q) and creates combinations for both non-seasonal (pdq) and seasonal parameters (seasonal_pdq with a 12-month seasonality).\n","2. Initialize Best Model Tracking: Sets placeholders for the best AIC (model performance metric), and corresponding parameters.\n","3. Iterate Through Parameter Combinations: Tests each combination of (pdq) and (seasonal_pdq) by fitting a SARIMAX model to the scaled_sales data.\n","4. Track Best Model: If a model's AIC score is lower than the current best, updates best_aic, best_param, and best_param_seasonal to store the optimal parameters.\n","5. Print Best Parameters: Outputs the optimal (pdq) and (seasonal_pdq) parameters along with the lowest AIC score.\n","6. Fit Final Model: Fits a SARIMAX model using the best parameters found for scaled_sales."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"d6fc8522-d375-4623-9933-70528a62dd19"},{"cell_type":"code","source":["# Hyperparameter tuning for SARIMAX\n","p = d = q = range(0, 2)\n","pdq = list(itertools.product(p, d, q))\n","seasonal_pdq = [(x[0], x[1], x[2], 12) for x in pdq]\n","\n","best_aic = float(\"inf\")\n","best_param = None\n","best_param_seasonal = None\n","for param in pdq:\n"," for param_seasonal in seasonal_pdq:\n"," try:\n"," mod = sm.tsa.statespace.SARIMAX(simulated_sales_df['scaled_sales'],\n"," order=param,\n"," seasonal_order=param_seasonal,\n"," enforce_stationarity=False,\n"," enforce_invertibility=False)\n"," results = mod.fit(disp=False)\n"," if results.aic < best_aic:\n"," best_aic = results.aic\n"," best_param = param\n"," best_param_seasonal = param_seasonal\n"," except:\n"," continue\n","\n","print(f'Best ARIMA{best_param}x{best_param_seasonal}12 - AIC:{best_aic}')\n","\n","# Fit the best SARIMAX model on scaled data\n","mod = sm.tsa.statespace.SARIMAX(simulated_sales_df['scaled_sales'],\n"," order=best_param,\n"," seasonal_order=best_param_seasonal,\n"," enforce_stationarity=False,\n"," enforce_invertibility=False)\n","results = mod.fit(disp=False)"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":15,"statement_ids":[15],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:11:34.4235122Z","session_start_time":null,"execution_start_time":"2024-11-02T23:11:34.8689054Z","execution_finish_time":"2024-11-02T23:11:40.6091719Z","parent_msg_id":"e904a639-f4d2-4105-b337-b1fbc5c2d795"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 15, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stderr","text":["/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n"]},{"output_type":"stream","name":"stdout","text":["Best ARIMA(1, 0, 0)x(0, 0, 0, 12)12 - AIC:-109.61193341586926\n"]}],"execution_count":13,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"32dd0e0b-1ab0-4905-b378-f084c56ced09"},{"cell_type":"markdown","source":["#### Model diagonostics for SARIMAX model.\n","- Residuals Plot: Look for randomness around zero. Any patterns or trends indicate model inadequacy.\n","- Histogram and KDE Plot: Check for normal distribution centered around zero. Skewness or heavy tails suggest poor fit.\n","- Q-Q Plot: Points should lie along the 45-degree line. Deviations indicate non-normal residuals.\n","- Correlogram (ACF Plot): Significant autocorrelations suggest the model is not capturing temporal dependencies."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"e87f82b8-a4fc-4830-9759-408b7ea4c7a3"},{"cell_type":"code","source":["# Print model summary\n","print(results.summary())"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":16,"statement_ids":[16],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:11:44.7803494Z","session_start_time":null,"execution_start_time":"2024-11-02T23:11:45.2423172Z","execution_finish_time":"2024-11-02T23:11:45.6235055Z","parent_msg_id":"91c5bfe2-a049-4c57-b802-ebccc6e63d17"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 16, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":[" SARIMAX Results \n==============================================================================\nDep. Variable: scaled_sales No. Observations: 36\nModel: SARIMAX(1, 0, 0) Log Likelihood 56.806\nDate: Sat, 02 Nov 2024 AIC -109.612\nTime: 23:11:45 BIC -106.501\nSample: 0 HQIC -108.538\n - 36 \nCovariance Type: opg \n==============================================================================\n coef std err z P>|z| [0.025 0.975]\n------------------------------------------------------------------------------\nar.L1 1.0369 0.013 77.347 0.000 1.011 1.063\nsigma2 0.0023 0.001 2.333 0.020 0.000 0.004\n===================================================================================\nLjung-Box (L1) (Q): 1.08 Jarque-Bera (JB): 2.87\nProb(Q): 0.30 Prob(JB): 0.24\nHeteroskedasticity (H): 1.15 Skew: -0.13\nProb(H) (two-sided): 0.81 Kurtosis: 1.62\n===================================================================================\n\nWarnings:\n[1] Covariance matrix calculated using the outer product of gradients (complex-step).\n"]}],"execution_count":14,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"f78183d9-b20c-4955-b961-90ab290e03cc"},{"cell_type":"code","source":["# Plot diagnostics\n","results.plot_diagnostics(figsize=(15, 12))\n","plt.show()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":17,"statement_ids":[17],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:11:48.1730157Z","session_start_time":null,"execution_start_time":"2024-11-02T23:11:48.7278865Z","execution_finish_time":"2024-11-02T23:11:49.8751635Z","parent_msg_id":"4d7101d1-4424-46d0-bb74-a0012e7b1bdd"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 17, Finished, Available, Finished)"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"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nMpYFfB1fVDdlMd4IR+fv6goNek9qqxq2mdfIJDILaX4+HiPv7UruO3U02wblF1cXJz69eun119/XTabTREREZUdUrURHx8vyfNvodPT02UymVSrVq2KDqtaGzhwoKKioqjFVYJp06bp6aef1iOPPKLbbrutcDuv2fLhbXy94XXrn8aNG6tx48aSpL59+0qSHnvsMV1zzTW8doFqrGXLlpo5c6ZffQveI0782dv7Rt26dcs30CBwKmMllf7zq6o71fFCPr6/o6LUtPeosqppn32BQCK3lJKTk7V48WI5nc4idXZSUlIkSW3atKms0KqtE1fNRPlp1qyZIiIiCl+7J0pJSVHz5s0VHh5eCZFVb4ZhyGymPLk306ZN07Rp0zRx4kSNGzeuSBuv2VPna3x94XVbeh06dNDrr7+uXbt26eyzz+a1C1RTDRo00A033FAuxzrxfaM6fpk9lbEq6+dXVVaer62ajO/vqAg18T2qvFT3z75A4FtZKQ0YMEBZWVlatmxZke0LFixQYmKiOnXqVEmRVU8ZGRn6/PPP1b59e77klrOQkBBdcskl+uijj5SZmVm4fe/evaW6lQv+W7p0qXJycnif8OKpp57StGnTNH78eE2cOLFYO6/ZU1PS+HrD67Zs1q5dK7PZrKSkJF67APxy4vsG/lHWzy9A4vs7Ao/3qFPDZ1/pMSO3lPr06aNevXpp7NixyszMVLNmzbR48WKtXLlSc+bMkcViqewQq6xbb71Vp512ms4555zCxc5efPFFHTp0SC+//HJlh1flrFixQjk5OYVJg19++UVLly6VlP86joyM1AMPPKCLLrpIw4cP17333qvc3FxNnTpVderU0ZgxYyoz/KBW0tgeOXJEI0eO1JAhQ9S8eXOZTCZ98803mjVrltq0acPsCg9eeOEFTZkyRb1791a/fv20YcOGIu3nnnuuJPGaLSN/xnfPnj28bsvgnnvuUUxMjDp27Kh69erp6NGjWrp0qT744APdfffdhTMLeO0CKODv+wb8vz7AP/z5DlCT8P29bHgd+Yf3KP/x2Vd+TBkZGUZlB1HVZGVl6YknntCSJUuUnp6uli1bauzYsRo6dGhlh1alzZgxQx988IF2796t7Oxs1a5dW+eff77Gjh2rDh06VHZ4VU779u21d+9ej21bt25V06ZNJUlbtmzRo48+qg0bNigkJEQ9evTQk08+qWbNmlVkuFVKSWNbq1YtjRkzRj/++KMOHz4sl8ulxo0ba8CAARo7diy1MD3o37+/vvnmG6/tGRkZhf/mNVt6/oxvRkYGr9syeOedd/Tuu+9q586dOnbsmKKiotSuXTvdcMMNGj58eJG+vHYBSKV736jpSnN9gHz+fgeoSfj+Xnq8jvzDe5T/+OwrPyRyAQAAAAAAACDIUSMXAAAAAAAAAIIciVwAAAAAAAAACHIkcgEAAAAAAAAgyJHIBQAAAAAAAIAgRyIXAAAAAAAAAIIciVwAAAAAAAAACHIkcgEAAAAAAAAgyJHIBQAAAAAAAIAgRyIXAAAAAAAAAIIciVwAAAAAAAAACHIkcgEAAAAAAAAgyJHIBQAAAAAAAIAgRyIXAAAAAAAAAIIciVwAAAAAAAAACHIkcgEAAAAAAAAgyJHIBQAAAAAAAIAgRyIXAAAAAAAAAIIciVwAAAAAAAAACHIkcgEAAAAAAAAgyJHIBQAAAAAAAIAgRyIXAAAAAAAAAIIciVwAAAAAAAAACHIkcgEAAAAAAAAgyJHIBQAAAAAAAIAgRyIXAAAAAAAAAIIciVwAAAAAAAAACHIkcgEAAAAAAAAgyJHIBQAAAAAAAIAgRyIXAAAAAAAAAIIciVwAAAAAAAAACHIkcgEAAAAAAAAgyJHIBQAAAAAAAIAgRyIXAAAAAAAAAIIciVwAAAAAAAAACHIkcgEAAAAAAAAgyJHIBQAAAAAAAIAgRyIXAAAAAAAAAIIciVwAAAAAAAAACHIkcgEAAAAAAAAgyJHIBQAAAAAAAIAgRyIXAAAAAABUaaNHj1ZcXJzat29f2aEAQMCQyAUAFHr33XcVFxenuLg47d69u7LDAQAAwAkMw9CKFSs0fvx4devWTS1btlS9evXUtGlTde7cWbfddpvef/992Wy2yg4VABAAIZUdAAB4s3btWg0cOLDw50svvVQLFizwuc/UqVM1ffp0SdL333+vVq1aBTRGlGzPnj1atGiRVq5cqd27d+vIkSOKiopSgwYN1LVrVw0cOFAXXnhhjYkDAACgLL777jvdd999+vHHH4u1HTt2TMeOHdPOnTu1cOFC1a5dW+PGjdMdd9whs5n5WwBQXZDIBVBlfPrpp/rhhx/UsWPHyg4FfnA4HPr3v/+tWbNmKS8vr0ib3W5Xenq6tm/frrlz56pnz556/vnn1axZs2obBwAAQFm99957uvvuu2W32yVJ55xzjgYNGqSzzjpL8fHxysrK0p49e7Rq1Sp9+umnSk9P18MPP6zrrrtOcXFxlRs8AKDckMgFUKU8+eST+vDDDys7DJQgOztbN9xwg1atWiVJio2N1TXXXKNevXqpQYMGyszM1M8//6z58+frp59+0ldffaW+fftq0aJFOvvss6tdHAAAAGW1du1a3XnnnXK5XIqMjNTMmTN15ZVXeuz7r3/9S4cOHdK0adP0+uuvV3CkAIBAI5ELoEqoU6eOjh49qtWrV+ubb75Rt27dKjsk+HDvvfcWJk/PP/98vfHGG0pMTCzSp0ePHrr99ts1c+ZMTZ48WYcPH9bVV1+tb775RnXq1KlWcQAAAJSFzWbTyJEj5XK5ZDabtWDBAl1wwQU+96lfv76effZZXXDBBQoNDa2gSAEAFYFiOQCqhJEjRyoqKkpS/qxcBK9ly5Zp4cKFkqTWrVtr0aJFxZKnBcxms/7v//5PEydOlCQdPHhQ48ePr1ZxAAAAlNU777yjgwcPSpJuueWWEpO4Jxo8eHDh9fOJ/vrrLz388MPq2rWrmjRpogYNGujMM8/UqFGj9N133/k8Zvv27RUXF6fRo0dLkrZu3aoxY8borLPOUoMGDRQXF6eMjIxS9y2Qm5urOXPmaPDgwWrVqpXq1aunFi1aaMCAAZozZ06xMlll8csvv2jcuHHq1KmTGjVqpIYNG6pjx4669957tX37dr+O8emnn2ro0KFq0aKFEhMT1bFjRz3yyCNKTU31+NhPdPLiwna7XbNnz1bfvn3VokUL1a5du/CaVMovBfbpp5/qvvvuU69evdS0aVPVrVtXzZo108UXX6ypU6fq6NGjPuM9OZ4tW7Zo5MiRatu2rRo0aKBzzjlHDz74YLHjfPfddxoxYoTatWunhIQEnXXWWZo0aZIyMzP9GicA5Y9ELoAqoX79+ho5cqQkaf369friiy9O6Xg5OTl64YUXdMkll6h58+aqX7++zjjjDA0fPlyLFi2SYRhe9x09erTi4uLUvn17SVJqaqoef/xxdenSRU2aNFFcXJw+/vhjr30ffvhhdezYUYmJiWrTpo1uvPHGYheNu3fv1oQJE9SxY0c1aNBALVu21MiRI/Xnn3/6fFwpKSn6z3/+oyFDhig5OVn169dXo0aN1KFDB40aNUobNmw4lWHzy4wZMwr//dxzzykmJqbEfcaPH6/WrVtLkpYuXarff/+92sQBAABQVu+++64kyWQyeUwKltaiRYvUqVMnvfjii0pJSdHx48eVm5urPXv26L333lO/fv00YcIEud3uEo/15ptvqnfv3nrnnXe0e/du5ebmnlLfLVu2qFOnTpowYYLWrFmjQ4cOyeFw6OjRo/r66681YcIE9ejRo8TrYV9eeOEFde3aVXPnztVvv/2m7Oxs5eTk6Pfff9cbb7yh7t27F7mG9GT8+PG65pprtGrVKh09elQ2m02///67XnjhBfXs2VNbt271O5709HT16dNHEydO1Pfff6+jR48W+x5yzz336JprrtGrr76qzZs369ixY3I6nUpPT9cPP/yg6dOn69xzz9W3337r1znfe++9wlJi+/btU25urv7880+9/PLL6tevX2EyuuC70tKlS/XXX38pLy9Pu3fv1syZM9W/f39lZWX5/TgBlB9KKwCoMu655x69/vrrOn78uP7973/roosuKtNxtm3bpuHDh+uvv/4qsj01NVWff/65Pv/8c73++utasGBBiYtDbNy4UVdffbWOHDlS4nl/+uknXXnllYUXR1L+7XJLlizR8uXLtXjxYnXp0kVr1qzR9ddfr+PHjxf2y83N1aJFi7RixQr973//U3JycrHjr127VgMHDiy23W63648//tAff/yh9957T/fee68effTREuMti23btmnz5s2SpI4dO+r888/3a7+QkBCNHDlS48aNk9vt1rvvvqtJkyZV+TgAAADK6vjx4/rpp58kSaeffrqaN29+SsdbuXKlbrvtNhmGoYiICI0ePVq9e/dWWFiYNm/erOeee05//fWX5syZo/DwcD3++ONej7V582YtXLhQiYmJGjNmjDp27CjDMPT999/LarWWuu+OHTs0YMAAZWVlKSoqSjfffLPOPfdcNW7cWMePH9eqVav06quvaufOnRo6dKhWr16tWrVqlerxv/nmm3rkkUckSXFxcbrnnnsKy7WtX79ezz33nNLT0/XYY48pJiZGt956a7FjPP/883rttdckSQ0bNtS9996rDh06KC8vT1988YVeeukljRgxQjabza+Y7rzzTqWkpGjYsGEaMmSIGjRooAMHDsjlchX2cblcSkpK0oABA9SxY0eddtppCgkJ0Z49e7RmzRq98847SktL03XXXaf169erXr16Xs/3888/a/HixWrevLnGjBmjtm3bKjMzU++8844WLlyo3377TY888ogGDhyoRx55ROeee65uu+02tWzZUkePHtUrr7yi5cuX68cff9TTTz+tyZMn+zv8AMoJiVwAVUbt2rU1evRoTZ8+XT/88IP+97//6bLLLivVMQ4cOKCBAwcqLS1NknTVVVdp2LBhqlevnv744w/NmTNH3377rdavX69hw4bp008/lcVi8XisgoW0bDabxo4dq169eik6Olq//PKLmjRpUqSvzWbTddddJ7vdrkmTJqlbt26yWCxauXKlnn32WeXk5Oj222/XkiVLdP311ysmJkYPPvigOnXqJKfTqWXLlmnWrFnKyMjQ3XffrZUrVxaLx+VyKSoqSn379lXPnj3VsmVLxcTE6MiRI9q+fbteeeUV7d27VzNmzFCLFi103XXXlWrs/LFu3brCf5f2ubnssss0bty4YsepynEAAACUVUpKSmFC71QXYXU4HLrnnnsKk7jLli3TueeeW9jesWNHDRkyRJdccol27typF198UVdddVXhXWUn27Fjh1q3bq1PP/1UtWvXLtzeuXPnUvc1DEO33nqrsrKy1KZNGy1ZskQJCQlFjnHBBRfoiiuuUP/+/fXHH3/ohRde0MMPP+z3409LS9NDDz0kSapbt66WL19eJDHeuXNnDR48WH379tWhQ4f0yCOPaNCgQapfv35hn9TUVE2dOlWS1KRJE61cubJIe9euXdWnTx8NHDhQdrvdr7i2bdumGTNm6KabbircdvJz/cADDygpKUkmk6nI9nPOOUeDBw/WLbfcon79+unIkSN65ZVXfI7LTz/9pPPOO08ffvihIiMjC7f37NlTeXl5Wrp0qRYvXqwVK1Zo0KBBeuONN4p8F7rwwgt1ySWXaMOGDXr77bf18MMPKySEtBJQkSitAKBKufPOOwsvAKdMmeKzBIInDz74YGESd9q0aXr11VfVp08fnX322RoyZIj+97//aciQIZKk77//vvA37p6kpaUpIyNDn3zyiSZNmqQePXronHPO0dVXX60zzzyzSN8jR44oKytLX3zxhcaOHavzzjtPnTp10sSJE/Xvf/9bkrRnzx717dtX9erV05o1azRq1Ch16tRJ559/vqZMmaK77rpLUv4sYE+3bLVv317btm3TG2+8oZtuukndu3fX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FUsqt27dWlJ+vVpfC4pt27bNr/q4/jixtq+3JK70T51hANUfiVwAVVZoaKgmTJggSdq3b19hTVtvCi7gJGnjxo0++xZcwErFL+KC0Yn1f70tqiYF/iIvOTlZ55xzjqT8Mfz+++/92s/pdGru3LmFP19++eXVIg4AAIBTcd1116lBgwaSpLlz52rNmjV+77t06VJlZ2dLknr16lW4/Z133vG6z7fffqtffvml2D6B1L9//8J/P/vsswE5R8Fjyc7O1gcffOC135IlS3T8+PEi+xS44IILJEnHjx/3OVHgvffeO9VwCxWUnfBVD/jgwYP69NNPy+2cAIIbiVwAVdrw4cMLfzs9Y8YMn3Vfe/ToUXibvK8L2OPHj+vDDz+UlH9rfVnqb1W0E2vm+rrQKynZXR7uvffewn//3//9n1+Ljc2YMaNwZeD27duXyxeHYIkDAACgrCIiIjRnzhxZLBa53W5dc801PhORUv7iYePHj9eIESMKZ472799fjRo1kiTNnDnTY83djIwM/d///Z+k/DJkI0eOLNfH4s3AgQMLJ07Mnz+/xJnHu3bt0vvvv1+qc1x77bWFC+NOnjzZ45oSu3fv1iOPPCIpf9xvuOGGIu3XXHNN4Z1ujzzyiMc7/L7//nu99tprpYrNl+bNm0uSfv/9d3333XfF2nNycjRy5MiArH0BIDiRyAVQpVksFk2cOFFSfjmE+fPne+3boEEDDRw4UJK0du1aj0lNwzA0btw4paWlSZJuv/32AERd/gou8iR5HYO5c+eWusxAWQwaNEjDhg2TJKWkpOiqq67yumqv2+3WCy+8oH//+9+S8p/PGTNmVKs4AAAATkXPnj314osvymq1KicnRzfffLMuuugiPf/881q9erW2bNmib775Ru+9955uu+02nX322cWSiaGhoXr++edlMpmUnZ2t/v3768knn9T69eu1adMmzZ07Vz169NCOHTskSXfddVdhyYNAM5vNeuONNxQbGytJmjhxogYMGKB58+Zpw4YN2rJli1avXq0XXnhBl19+uTp06KBly5aV6hx16tQpvM5LTU1Vr169NHPmTG3YsEEbNmzQCy+8oF69ehVeKz7xxBOqX79+kWMkJibq/vvvl5RfBuLCCy/Ua6+9pk2bNmn9+vV68sknNXjwYDVo0KBwYeVTXRjt6quvlpR/rTps2DA9++yz+uabb/TDDz8UPmdr167V+eeff0rnAVB1sIILgCrviiuu0DPPPKNt27aVuPjAlClTtGbNGqWlpWncuHH6/vvvddVVV6lOnTratWuXXnnllcJas507d9att95aEQ/hlJ111llKTk5WSkqK3njjDR07dkzDhg1TgwYNtG/fPi1cuFBLly7V+eefr2+//Tbg8cyYMUNHjhzRF198ofXr1+vcc8/VtddeqwsvvFAJCQnKysrSzz//rPnz5xfWIZPyb6fr1KlTtYsDAADgVFxzzTVq1qyZJkyYoB9//FGbNm3Spk2bvPavU6eO7r///sLkqCT17t1bc+bM0V133aXs7Gw9/fTTevrpp4vtO3LkSE2ePDkQD8OrM844QytWrNCIESO0Y8cOff311/r666+99i9L7d4bb7xRx48f12OPPaa0tDRNmjSpWB+LxaKHH37Y63eAe++9V3v37tUbb7yhffv2afz48UXa69Spo7feekvXX3+9JCk8PLzUcZ6oQ4cOeuCBBzR16lQdO3ZMjz/+eLE+Y8aMUZs2bSrkGh9A5SORC6DKM5lMevDBBwsXg/AlMTFRy5Yt0/Dhw7Vv3z699957HutYdenSRfPnz5fFYglEyOXOZDJp9uzZGjRokDIyMvTBBx8Uu+0uOTlZb775ZuFCDYEUFRWl//73v3riiSf0yiuv6Pjx45o1a5ZmzZrlsX9cXJxmzpypQYMGVcs4AAAATtX555+vNWvWaMWKFfr888/17bffKjU1VRkZGYqMjFRiYqLOPvts9evXT5dddpnHJOJVV12lLl26aPbs2friiy+0d+9e2e121a9fX127dtXNN9+s8847rxIeXX4y95tvvtGHH36ojz76SJs2bdKRI0fkdDpVu3ZttWjRQueee64uueQSde3atUznuPvuu9WvXz+98sor+uqrr7R//35J+d8Revbsqdtuu63IuhonM5lMmjFjhvr06aPXXntNmzdvls1mU8OGDdWnTx/dfffdatSoUWGd3RMT6WV1//3365xzztHs2bO1adMm5eTkqF69eurQoYNuvvlm9erVS+++++4pnwdA1WDKyMgwKjsIAPBk7dq1haUQnn32Wd18880++1988cVFFin7/vvvva7ump2drddff12ffPKJfvnlF2VlZSk+Pl5nnXWWrrrqKl155ZVeb4UaPXq0FixYoMaNG+unn37yGZO/ffv3769vvvlG3bp10yeffOK1X/v27bV3715dc801HpORe/fu1YwZM7RixQodPHhQ0dHRat68uS6//HKNHDlS4eHhiouLk5R/UfjAAw8U2f/dd9/VnXfeKUnaunVrudQH3r17txYuXKhVq1Zp165dOnr0aJGVfpOSkrR69WrVrl37lM9VFeIAAABA9bVv3z61bdtWUn494pNr7QLAqSCRCwCocC6XS9dee60+++wzSfm10ApqHdfEOAAAAFA9zJw5s7Bsw7p16woXcgOA8kAiFwBQKQoW2ihYNXnGjBm66aabamwcAAAACG42m00ZGRlKTEz02L5161YNGDBAmZmZat++vdauXVvBEQKo7syVHQAAoGYqqF972mmnSZLGjRtX6hWIq1McAOCvzMxMTZo0SVdccYVatGihuLg4TZ061e/9Dx8+rNGjR6t58+ZKTExUnz59tGbNGo99v/zyS/Xp00eJiYlq3ry5Ro8ercOHD5fXQwGAKiUtLU1nn322br75Zs2fP18bNmzQ1q1b9fnnn+u+++7TJZdcoszMTJlMJv373/+u7HABVEMsdgYAqDQJCQlavHhx4cJsv//+u+x2u6xWa42MAwD8kZaWpjfffFPt2rVT//799fbbb/u9b15engYPHqxjx45p2rRpqlevnl599VUNHTpUS5YsUffu3Qv7fv3117ryyivVt29fzZ8/X4cPH9bkyZM1ePBgrV69WmFhYYF4eAAQ1PLy8jwuLFwgNDRUM2bMUM+ePSs4MgA1AaUVAAAAgCrEMPIv300mk44ePaoWLVp4XMDSk9dee03jx4/X8uXL1blzZ0mS0+lU9+7dFRUVpVWrVhX2veiii5STk6Ovv/5aISH58z++++479evXT88884xuueWWADw6AAheTqdTn3zyiVasWKFNmzbpyJEjSk9PV0REhBo3bqwLLrhAt912m5KSkio7VADVFDNyAQAAgCrEZDKVed+PP/5YLVu2LEziSlJISIiGDRumxx9/XPv371fDhg21f/9+bdq0SY8++mhhEleSzjvvPJ1++un6+OOPSeQCqHFCQkI0ePBgDR48uLJDAVBDUSMXAAAAqCG2b9+utm3bFttesG3Hjh2F/U7cfnLfgnYAAABUHBK5AAAAQA2Rlpam2rVrF9tesC0tLa3I3976FrQDAACg4pDIBQAAAGoQX6UZTm7z1vdU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yvv73yniAgAAeElubq7mzJmjLl26KCIiQvHx8UpLS3Pp2KFDhyo0NLTK/zIyMqqNHTNmTH29NAAAAFSDGblNmPHzz2WZMkV+R444jSvu1095q1fLERPjmcQAAABQqZtuuklHjhzRggUL1LFjR23evFmTJ0+W3W7XDTfc4PTYJ598Ujk5OeW25eXlaezYsbrssssUERFRbl9MTIyee+65cttatGhRNy8EAAAANUYhtymy22V+9lkFLlggQ35+lWGOgADlP/SQCqdNk4xM3gYAAPCmHTt2aPfu3Vq7dq3Gjh0rSRowYIBOnTqlefPmafTo0TKZTFUe36VLlwrbXnrpJRUVFemmm26qsM9iseiqq66quxcAAACAWqE618QYTp1S8MiRssyZ47SIa/vVr5S7Z48Kp0+niAsAAOADtm3bppCQEF3/iwVnJ0yYoDNnzujw4cM1PueGDRsUEhKi0aNH11GWAAAAqC/MyG0qHA75v/SSLHPnyvDjj1WHmUwquOceFdx7r+Tv78EEAQAA4Mzx48fVuXNn+fmVfwvfrVu3sv19+vRx+XxffvmlDh48qJtvvlkhISEV9p84cUIxMTHKyclR27ZtNWbMGM2aNUsWi8Wl8+c7mTRQFwoLC8v9Cd/AffFd3Bvfxb3xXdwb39TY7ktgYKDLsRRymwDD2bOy3HWX/P/5T6dxtthYWZ95RrYrrvBQZgAAAHBVZmamYipZs6Bly5Zl+2tiw4YNklRpW4W+fftq9OjRio2NVX5+vnbu3Kmnn35aBw8e1LZt22R04RNb6enpstlsNcrJHT9fpA2+g/viu7g3vot747u4N76pMdwXk8mkDh06uBxPIbeR83vtNVn+/GcZz51zGlcwZYry58+XXJxhAQAAAPft379fw4cPdyl237596tmzpyTJYDBUGeds3y8VFxcrNTVVXbt2rbQP7oMPPlju68GDBys6OloPPfSQXn/9dZdyj4qKcjkfdxQWFiojI0MREREym831ei24jvviu7g3vot747u4N76pKd+XRlHIzcnJ0RNPPKGPPvpIH374oc6dO6f77rtPc+fOden4jRs36o477qh032effVZhBd8GITtbljlzZP7b35yG2du0Ud6qVbINHOihxAAAABAbG6vly5e7FNu2bVtJUlhYWKWzbrOysiT9b2auK3bs2KGMjAzdddddLh8zbtw4PfTQQzp8+LBLhdyafEywNsxms8euBddxX3wX98Z3cW98F/fGNzXF+9IoCrmZmZl64YUX1L17dw0dOlTr16936zyrVq1S586dy20LCwurixQ9yrRnj4LuuEPG06edxhX+/veyLl4stWjhmcQAAAAgSWrdurVuvvnmGh0TFxentLQ0FRcXl+uTe+zYMUlS165dXT7Xhg0bZDabNX78+BrlIMmltgoAAACoe42ikBsdHa2vv/5aBoNB586dc7uQGxcXp8svv7yOs/OgvDwFzp+vgOeecxpmDw+XddkyFQ8d6qHEAAAAUFvDhg3TunXrtHXrVo0ePbpse2pqqiIjI9WrVy+XzpORkaGdO3dq+PDhNZq0kJqaKkkuXwcAAAB1q1EUcmvSD6yxMh0+LMuUKTL9979O44qGDZN12TI5Lr7YQ5kBAACgLiQlJSkxMVEzZ85UTk6O2rdvr7S0NO3atUvPPvusTCZTWez06dOVmpqqo0ePKjo6utx5UlNTVVxcXOWM4AMHDujJJ5/UsGHDFBMTo/z8fO3atUsvvPCCBgwYoGuvvbZeXycAAAAq1ygKuXVl3Lhx+uGHH9S8eXPFx8fr/vvvV1xcnEvH5ufn13N2VSgsVPBTTyl4+XIZ7PYqw+zNmiln0SLljx0rGQySh/ItLCws9yeqxli5hnFyHWPlGsbJNYyT6xgr55paH7O6tmHDBi1cuFCLFi1SVlaWYmNj9fzzz2vMmDHl4mw2m2w2mxwOR4VzvPjii4qOjtavf/3rSq/RunVrmUwmPfHEEzp37pwMBoM6dOig+++/X9OnT6e1AgAAgJcYsrOzK767a8DOnTunjh071mixs127duntt99Wr1691KxZMx07dkzLli1Tdna2tm/frh49elR7jq+++ko2m6226ddI4H//qw7z5yvo88+dxv141VU6MW+eilq39lBmAAAAFZlMJnXo0MHbaaCRyM/P16lTp9S2bVt+QeBDuC++i3vju7g3vot745ua8n3xuRm5+/fvd2kVXEnat2+fevbsWetrDho0SIMGDSr7un///ho8eLD69++vRYsWlfUDcyYqKqrWebjMZlPQmjUKWbJEBiezfRwWi3IefFDWP/xBrb00c6KwsFAZGRmKiIiQ2Wz2Sg4NBWPlGsbJdYyVaxgn1zBOrmOsAAAAANQHnyvkxsbGavny5S7Ftm3btt7yaNeuna6++modPnzYpXhP/QbAeOKELNOmye/gQadxxb16ybpmjRydOskXfjdhNpub3G9J3MVYuYZxch1j5RrGyTWMk+sYKwAAAAB1yecKua1bt65y4QVPczgcvtMDzOGQ/7p1sjzwgAwXLlQd5uengjlzVPDnP0t+Pnd7AQAAAAAAALiBSl8VTp48qUOHDmngwIHeTkWGM2dkmTFD/jt3Oo2zxcUpLyVF9l/9ykOZAQAAAAAAAPCERlPI3blzp/Ly8pSTkyNJ+uyzz7RlyxZJUlJSkoKCgiRJ06dPV2pqqo4eParo6GhJ0siRI9WvXz9169atbLGz5cuXy2Aw6IEHHvDOC/qJ/z/+ocCZM2XMzq4yxmEwqPDOO5V///0SH+EEAAAAAAAAGp1GU8idOXOmTp06Vfb1q6++qldffVWS9MEHH6hdu3aSJJvNJpvNJofDURYbFxenV155RStXrpTValV4eLgSEhI0e/ZsderUyaOvo5QhM1OBs2bJ/I9/OI2zxcTIunq1bP36eSgzAAAAAAAAAJ7WaAq5H330kUtxKSkpSklJKbdt8eLF9ZGS2/x27pTlzjtl/O47p3EFf/iD8hculEJCPJQZAAAAAAAAAG9oNIXcRiE3V4EPPqiAF15wGmZv3VrWFStUnJTkmbwAAAAAAAAAeBWFXB9hOnhQlqlTZTp50mlc4Zgxyl+6VI6WLT2TGAAAAAAAAACvo5Drbfn5Cly0SOYVK2T4Wd/eX7KHhir/ySdVNGaMB5MDAAAAAAAA4Aso5HqR8YMPFDRlikzHjzuNK0pKknX5cjkiIz2UGQAAAAAAAABfQiHXG4qLFfCXvyhgyRIZiourDHMEB8u6aJGKbr5ZMhg8mCAAAAAAAAAAX0Ih18OMX3why9Sp8jt82Glccd++yktJkSMmxjOJAQAAAAAAAPBZRm8n0GTY7TI/+6xCBgxwWsR1mM2yLlyoC9u2UcQFAAAAAAAAIIkZuZ6Rna3gSZPkt3ev0zBbz57KW7NG9rg4DyUGAAAAAAAAoCFgRq4nNG8u2WxV7naYTMqfNUu5u3ZRxAUAAAAAAABQAYVcTzAalbdqlRzNmlXYZevUSRf+/W8VPPigZDZ7ITkAAAAAAAAAvo5Croc42rWTddGictsKbrtNufv2ydarl5eyAgAAAAAAANAQ0CPXg4omTlTRtm0yffyx8lavlm3gQG+nBAAAAAAAAKABoJDrSQaDrKtWyeHnJ4WGejsbAAAAAAAAAA0EhVwPc1x8sbdTAAAAAAAAANDA0CMXAAAAAAAAAHwchVwAAAAAAAAA8HG0VvAAm92hAxmFyrDaFGExqV+EWSajwdtpAQAAAAAAAGggKOTWs60nrZpzKFvpefaybVFBRiX3CdWIGIsXMwMAAAAAAADQUNBaoR5tPWnVpN2Z5Yq4knQmz65JuzO19aTVS5kBAAAAAAAAaEgo5NYTm92hOYey5ahkX+m2ue+cl81eWQQAAAAAAAAA/A+F3HpyIKOwwkzcn3NIOn3BpgMZhZ5LCgAAAAAAAECDRCG3nmRYbXUaBwAAAAAAAKDpopBbTyIspjqNAwAAAAAAANB0UcitJ/0izIoKMspQxX6DpEuCTeoXYfZkWgAAAAAAAAAaIAq59cRkNCi5T6gkVSjmln69uHcLmYxVlXoBAAAAAAAAoASF3Ho0IsaidYlhigwqP8xRwSatSwzTiBiLlzIDAAAAAAAA0JD4eTuBxm5EjEVDowN1IKNQGVabIiwl7RSYiQsAAAAAAADAVRRyPcBkNCghMsDbaQAAAAAAAABooGitAAAAAAAAAAA+jkIuAAAAAAAAAPg4CrkAAAAAAAAA4OMo5AIAAAAAAACAj6OQCwAAAAAAAAA+jkIuAAAAAAAAAPg4CrkAAAAAAAAA4OMo5AIAAAANQE5OjubNm6dRo0apY8eOCg0N1eLFi2t0jrNnz2rq1Knq0KGDIiMjlZSUpL1791Yau2fPHiUlJSkyMlIdOnTQ1KlTdfbs2bp4KQAAAHADhVwAAACgAcjMzNQLL7yggoICDR06tMbHFxQUaOTIkdq3b5+Sk5P10ksvKTw8XGPGjNGbb75ZLvbNN9/U2LFjFR4erpdeeknJycnau3evRo4cqYKCgrp6SQAAAKgBP28nAAAAAKB60dHR+vrrr2UwGHTu3DmtX7++Rsdv2LBBx44d044dO9S7d29JUkJCguLj4zV//ny98cYbZbHz5s1Tp06dtH79evn5lfzI0K5dO11zzTV68cUXNXny5Lp7YQAAAHAJM3JR70wmk7dTaDAYK9cwTq5jrFzDOLmGcXIdY4X6YDAYZDAY3D5+27Ztio2NLSviSpKfn59uvPFGvffee0pPT5ckpaen68iRIxo3blxZEVeS+vTpo06dOmnbtm3uv4g6xt8138R98V3cG9/FvfFd3Bvf1FTvCzNyUa8CAwPVoUMHb6fRIDBWrmGcXMdYuYZxcg3j5DrGCr7q+PHj6tu3b4Xt3bp1kyR9+umnioqK0vHjx8tt/2XsoUOH6jdRF/F3zTdxX3wX98Z3cW98F/fGNzXl+8KMXAAAAKAJyMzMVMuWLStsL92WmZlZ7s+qYkv3AwAAwLOYkQsAAAB42P79+zV8+HCXYvft26eePXvWyXWdtWb45b6qYmvT3gEAAADuo5ALAAAAeFhsbKyWL1/uUmzbtm3r5JphYWGVzqbNysqS9L8ZuGFhYZJUZWxlM3UBAABQ/yjkAgAAAB7WunVr3XzzzR69ZlxcnI4dO1Zhe+m2rl27lvvz2LFjGjx4cIXY0v0AAADwLHrkAgAAAE3AsGHD9Pnnn+vw4cNl24qLi7Vp0yb16tVLkZGRkqSoqChdeeWV2rRpk2w2W1nsu+++qy+++MLllhAAAACoW4bs7GyHt5MAAAAAUL2dO3cqLy9POTk5mj59uq6//nqNGjVKkpSUlKSgoCBJ0vTp05WamqqjR48qOjpaklRQUKBf//rXysnJ0fz58xUeHq61a9dq+/btevXVVxUfH192nf3792vUqFEaMmSIbr31Vp09e1YPP/ywmjdvrt27dysgIMDzLx4AAKCJY0Yu6lROTo7mzZunUaNGqWPHjgoNDdXixYtdPn7jxo0KDQ2t9L+MjIx6zNyzajtOknT27FlNnTpVHTp0UGRkpJKSkrR37956yti7cnNzNWfOHHXp0kURERGKj49XWlqaS8c2tmeqNmPRlJ4Zyf2xamzPTHVq+/2oKT1XtRmrpvZcof7MnDlTkyZN0vTp0yVJr776qiZNmqRJkybp7NmzZXE2m002m00Ox//mbAQEBGjLli2Kj4/X7NmzNX78eGVkZGjz5s3liriSlJCQoJdfflkZGRkaP368Zs+erfj4eG3ZssXrRdza/FuI+rF3717dcccduuqqqxQVFaWuXbvqd7/7nd5//31vp4ZKrF+/XqGhobrkkku8nQokHTx4UDfccIPatWun1q1b64orrtDjjz/u7bSatA8++EC///3v1aVLF0VGRuqqq67SkiVLlJeX5+3UmpSavPd+//33NXLkSF1yySWKjo7WxIkTdfLkSc8m7CH0yEWdyszM1AsvvKDu3btr6NChWr9+vVvnWbVqlTp37lxuW+nCG41BbcepoKBAI0eO1Pnz55WcnKzw8HA999xzGjNmTIUZNY3BTTfdpCNHjmjBggXq2LGjNm/erMmTJ8tut+uGG25w6RyN5Zlydyya2jMj1f65aSzPTHVq8/2oqT1XdfFvXFN5rlB/PvroI5fiUlJSlJKSUmF7q1attGbNGpfOkZiYqMTExBrl5wl18b4Adeuvf/2rMjMzNWXKFF166aU6d+6cVq5cqUGDBiktLU0DBw70dor4SXp6uh588EFFRkbqxx9/9HY6Td7LL7+s22+/XaNGjdKaNWsUHByskydP6syZM95Orcn69NNPdc0116hTp05avHixwsLCdODAAT3++ON6//33lZqa6u0UmwxX33t//vnnGj58uLp3767/+7//U35+vhYvXqxrr71W+/fv18UXX+zhzOsXhVzUqejoaH399dcyGAw6d+6c24XcuLg4XX755XWcne+o7Tht2LBBx44d044dO9S7d29JJTNn4uPjNX/+fL3xxhv1kbZX7NixQ7t379batWs1duxYSdKAAQN06tQpzZs3T6NHj5bJZKr2PI3hmarNWDSlZ0aqm+emMTwzrqjN96Om9lzVxb9xTeW5AupLXb0vQN1aunSpwsPDy2377W9/qyuuuEJPPfUUhVwfcvfdd6tfv35q2bKltm7d6u10mrT09HT9+c9/1h/+8Ac9+eSTZdsHDBjgxaywefNm5efna8OGDWrfvr0kaeDAgcrIyNALL7yg7OxshYaGejfJJsLV996LFi2S2WzW3//+dzVv3lySdNlll+nKK6/UihUr9PDDD3sy7XpHawXUKYPBIIPB4O00fF5tx2nbtm2KjY0tK5xIkp+fn2688Ua99957Sk9Pr4s0fcK2bdsUEhKi66+/vtz2CRMm6MyZM+UWbGnsajMWTemZkXhuaqI234+a2nPFv3GA9/H93Tf9sogrSSEhIbr00kt1+vRpL2SEyvz973/XgQMHyhUN4T3r16/XhQsXdNddd3k7FfyMn1/JfMfSgmCpFi1ayGg0yt/f3xtpNUmuvPcuLi7Wv//9b40YMaLcPYuOjlZCQoK2bdtW32l6HIVc+KRx48YpLCxMMTExmjhxoo4dO+btlHzK8ePH1a1btwrbS7d9+umnnk6p3hw/flydO3cu+we1VOlrPX78uEvnaQzPVG3Goik9M1LdPDeN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rCwaGhqYP39+u+5LREREREREHj8KckXk/8KwYcMoLCzEZDKRk5NDSUkJRqMRHx8foqOjmThxot34cePG4e3tTUpKCt988w1//vknfn5+LFiwgPfff/++d0ROnTqVwMBAUlNTKSoqIjs7G3d3d/r06cPs2bOJi4uzjXVycmLr1q0sXbqUjIwM2+FrEyZMuGeQC/Dmm2+Sm5tLSkoKR44cITs7m549exIYGMjUqVNt49577z1cXFzYtGkTaWlpeHh4EBkZyZIlS3jnnXfu677u5bXXXqO8vJx169aRk5PDl19+aduF6urqislkIjY21uG6rl27sm/fPhYvXkxBQQHl5eUEBweTlZWF2Wx2CHKjoqJsh4Lt3LmTrl27EhYWxrZt21o8VOx+bNy4kcWLF5OZmcnVq1exWCwEBwffd5BrMBhYv349kZGRbNmyhf3793P9+nW8vLx4+umnWbFiBa+++ioAfn5+fPDBBxw+fJj8/HwuXbpEz549eeGFF5g9ezbh4eEP5N5ERERERETk8WGoq6uzPOxFiIhIx2fdhWs2m1m1ahUzZ8582EsSEREREREReWwoyBURkVa7du0aUVFR/Pzzz6xbt85uJ7KIiIiIiIiI/HtUWkFERFrNzc2N9PR0tm7dytmzZ7l27Rpubm4Pe1kiIiIiIiIijzztyBURERERERERERHp4Do97AWIiIiIiIiIiIiISMsU5IqIiIiIiIiIiIh0cApyRURERERERERERDo4BbkiIiIiIiIiIiIiHZyCXBEREREREREREZEOTkGuiIiIiIiIiIiISAenIFdERERERERERESkg1OQKyIiIiIiIiIiItLBKcgVERERERERERER6eD+AzDRUnjmj86yAAAAAElFTkSuQmCC"},"metadata":{}}],"execution_count":15,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"f01ecd42-e187-428a-bca2-099c25ffd318"},{"cell_type":"markdown","source":["#### Plotting forecasted data."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"16c243a6-90c4-4c9d-844d-e3330d2c2a71"},{"cell_type":"code","source":["# Forecasting the next 12 months\n","forecast_steps = 12\n","forecast = results.get_forecast(steps=forecast_steps)\n","forecast_index = pd.date_range(start=simulated_sales_df['order_date'].iloc[-1] + pd.DateOffset(months=1), periods=forecast_steps, freq='MS')\n","forecast_scaled = forecast.predicted_mean.values.reshape(-1, 1)\n","\n","# Apply inverse transformation to get the forecast back to original scale\n","forecast_original_scale = scaler.inverse_transform(forecast_scaled)\n","forecast_df = pd.DataFrame({'order_date': forecast_index, 'forecast': forecast_original_scale.flatten()})\n","\n","# Plot the observed data and forecast\n","plt.figure(figsize=(12, 6))\n","plt.plot(simulated_sales_df['order_date'], simulated_sales_df['sales'], label='Observed Data', marker='o')\n","plt.plot(forecast_df['order_date'], forecast_df['forecast'], label='Forecast', marker='x')\n","plt.xlabel('Order Date')\n","plt.ylabel('Sales')\n","plt.title('Forecasted Chicago Sales')\n","plt.legend()\n","plt.show()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":19,"statement_ids":[19],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:12:07.2622138Z","session_start_time":null,"execution_start_time":"2024-11-02T23:12:07.7666218Z","execution_finish_time":"2024-11-02T23:12:08.8432013Z","parent_msg_id":"0318e3c6-6334-4e2d-bed4-3ebbba47dfa8"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 19, Finished, Available, Finished)"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"iVBORw0KGgoAAAANSUhEUgAABG0AAAJECAYAAACsHdkDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAADAvElEQVR4nOzdd3xT1fsH8E+SNkn3ohNaCsguyEZG2SBQKYKKIspQNjhAEFBARUZFviiggrL3nrJXgTJEtmgru8xSSvfKaHJ/f/TX2NAk3WnafN6vFwr3nHvvk5xeaJ6e8xxRUlKSACIiIiIiIiIisijisg6AiIiIiIiIiIjyYtKGiIiIiIiIiMgCMWlDRERERERERGSBmLQhIiIiIiIiIrJATNoQEREREREREVkgJm2IiIiIiIiIiCwQkzZERERERERERBaISRsiIiIiIiIiIgvEpA0RERERERERkQVi0oaIiIjKNVdXV7i6umLOnDllHQqAkonn/v37uuusX7++BKOjshYSEgJXV1eEhISUdShERFQO2JR1AEREZL0iIiLQq1evAvefNGkSpkyZUooREQFZWVnYu3cvjh49igsXLiAuLg4pKSlwcnKCr68vmjZtip49e6Jr166wseG3UuVJUlIS1q9fj6NHjyIyMhKJiYmQSqWoVKkSvLy80KBBA7Rp0watW7eGj49PWYdLRETEpA0RERHl7/79+3j55ZcBAD///DMGDBhQxhGVjgMHDuDLL7/E3bt387QlJiYiMTERkZGRWLt2LSpXrowvv/wS7777bhlESoV16NAhjB49GvHx8XrHVSoV0tLSEB0djT///BPLly+Hl5cXbt68WUaREhER/YdJGyIisggffvghPvzwQ5N9PD09zRQNWaMffvgBM2bMgCAIAIDg4GD07NkTdevWhZubG5KSknDv3j0cOnQIR48exePHjzF58uRSSdpUrVoVSUlJJX5da3Xu3Dm89957UKvVEIvF6Nu3L3r06IFq1apBLBYjISEB169fR3h4OE6fPl3W4RIREekwaUNERBahUqVKqFevXlmHQVZq06ZN+OabbwAAHh4eWLFiBdq3b5+nX/v27TF48GBER0fjq6++Qnh4uLlDpSL48ssvoVarIZFIsHXrVnTq1ClPn06dOuGTTz5BXFwcdu3aZf4giYiIDGDShoiIiKxaTEwMPvvsMwCAvb09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3Lt3D1u3bsWiRYvw5Zdf5rlOUlISpk+fjgMHDiA1NRX16tXDhAkT0LNnT71+CoUCS5cuxaZNm/Dw4UNoNBp4enqiadOmGD9+POrXr6/Xf9++ffj1119x7do1KBQKVK9eHe+++y5Gjx4NieS/qXXr16/HmDFj8PPPP6NSpUr48ccfcf36dbi5uWHJkiUICQnBe++9h59++ilP7I8fP0aDBg3Qtm1b7NmzR3c8NTUVixYtwp49exAdHQ2pVIrmzZtjwoQJaNWqVZ7rREVF4euvv8aZM2cgFovRsmVL3ddxSWndujV27NiBNm3aYOHChRg8eDCqVKkCIDthunLlShw+fBh3795FfHw8PDw80L59e0yePBnVqlXTXSckJARnzpwBAPTq1Ut33N/fH9evXweQvVxu8+bNOH/+PGJiYgAANWvWxODBgzF48OASfV1ERERERFROKTMhW/49bM8fz9MkylJDsLG12oQNYIFJG2M8PDwQFxcHIHs5zqFDh/DOO+/ozdoICAhAcHAw9u7dq/uwe/ToUSgUCgwYMEDvegMGDMC3336Lffv2lXrS5kJc6S3DupOiwR3kTeqYy4YNG6DVajF48OA8CZvcJk6ciK1bt2L9+vV5kjZqtRq9e/eGQqFA//79kZycjB07dmDAgAH49ddf0a9fP13fUaNGYefOnahfvz7effddyGQyPHr0CBEREejUqZNe0mbGjBmYP38+KleujNDQUDg5OeHs2bOYNm0aLl68iNWrV+eJc/fu3Th+/DheffVVfPjhh0hLS0Pr1q0REBCAPXv2YN68eZDL5XrnbN26FVqtFm+//bbuWGJiInr27ImoqCi0atUKnTp1QkpKCvbv349evXph1apVeO2113T9IyMj0b17d6SlpaFXr16oUaMGLl26hO7du+dJRBXXSy+9hD59+mDTpk3Yt28fRowYASB79trs2bMRHByM1157Dfb29rh58ya2bduGw4cP4+TJkwgICAAAvPvuuwCAM2fOoH///rrjLi4uuvssWLAAd+/eRfPmzeHn54fk5GQcPXoUn376KW7duoVZs2aV6OsiIiIiIqLyRRT7CPKF0yB5ZLjupoDsxI3t7jVWm7ix2KSNVquFVqtFUlISdu3ahWPHjuH7778HANy7dw+ZmZkGP8zWr18f4eHhUCgUkMvliIqKAgDUq1dPr5+Pjw88PDx0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Yvz48ahbty6aNGmC1atXl0iQRERERGQ+311Nxc7oTINtnSvL8G1zFzNHREREZJ2KnLT53//+h2+++QZOTk66YzNmzMDKlSuRlpaGR48eYdy4cTh58mSJBEpEREREpW/XvUyEXTW8U1QtFxus6OAOG267TUREZBZFTtpcunQJwcHBEImy/9FWq9VYv349mjZtilu3buHatWuoVKkSfvnllxILloiIiIhKz9XnKoyKMLxTlKtUhE1dPODCnaKIiIjMpsj/6sbFxaFKlSq6P1+8eBGpqakYMmQI5HI5fH190bNnT/z9998lEigRERERlZ6nGRq8eywemRohT5uNCFjd0QPVnblTFBERkTkVOWkjFouhVCp1fz537hxEIhGCg4N1x9zd3REfH1+8CImIiIioVGVmCXj3WDyeZBjeKWruK65o78edooiIiMytyEmbgIAARERE6P68e/duVK1aFQEBAbpjT548gbu7e/EiJCIiIqJSIwgCPjqTiMvPDe8UNayuAz6ow52iiIiIykKRkzZvv/02/v77b3Tp0gU9evTA9evX8cYbb+j1+euvv1C9evViB0lEREREJUujFRARo8SQE4nYdtfwTlEd/GSY04I7RREREZWVIi9MHj58OC5fvozdu3dDEAR06dIFn332ma798uXLiIqKwpQpU0okUCIiIiIqGXuiMzH5fJLR5VAA8JKzDVZxpygiIqIyVeSkjUwmw8qVK5GSkgKRSKS39TcAVK1aFadOndJbLkVEREREZWtPdCYGhScgb7nh/7hIRdjUxR2uMu4URUREVJaKvQWAs7OzweMeHh7w8PAo7uWJiIiIqJjS1Fpcea7GhWdKzL2WajJhAwDL27vhJRdbs8RGRERExhU7aXPt2jVs374dN2/eRGZmJnbv3g0AePDgAS5duoQOHTrAzc2t2IESERERUf60goAbSVm4GKfS/YpKyoI2v0xNLjIJZ9gQERFZgmIlbaZPn46ffvoJgpD9XYBI9N+aZ0EQMHToUMycOROjRo0qXpREREREBI1WwNlYFWIzNfC2k6C1txQJSm2uBI0al5+rkKouRIbGgNhMTQlFTERERMVR5KTNunXrsGjRInTv3h3Tpk3D9u3b8cMPP+jaq1atiqZNm+LAgQNM2hAREREVk6HiwRIRoClefsYgbztJyV+UiIiICq3Ic1+XL1+O2rVrY+3a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daO+voE6t37U2DdQ59aN+vqGllbnVrcQscNRsXeSwWBQly5dFBwcrF27dtVot2vXLiUnJ7eoYgEAAAAAAN/RqkIbs9mstWvXqnfv3goKCpKfn5/GjRunNWvWqKCgoKpdZmamNm/erAkTJniwtwAAAAAAALVrsY9H3XDDDerQoYP69+9ftRDxokWLdPToUS1evLiq3ezZszV69GhNnDhRM2bMUElJidLT0xUTE6Pp06d78A4AAAAAAABq12JDm5SUFK1atUovvviiioqKFBUVpSFDhui5557TgAEDqtqdfvrpeu+993TvvfdqypQp8vPzU2pqqpYvX67Y2FgP3gEAAAAAAEDtWmxoM2PGDM2YMcOltv369dO7777r5h4BAAAAAAA0nVa1pg0AAAAAAEBrQWgDAAAAAADghQhtAAAAAAAAvBChDQAAAAAAgBcitAEAAAAAAPBChDYAAAAAAABeiNAGAAAAAADACxHatGImk8nTXYAbUV/fQJ1bN+rrG6hz60eNfQN1bt2or29oiXU2mM1mh6c7AQAAAAAAgOqYaQMAAAAAAOCFCG0AAAAAAAC8EKENAAAAAACAFyK0AQAAAAAA8EKENgAAAAAAAF6I0AYAAAAAAMALEdq4waeffqpp06Zp0KBBSkxMVI8ePXTVVVdp586dNdru3LlTF110kdq3b6+kpCRNnjxZGRkZ1dr8/PPPuvvuu3X22WcrKSlJnTt31tixY/Xuu+/WON/q1at1/fXXq3///mrbtq169+6tP//5z9q3b1+D7sGVfknS4sWLNXnyZPXp00eRkZEaP358g67TEvlKfZcvX67IyMhaP5544okGXbOl8WSdN23apIsvvljdu3dXfHy8TjvtNE2YMEHr1q1r0D0wjmvnK/X19XEsebbWJ3vooYcUGRmpoUOHNugeGMu185X6+vpY9mSd6/rcZ2VluXwPjOO6+UqNGcue/5r9/vvv64ILLlDHjh2VmJioIUOGaOnSpS7fgyfGMqGNG7z44os6cOCApk6dqpUrV2revHnKzs7WmDFj9Omnn1a127t3ryZMmCCr1aqXXnpJixYt0r59+3T++ecrOzu7qt2GDRu0bt06paWl6eWXX9aSJUuUnJysKVOmaP78+dWu/c9//lPFxcW69dZb9eabb+ruu+/Wt99+q7PPPlu7d+92qf+u9kuSXnrpJWVmZmrEiBGKjY09hc9ay+Er9R07dqzWr19f42PUqFGSpAsvvPBUPo1ez5N1zs3NVffu3TV37lytWrVKTzzxhPz9/XXFFVfo9ddfd6n/jOO6+Up9fX0cS56t9Ym+/fZbLVy4UPHx8Q3qP2O5br5SX18fy95Q56effrrG5z86Otql/jOO6+crNWYse7bOTzzxhK6++mr17NlTL730kl599VVdf/31slqtLvXfU2PZYDabHad0BtRw7NgxxcXFVXutsLBQAwYMUI8ePaqSv2uvvVabN2/W119/rfDwcEnSgQMHNHDgQP3lL3/R/fffL0nKyclRdHS0DAZDtXNOnDhRmzdv1i+//KLAwMBar3348GH16dNHV155pRYuXFhv/13tlyTZ7XYZjRXZ39ChQxUdHa3333/f5c9VS+RL9T1ZUVGRunXrpt69e+vDDz+s91otmSfr7ExZWZn69u2rTp06ufS5ZxzXzZfqezJfGseSd9S6vLxco0aN0rBhw/T9998rNzdX27Ztc6n/jOW6+VJ9T+ZLY9mTdV6+fLmmTZumjRs3qn///o3qP+O4fr5U45Mxlpunzjt37tTo0aN177336m9/+1uj+u+pscxMGzc4+S+iJIWFhalbt246ePCgpIpv8GvXrlVaWlpVwSUpKSlJqampeu+996pei4mJqfEXUZIGDBig4uJi5eXl1Xntdu3aKTExseradWlIvyRV/UX0Jb5U35OtWrVKhYWFuvrqq+u9VkvnyTo74+/vr4iICPn5+dXbd8Zx/XypvifzpXEseUetn3jiCeXl5emee+5pUN8Zy/XzpfqezJfGsjfUubEYx67xpRqfjLHcPHV+/vnnFRgYqBtvvLFRfffkWPbNrwoecPz4cX3zzTfq3r27JOmXX36RxWJRSkpKjbYpKSnav3+/SkpK6jzn5s2bFRsb6/Qv/4kyMjKUmZlZde26NEW/fJGv1PeVV15ReHi4Lr744nqv1Ro1d53tdrvKy8t1+PBhzZ07Vz///LOmT59ebz8Zx43jK/X19XEsNW+tf/zxRz366KN6/PHHFRYW1qB+MpYbx1fq6+tjubm/Zk+cOFHR0dHq3LmzJk+erF27drnUT8Zx4/lKjRnLzVPnrVu36vTTT9fq1at1xhlnKDo6Wj179tR9993n0uNRnhzLhDbN5LbbblNxcbFmzpwpqWJNA0mKioqq0TYqKkoOh0Nms7nW8y1btkyff/65Zs6cKZPJVGu78vJyTZ8+XWFhYfrLX/5Sbz9PtV++yhfqu3fvXm3fvl2XXnqpQkJC6r1Wa9Tcdb788ssVGxurHj166Nlnn9WLL76osWPH1ttPxnHj+EJ9GccVmqvWdrtd06dP14QJE3Teeec1uJ+M5cbxhfoylpuvzgkJCZo5c6aeeuoprVmzRnfddZe+/vprnXvuufruu+/q7SfjuPF8ocaM5ear8+HDh7V//37dcccduummm/TOO+/o//7v/7Rw4UJNmzat3n56cizXPw8bp+yhhx7SypUrtWDBAvXr16/aMWfTueo7tn79es2cOVMXXXSRbrrpplrf73A4NH36dG3btk3Lli1Thw4dqo7Z7XbZ7fZq1zrxL3Vj+uWrfKW+//73vyVJ11xzTa3vbc08UecFCxbo+PHjOnLkiFauXKnrrrtOzzzzjC677DJJjOOm5Cv19fVxLDVvrZ9++mnt27dPr776ap19Yiw3HV+pr6+P5eas85gxYzRmzJiqPw8fPlznnXeehg8frrlz51bVn3HctHylxozl5quz3W5XQUGB/vWvf+nSSy+VJI0YMUJFRUV65plnNHv2bCUnJ3vlWGamjZvNmzdPjz76qO65555qz89VrkRemdidKC8vTwaDQRERETWOffLJJ7r66qs1atQoLVmypNa/GA6HQ7fccotWrlypxYsX19hibNq0aYqNja36SEtLO6V++SpfqW9ZWZlee+019erVq9ELtLVknqpz165dNWDAAF1wwQVaunSpzj77bM2cObPqGwnjuGn4Sn19fRxLzVvrzMxMzZ07V3fccYf8/f1lNptlNptls9lkt9tlNptlsVgkMZabiq/U19fHsqe+Zp+oU6dOGjJkiHbs2FH1GuO46fhKjRnLzVvnyvOec8451V4/99xzJUnffPONJO8cy8y0caN58+Zp3rx5mjVrlm699dZqx7p06aLg4GCnz0ru2rVLycnJCgoKqvb6J598okmTJmn48OFatmyZAgICnF638gf65cuXa+HChZo4cWKNNrNmzao2OCqfw25Mv3yVL9X3o48+0rFjx3Tbbbc57VNr5qk6OzNgwAB9/PHHys7OVnx8POO4CfhSfX15HEvNX+uMjAxZLBbNmjVLs2bNqnHezp07a+rUqVV9YiyfGl+qry+PZW/6mu1wOKotNMo4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t2+XVLG2S11OP/10tWvXTocOHdJvv/2mDh06VB3LyspSSkqK1q5dq+Dg4KrX9+/frwULFigxMVGffvqp4uLiJEmzZs3SOeec4/Q6t99+u3bv3q1FixZp8uTJVa8fPXpUo0eP1t///neNGTNGQUFB1d53+PBhbdmyRVFRUQ37BNTBaDRq6NChOnDggL766quq0GbixImaNm2aAgICqrWfP3++0tPT9fbbb+uKK66QJM2ePVuff/65MjMzNXv27BrXyM3N1dSpUxUbG6uPPvpIHTt2rDr25ptv6oYbbtDDDz+sRx55pMnuCwAAnDoejwIAAG539OhRSVL79u3rbVvZJisrq8axBx54oFpgI0lvvPGGysvL9Ze//KUqsJGk8PBwzZw5s8Y5cnJytGrVKp199tnVAhtJio+P1y233KLs7Gxt2rSpxntnz57dpIFNpXbt2klStceUEhMTawQ2knTjjTdKktP+1ebVV19Vfn6+5syZUy2wkaTLLrtMffv21apVqxrRcwAA4E7MtAEAAF6lcl0Xg8FQ7fWgoKCqWSgn+v777yVJw4YNq3Fs6NChNV776quvZLPZVFpa6nRNmv3790uSfvrpJ40bN67asYEDB7p4Fw1z4lo2J772yiuvaMWKFdq9e7fy8/Nlt9urjh85csTl8+/YsaPq18r7O1FpaalycnKUk5OjmJiYRtwBAABwB0IbAADgdvHx8dq7d68OHjyoP/zhD3W2PXToUNV7ThQbG1sjyJGk/Pz8quPOrnuyvLw8SdIXX3yhL774otZ+FBUVuXS+plAZwJwYmNx+++1asmSJOnTooPPPP19t27atmnkzf/58lZaWunz+yntesmRJne2KiooIbQAA8CKENgAAwO3OPPNMff755/r00081cuTIWtvt3btXhw8fVmJiYrX1bKSaM28qVW4Nnp2draSkpGrHKh/LOlGbNm0kSdOnT9dDDz3UkNuotQ+nwm63a+vWrZKkAQMGSJKOHTumF154QSkpKVq/fr1CQkKq2mdlZWn+/PkNukblPW/dulU9e/Zsop4DAAB3Y00bAADgdldddZWMRqNefvllZWdn19ru0UcflSRNmjTJ5XP36tVLkqqCjxM52757wIABMhgM+vLLL12+hju99tpryszMVM+ePdWjRw9JUkZGhhwOh0aOHFktsJGc35NUsYW4JNlsthrHzjjjDEnymnsGAACuIbQBAABud9ppp2nq1KnKzc3VlVdeWWM9FrvdrgULFmjlypXq0qWLbrnlFpfPffnll8tkMmnx4sU6duxY1ev5+flVIdCJEhIS9Mc//lHbt2/XU0895XQ9mR07dqi4uLgBd9hwNptN//73v3XrrbfKZDJp7ty5VTN5KhcL/s9//lNtHZuDBw/qvvvuc3q+ygWSDx48WOPYpEmT1KZNGz344IPavXt3jePFxcUEOgAAeCEejwIAAM3igQceUH5+vl555RUNHDhQ5513nrp06aKCggJt2LBB+/btU9euXfXGG29UPfLkiuTkZN1+++1KT0/X8OHDdfHFF8vPz0+rV69WSkqKfvrppxrveeyxx/TTTz9pzpw5eu211zR48GCFh4fr4MGD2rlzp/bt26c9e/bUmOXSWJs2bVJJSYkkyWKx6NChQ9q6dasOHTqkqKgoPfvss9UeG2vbtq3S0tK0evVqjRw5UmeffbaOHj2qtWvXasSIEcrIyKhxjREjRujdd9/Vtddeq3PPPVdBQUHq2bOnxo4dq9jYWL3wwgu69tprddZZZ2nMmDH6wx/+oNLSUh04cEBbt27V4MGD9dZbbzXJ/QIAgKZhMJvNNf97CQAAwE02bdqkpUuXavv27crOzlZISIi6deumtLQ0XX/99TW29Jak3r17S5K+++67Ws+7bNkyLV68WPv371dcXJwuueQS3XnnnWrXrp2GDx+u999/v1p7i8WiJUuWaNWqVfrpp59kt9sVHx+vXr16acKECbrsssvk51fx/1vjx4/Xli1bZDabG3Svy5cv17Rp06r+bDAYFBoaqujoaPXs2VOjR4/WFVdcocjIyBrvLSws1Lx587R69WplZWWpQ4cOuvLKK/X3v/9dcXFxNe6pvLxcDz74oN566y0dOXJE5eXluuqqq/TMM89Utfnpp5/01FNPadOmTcrKylJISIgSExOVmpqqiRMnVq2pAwAAvAOhDQAAAAAAgBdiTRsAAAAAAAAvRGgDAAAAAADghQhtAAAAAAAAvBChDQAAAAAAgBcitAEAAAAAAPBChDYAAAAAAABeiNAGAAAAAADACxHaAAAAAAAAeCFCGwAAAAAAAC9EaAMAAAAAAOCFCG0AAAAAAAC8EKENAAAAAACAF/p/FJJsJR2GbtoAAAAASUVORK5CYII="},"metadata":{}}],"execution_count":17,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"412c2f7f-a4d5-402b-ac2b-7b51e60e064d"},{"cell_type":"markdown","source":["#### Validate forecasted results and load the model."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"4c7dec16-72b7-447d-802f-dd72da9bc317"},{"cell_type":"code","source":["import numpy as np\n","import pandas as pd\n","import statsmodels.api as sm\n","import matplotlib.pyplot as plt\n","from sklearn.metrics import mean_absolute_error, mean_squared_error"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":4,"statement_ids":[4],"state":"finished","livy_statement_state":"available","session_id":"6fce11ce-2088-4da8-9a6d-87a0f8d9111b","normalized_state":"finished","queued_time":"2024-11-03T01:16:23.1937245Z","session_start_time":null,"execution_start_time":"2024-11-03T01:16:23.6174133Z","execution_finish_time":"2024-11-03T01:16:46.3815426Z","parent_msg_id":"fe34ebe0-9b2e-477b-89fa-3e2fa56f8b9d"},"text/plain":"StatementMeta(, 6fce11ce-2088-4da8-9a6d-87a0f8d9111b, 4, Finished, Available, Finished)"},"metadata":{}}],"execution_count":3,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"a4ab0d70-711b-4bdf-8013-53409b894aad"},{"cell_type":"code","source":["# Get the maximum date from the index\n","max_date = simulated_sales_df.index.max()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":21,"statement_ids":[21],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:12:14.7557645Z","session_start_time":null,"execution_start_time":"2024-11-02T23:12:15.1793216Z","execution_finish_time":"2024-11-02T23:12:15.5263214Z","parent_msg_id":"1055fe66-adc8-40bb-a161-caff66b687f8"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 21, Finished, Available, Finished)"},"metadata":{}}],"execution_count":19,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"f95f7b6f-9c14-43fd-a590-cf02471b0705"},{"cell_type":"code","source":["import pandas as pd\n","from statsmodels.tsa.statespace.sarimax import SARIMAX\n","\n","# Sample data creation (replace this with your actual DataFrame)\n","date_range = pd.date_range(start='2022-01-01', end='2024-12-01', freq='M')\n","sales_data = pd.DataFrame({'sales': range(len(date_range))}, index=date_range)\n","\n","# Define training and validation periods\n","train_end = '2023-12-31' # Last date for training (end of December)\n","validation_start = pd.Timestamp('2024-01-31') # Start of validation period (end of January)\n","validation_end = pd.Timestamp('2024-06-30') # End of validation period (end of June)\n","\n","# Ensure the index is a DatetimeIndex\n","if not isinstance(sales_data.index, pd.DatetimeIndex):\n"," print(\"The index is not a DatetimeIndex.\")\n","else:\n"," print(\"The index is a DatetimeIndex.\")\n","\n","# Fit the model (adjust the order parameters as needed)\n","model = SARIMAX(sales_data['sales'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))\n","results = model.fit(disp=False)\n","\n","# Check the fitted model\n","print(results.summary())\n","\n","# Get predictions for the validation period\n","try:\n"," print(\"\\nPASS\\n\")\n"," predictions = results.get_prediction(start=validation_start, end=validation_end, dynamic=False)\n"," predicted_values = predictions.predicted_mean\n"," print(\"Predicted Values:\")\n"," print(predicted_values)\n","except KeyError as e:\n"," print(f\"KeyError: {e}\")\n"," print(f\"Available index in the model: {sales_data.index}\")"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":22,"statement_ids":[22],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:12:24.7295456Z","session_start_time":null,"execution_start_time":"2024-11-02T23:12:25.240496Z","execution_finish_time":"2024-11-02T23:12:26.2918542Z","parent_msg_id":"490e57df-a45f-46be-b1b2-dc0f49b620b7"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 22, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["The index is a DatetimeIndex.\n SARIMAX Results \n==========================================================================================\nDep. Variable: sales No. Observations: 35\nModel: SARIMAX(1, 1, 1)x(1, 1, 1, 12) Log Likelihood 230.177\nDate: Sat, 02 Nov 2024 AIC -450.354\nTime: 23:12:25 BIC -444.899\nSample: 01-31-2022 HQIC -449.069\n - 11-30-2024 \nCovariance Type: opg \n==============================================================================\n coef std err z P>|z| [0.025 0.975]\n------------------------------------------------------------------------------\nar.L1 3.758e-06 1.87e-18 2e+12 0.000 3.76e-06 3.76e-06\nma.L1 -4.708e-10 1.87e-18 -2.51e+08 0.000 -4.71e-10 -4.71e-10\nar.S.L12 7.682e-14 3.52e-35 2.18e+21 0.000 7.68e-14 7.68e-14\nma.S.L12 -7.682e-14 2.92e-35 -2.63e+21 0.000 -7.68e-14 -7.68e-14\nsigma2 1.605e-11 4.92e-10 0.033 0.974 -9.48e-10 9.8e-10\n===================================================================================\nLjung-Box (L1) (Q): nan Jarque-Bera (JB): nan\nProb(Q): nan Prob(JB): nan\nHeteroskedasticity (H): nan Skew: nan\nProb(H) (two-sided): nan Kurtosis: nan\n===================================================================================\n\nWarnings:\n[1] Covariance matrix calculated using the outer product of gradients (complex-step).\n[2] Covariance matrix is singular or near-singular, with condition number inf. Standard errors may be unstable.\n\nPASS\n\nPredicted Values:\n2024-01-31 24.0\n2024-02-29 25.0\n2024-03-31 26.0\n2024-04-30 27.0\n2024-05-31 28.0\n2024-06-30 29.0\nFreq: M, Name: predicted_mean, dtype: float64\n"]},{"output_type":"stream","name":"stderr","text":["/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n warnings.warn(\"Maximum Likelihood optimization failed to \"\n"]}],"execution_count":20,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"e08c035b-2a37-4793-95b1-dc7bcf039fda"},{"cell_type":"code","source":["# Log the model and parameters\n","model_name = f\"{EXPERIMENT_NAME}-Sarimax\"\n","with mlflow.start_run(run_name=\"Sarimax\") as run:\n"," mlflow.statsmodels.log_model(results,model_name,registered_model_name=model_name)\n"," mlflow.log_params({\"order\":(0,1,1),\"seasonal_order\":(0, 1, 1, 12),'enforce_stationarity':False,'enforce_invertibility':False})\n"," model_uri = f\"runs:/{run.info.run_id}/{model_name}\"\n"," print(\"Model saved in run %s\" % run.info.run_id)\n"," print(f\"Model URI: {model_uri}\")\n","mlflow.end_run()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":23,"statement_ids":[23],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:12:31.4621724Z","session_start_time":null,"execution_start_time":"2024-11-02T23:12:32.0087068Z","execution_finish_time":"2024-11-02T23:12:52.5566216Z","parent_msg_id":"7e7962c1-3919-435b-8aea-c83bc663f222"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 23, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stderr","text":["2024-11-02:23:12:44,932 ERROR [shared_platform_utils.py:82] Create MLModel failed, status_code: 400, b'{\"requestId\":\"5065c1a6-0977-4fcd-a530-83c6ac92c01d\",\"errorCode\":\"ItemDisplayNameAlreadyInUse\",\"message\":\"Requested \\'orders-sales-forecast-Sarimax\\' is already in use\"}'\nRegistered model 'orders-sales-forecast-Sarimax' already exists. Creating a new version of this model...\n2024/11/02 23:12:49 INFO mlflow.store.model_registry.abstract_store: Waiting up to 300 seconds for model version to finish creation. Model name: orders-sales-forecast-Sarimax, version 5\nCreated version '5' of model 'orders-sales-forecast-Sarimax'.\n"]},{"output_type":"stream","name":"stdout","text":["Model saved in run 9afe4db1-5c3b-475a-96cd-1dca63a255ff\nModel URI: runs:/9afe4db1-5c3b-475a-96cd-1dca63a255ff/orders-sales-forecast-Sarimax\n"]},{"output_type":"display_data","data":{"application/vnd.mlflow.run-widget+json":{"info":{"artifact_uri":"sds://onelakemsit.pbidedicated.windows.net/3f4eeb28-7210-44e7-bd10-efcda197a9f7/9a6fa9c6-d583-4646-90be-948000a94098/9afe4db1-5c3b-475a-96cd-1dca63a255ff/artifacts","end_time":1730589170,"experiment_id":"6e249cc0-0384-4a0a-8c72-bad492a83d86","lifecycle_stage":"active","run_id":"9afe4db1-5c3b-475a-96cd-1dca63a255ff","run_name":"","run_uuid":"9afe4db1-5c3b-475a-96cd-1dca63a255ff","start_time":1730589152,"status":"FINISHED","user_id":"e83b0ff5-f802-4776-bae4-11fe73ba932a"},"data":{"metrics":{},"params":{"order":"(0, 1, 1)","seasonal_order":"(0, 1, 1, 12)","enforce_stationarity":"False","enforce_invertibility":"False"},"tags":{"mlflow.user":"1b884fa3-ac7e-44f0-a171-1f215a13ecd4","synapseml.notebook.artifactId":"4ef083b9-cbcc-4f39-a126-7c3611447a5d","synapseml.user.name":"Vindhya Banda","synapseml.user.id":"d7eaa3fc-8cbd-4cef-bc38-50830ac05ed0","synapseml.livy.id":"69bf9935-062b-4346-914c-f3056e2ebcc2","mlflow.runName":"Sarimax","synapseml.run.artifactJobId":"7f403eb5-f92c-4da7-b0ef-ebd8df4b1b59","mlflow.rootRunId":"9afe4db1-5c3b-475a-96cd-1dca63a255ff","synapseml.experimentName":"orders-sales-forecast","synapseml.experiment.artifactId":"9a6fa9c6-d583-4646-90be-948000a94098"}},"inputs":{"dataset_inputs":[]}}},"metadata":{}}],"execution_count":21,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"7f16653c-6f45-4993-85be-3a6179bb3401"},{"cell_type":"code","source":["# Load the saved model\n","loaded_model = mlflow.statsmodels.load_model(model_uri)"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":24,"statement_ids":[24],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:12:55.4569138Z","session_start_time":null,"execution_start_time":"2024-11-02T23:12:55.9034108Z","execution_finish_time":"2024-11-02T23:12:58.9442392Z","parent_msg_id":"a38ab591-3bb5-4746-abda-a6a64b11855f"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 24, Finished, Available, Finished)"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"Downloading artifacts: 0%| | 0/9 [00:00 0:\n"," # Calculate the Mean Absolute Percentage Error (MAPE)\n"," mape = mean_absolute_percentage_error(valid_rows['Actual_Sales_x'], valid_rows['Forecasted_Sales']) * 100\n","\n"," # Assign MAPE back to final_data or create a new column\n"," final_data['MAPE'] = np.nan # Initialize MAPE column with NaN\n"," final_data.loc[valid_rows.index, 'MAPE'] = mape # Assign calculated MAPE to valid rows\n","else:\n"," print(\"No valid data available for MAPE calculation.\")\n"," final_data['MAPE'] = np.nan # Ensure MAPE column remains NaN where no valid data exists\n"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":31,"statement_ids":[31],"state":"finished","livy_statement_state":"available","session_id":"69bf9935-062b-4346-914c-f3056e2ebcc2","normalized_state":"finished","queued_time":"2024-11-02T23:14:37.0981562Z","session_start_time":null,"execution_start_time":"2024-11-02T23:14:37.5513296Z","execution_finish_time":"2024-11-02T23:14:37.9412798Z","parent_msg_id":"b699fea2-f925-4e1f-bd13-2ded61198aea"},"text/plain":"StatementMeta(, 69bf9935-062b-4346-914c-f3056e2ebcc2, 31, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Number of valid rows for MAPE calculation: 0\nNo valid data available for MAPE calculation.\n"]}],"execution_count":28,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"0a5eed96-a4b9-49c5-83d2-09eab6134195"},{"cell_type":"markdown","source":["## Case 2: Forecasting sales for a specific product in a particular region."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"749733a2-61f1-41c4-9f9d-3de44bd5e6b8"},{"cell_type":"markdown","source":["Forecasting the sales of eggs in the Chicago. We have the daily sales data for Eggs in Chicago, with each date showing the total sales amount in dollars. Some dates may show zero sales, which could indicate days with no orders for Eggs."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"e4f86c82-5647-4c95-9fa6-8015ed03ec07"},{"cell_type":"markdown","source":["### Import required libraries"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"009a32a6-7576-40f2-b9d9-c5a1d85f2e06"},{"cell_type":"code","source":["import pandas as pd\n","import json\n","from prophet import Prophet\n","import warnings\n","import itertools\n","import numpy as np\n","import matplotlib.pyplot as plt\n","warnings.filterwarnings(\"ignore\")\n","plt.style.use('fivethirtyeight')\n","import pandas as pd\n","import statsmodels.api as sm\n","import matplotlib\n","matplotlib.rcParams['axes.labelsize'] = 14\n","matplotlib.rcParams['xtick.labelsize'] = 12\n","matplotlib.rcParams['ytick.labelsize'] = 12\n","matplotlib.rcParams['text.color'] = 'k'\n","from sklearn.metrics import mean_absolute_percentage_error\n","from datetime import timedelta"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":4,"statement_ids":[4],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:19:58.4648686Z","session_start_time":null,"execution_start_time":"2024-11-05T03:19:59.0539178Z","execution_finish_time":"2024-11-05T03:20:15.3592152Z","parent_msg_id":"1ae553f7-0c03-47e5-956d-0c4a45da2509"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 4, Finished, Available, Finished)"},"metadata":{}}],"execution_count":2,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"10de6dbf-47e6-415d-93b4-5cdb5b1440e2"},{"cell_type":"markdown","source":["### Load the data"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"d8c94611-3236-40d5-8450-176e557f3537"},{"cell_type":"code","source":["# Read from Kusto\n","ordersQuery = \"['orders'] | mv-expand li = parse_json(line_items) | project order_date, store_id, order_id, product_id = toint(li.product_id), quantity = toint(li.quantity), price = toreal(li.price), item_total = toreal(li.item_total), order_total\"\n","inventoryQuery = \"['inventory'] | project date_time, store_id, product_id, in_stock, retail_price\"\n","productsQuery = \"['products'] | project product_id, name, category, photo_path, price_range, stock\"\n","\n","kustoUri = \"https://trd-g8jnmstet4k7q79z9v.z1.kusto.fabric.microsoft.com\"\n","database = \"contosohypermarket\"\n","accessToken = mssparkutils.credentials.getToken(kustoUri)\n","\n","orders_df = spark.read\\\n"," .format(\"com.microsoft.kusto.spark.synapse.datasource\")\\\n"," .option(\"accessToken\", accessToken)\\\n"," .option(\"kustoCluster\", kustoUri)\\\n"," .option(\"kustoDatabase\", database)\\\n"," .option(\"kustoQuery\", ordersQuery).load()\n","\n","inventory_df = spark.read\\\n"," .format(\"com.microsoft.kusto.spark.synapse.datasource\")\\\n"," .option(\"accessToken\", accessToken)\\\n"," .option(\"kustoCluster\", kustoUri)\\\n"," .option(\"kustoDatabase\", database)\\\n"," .option(\"kustoQuery\", inventoryQuery).load()\n","\n","products_df = spark.read\\\n"," .format(\"com.microsoft.kusto.spark.synapse.datasource\")\\\n"," .option(\"accessToken\", accessToken)\\\n"," .option(\"kustoCluster\", kustoUri)\\\n"," .option(\"kustoDatabase\", database)\\\n"," .option(\"kustoQuery\", productsQuery).load()\n","\n","# Convert Spark DataFrames to Pandas DataFrames\n","orders_df = orders_df.toPandas()\n","products_df = products_df.toPandas()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":5,"statement_ids":[5],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:20:18.0228977Z","session_start_time":null,"execution_start_time":"2024-11-05T03:20:18.4875288Z","execution_finish_time":"2024-11-05T03:20:45.9496343Z","parent_msg_id":"bee9a4cd-0829-447f-a25f-46c365a1c73e"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 5, Finished, Available, Finished)"},"metadata":{}}],"execution_count":3,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"48b39ec1-4daf-4756-b6da-95e5c1b6ef5a"},{"cell_type":"markdown","source":["### Data Preprocessing"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"007f637a-5e3c-4ece-84d2-5162990100e8"},{"cell_type":"code","source":["# Filter the inventory for the Chicago region and convert to Pandas DataFrame\n","chicago_inventory = inventory_df[inventory_df['store_id'] == 'CHI'].toPandas()\n","\n","# Merge inventory with products to get product names\n","chicago_inventory_with_names = pd.merge(chicago_inventory, products_df[['product_id', 'name']], on='product_id')\n","\n","# Find the product with the maximum stock\n","max_stock_product = chicago_inventory_with_names.loc[chicago_inventory_with_names['in_stock'].idxmax()]\n","\n","# Display the product name and stock quantity\n","print(\"Product with the highest stock in Chicago:\")\n","print(f\"Product: {max_stock_product['name']}, Stock: {max_stock_product['in_stock']}\")"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":6,"statement_ids":[6],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:20:49.3226112Z","session_start_time":null,"execution_start_time":"2024-11-05T03:20:49.878258Z","execution_finish_time":"2024-11-05T03:20:57.0553621Z","parent_msg_id":"ca0e9f45-5fe3-49d2-8ab4-2569182171c9"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 6, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Product with the highest stock in Chicago:\nProduct: Strawberry, Stock: 10000\n"]}],"execution_count":4,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"bd96b363-5b96-45f6-b946-b3adc0cff117"},{"cell_type":"code","source":["# Check column names\n","print(\"Orders DataFrame columns:\", orders_df.columns)\n","print(\"Products DataFrame columns:\", products_df.columns)\n","\n","# Merge orders with products to get product details\n","merged_df = pd.merge(orders_df, products_df, on='product_id')\n","\n","# Check merged DataFrame columns\n","print(\"Merged DataFrame columns:\", merged_df.columns)\n","\n","# Filter data for Eggs in Chicago\n","product_name = 'Strawberry'\n","region = 'CHI'\n","filtered_df = merged_df[(merged_df['name'] == product_name) & (merged_df['store_id'] == region)]\n","\n","# Check if filtered_df is empty\n","if filtered_df.empty:\n"," raise ValueError(f\"No data found for product '{product_name}' in region '{region}'.\")"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":7,"statement_ids":[7],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:20:59.9397675Z","session_start_time":null,"execution_start_time":"2024-11-05T03:21:00.3349123Z","execution_finish_time":"2024-11-05T03:21:00.7159952Z","parent_msg_id":"051aa189-200a-4e53-8b37-6ba3906cb428"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 7, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Orders DataFrame columns: Index(['order_date', 'store_id', 'order_id', 'product_id', 'quantity', 'price',\n 'item_total', 'order_total'],\n dtype='object')\nProducts DataFrame columns: Index(['product_id', 'name', 'category', 'photo_path', 'price_range', 'stock'], dtype='object')\nMerged DataFrame columns: Index(['order_date', 'store_id', 'order_id', 'product_id', 'quantity', 'price',\n 'item_total', 'order_total', 'name', 'category', 'photo_path',\n 'price_range', 'stock'],\n dtype='object')\n"]}],"execution_count":5,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"c0aef7db-4f2b-4a8a-9fa8-e87886f3988e"},{"cell_type":"markdown","source":["### Sales Forecasting"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"265401a2-2ff9-4384-a0ca-217b04fd6f63"},{"cell_type":"code","source":["# Prepare data for Prophet\n","sales_data = filtered_df.groupby('order_date').agg({'quantity': 'sum'}).reset_index()\n","sales_data.columns = ['ds', 'y']\n","\n","# Check the sales_data DataFrame\n","print(sales_data.head())\n","print(sales_data.info())\n","\n","# Handle missing values\n","sales_data = sales_data.dropna()\n","\n","# Ensure there are at least 2 non-NaN rows\n","if sales_data.shape[0] < 2:\n"," raise ValueError('Insufficient data for forecasting. Please ensure there are at least 2 non-NaN rows.')\n","\n","# Fit the model\n","model = Prophet()\n","model.fit(sales_data)\n","\n","# Make future predictions\n","future = model.make_future_dataframe(periods=30) # Forecast for the next 30 days\n","forecast = model.predict(future)"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":8,"statement_ids":[8],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:21:05.2381158Z","session_start_time":null,"execution_start_time":"2024-11-05T03:21:05.6450507Z","execution_finish_time":"2024-11-05T03:21:06.6439494Z","parent_msg_id":"2923ae4a-d877-4037-aff8-fa3938a0bad5"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 8, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":[" ds y\n0 2024-09-26 13:21:01.705 4\n1 2024-09-26 13:22:01.964 8\n2 2024-09-26 13:23:02.225 2\n3 2024-09-26 13:25:02.748 5\n4 2024-09-26 13:27:03.110 5\n\nRangeIndex: 777 entries, 0 to 776\nData columns (total 2 columns):\n # Column Non-Null Count Dtype \n--- ------ -------------- ----- \n 0 ds 777 non-null datetime64[us]\n 1 y 777 non-null int32 \ndtypes: datetime64[us](1), int32(1)\nmemory usage: 9.2 KB\nNone\nDisabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.\ninput tempfile: /tmp/tmpcnr8w6eh/35f5m6b4.json\ninput tempfile: /tmp/tmpcnr8w6eh/jneh1p9t.json\nidx 0\nrunning CmdStan, num_threads: None\nCmdStan args: ['/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/prophet/stan_model/prophet_model.bin', 'random', 'seed=91172', 'data', 'file=/tmp/tmpcnr8w6eh/35f5m6b4.json', 'init=/tmp/tmpcnr8w6eh/jneh1p9t.json', 'output', 'file=/tmp/tmpcnr8w6eh/prophet_modellra6azuw/prophet_model-20241105032105.csv', 'method=optimize', 'algorithm=lbfgs', 'iter=10000']\nChain [1] start processing\nChain [1] done processing\n"]},{"output_type":"stream","name":"stderr","text":["03:21:05 - cmdstanpy - INFO - Chain [1] start processing\n03:21:06 - cmdstanpy - INFO - Chain [1] done processing\n"]}],"execution_count":6,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"b9ff1f2f-69ed-44e7-9ef1-0a66acbb257e"},{"cell_type":"code","source":["# Filter orders for 'Strawberry' in Chicago ('CHI')\n","product_name = 'Strawberry'\n","product_id = products_df[products_df['name'] == product_name].iloc[0]['product_id']\n","filtered_sales_df = orders_df[\n"," (orders_df['product_id'] == product_id) & \n"," (orders_df['store_id'] == 'CHI')\n","]\n","\n","# Aggregate daily sales for the specific product and store\n","actual_sales = filtered_sales_df.groupby('order_date')['quantity'].sum().reset_index()\n","actual_sales.rename(columns={'order_date': 'ds', 'quantity': 'y'}, inplace=True)\n","actual_sales['ds'] = pd.to_datetime(actual_sales['ds'])\n","\n","# Fill in missing dates with zero sales to create a continuous time series\n","date_range = pd.date_range(start=actual_sales['ds'].min(), end=actual_sales['ds'].max(), freq='D')\n","actual_sales = actual_sales.set_index('ds').reindex(date_range, fill_value=0).rename_axis('ds').reset_index()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":9,"statement_ids":[9],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:21:10.347817Z","session_start_time":null,"execution_start_time":"2024-11-05T03:21:10.8112399Z","execution_finish_time":"2024-11-05T03:21:11.1673416Z","parent_msg_id":"d43d268a-df8d-48cf-93ce-591bf18cde66"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 9, Finished, Available, Finished)"},"metadata":{}}],"execution_count":7,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"da702183-cfbc-4251-8509-7f775328135a"},{"cell_type":"markdown","source":["### Plot forecasted data"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"5eaccb9b-a8af-4304-bed6-675dca98be9c"},{"cell_type":"code","source":["# Plot the forecasted data\n","fig = model.plot(forecast)\n","plt.title('Sales Forecast')\n","plt.xlabel('Date')\n","plt.ylabel('Sales Quantity')\n","plt.show()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":10,"statement_ids":[10],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:21:14.0267751Z","session_start_time":null,"execution_start_time":"2024-11-05T03:21:14.4240392Z","execution_finish_time":"2024-11-05T03:21:15.4680752Z","parent_msg_id":"fd19c285-b769-418f-b931-b86049925b12"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 10, Finished, Available, Finished)"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"iVBORw0KGgoAAAANSUhEUgAAA9IAAAJgCAYAAABm5lsUAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAADdjElEQVR4nOzdeXwU5eE/8M/M7JXdzX0nQCAcIqcIeFa5FP164VXPimJBrfanULVSQZTWq60UWq1txRbF9qui9ap+tZ6gtioocotCQgLkvpO953h+f4REQu5kk51NPu/XKy/I7Mzsk3022fnMc0lCCAEiIiIiIiIi6hI50gUgIiIiIiIiiiYM0kRERERERETdwCBNRERERERE1A0M0kRERERERETdwCBNRERERERE1A0M0kRERERERETdwCBNRERERERE1A0M0kRERERERETdwCBNRERERERE1A0M0kRERB244YYbIEkShg8fHumiEBERkUkwSBMRkWn5fD48/fTTuOCCCzB06FDExMTA5XJh+PDhOOmkk3DjjTfi2WefRUFBQaSLamqSJHX5a+bMmZEuLhERkelZIl0AIiKitnzxxRe46qqr2gzJhYWFKCwsxJYtW7Bu3ToAgN/vh8Ph6OdSEoXX8OHDUVhYiOuvvx7PPPNMpItDRETtYJAmIiLT2bdvH+bOnYv6+noAwPnnn48f/vCHOO644+BwOFBdXY0dO3Zg48aNePfdd+H3+yNc4ugwbdq05hsP7XG5XP1UGiIioujFIE1ERKazbNmy5hD99NNP48c//nGrfWbPno3Fixejvr4ezzzzDBRF6e9iRh2Xy4UJEyZEuhhERERRj0GaiIhMRdd1vPnmmwAaW1DbCtFHi4uLw+23394fRSMiIiICwMnGiIjIZCoqKpq7ao8cObJX5zIMAx9++CHuuusunH766UhJSYHVakVCQgJOOOEE3HXXXTh48GA4io1AIIAnnngCZ511FjIyMmCz2ZCamopZs2bhiSeeQDAY7PD4r7/+GosWLcLYsWPhdrtht9uRnZ2NKVOmYOHChdiwYUOn5+hLn3/+OW644Qbk5ubC6XQiLi4OEyZMwM9+9rMOX8OCgoLmicyaxvy+9tpruPDCC5GdnQ2LxYITTjih1XElJSVYvnw5pk2bhqSkpObX49JLL8Ubb7zRpTL7fD784Q9/wNy5c5GVlQW73Y709HRMnToVt99+Oz799FMIIdr8WZcvX46ZM2c212VcXBzGjRuHn/zkJ9izZ0+nz71//34sXrwYkyZNQmxsLGw2GzIzMzFp0iRce+21WL9+PRoaGpr3nzlzJiRJQmFhIQDg2Wef5URwRERmJoiIiEykurpaABAAxKRJk3p1rvvvv7/5XO19OZ1O8corr7R7juuvv14AEDk5Oe3u89VXX4lhw4Z1+Dxjx44V+/fvb/P43//+90KW5U7L+s033/TodWg6fsaMGd0+1jAMsXjx4g7L5XA4xHPPPdfm8QcOHGje729/+5u44YYbWh0/efLkFsc888wzwul0dvic8+bNEx6Pp91yb9q0SWRkZHT6mh44cKDFcevWrev0GEVRxB//+Md2n/vll18Wdru90/O8/fbbzcfMmDGj0/17Un9ERNQ32LWbiIhMJTExEcOHD0dBQQF27NiBhx9+GEuXLoUsd78TlaZpyMzMxCWXXIJTTz0Vubm5cDgcOHToEP773//iySefhMfjwTXXXIOtW7fi+OOP7/Zz7NmzBzNmzIDH44HL5cJPfvITnHrqqRg2bBjq6+vxzjvv4IknnsDevXtx7rnn4ssvv0R8fHzz8Tt27MCSJUtgGAaGDx+O2267DVOmTEFycjK8Xi/27duHTZs24fXXX+922cJh2bJlWLNmDQBgyJAhWLp0KaZPn45gMIh3330Xq1atgt/vx/z585GYmIjzzz+/3XOtWbMGO3bswGmnnYZbb70Vxx13HBoaGrB3797mfZ599lnccMMNAIChQ4fi//2//4fx48cjIyMDRUVF+N///V+88MILeP3117FgwQJs2LCh1fP85z//wVlnnQVVVSHLMq666ipceumlGD58OFRVxXfffYd3330Xr732WqtjNU1DYmIiLrroIsyYMQOjR4+Gy+VCcXExtm7dij/84Q+orKzET3/6U4wdOxazZ89ucXxZWRmuv/56BINBpKam4tZbb8Vpp52G1NRUBAIB5Ofn4z//+U+r5163bh28Xi/OOeccFBcXY968eXjwwQdb7MOJ4IiITCTSSZ6IiOhYq1evbtESN2zYMPHTn/5U/O///q/Yt2+fMAyjS+c5cOCACIVC7T5+6NAhkZ2dLQCIH/3oR23u01GLtGEYYvLkyQKAGD9+vCgpKWnzHFu2bGluYV2+fHmLx+677z4BQLhcrnaPF0IIr9cr/H5/u493pOl1nDZtmti5c2e7X99++22L43bt2tXcUj569GhRUVHR6tybN29u/tkyMzNFIBBo8fjRLdIAxDXXXCN0XW+znIcOHWo+19VXXy2CwWCb+z355JPN53v//fdbPBYIBMTQoUMFAGG328W///3vdl+XyspK4fP5Wmw7fPiw8Hq97R5TW1srJk2aJACIH/zgB60e/+tf/9pcth07drR7nlAoJOrr61ttz8nJEQDE9ddf3+6xREQUeQzSRERkOoZhiJtuuqndLq4pKSni0ksvFS+++KJQVbVXz7VmzRoBQMTFxbUZ0DsK0m+++WZzmTZv3tzh89x9990CgMjKymqxfdGiRQKAmDJlSq9+jo609zoe+3Xsz3jrrbc2P/bhhx+2e/5f/vKXzfv9/e9/b/HY0UE6Pj5e1NXVtXueu+66SwAQqampHYZZIYSYPn16czA/2tq1a5uf79FHH+3wHD312muvNT9HZWVli8ceeughAUAkJib26NwM0kRE0YGTjRERkelIkoS//OUv+OCDD3DBBRfAarW2eLyyshKvvPIKrrzySkycOBFff/11l85bX1+PAwcOYPfu3di1axd27doFp9PZ4rHuaOqem5OTg+nTp3e475lnngkAKC4ubjE5V1ZWFoDGLuKbN2/u1vP3tffeew8AkJubi1mzZrW736JFi1od05YLL7wQcXFx7T7e9Hqed955zfXSnqbX87PPPmuxvWnGd7vdjp/85CcdnqMrvF4vCgoKWrxnjn4/bt++vcX+TfVZU1MTse74RETU9zhGmoiITGv27NmYPXs2PB4PPvvsM2zevBlfffUVPv74Y1RVVQEA9u7dixkzZuCzzz7D+PHjW52joKAAq1atwhtvvNHpDN2VlZXIzc3tcvm+/PJLAEBhYSEkSerycaWlpRg2bBgA4Oqrr8YjjzyCYDCI008/Heeccw7OO+88/OAHP8CECRN6NDa8PTNmzMDGjRu7tG8wGMS+ffsAAKecckqH+2ZkZDSPa9+5c2e7+02ePLndx+rq6rB//34AjeOkn3322S6Vs7S0tMX3W7dubX6ujkJ7RyorK7Fq1Sq88sor2LdvX5szex+979EuuugiJCYmoqamBpdccglmzJiBCy+8EGeccQamTJkCi4WXXkREAwFbpImIyPTcbjfOPvtsLFu2DK+88gpKS0vxz3/+E0OGDAEANDQ0YPHixa2Oe/vttzF+/Hg88cQTXVrmqmnZra4qLy/v1v5NfD5f8/+PO+44bNiwAcnJydA0DW+99RZuu+02TJ48GSkpKbjiiivwzjvv9Oh5eqOmpqb5/2lpaZ3un5GRAQCorq5ud5/ExMR2H+vpa3lsnVVUVAAAMjMze3S+r776CmPHjsWjjz6K7777rsMQ3dbzJyUl4c0338SwYcMghMDGjRtx55134qSTTkJCQgIuuOACbNiwAYZh9Kh8RERkDrwtSkREUcdiseDSSy/F6NGjMW3aNIRCIXz44Yeorq5GUlISAKCqqgrXXHMNfD4f3G437rrrLpxzzjkYOXIk4uPjYbPZAAAffvgh5syZAwCdhqZj6boOADj55JPx9NNPd/m4ESNGtPh+3rx5mD17Nl566SW88847+OSTT1BaWoqamhq89NJLeOmll3Deeefh5ZdfRkxMTLfKGA5daW3vymunKEq7jzW9lgDw05/+FDfffHPXCteO7vQQaBIKhXDFFVegqqoKVqsV/+///T/MmzcPY8aMQWJiIux2OwAgPz+/eY3ztn7u0047Dd999x1ee+01vPnmm/jkk09QWFgIr9eLt956C2+99RZOOukkvPnmm0hNTe3Vz0lERJHBIE1ERFFr4sSJOPnkk/HJJ5/AMAzk5eU1B+mXXnoJtbW1AIBXX30VZ511Vpvn6KgFtTMpKSkoKytDWVkZJkyY0OPzAEBsbCxuvPFG3HjjjQCAffv24c0338QTTzyB/Px8/N///R+WLVuG3/3ud716nq46uvW4rKys0/2b9ml6/bsrJSWl+f8ej6fHr2dKSgoOHz6M4uLibh/74YcfIj8/HwDw5JNPYuHChW3u15X3jN1ux5VXXokrr7wSAHDo0CG8/fbbePLJJ7F9+3Zs3rwZN998M1555ZVul5OIiCKPXbuJiCiqNU3uBKDFeOLdu3cDaAx27YVo4Ptxzj0xZcoUAI3jsL/77rsen6cto0ePxpIlS/Dll18iPT0dANpcM7mv2O12jB49GgA6nQStrKwMBQUFABpvbvRESkoKhg4dCgB4//33e9z1eerUqQCAbdu2ob6+vlvHNr1nADQH4Lb05D0zdOhQ3HTTTdi8eXPzTYJ//etfrbqG96QlnYiI+h+DNBERRS0hBL766isAjQEkJyen+TFN0wAAgUCg3VDm8/nw3HPP9fj5L7744ub/P/LIIz0+T0cSExNx4oknAmg9sVVfO/vsswEA+/fvx8cff9zufkd3a286pifmzZsHADh8+HCP6+XCCy8E0NhN+8knn+zWsU3vGaBxtu62GIaBtWvX9qhsAGCz2XDGGWc0P19dXV2Lxx0OB4DGyd6IiMi8GKSJiMhUPB4PTjrpJLzxxhstxs225f7772+e6fmMM85o0T24qTXV5/O12ZKr6zoWLlzYoy7ATS655JLm1sVnnnkGf/jDHzrc/8CBA3j++edbbHv11VdbTOx1rOrq6uabBceOre5rt956a3Mr/y233NJmObdu3dp8EyEzMxOXX355j5/v7rvvbh4Dfvvtt+PTTz/tcP9PP/0UmzZtarHtRz/6UfMkdCtXrsS7777b7vFVVVUtWoSb3jNAY3225Re/+EXzzOBteeeddzp8TwUCAXzyyScAGrvzH/2eBb6fJC0vL6/dcxARUeRxjDQREZnOli1bMG/ePGRmZmLevHk49dRTMWLECMTFxaGhoQE7duzAc889h88//xxAYzfkVatWtTjHFVdcgXvvvRfBYBALFizA9u3bcdZZZyE+Ph67d+/G448/jq+++gqnn346/vOf//SonLIsY8OGDTj11FNRV1eHO+64A6+++iquu+46jBs3DjabDVVVVdixYwfeeecdfPjhh7jkkktw9dVXN5/j97//Pa699lqcd955mD17No4//ngkJiairq4O27dvxxNPPNE8o/Wtt97aw1e0Z8aPH4977rkHjzzyCL755htMmTIF99xzD6ZNm4ZgMIh3330Xq1atgs/ngyRJWLt2bfOEXD0xbNgwPP300/jRj36E+vp6zJo1C1dffTXmzZuH4cOHwzAMlJSU4KuvvsKrr76KnTt34vHHH8eMGTOaz2G32/GPf/wDc+bMQSAQwP/8z//g6quvxmWXXYacnByoqor9+/fjvffew8svv4xdu3Zh+PDhAIBzzjkHaWlpKC8vx/Lly1FYWIiLL74YKSkp2L9/P9auXYsPPvigw/fMCy+8gIsuughz5szBOeecgwkTJiA5ORlerxd79+7Fn/70J+zatQtA4/rbxy6Hddppp+Gjjz7Cli1b8Oijj+J//ud/4HK5AAAxMTHIzs7u8etLRERhJIiIiEzE7/eLjIwMAaBLX0OGDBEffPBBm+f629/+JmRZbvfYK6+8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on2uWtu3b5+w2+3ixRdfjClIp3q/aJoW/P7RRx9t8wXi+PHjwmKxiJtuuilk+/333y8kSRKfffZZh+fauHGjACD+9re/hWyfOnWqKC4uFqqqxtyutrBfuqZfnE6nuPDCC0OOc7vdwuFwiCuuuKLDc7Ffou8XXdeDj+2bb77pMEhnZGRE/ThOx36Jvl+ifa5UVRXHjx8PO3bdunUCgPjLX/4St3OxX6J/rr7++muhKIq49dZbQ47929/+JgCIp59+Om7nSvV+Of3Y4cOHxxwMYnl/4etY9/VLtO8vfB1Lzn6Jx+tYIiR0andBQUHYNrvdjmHDhuGrr74CAKiqig0bNmDmzJnIysoKHldSUoLJkydj/fr1wW29evWKWE173LhxaGpqQnV1ddi+hx56CNXV1bj//vtjanss7Xr33XfRu3dvVFRUhNzHZZddhsbGRmzatKnD80XzXJ3upptuwtSpUzF9+vRoH1bU50rWfgHQbnW91jZt2oTm5mbccMMNIdtvuOEGCCHw0ksvdXgf69evh91ux9VXXx12H4cOHcL27dtjbldb2C9d0y9GoxEOhyPkOIvFEvzqCPsl+n7pzhUP2C/R90u07y+KoiAvLy/s2HHjxgFAm+9FsZ6L/eIXbb9s27YNmqbhu9/9bsixl112GQDghRdeiMu50qFfYj02kljeX84U+yV60b6/8HUsOfslHq9jiZB060jX1dVh586dGD58OACgqqoKbrcb5eXlYceWl5djz549aG5ubvc+N2/ejPz8/LBf/P/85z+477778OSTT8Jut8fUzlja5fV6YTabw44LbPv4449jOnfA6c9Va7///e/x3nvv4YknnujUfXd0rmTtl1h8+umnAICzzz47ZHtRURF69eoV3N/RfQwdOhQGgyFke+B5ieY+zgT7pe37iLZfFixYgE2bNuEPf/gDampqcPjwYfz0pz9FXV0dbrvttk49BvZLfLjdbhQWFkJRFPTp0we33HJLxA8U0WK/RK+995fTvfXWWwAQ1bHRnIv90rZI/eL1egEg7HOG0WiEJElx+4yRDv0SD7G+7/N1LDXwdSyxuup1rKsZOj6ke82fPx+NjY34xS9+AQA4ceIEACA3Nzfs2NzcXAghUFNTg6Kiooj39/vf/x5btmzBqlWroChKcLuu6/jRj36EGTNmhP31IxqxtGvYsGF44403cPDg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SkoAANdffz0A4O2338acOXOCATo7Ozt4jqqqKkyaNAkulwvf/va3cdVVV+HYsWN44YUX8Nprr+HNN9/E+PHju/mRExERxReDNBERUQ8yceJErF69Gu+//z4AYOjQoTh8+DByc3NDjtu8eTMuvvhi3HfffXjmmWcA+IP0/v378fbbb+P666/HpEmTwu6/srISR44cwWuvvYapU6cGt99zzz0YM2YM5s6di48//rjrHiAREVE34NRuIiKiHqS4uBgAcPz4cQCAw+EIC9GAf+r28OHD8cYbb0R937t27cK///1vzJkzJyREA/7R8Llz5+KTTz7hFG8iIkp5HJEmIiLqQYQQYdu2bNmClStXYvv27Th+/DhUVQ3uM5lMUd/3tm3bAABHjhyJWPBs9+7dwf+PGDEixpYTERElDwZpIiKiHuTw4cMAgPz8fADAunXrcM0118But2PatGno378/bDYbJEnCn/70Jxw4cCDq+66urgYAbNy4ERs3bmzzuMbGxjN4BERERInHIE1ERNSDbNmyBQAwduxYAMDSpUthsViwY8cODBo0KOTY5557Lqb7zsrKAgA8/vjjuOWWW868sUREREmK10gTERH1EF988QX+/ve/w2w2Y/r06QD8VbaHDh0aFqIPHToUtvwVACiKAgDQNC1sX6Aa99atW+PddCIioqTCIE1ERNQDvPPOO5g2bRo8Hg/uvvtuOJ1OAEBJSQn27NmDo0ePBo9tbm7GzTffHHKtdECgMNnXX38dtm/cuHEYP3481qxZg7Vr14bt13Udb7/9drweEhERUcJIIlLVESIiIkop+/fvx4ABA1BWVoYf/OAHAACv14tjx45h+/bt+PTTT6EoCu6++2788pe/hCRJAIAnnngCt956K4qKijBr1iyoqop//vOfEELAbrfjo48+CilQ9p///AcjRoxAcXExfvjDH8LhcMDhcODmm28GAOzbtw+TJ0/GgQMHcO6556KiogIWiwUHDx7E1q1b8c0336C5ubn7nyAiIqI4YpAmIiJKA4Eg3ZrVakV2djaGDBmCCy+8EHPmzEFZWVnIMUIIPP3003j88cdRVVWF7OxsXHrppXjggQcwe/ZsvP3222GVvv/85z9j+fLl+OKLL+DxeFBSUoL9+/cH99fU1ODXv/41XnrpJVRVVUFRFBQVFWHs2LGYNWtWcFo5ERFRqmKQJiIiIiIiIooBr5EmIiIiIiIiigGDNBEREREREVEMGKSJiIiIiIiIYsAgTURERERERBQDBmkiIiIiIiKiGDBIExEREREREcWAQZqIiIiIiIgoBgzSRERERERERDFgkCYiIiIiIiKKAYM0ERERERERUQwYpImIiIiIiIhiwCBNREREREREFAMGaSIiIiIiIqIY/H9w+WMoB2oSGAAAAABJRU5ErkJggg=="},"metadata":{}}],"execution_count":8,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"a0fb27bb-f6f1-4c8a-bb35-35c2d56e3e34"},{"cell_type":"markdown","source":["### Scoring the model for accuracy"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"f48c2e1b-54f6-401a-81d3-3c6cfe2ef4ac"},{"cell_type":"code","source":["import pandas as pd\n","from sklearn.metrics import mean_absolute_error, mean_absolute_percentage_error\n","\n","# Rename actual DataFrame\n","actual = sales_data.rename(columns={'y': 'actual'})\n","\n","# Prepare forecasted DataFrame\n","forecasted = forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].rename(columns={'yhat': 'forecasted', 'yhat_lower': 'forecasted_lower', 'yhat_upper': 'forecasted_upper'})\n","\n","# Convert 'ds' in both DataFrames to datetime\n","actual['ds'] = pd.to_datetime(actual['ds'])\n","forecasted['ds'] = pd.to_datetime(forecasted['ds'])\n","\n","# Standardize to nanoseconds precision\n","actual['ds'] = actual['ds'].dt.floor('ns') # Convert to nanoseconds\n","forecasted['ds'] = forecasted['ds'].dt.floor('ns') # Keep as nanoseconds\n","\n","# Check column names and dtypes\n","print(\"Actual DataFrame columns:\", actual.columns)\n","print(\"Forecasted DataFrame columns:\", forecasted.columns)\n","print(\"Actual ds dtype:\", actual['ds'].dtype)\n","print(\"Forecasted ds dtype:\", forecasted['ds'].dtype)\n","\n","# Merge dataframes on 'ds'\n","merged = actual.merge(forecasted, on='ds', how='inner')\n","\n","# Calculate accuracy metrics\n","mae = mean_absolute_error(merged['actual'], merged['forecasted'])\n","mape = mean_absolute_percentage_error(merged['actual'], merged['forecasted'])\n","\n","print(f'Mean Absolute Error (MAE): {mae}')\n","print(f'Mean Absolute Percentage Error (MAPE): {mape}')"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":11,"statement_ids":[11],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:21:21.2700181Z","session_start_time":null,"execution_start_time":"2024-11-05T03:21:21.6990947Z","execution_finish_time":"2024-11-05T03:21:22.1023814Z","parent_msg_id":"64a298a1-f93d-4608-ae7e-9851e6e1258d"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 11, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Actual DataFrame columns: Index(['ds', 'actual'], dtype='object')\nForecasted DataFrame columns: Index(['ds', 'forecasted', 'forecasted_lower', 'forecasted_upper'], dtype='object')\nActual ds dtype: datetime64[us]\nForecasted ds dtype: datetime64[ns]\nMean Absolute Error (MAE): 16.135472447036864\nMean Absolute Percentage Error (MAPE): 2.2703632900055903\n"]}],"execution_count":9,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"e1418afd-a3c4-455d-816a-e170a3b06891"},{"cell_type":"markdown","source":["### Calculating forecasted data"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"6d5390e8-e8d5-4dfa-919a-68751079dcd8"},{"cell_type":"code","source":["forecast[['ds', 'yhat']].to_csv('forecast.csv', index=False)"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":12,"statement_ids":[12],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:21:30.9470509Z","session_start_time":null,"execution_start_time":"2024-11-05T03:21:31.3580641Z","execution_finish_time":"2024-11-05T03:21:31.7391434Z","parent_msg_id":"8635c807-cc9a-461e-89f3-e752c7f5de22"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 12, Finished, Available, Finished)"},"metadata":{}}],"execution_count":10,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"4bf2e2e3-fc56-485e-a5a4-4234d88dbc93"},{"cell_type":"markdown","source":["##### Preparing actual and forecasted data"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"80a0aaf6-d7bc-44a0-b38b-ee8d0ef97c0f"},{"cell_type":"code","source":["# Filter orders for 'Strawberry' in Chicago ('CHI')\n","product_name = 'Strawberry'\n","product_id = products_df[products_df['name'] == product_name].iloc[0]['product_id']\n","filtered_sales_df = orders_df[\n"," (orders_df['product_id'] == product_id) & \n"," (orders_df['store_id'] == 'CHI')\n","]\n","\n","# Aggregate daily sales for the specific product and store\n","actual_sales = filtered_sales_df.groupby('order_date')['quantity'].sum().reset_index()\n","actual_sales.rename(columns={'order_date': 'ds', 'quantity': 'y'}, inplace=True)\n","actual_sales['ds'] = pd.to_datetime(actual_sales['ds'])\n","\n","# Fill in missing dates with zero sales to create a continuous time series\n","date_range = pd.date_range(start=actual_sales['ds'].min(), end=actual_sales['ds'].max(), freq='D')\n","actual_sales = actual_sales.set_index('ds').reindex(date_range, fill_value=0).rename_axis('ds').reset_index()"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":13,"statement_ids":[13],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:21:35.8897096Z","session_start_time":null,"execution_start_time":"2024-11-05T03:21:36.3128878Z","execution_finish_time":"2024-11-05T03:21:36.661125Z","parent_msg_id":"4b745b13-20e5-4e47-8e93-51b2dc16237c"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 13, Finished, Available, Finished)"},"metadata":{}}],"execution_count":11,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"43571449-9160-4f0a-b4f0-a2dbde8418c5"},{"cell_type":"code","source":["# Initialize and fit Prophet model\n","model = Prophet()\n","model.fit(actual_sales)\n","\n","# Forecast the next 30 days\n","future = model.make_future_dataframe(periods=30)\n","forecast = model.predict(future)"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":14,"statement_ids":[14],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:21:41.1291977Z","session_start_time":null,"execution_start_time":"2024-11-05T03:21:41.5068476Z","execution_finish_time":"2024-11-05T03:21:41.8766493Z","parent_msg_id":"ac1e7f28-ba1c-4c35-83c9-d35ea4d718ce"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 14, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stderr","text":["03:21:41 - cmdstanpy - INFO - Chain [1] start processing\n03:21:41 - cmdstanpy - INFO - Chain [1] done processing\n"]},{"output_type":"stream","name":"stdout","text":["Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.\nDisabling daily seasonality. Run prophet with daily_seasonality=True to override this.\nn_changepoints greater than number of observations. Using 19.\ninput tempfile: /tmp/tmpcnr8w6eh/4u6xy9zg.json\ninput tempfile: /tmp/tmpcnr8w6eh/3nr4slau.json\nidx 0\nrunning CmdStan, num_threads: None\nCmdStan args: ['/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/prophet/stan_model/prophet_model.bin', 'random', 'seed=53327', 'data', 'file=/tmp/tmpcnr8w6eh/4u6xy9zg.json', 'init=/tmp/tmpcnr8w6eh/3nr4slau.json', 'output', 'file=/tmp/tmpcnr8w6eh/prophet_model9b3p2hun/prophet_model-20241105032141.csv', 'method=optimize', 'algorithm=newton', 'iter=10000']\nChain [1] start processing\nChain [1] done processing\n"]}],"execution_count":12,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"74c17c5a-a4b7-446d-bee3-604e60ac4068"},{"cell_type":"code","source":["# Prepare forecast data for MAPE calculation\n","forecasted_sales = forecast[['ds', 'yhat']].rename(columns={'yhat': 'Forecasted_Sales'})\n","\n","# Merge actual sales with forecasted sales on 'ds' date\n","final_data = actual_sales.merge(forecasted_sales, on='ds', how='left')\n","\n","# Filter to remove rows where 'y' (actual sales) is NaN for valid MAPE calculation\n","valid_data = final_data.dropna(subset=['y'])\n","\n","# Filter out rows where actual sales (y) are zero to avoid division by zero in MAPE calculation\n","valid_data = final_data[final_data['y'] != 0].dropna(subset=['y'])\n","\n","# Calculate MAPE only on valid entries where y is not zero\n","if not valid_data.empty:\n"," valid_data['MAPE'] = mean_absolute_percentage_error(valid_data['y'], valid_data['Forecasted_Sales']) * 100\n","else:\n"," print(\"No valid data available for MAPE calculation (all y values are zero or missing).\")\n","\n","# Display first few rows of valid data with MAPE\n","print(valid_data[['ds', 'y', 'Forecasted_Sales', 'MAPE']].head())"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":15,"statement_ids":[15],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:21:46.1542353Z","session_start_time":null,"execution_start_time":"2024-11-05T03:21:46.601026Z","execution_finish_time":"2024-11-05T03:21:46.9453965Z","parent_msg_id":"3e221c63-10dc-4ab4-9241-25f654d2f946"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 15, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":[" ds y Forecasted_Sales MAPE\n0 2024-09-26 13:21:01.705 4 1.310092 67.247704\n"]}],"execution_count":13,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"c71d537b-e700-4ba2-aca8-0ce95eabdd7a"},{"cell_type":"markdown","source":["##### Simulating data"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"56bb490e-c1ff-4cdf-a25b-4b9f703a17f1"},{"cell_type":"code","source":["# Parameters for synthetic data generation\n","start_date = actual_sales['ds'].min() - timedelta(days=365) # Start one year earlier\n","end_date = actual_sales['ds'].min() - timedelta(days=1) # End right before actual data starts\n","date_range = pd.date_range(start=start_date, end=end_date, freq='D')\n","\n","# Generate seasonal pattern with some random noise\n","np.random.seed(42)\n","seasonal_pattern = 10 + 5 * np.sin(2 * np.pi * date_range.dayofyear / 365) # Yearly seasonality\n","noise = np.random.normal(0, 2, len(date_range)) # Random noise\n","\n","# Create synthetic sales data\n","synthetic_sales = pd.DataFrame({\n"," 'ds': date_range,\n"," 'y': pd.Series(seasonal_pattern + noise).clip(lower=0) # Ensure no negative sales\n","})\n","\n","# Concatenate synthetic sales with actual sales\n","extended_sales = pd.concat([synthetic_sales, actual_sales]).sort_values(by='ds').reset_index(drop=True)"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":16,"statement_ids":[16],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:21:56.7511226Z","session_start_time":null,"execution_start_time":"2024-11-05T03:21:57.1414116Z","execution_finish_time":"2024-11-05T03:21:57.5089829Z","parent_msg_id":"f6e94e07-932c-4250-885a-f3186f9ffa3e"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 16, Finished, Available, Finished)"},"metadata":{}}],"execution_count":14,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"840e1912-413f-459f-a0e3-b0853d8af473"},{"cell_type":"markdown","source":["##### Integrate simulated data with Prophet model"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"409560e9-df84-456d-87b4-0cb314204ed2"},{"cell_type":"code","source":["# Initialize and fit Prophet model with extended sales data\n","model = Prophet()\n","model.fit(extended_sales)\n","\n","# Forecast the next 30 days\n","future = model.make_future_dataframe(periods=30)\n","forecast = model.predict(future)\n","\n","# Prepare forecast data for MAPE calculation\n","forecasted_sales = forecast[['ds', 'yhat']].rename(columns={'yhat': 'Forecasted_Sales'})\n","\n","# Merge actual sales with forecasted sales on 'ds' date\n","final_data = actual_sales.merge(forecasted_sales, on='ds', how='left')\n","\n","# Filter to remove rows where 'y' (actual sales) is NaN for valid MAPE calculation\n","valid_data = final_data.dropna(subset=['y'])\n","\n","# Filter out rows where actual sales (y) are zero to avoid division by zero in MAPE calculation\n","valid_data = final_data[(final_data['y'] != 0) & (~final_data['Forecasted_Sales'].isna())]"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":17,"statement_ids":[17],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:22:12.01668Z","session_start_time":null,"execution_start_time":"2024-11-05T03:22:12.3966452Z","execution_finish_time":"2024-11-05T03:22:12.7834637Z","parent_msg_id":"46438ea9-fe81-4274-9958-793a8e0a3bcf"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 17, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stderr","text":["03:22:12 - cmdstanpy - INFO - Chain [1] start processing\n03:22:12 - cmdstanpy - INFO - Chain [1] done processing\n"]},{"output_type":"stream","name":"stdout","text":["Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.\nDisabling daily seasonality. Run prophet with daily_seasonality=True to override this.\ninput tempfile: /tmp/tmpcnr8w6eh/fpytl34j.json\ninput tempfile: /tmp/tmpcnr8w6eh/whzg23sw.json\nidx 0\nrunning CmdStan, num_threads: None\nCmdStan args: ['/home/trusted-service-user/cluster-env/trident_env/lib/python3.11/site-packages/prophet/stan_model/prophet_model.bin', 'random', 'seed=36194', 'data', 'file=/tmp/tmpcnr8w6eh/fpytl34j.json', 'init=/tmp/tmpcnr8w6eh/whzg23sw.json', 'output', 'file=/tmp/tmpcnr8w6eh/prophet_modelfj0kckb0/prophet_model-20241105032212.csv', 'method=optimize', 'algorithm=lbfgs', 'iter=10000']\nChain [1] start processing\nChain [1] done processing\n"]}],"execution_count":15,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"53aea9c4-eddd-4a9a-9a26-5cf7459d1b8f"},{"cell_type":"markdown","source":["##### Calculating MAPE"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"7dafbdb5-bdca-47d4-8cc4-5ce8055c31e8"},{"cell_type":"code","source":["# Check if valid_data is not empty before calculating MAPE\n","if not valid_data.empty:\n"," valid_data['MAPE'] = mean_absolute_percentage_error(valid_data['y'], valid_data['Forecasted_Sales']) * 100\n"," print(valid_data[['ds', 'y', 'Forecasted_Sales', 'MAPE']].head())\n","else:\n"," print(\"No valid data available for MAPE calculation (all y values are zero or missing).\")\n","\n","# Display the first few rows of the final data with MAPE\n","print(valid_data[['ds', 'y', 'Forecasted_Sales', 'MAPE']].head())"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":18,"statement_ids":[18],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:22:15.6725467Z","session_start_time":null,"execution_start_time":"2024-11-05T03:22:16.0734557Z","execution_finish_time":"2024-11-05T03:22:16.4378175Z","parent_msg_id":"20e0e7d2-1098-4eca-8656-b9440ce76bae"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 18, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":[" ds y Forecasted_Sales MAPE\n0 2024-09-26 13:21:01.705 4 3.175803 20.604931\n ds y Forecasted_Sales MAPE\n0 2024-09-26 13:21:01.705 4 3.175803 20.604931\n"]}],"execution_count":16,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"e5e5edb1-e546-463a-8f8a-0b2156bbbbfd"},{"cell_type":"markdown","source":["The updated output with a more reasonable MAPE value (around 20.6%) suggests that the adjustments made to filter out rows with zero values in y have worked well. This value is now within a plausible range, indicating that the MAPE calculation is functioning as expected, and the model's forecasts are in a more meaningful comparison with the actual sales data."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"0ed7e66f-77e8-4a20-9dfa-974eff1a3ea7"},{"cell_type":"markdown","source":["#### Recommendations for the future\n","- Experiment with adding yearly_seasonality=True or daily_seasonality=True when initializing the Prophet model to account for potential seasonal effects.\n","- Generating more synthetic data or investigating other external data sources to enrich the training set.\n","- Introducing additional relevant factors, like holidays or product promotions."],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"f08d34f4-5eb8-453a-bbc5-650073288851"},{"cell_type":"markdown","source":["### Visualize in PowerBI"],"metadata":{"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"cf0da18a-60e7-4717-b707-318ca0b916fa"},{"cell_type":"code","source":["# Prepare future predictions DataFrame\n","future_predictions = forecast[['ds', 'yhat']].rename(columns={'yhat': 'Forecasted_Sales'})\n","future_predictions['Category'] = 'Future'"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":20,"statement_ids":[20],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:35:10.6036639Z","session_start_time":null,"execution_start_time":"2024-11-05T03:35:11.0704068Z","execution_finish_time":"2024-11-05T03:35:11.4887525Z","parent_msg_id":"85069a28-213a-4605-b401-1878623ab781"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 20, Finished, Available, Finished)"},"metadata":{}}],"execution_count":18,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"4065b5ac-2cbe-41ce-8d4e-29e3f6e2a999"},{"cell_type":"code","source":["# Prepare actual sales DataFrame (assuming 'actual_sales' has 'ds' and 'y' columns)\n","actual_predictions = actual_sales.rename(columns={'y': 'Actual_Sales'})\n","actual_predictions['Category'] = 'Actual'"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":21,"statement_ids":[21],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:35:13.3291876Z","session_start_time":null,"execution_start_time":"2024-11-05T03:35:13.794871Z","execution_finish_time":"2024-11-05T03:35:14.285944Z","parent_msg_id":"e50cffe4-ddfd-4808-a05f-286880dc3795"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 21, Finished, Available, Finished)"},"metadata":{}}],"execution_count":19,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"c831bc24-3c25-4cf4-823b-04196cb8b6e1"},{"cell_type":"code","source":["# Merge actual and forecasted DataFrames\n","combined_df = pd.merge(\n"," actual_predictions[['ds', 'Actual_Sales']],\n"," future_predictions[['ds', 'Forecasted_Sales']],\n"," on='ds',\n"," how='outer'\n",")\n","combined_df['Category'] = combined_df.apply(lambda row: 'Actual' if pd.notnull(row['Actual_Sales']) else 'Future', axis=1)"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":22,"statement_ids":[22],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:35:15.8414792Z","session_start_time":null,"execution_start_time":"2024-11-05T03:35:16.331134Z","execution_finish_time":"2024-11-05T03:35:16.7296294Z","parent_msg_id":"4ddee541-6605-4cc9-b258-bee6657445cb"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 22, Finished, Available, Finished)"},"metadata":{}}],"execution_count":20,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"1f0ae9ab-1c30-4eaa-8033-b23a1be0e941"},{"cell_type":"code","source":["from sklearn.metrics import mean_absolute_percentage_error\n","\n","# Filter out rows with null actual sales for MAPE calculation\n","valid_data = combined_df.dropna(subset=['Actual_Sales'])\n","\n","# Calculate MAPE (excluding zero values in 'Actual_Sales')\n","if not valid_data.empty:\n"," mape = mean_absolute_percentage_error(valid_data['Actual_Sales'], valid_data['Forecasted_Sales']) * 100\n"," print(f'MAPE: {mape:.2f}%')\n","else:\n"," print(\"No valid data available for MAPE calculation.\")"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":23,"statement_ids":[23],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:35:18.7566662Z","session_start_time":null,"execution_start_time":"2024-11-05T03:35:19.284397Z","execution_finish_time":"2024-11-05T03:35:19.6311776Z","parent_msg_id":"5a61ed09-40be-468f-a998-52cfdd7db6d8"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 23, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["MAPE: 767881500651486848.00%\n"]}],"execution_count":21,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"3fcb65d0-a075-4e2d-ba95-87b81f2e0a34"},{"cell_type":"code","source":["combined_df['Category'] = combined_df.apply(\n"," lambda row: 'Actual' if pd.notnull(row['Actual_Sales']) else 'Future', axis=1\n",")"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":24,"statement_ids":[24],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:35:21.7573387Z","session_start_time":null,"execution_start_time":"2024-11-05T03:35:22.156576Z","execution_finish_time":"2024-11-05T03:35:22.5354367Z","parent_msg_id":"6c0e4d87-0dc2-476f-ab07-7c16c5d9315b"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 24, Finished, Available, Finished)"},"metadata":{}}],"execution_count":22,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"b970ce06-7a78-4dd0-b956-bba9064a63b4"},{"cell_type":"code","source":["# Filter rows where 'Actual_Sales' is not null\n","filtered_combined_df = combined_df[~combined_df['Actual_Sales'].isnull()]"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":25,"statement_ids":[25],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:35:23.6044887Z","session_start_time":null,"execution_start_time":"2024-11-05T03:35:24.0540518Z","execution_finish_time":"2024-11-05T03:35:24.4330266Z","parent_msg_id":"4f28a7b0-db04-4cbd-ad23-971c355f0316"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 25, Finished, Available, Finished)"},"metadata":{}}],"execution_count":23,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"63468c4e-5b4a-4c64-89d3-d624e4a08ab6"},{"cell_type":"code","source":["# Create the input DataFrame from actual sales\n","input_df = actual_sales.reset_index()\n","input_df.rename(columns={'ds': 'Date', 'y': 'Actual_Sales'}, inplace=True)\n","input_df['Category'] = 'Your Category Name' # Change 'Your Category Name' to your use case\n","input_df['MAPE'] = np.nan\n","input_df['Forecasted_Sales'] = np.nan"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":26,"statement_ids":[26],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:37:05.8374085Z","session_start_time":null,"execution_start_time":"2024-11-05T03:37:06.3426543Z","execution_finish_time":"2024-11-05T03:37:06.7011932Z","parent_msg_id":"9459ff71-c9d8-4cbf-bef3-b366df84581a"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 26, Finished, Available, Finished)"},"metadata":{}}],"execution_count":24,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"edffddb2-6cec-442e-a186-1ab4e77d4dda"},{"cell_type":"code","source":["# Combine actual data with forecast data where 'Actual_Sales' is NaN\n","combined_df = pd.concat([input_df, forecast[['ds', 'yhat']].rename(columns={'ds': 'Date', 'yhat': 'Forecasted_Sales'})])\n","combined_df['Category'].fillna('Forecast', inplace=True)"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":27,"statement_ids":[27],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:37:08.6991979Z","session_start_time":null,"execution_start_time":"2024-11-05T03:37:09.1371946Z","execution_finish_time":"2024-11-05T03:37:09.4783961Z","parent_msg_id":"f52f3fb6-645d-40b9-8ef5-a7ce9f8f55ad"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 27, Finished, Available, Finished)"},"metadata":{}}],"execution_count":25,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"c899ca3b-ab6d-41d2-a346-a2bdc52cb851"},{"cell_type":"code","source":["# Write the final data to Delta Lake table\n","table_name = \"Strawberry_Chicago_Demand_Forecast_Table\"\n","spark.createDataFrame(combined_df).write.mode(\"overwrite\").format(\"delta\").save(f\"Tables/{table_name}\")\n","print(f\"Spark DataFrame saved to Delta table: {table_name}\")"],"outputs":[{"output_type":"display_data","data":{"application/vnd.livy.statement-meta+json":{"spark_pool":null,"statement_id":28,"statement_ids":[28],"state":"finished","livy_statement_state":"available","session_id":"e37a719e-11cd-4903-b8fe-5b6ec76f2489","normalized_state":"finished","queued_time":"2024-11-05T03:37:11.3435008Z","session_start_time":null,"execution_start_time":"2024-11-05T03:37:11.7588443Z","execution_finish_time":"2024-11-05T03:37:26.4720364Z","parent_msg_id":"82e3e439-d58d-4a23-85b7-f04caf24286e"},"text/plain":"StatementMeta(, e37a719e-11cd-4903-b8fe-5b6ec76f2489, 28, Finished, Available, Finished)"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Spark DataFrame saved to Delta table: Strawberry_Chicago_Demand_Forecast_Table\n"]}],"execution_count":26,"metadata":{"jupyter":{"source_hidden":false,"outputs_hidden":false},"nteract":{"transient":{"deleting":false}},"microsoft":{"language":"python","language_group":"synapse_pyspark"}},"id":"350ab0c3-218c-4d16-ae7d-765dc74f9251"}],"metadata":{"kernel_info":{"name":"synapse_pyspark"},"kernelspec":{"name":"synapse_pyspark","language":"Python","display_name":"Synapse PySpark"},"language_info":{"name":"python"},"microsoft":{"language":"python","language_group":"synapse_pyspark","ms_spell_check":{"ms_spell_check_language":"en"}},"widgets":{"application/vnd.jupyter.widget-state+json":{"version_major":2,"version_minor":0,"state":{"5a03f075878b4064ab2f7d8cce157b08":{"model_name":"FloatProgressModel","model_module":"@jupyter-widgets/controls","model_module_version":"2.0.0","state":{"value":9,"max":9,"bar_style":"success","style":"IPY_MODEL_972cdd559ebf48189e9d445fe3122366","layout":"IPY_MODEL_36fcfa9fac014b779b6dbeb09ab35479"}},"972cdd559ebf48189e9d445fe3122366":{"model_name":"ProgressStyleModel","model_module":"@jupyter-widgets/controls","model_module_version":"2.0.0","state":{"description_width":""}},"ec44fa797cc54cf99c42dc4ba813aa50":{"model_name":"HTMLStyleModel","model_module":"@jupyter-widgets/controls","model_module_version":"2.0.0","state":{"description_width":"","font_size":null,"text_color":null}},"427479fe41cf407f8d0122dca3bc36df":{"model_name":"LayoutModel","model_module":"@jupyter-widgets/base","model_module_version":"2.0.0","state":{}},"76c4c8dd7d9847229100d098d6e5388e":{"model_name":"HTMLModel","model_module":"@jupyter-widgets/controls","model_module_version":"2.0.0","state":{"value":" 9/9 [00:00<00:00, 9.05it/s]","layout":"IPY_MODEL_109021a0d5e9460ebf1b762d0b925f30","style":"IPY_MODEL_ec44fa797cc54cf99c42dc4ba813aa50"}},"18bf4a1c2f914d728bf99d59e54e7946":{"model_name":"LayoutModel","model_module":"@jupyter-widgets/base","model_module_version":"2.0.0","state":{}},"8d87a517fc5e474a9f6a03e1b20247b8":{"model_name":"HBoxModel","model_module":"@jupyter-widgets/controls","model_module_version":"2.0.0","state":{"children":["IPY_MODEL_1e5e5a7e899d4ee6ac242857469e47e0","IPY_MODEL_5a03f075878b4064ab2f7d8cce157b08","IPY_MODEL_76c4c8dd7d9847229100d098d6e5388e"],"layout":"IPY_MODEL_18bf4a1c2f914d728bf99d59e54e7946"}},"1e5e5a7e899d4ee6ac242857469e47e0":{"model_name":"HTMLModel","model_module":"@jupyter-widgets/controls","model_module_version":"2.0.0","state":{"value":"Downloading artifacts: 100%","layout":"IPY_MODEL_427479fe41cf407f8d0122dca3bc36df","style":"IPY_MODEL_6b62b69da7c34c34bc0b2134c369f2c2"}},"36fcfa9fac014b779b6dbeb09ab35479":{"model_name":"LayoutModel","model_module":"@jupyter-widgets/base","model_module_version":"2.0.0","state":{}},"6b62b69da7c34c34bc0b2134c369f2c2":{"model_name":"HTMLStyleModel","model_module":"@jupyter-widgets/controls","model_module_version":"2.0.0","state":{"description_width":"","font_size":null,"text_color":null}},"109021a0d5e9460ebf1b762d0b925f30":{"model_name":"LayoutModel","model_module":"@jupyter-widgets/base","model_module_version":"2.0.0","state":{}}}}},"nteract":{"version":"nteract-front-end@1.0.0"},"spark_compute":{"compute_id":"/trident/default","session_options":{"conf":{"spark.synapse.nbs.session.timeout":"1200000"}}},"dependencies":{"lakehouse":{"default_lakehouse":"1e009111-e0de-44ad-adaf-9a5240002190","default_lakehouse_name":"SuperstoreForecast","default_lakehouse_workspace_id":"3f4eeb28-7210-44e7-bd10-efcda197a9f7"}}},"nbformat":4,"nbformat_minor":5} \ No newline at end of file diff --git a/azure_jumpstart_ag/artifacts/fabric/ot_dashboard.json b/azure_jumpstart_ag/artifacts/fabric/ot_dashboard.json new file mode 100644 index 0000000000..d4eae01635 --- /dev/null +++ b/azure_jumpstart_ag/artifacts/fabric/ot_dashboard.json @@ -0,0 +1,791 @@ +{ + "$schema": "https://msitpbiadx.powerbi.com/static/d/schema/54/dashboard.json", + "id": "4ca6d90b-dda9-444c-a3c9-eb99bde78b66", + "eTag": "\"0d986902e12d44e9b7187e3eb61e2b85\"", + "schema_version": "54", + "title": "OT Dashboard", + "tiles": [ + { + "id": "6c5c8567-04ee-470d-ab31-eee08a9c26ee", + "title": "Refrigerator Status", + "visualType": "multistat", + "pageId": "e813fc9f-4788-43f3-a890-ca213b19d6e9", + "layout": { + "x": 0, + "y": 6, + "width": 3, + "height": 6 + }, + "queryRef": { + "kind": "query", + "queryId": "a499aa12-4369-493d-93ea-409aa7dd483c" + }, + "hideTitle": true, + "visualOptions": { + "multiStat__textSize": "auto", + "multiStat__valueColumn": "door_status", + "colorRulesDisabled": false, + "colorStyle": "light", + "multiStat__displayOrientation": "horizontal", + "multiStat__labelColumn": "device_id_label", + "multiStat__slot": { + "width": 1, + "height": 2 + }, + "colorRules": [ + { + "id": "c807c2d3-43f7-4af9-8a9e-9e756b71e1d8", + "ruleType": "colorByCondition", + "applyToColumn": null, + "hideText": false, + "applyTo": "cells", + "conditions": [ + { + "operator": "==", + "column": "door_status", + "values": [ + "Open" + ] + } + ], + "chainingOperator": "and", + "colorStyle": "bold", + "color": "red", + "tag": "", + "icon": null, + "ruleName": "Temperature Gauge", + "visualType": "multistat" + }, + { + "id": "85140876-c125-4982-ba46-0e018c1d9aec", + "ruleType": "colorByCondition", + "applyToColumn": null, + "hideText": false, + "applyTo": "cells", + "conditions": [ + { + "operator": "==", + "column": "door_status", + "values": [ + "Closed" + ] + } + ], + "chainingOperator": "and", + "colorStyle": "bold", + "color": "green", + "tag": "", + "icon": null, + "ruleName": "Sensor Lag", + "visualType": "multistat" + } + ] + } + }, + { + "id": "bbd3ed7e-296d-4784-a2ab-3341f0019572", + "title": "New tile", + "visualType": "multistat", + "pageId": "e813fc9f-4788-43f3-a890-ca213b19d6e9", + "layout": { + "x": 0, + "y": 0, + "width": 3, + "height": 6 + }, + "queryRef": { + "kind": "query", + "queryId": "e872f3db-a364-4f27-9c45-6302e6426a0a" + }, + "hideTitle": true, + "visualOptions": { + "multiStat__textSize": "auto", + "multiStat__valueColumn": "status_label", + "colorRulesDisabled": false, + "colorStyle": "light", + "multiStat__displayOrientation": "horizontal", + "multiStat__labelColumn": "device_id", + "multiStat__slot": { + "width": 1, + "height": 2 + }, + "colorRules": [ + { + "id": "b832c4c4-64a6-41b5-bffa-11d82d15cd3b", + "ruleType": "colorByCondition", + "applyToColumn": null, + "hideText": false, + "applyTo": "cells", + "conditions": [ + { + "operator": "==", + "column": "status", + "values": [ + "on" + ] + } + ], + "chainingOperator": "and", + "colorStyle": "bold", + "color": "green", + "tag": "", + "icon": null, + "ruleName": "", + "visualType": "multistat" + }, + { + "id": "a4203fa2-9755-4080-b83b-731edced75c8", + "ruleType": "colorByCondition", + "applyToColumn": null, + "hideText": false, + "applyTo": "cells", + "conditions": [ + { + "operator": "==", + "column": "status", + "values": [ + "off" + ] + } + ], + "chainingOperator": "and", + "colorStyle": "bold", + "color": "red", + "tag": "", + "icon": null, + "ruleName": "", + "visualType": "multistat" + } + ] + } + }, + { + "id": "7d5ce537-2733-4aca-9ca4-292b77384659", + "title": "Brightness Level (Lumens)", + "visualType": "line", + "pageId": "e813fc9f-4788-43f3-a890-ca213b19d6e9", + "layout": { + "x": 3, + "y": 0, + "width": 10, + "height": 6 + }, + "queryRef": { + "kind": "query", + "queryId": "15b59907-6b86-47f5-947c-1d824ad91e38" + }, + "visualOptions": { + "multipleYAxes": { + "base": { + "id": "-1", + "label": "", + "columns": [], + "yAxisMaximumValue": 100, + "yAxisMinimumValue": null, + "yAxisScale": "linear", + "horizontalLines": [] + }, + "additional": [], + "showMultiplePanels": false + }, + "hideLegend": false, + "legendLocation": "bottom", + "xColumnTitle": "", + "xColumn": "timestamp", + "yColumns": [ + "brightness_level" + ], + "seriesColumns": [ + "device_id" + ], + "xAxisScale": "linear", + "verticalLine": "", + "crossFilterDisabled": false, + "drillthroughDisabled": false, + "crossFilter": [], + "drillthrough": [] + } + }, + { + "id": "e8fd7d81-3e06-4485-aef1-ba3c341f6461", + "title": "Lighting Power Utilization (kWh)", + "visualType": "area", + "pageId": "e813fc9f-4788-43f3-a890-ca213b19d6e9", + "layout": { + "x": 13, + "y": 0, + "width": 8, + "height": 6 + }, + "queryRef": { + "kind": "query", + "queryId": "baf31768-a72a-4d2f-9fea-7d546122263a" + }, + "visualOptions": { + "multipleYAxes": { + "base": { + "id": "-1", + "label": "", + "columns": [], + "yAxisMaximumValue": null, + "yAxisMinimumValue": null, + "yAxisScale": "linear", + "horizontalLines": [] + }, + "additional": [], + "showMultiplePanels": true + }, + "hideLegend": true, + "legendLocation": "bottom", + "xColumnTitle": "", + "xColumn": "timestamp", + "yColumns": [ + "power_usage_kwh" + ], + "seriesColumns": [ + "device_id" + ], + "xAxisScale": "linear", + "verticalLine": "", + "crossFilterDisabled": false, + "drillthroughDisabled": false, + "crossFilter": [], + "drillthrough": [] + } + }, + { + "id": "8ba8d51e-4ca9-4ac4-8838-c40363090d18", + "title": "New tile", + "visualType": "multistat", + "pageId": "e813fc9f-4788-43f3-a890-ca213b19d6e9", + "layout": { + "x": 0, + "y": 12, + "width": 3, + "height": 6 + }, + "queryRef": { + "kind": "query", + "queryId": "658a1393-d464-4626-97ed-915df835eda0" + }, + "hideTitle": true, + "visualOptions": { + "multiStat__textSize": "auto", + "multiStat__valueColumn": "operating_mode_label", + "colorRulesDisabled": false, + "colorStyle": "light", + "multiStat__displayOrientation": "horizontal", + "multiStat__labelColumn": "device_id_label", + "multiStat__slot": { + "width": 1, + "height": 2 + }, + "colorRules": [ + { + "id": "b832c4c4-64a6-41b5-bffa-11d82d15cd3b", + "ruleType": "colorByCondition", + "applyToColumn": null, + "hideText": false, + "applyTo": "cells", + "conditions": [ + { + "operator": "==", + "column": "operating_mode", + "values": [ + "heating" + ] + } + ], + "chainingOperator": "and", + "colorStyle": "bold", + "color": "red", + "tag": "", + "icon": null, + "ruleName": "", + "visualType": "multistat" + }, + { + "id": "a4203fa2-9755-4080-b83b-731edced75c8", + "ruleType": "colorByCondition", + "applyToColumn": null, + "hideText": false, + "applyTo": "cells", + "conditions": [ + { + "operator": "==", + "column": "operating_mode", + "values": [ + "cooling" + ] + } + ], + "chainingOperator": "and", + "colorStyle": "bold", + "color": "blue", + "tag": "", + "icon": null, + "ruleName": "", + "visualType": "multistat" + } + ] + } + }, + { + "id": "ead1d757-b659-4e8a-b4b3-99b704ad191b", + "title": "HVAC Power Utilization (kWh)", + "visualType": "area", + "pageId": "e813fc9f-4788-43f3-a890-ca213b19d6e9", + "layout": { + "x": 3, + "y": 12, + "width": 8, + "height": 6 + }, + "queryRef": { + "kind": "query", + "queryId": "1fa31e61-b4dd-4471-b5a6-c982c15cd9c8" + }, + "visualOptions": { + "multipleYAxes": { + "base": { + "id": "-1", + "label": "", + "columns": [], + "yAxisMaximumValue": null, + "yAxisMinimumValue": null, + "yAxisScale": "linear", + "horizontalLines": [] + }, + "additional": [], + "showMultiplePanels": true + }, + "hideLegend": true, + "legendLocation": "bottom", + "xColumnTitle": "", + "xColumn": "timestamp", + "yColumns": [ + "power_usage_kwh" + ], + "seriesColumns": [ + "device_id" + ], + "xAxisScale": "linear", + "verticalLine": "", + "crossFilterDisabled": false, + "drillthroughDisabled": false, + "crossFilter": [], + "drillthrough": [] + } + }, + { + "id": "d0be5ee7-a268-4389-8553-a479fe3581ec", + "title": "Refrigerator Temperature (Celsius)", + "visualType": "multistat", + "pageId": "e813fc9f-4788-43f3-a890-ca213b19d6e9", + "layout": { + "x": 3, + "y": 6, + "width": 10, + "height": 6 + }, + "queryRef": { + "kind": "query", + "queryId": "cf05490c-b613-4a3d-b194-d75d840b8fc5" + }, + "visualOptions": { + "multiStat__textSize": "auto", + "multiStat__valueColumn": "temperature_celsius_label", + "colorRulesDisabled": false, + "colorStyle": "light", + "multiStat__displayOrientation": "horizontal", + "multiStat__labelColumn": "device_id", + "multiStat__slot": { + "width": 1, + "height": 2 + }, + "colorRules": [ + { + "id": "c807c2d3-43f7-4af9-8a9e-9e756b71e1d8", + "ruleType": "colorByCondition", + "applyToColumn": null, + "hideText": false, + "applyTo": "cells", + "conditions": [ + { + "values": [ + "2" + ], + "operator": ">", + "column": "temperature_celsius" + } + ], + "chainingOperator": "and", + "colorStyle": "bold", + "color": "red", + "tag": "Food Safety Risk", + "icon": "warning", + "ruleName": "Temperature Gauge", + "visualType": "multistat" + }, + { + "id": "85140876-c125-4982-ba46-0e018c1d9aec", + "ruleType": "colorByCondition", + "applyToColumn": null, + "hideText": false, + "applyTo": "cells", + "conditions": [ + { + "values": [ + "2024-11-01T10:13:50Z" + ], + "operator": ">", + "column": "temperature_celsius" + } + ], + "chainingOperator": "and", + "colorStyle": "bold", + "color": "yellow", + "tag": "Sensor Read Error", + "icon": null, + "ruleName": "Sensor Lag", + "visualType": "multistat" + }, + { + "id": "b1060aba-4b62-4d00-91f1-ac8971f074b9", + "ruleType": "colorByCondition", + "applyToColumn": null, + "hideText": false, + "applyTo": "cells", + "conditions": [ + { + "operator": "<=", + "column": "temperature_celsius", + "values": [ + "2" + ] + } + ], + "chainingOperator": "and", + "colorStyle": "bold", + "color": "green", + "tag": "", + "icon": null, + "ruleName": "", + "visualType": "multistat" + } + ] + } + }, + { + "id": "da08f950-8ba9-4712-b512-225bf790f8d6", + "title": "Temp (Celsius)", + "visualType": "column", + "pageId": "e813fc9f-4788-43f3-a890-ca213b19d6e9", + "layout": { + "x": 11, + "y": 12, + "width": 5, + "height": 6 + }, + "queryRef": { + "kind": "query", + "queryId": "338ebed5-284b-4251-828e-f1eb290c624a" + }, + "visualOptions": { + "multipleYAxes": { + "base": { + "id": "-1", + "label": "", + "columns": [], + "yAxisMaximumValue": 25, + "yAxisMinimumValue": null, + "yAxisScale": "linear", + "horizontalLines": [] + }, + "additional": [], + "showMultiplePanels": false + }, + "hideLegend": true, + "legendLocation": "bottom", + "xColumnTitle": "", + "xColumn": "device_id", + "yColumns": [ + "temperature_celsius" + ], + "seriesColumns": null, + "xAxisScale": "linear", + "verticalLine": "", + "crossFilterDisabled": false, + "drillthroughDisabled": false, + "crossFilter": [], + "drillthrough": [] + } + }, + { + "id": "7bb594f5-7b06-4b5f-870c-524babd709b5", + "title": "Refrigerator Power Utilization (kWh)", + "visualType": "area", + "pageId": "e813fc9f-4788-43f3-a890-ca213b19d6e9", + "layout": { + "x": 13, + "y": 6, + "width": 8, + "height": 6 + }, + "queryRef": { + "kind": "query", + "queryId": "59c08389-4793-425f-b3b1-201ceec1c8f1" + }, + "visualOptions": { + "multipleYAxes": { + "base": { + "id": "-1", + "label": "", + "columns": [], + "yAxisMaximumValue": null, + "yAxisMinimumValue": null, + "yAxisScale": "linear", + "horizontalLines": [] + }, + "additional": [], + "showMultiplePanels": true + }, + "hideLegend": true, + "legendLocation": "bottom", + "xColumnTitle": "", + "xColumn": "timestamp", + "yColumns": [ + "power_usage_kwh" + ], + "seriesColumns": [ + "device_id" + ], + "xAxisScale": "linear", + "verticalLine": "", + "crossFilterDisabled": false, + "drillthroughDisabled": false, + "crossFilter": [], + "drillthrough": [] + } + }, + { + "id": "a3711b00-ce16-4416-b092-a137a55e1688", + "title": "Humidity", + "visualType": "multistat", + "pageId": "e813fc9f-4788-43f3-a890-ca213b19d6e9", + "layout": { + "x": 16, + "y": 12, + "width": 5, + "height": 6 + }, + "queryRef": { + "kind": "query", + "queryId": "1e4dd09f-5439-4b45-91c3-2bf340158b6d" + }, + "visualOptions": { + "multiStat__textSize": "auto", + "multiStat__valueColumn": "humidity_percent_label", + "colorRulesDisabled": false, + "colorStyle": "light", + "multiStat__displayOrientation": "horizontal", + "multiStat__labelColumn": "device_id", + "multiStat__slot": { + "width": 1, + "height": 2 + }, + "colorRules": [ + { + "id": "b832c4c4-64a6-41b5-bffa-11d82d15cd3b", + "ruleType": "colorByCondition", + "applyToColumn": null, + "hideText": false, + "applyTo": "cells", + "conditions": [ + { + "operator": "==", + "column": "operating_mode", + "values": [ + "heating" + ] + } + ], + "chainingOperator": "and", + "colorStyle": "bold", + "color": "red", + "tag": "", + "icon": null, + "ruleName": "", + "visualType": "multistat" + }, + { + "id": "a4203fa2-9755-4080-b83b-731edced75c8", + "ruleType": "colorByCondition", + "applyToColumn": null, + "hideText": false, + "applyTo": "cells", + "conditions": [ + { + "operator": "==", + "column": "operating_mode", + "values": [ + "cooling" + ] + } + ], + "chainingOperator": "and", + "colorStyle": "bold", + "color": "blue", + "tag": "", + "icon": null, + "ruleName": "", + "visualType": "multistat" + } + ] + } + } + ], + "baseQueries": [ + { + "id": "96a651b3-ce60-4f37-8c85-1db19332b6ec", + "queryId": "02787624-cc81-471a-9dd3-89e876a0b0d4", + "variableName": "test" + } + ], + "parameters": [ + { + "kind": "duration", + "id": "bb1650a2-322a-4c35-acf3-2fecaf349561", + "displayName": "Time range", + "description": "", + "beginVariableName": "_startTime", + "endVariableName": "_endTime", + "defaultValue": { + "kind": "dynamic", + "count": 1, + "unit": "hours" + }, + "showOnPages": { + "kind": "all" + } + } + ], + "dataSources": [ + { + "id": "84a721cf-89b0-46ec-8a2e-24f267bb60e6", + "kind": "kusto-trident", + "clusterUri": "{{KQL_CLUSTER_URI}}", + "database": "{{KQL_DATABASE_ID}}", + "name": "contosohypermarket", + "scopeId": "kusto-trident", + "workspace": "{{FABRIC_WORKSPACE_ID}}" + } + ], + "pages": [ + { + "name": "OT Dashboard", + "id": "e813fc9f-4788-43f3-a890-ca213b19d6e9" + } + ], + "queries": [ + { + "dataSource": { + "kind": "inline", + "dataSourceId": "84a721cf-89b0-46ec-8a2e-24f267bb60e6" + }, + "text": "//Get refrigerator temps\niot_data\n| where equipment_type == \"Refrigerator\"\n| extend d = parse_json(data) \n| extend system_id = d.id\n , door_open = d.door_open\n| summarize arg_max(timestamp, door_open) by device_id\n| extend door_status = case(door_open == true, \"Open\", \"Closed\")\n| extend device_id_label = strcat(device_id, \" Door\")\n| sort by device_id_label asc \n", + "id": "a499aa12-4369-493d-93ea-409aa7dd483c", + "usedVariables": [] + }, + { + "dataSource": { + "kind": "inline", + "dataSourceId": "84a721cf-89b0-46ec-8a2e-24f267bb60e6" + }, + "text": "//Light Status Queries\niot_data\n| where equipment_type == \"LightingSystem\"\n| extend d = parse_json(data) \n| extend system_id = d.id\n , status = tostring(d.status)\n| summarize arg_max(timestamp, status) by device_id\n//change the status to Sentence case.\n| extend status_label = strcat(toupper(substring(status, 0, 1)), tolower(substring(status, 1, strlen(status)-1)))\n| sort by device_id asc \n", + "id": "e872f3db-a364-4f27-9c45-6302e6426a0a", + "usedVariables": [] + }, + { + "dataSource": { + "kind": "inline", + "dataSourceId": "84a721cf-89b0-46ec-8a2e-24f267bb60e6" + }, + "text": "//Light Brightness Level\niot_data \n| where equipment_type == \"LightingSystem\" \n| where timestamp between (datetime(\"2024-11-01T01:39:51.330Z\") .. datetime(\"2024-11-01T01:49:51.330Z\"))\n| extend d = parse_json(data) \n| extend system_id = d.id , brightness_level = todecimal(d.brightness_level) \n| project timestamp, device_id, system_id, brightness_level ", + "id": "15b59907-6b86-47f5-947c-1d824ad91e38", + "usedVariables": [] + }, + { + "dataSource": { + "kind": "inline", + "dataSourceId": "84a721cf-89b0-46ec-8a2e-24f267bb60e6" + }, + "text": "//Light Power Utilization\niot_data \n| where equipment_type == \"LightingSystem\" \n//| where device_id == \"LightingSystem01\"\n| where timestamp between (datetime(\"2024-11-01T01:39:51.330Z\") .. datetime(\"2024-11-01T01:49:51.330Z\"))\n| extend d = parse_json(data) \n| extend system_id = d.id , power_usage_kwh = todecimal(d.power_usage_kwh) \n| project timestamp, device_id, system_id, power_usage_kwh ", + "id": "baf31768-a72a-4d2f-9fea-7d546122263a", + "usedVariables": [] + }, + { + "dataSource": { + "kind": "inline", + "dataSourceId": "84a721cf-89b0-46ec-8a2e-24f267bb60e6" + }, + "text": "// HVAC operating_mode\niot_data\n| where equipment_type == \"HVAC\"\n| extend d = parse_json(data) \n| extend system_id = d.id\n , operating_mode = tostring(d.operating_mode)\n| summarize arg_max(timestamp, operating_mode) by device_id\n| extend device_id_label = strcat(device_id, \" Mode\")\n//change the operating_mode to Sentence case.\n| extend operating_mode_label = strcat(toupper(substring(operating_mode, 0, 1)), tolower(substring(operating_mode, 1, strlen(operating_mode)-1)))\n| sort by device_id asc \n\n", + "id": "658a1393-d464-4626-97ed-915df835eda0", + "usedVariables": [] + }, + { + "dataSource": { + "kind": "inline", + "dataSourceId": "84a721cf-89b0-46ec-8a2e-24f267bb60e6" + }, + "text": "//Light Power Utilization\niot_data \n| where equipment_type == \"HVAC\" \n| where timestamp between (datetime(\"2024-11-01T01:39:51.330Z\") .. datetime(\"2024-11-01T01:49:51.330Z\"))\n| extend d = parse_json(data) \n| extend system_id = d.id , power_usage_kwh = todecimal(d.power_usage_kwh) \n| project timestamp, device_id, system_id, power_usage_kwh ", + "id": "1fa31e61-b4dd-4471-b5a6-c982c15cd9c8", + "usedVariables": [] + }, + { + "dataSource": { + "kind": "inline", + "dataSourceId": "84a721cf-89b0-46ec-8a2e-24f267bb60e6" + }, + "text": "//Get refrigerator temps\niot_data\n| where equipment_type == \"Refrigerator\"\n| extend d = parse_json(data) \n| extend system_id = d.id\n , temperature_celsius = todecimal(d.temperature_celsius)\n| summarize arg_max(timestamp, temperature_celsius) by device_id\n| extend temperature_celsius_label = strcat(round(temperature_celsius, 2), \"\\u00B0C\")\n| sort by device_id asc \n", + "id": "cf05490c-b613-4a3d-b194-d75d840b8fc5", + "usedVariables": [] + }, + { + "dataSource": { + "kind": "inline", + "dataSourceId": "84a721cf-89b0-46ec-8a2e-24f267bb60e6" + }, + "text": "// HVAC operating_mode\niot_data\n| where equipment_type == \"HVAC\"\n| extend d = parse_json(data) \n| extend system_id = d.id\n , temperature_celsius = todecimal(d.temperature_celsius)\n| summarize arg_max(timestamp, temperature_celsius) by device_id\n| sort by device_id asc \n\n", + "id": "338ebed5-284b-4251-828e-f1eb290c624a", + "usedVariables": [] + }, + { + "dataSource": { + "kind": "inline", + "dataSourceId": "84a721cf-89b0-46ec-8a2e-24f267bb60e6" + }, + "text": "//Light Power Utilization\niot_data \n| where equipment_type == \"Refrigerator\" \n| where timestamp between (datetime(\"2024-11-01T01:39:51.330Z\") .. datetime(\"2024-11-01T01:49:51.330Z\"))\n| extend d = parse_json(data) \n| extend system_id = d.id , power_usage_kwh = todecimal(d.power_usage_kwh) \n| project timestamp, device_id, system_id, power_usage_kwh ", + "id": "59c08389-4793-425f-b3b1-201ceec1c8f1", + "usedVariables": [] + }, + { + "dataSource": { + "kind": "inline", + "dataSourceId": "84a721cf-89b0-46ec-8a2e-24f267bb60e6" + }, + "text": "// HVAC humidity\niot_data\n| where equipment_type == \"HVAC\"\n| extend d = parse_json(data) \n| extend system_id = d.id\n , humidity_percent = tostring(d.humidity_percent)\n| summarize arg_max(timestamp, humidity_percent) by device_id\n| extend humidity_percent_label = strcat(humidity_percent, \"%\")\n| sort by device_id asc \n\n", + "id": "1e4dd09f-5439-4b45-91c3-2bf340158b6d", + "usedVariables": [] + }, + { + "id": "02787624-cc81-471a-9dd3-89e876a0b0d4", + "dataSource": { + "kind": "inline", + "dataSourceId": "84a721cf-89b0-46ec-8a2e-24f267bb60e6" + }, + "text": "// Please enter your KQL query (Example):\n// \n// | where between (['_startTime'] .. ['_endTime']) // Time range filtering\n// | take 100\niot_data\n| where device_id == \"SmartShelf02\"", + "usedVariables": [] + } + ] +} \ No newline at end of file From d86960985e7bbeaf725463a063817005cc624f08 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Wed, 6 Nov 2024 16:45:37 -0500 Subject: [PATCH 316/409] Update contoso_hypermarket.psm1 --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index e9e129ed3b..4a2ea9c29a 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -314,7 +314,7 @@ function Deploy-AIO-M3 { Write-Host "[$(Get-Date -Format t)] INFO: az deployment group create --name $deploymentName --resource-group $resourceGroup --template-file $dataflowBicepTemplatePath --parameters aioInstanceName=$iotInstanceName evenHubNamespaceHost=$evenHubNamespaceHost eventHubName=$eventHubName customLocationName=$customLocationName" az deployment group create --name $deploymentName --resource-group $resourceGroup --template-file $dataflowBicepTemplatePath ` --parameters aioInstanceName=$iotInstanceName evenHubNamespaceHost=$evenHubNamespaceHost eventHubName=$eventHubName ` - customLocationName=$customLocationName + customLocationName=$customLocationName # Verify the deployment status $deploymentStatus = az deployment group show --name $deploymentName --resource-group $resourceGroup --query properties.provisioningState -o tsv From 773ced8b9c4c6815f3d3810e07144cea8db61673 Mon Sep 17 00:00:00 2001 From: ldabas-msft <122379109+ldabas-msft@users.noreply.github.com> Date: Wed, 6 Nov 2024 22:19:52 +0000 Subject: [PATCH 317/409] Create acsa-edge-sub-volume.yaml --- .../yaml/acsa-edge-sub-volume.yaml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 azure_edge_iot_ops_jumpstart/acsa_fault_detection/yaml/acsa-edge-sub-volume.yaml diff --git a/azure_edge_iot_ops_jumpstart/acsa_fault_detection/yaml/acsa-edge-sub-volume.yaml b/azure_edge_iot_ops_jumpstart/acsa_fault_detection/yaml/acsa-edge-sub-volume.yaml new file mode 100644 index 0000000000..f9d01646b2 --- /dev/null +++ b/azure_edge_iot_ops_jumpstart/acsa_fault_detection/yaml/acsa-edge-sub-volume.yaml @@ -0,0 +1,13 @@ +apiVersion: "arccontainerstorage.azure.net/v1" +kind: EdgeSubvolume +metadata: + name: videos + namespace: contoso-hypermarket +spec: + edgevolume: acsa-pvc + path: videos #Don't use a preceding slash. + auth: + authType: MANAGED_IDENTITY + storageaccountendpoint: https://{STORAGEACCOUNT}.blob.core.windows.net/ + container: shopper-videos + ingestPolicy: edgeingestpolicy-default From 2485629ee5fe7a303b588d8822ef26505f6a37fb Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Wed, 6 Nov 2024 16:22:31 -0600 Subject: [PATCH 318/409] add secret --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 29324224f3..30d7d71e2b 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -487,6 +487,7 @@ function Deploy-HypermarketConfigs { } function Set-AIServiceSecrets { + $location = $global:azureLocation $AIServiceAccountName = $(az cognitiveservices account list -g $resourceGroup --query [].name -o tsv) $AIServicesEndpoints = $(az cognitiveservices account show --name $AIServiceAccountName --resource-group $resourceGroup --query properties.endpoints) | ConvertFrom-Json -AsHashtable $speechToTextEndpoint = $AIServicesEndpoints['Speech Services Speech to Text (Standard)'] @@ -502,7 +503,8 @@ function Set-AIServiceSecrets { --namespace=contoso-hypermarket ` --from-literal=azure-openai-endpoint=$openAIEndpoint ` --from-literal=azure-openai-key=$AIServicesKey ` - --from-literal=azure-speech-to-text-endpoint=$speechToTextEndpoint + --from-literal=azure-speech-to-text-endpoint=$speechToTextEndpoint ` + --from-literal=region=$location } } From db66354cfebff371b6283ab8ed2ae0e697db7e00 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Wed, 6 Nov 2024 17:33:53 -0500 Subject: [PATCH 319/409] Update contoso_hypermarket.psm1 --- .../Modules/contoso_hypermarket.psm1 | 428 +++++++++++++++++- 1 file changed, 424 insertions(+), 4 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 4a2ea9c29a..32c85ca2e3 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -548,8 +548,8 @@ function Set-EventHubSecrets { $eventHubConnectionString = $(az eventhubs eventhub authorization-rule keys list --resource-group $resourceGroup --namespace-name $eventHubNamespace --eventhub-name $eventHubName --name RootManageSharedAccessKey --query primaryConnectionString -o tsv) kubectx $clusterName kubectl create secret generic azure-eventhub-secret ` - --namespace=contoso-hypermarket ` - --from-literal=azure-eventhub-connection-string=$eventHubConnectionString + --namespace=contoso-hypermarket ` + --from-literal=azure-eventhub-connection-string=$eventHubConnectionString } } @@ -560,7 +560,427 @@ function Set-SQLSecret { Write-Host "`n" kubectx $clusterName kubectl create secret generic azure-sqlpassword-secret ` - --namespace=contoso-hypermarket ` - --from-literal=azure-sqlpassword-secret=$Env:adminPassword + --namespace=contoso-hypermarket ` + --from-literal=azure-sqlpassword-secret=$Env:adminPassword } } + +function Set-LoadBalancerBackendPools { + + #$loadBalancerName = $(az network lb list -g $resourceGroup --query [].name -o tsv) + #$loadBalancerPublicIp = $(az network lb frontend-ip list -g $resourceGroup --lb-name $loadBalancerName --query [].name -o tsv) + #$lbIndex = 0 + $vnetResourceId = $(az network vnet list -g $resourceGroup --query [].id -o tsv) + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + $clusterName = $cluster.Name.ToLower() + $loadBalancerName = "Ag-LoadBalancer-${clusterName}" + $loadBalancerPublicIp = "Ag-LB-Frontend-${clusterName}" + kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + $services = kubectl get services -n contoso-hypermarket -o json | ConvertFrom-Json + $services.items | ForEach-Object { + $service = $_ + $serviceName = $service.metadata.name + $servicePort = $service.spec.ports.port + $serviceIp = $service.status.loadBalancer.ingress.ip + + if ($null -ne $serviceIp) { + az network lb address-pool create -g $resourceGroup ` + --lb-name $loadBalancerName ` + --name "$serviceName-pool" ` + --vnet $vnetResourceId ` + --backend-addresses "[{name:${serviceName},ip-address:${serviceIp}}]" ` + --only-show-errors + + az network lb inbound-nat-rule create -g $resourceGroup ` + --lb-name $loadBalancerName ` + --name "$serviceName-NATRule" ` + --protocol Tcp ` + --frontend-port-range-start $servicePort[0] ` + --frontend-port-range-end $servicePort[0] ` + --frontend-ip $loadBalancerPublicIp ` + --backend-address-pool "$serviceName-pool" ` + --backend-port $servicePort[0] ` + --only-show-errors + } + } + + # Grafana backend pool creation + $clientVMName = "Ag-VM-Client" + $serviceName = "Grafana" + $servicePort = "3000" + $clientVMIpAddress = az vm list-ip-addresses --name $clientVMName ` + --resource-group $resourceGroup ` + --query "[].virtualMachine.network.privateIpAddresses[0]" ` + -o tsv ` + --only-show-errors + + az network lb address-pool create -g $resourceGroup ` + --lb-name $loadBalancerName ` + --name "$serviceName-pool" ` + --vnet $vnetResourceId ` + --backend-addresses "[{name:Grafana,ip-address:${clientVMIpAddress}}]" ` + --only-show-errors + + az network lb inbound-nat-rule create -g $resourceGroup ` + --lb-name $loadBalancerName ` + --name "$serviceName-NATRule" ` + --protocol Tcp ` + --frontend-port-range-start $servicePort ` + --frontend-port-range-end $servicePort ` + --frontend-ip $loadBalancerPublicIp ` + --backend-address-pool "$serviceName-pool" ` + --backend-port $servicePort ` + --only-show-errors + + az network lb outbound-rule create --address-pool "$serviceName-pool"` + --lb-name $loadBalancerName ` + --name "Grafana-outbound" ` + --outbound-ports 10000 ` + --protocol All ` + --frontend-ip-configs $loadBalancerPublicIp ` + --resource-group $resourceGroup ` + --only-show-errors + + #$lbIndex++ + } + +} + +function Deploy-HypermarketBookmarks { + $bookmarksFileName = "$AgToolsDir\Bookmarks" + $edgeBookmarksPath = "$Env:LOCALAPPDATA\Microsoft\Edge\User Data\Default" + + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + $clusterName = $cluster.Name.ToLower() + kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + $publicIPAddress = $(az network public-ip show --resource-group $resourceGroup --name "Ag-LB-Public-IP-$clusterName" --query "ipAddress" --output tsv) + $services = kubectl get services -n contoso-hypermarket -o json | ConvertFrom-Json + + # Matching url: backend-api + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'backend-api' -and + $_.spec.ports.port -contains 5002 + } + $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($backendApiIp in $backendApiIps) { + $output = "http://${publicIPAddress}:5002/docs" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("backend-api-" + $clusterName + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 + } + + # Matching url: cerebral-api-service + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'cerebral-api-service' -and + $_.spec.ports.port -contains 5003 + } + $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($backendApiIp in $backendApiIps) { + $output = "http://${publicIPAddress}:5003/api/docs" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("cerebral-api-" + $clusterName + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 + } + + # Matching url: cerebral-simulator-service + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'cerebral-simulator-service' -and + $_.spec.ports.port -contains 8001 + } + $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($backendApiIp in $backendApiIps) { + $output = "http://${publicIPAddress}:8001/apidocs" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("cerebral-simulator-" + $clusterName + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 + } + + # Matching url: footfall-ai-api + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'footfall-ai-api' -and + $_.spec.ports.port -contains 5000 + } + $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($backendApiIp in $backendApiIps) { + $output = "http://${publicIPAddress}:5000" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("footfall-ai-api-" + $clusterName + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 + } + + # Matching url: main-ui + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'main-ui' -and + $_.spec.ports.port -contains 8080 + } + $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($backendApiIp in $backendApiIps) { + $output = "http://${publicIPAddress}:8080/maintenanceworkerdashboard" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("main-ui-" + $clusterName + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 + } + + # Matching url: InfluxDB + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'InfluxDB' -and + $_.spec.ports.port -contains 9999 + } + $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($backendApiIp in $backendApiIps) { + $output = "http://${publicIPAddress}:9999" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("InfluxDB-" + $clusterName + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 + } + + # Matching url: Shopper Insights API + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'shopper-insights-api' -and + $_.spec.ports.port -contains 5001 + } + $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($backendApiIp in $backendApiIps) { + $output = "http://${publicIPAddress}:5001" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("Shopper-Insights-API-" + $clusterName + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 + } + } +} + +function Set-ACSA { + # Begin ACSA Installation. + # Documentation: https://aepreviews.ms/docs/edge-storage-accelerator/how-to-install-edge-storage-accelerator/ + + # Ensure necessary variables are available + $storageAccountName = $global:aioStorageAccountName # Using $global:aioStorageAccountName + $storageContainer = "shopper-videos" # Container name set to "shoppervideos" + $resourceGroup = $global:resourceGroup + $location = $global:azureLocation + $arcClusterName = $global:k3sArcClusterName + $subscriptionId = $global:subscriptionId + + # Create a storage account + Write-Host "Storage Account Name: $storageAccountName" + Write-Host "Container Name: $storageContainer" + + # Create a container within the storage account + Write-Host "Creating container within the storage account..." + az storage container create ` + --name "$storageContainer" ` + --account-name "$storageAccountName" ` + --auth-mode login + + # Assign necessary role to the extension principal + $principalID = az k8s-extension list ` + --cluster-name $arcClusterName ` + --resource-group $resourceGroup ` + --cluster-type connectedClusters ` + --query "[?extensionType=='microsoft.arc.containerstorage'].identity.principalId | [0]" -o tsv + + az role assignment create ` + --assignee-object-id $principalID ` + --assignee-principal-type ServicePrincipal ` + --role "Storage Blob Data Owner" ` + --scope "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup/providers/Microsoft.Storage/storageAccounts/$storageAccountName" + + # Deploy the ACSA application #NEED TO BE CHANGED + $acsadeployYamlUrl = "https://raw.githubusercontent.com/microsoft/azure_arc/main/azure_edge_iot_ops_jumpstart/acsa_fault_detection/yaml/acsa-edge-sub-volume.yaml" + $acsadeployYamlPath = "acsa-edge-sub-volume.yaml" + Invoke-WebRequest -Uri $acsadeployYamlUrl -OutFile $acsadeployYamlPath + + # Replace {STORAGEACCOUNT} with the actual storage account name + (Get-Content $acsadeployYamlPath) -replace '{STORAGEACCOUNT}', $storageAccountName | Set-Content $acsadeployYamlPath + + # Apply the acsa-deploy.yaml file using kubectl + Write-Host "Applying acsa-deploy.yaml configuration..." + kubectl apply -f $acsadeployYamlPath + Write-Host "acsa-deploy.yaml configuration applied successfully." +} + +function Deploy-HypermarketBookmarks { + $bookmarksFileName = "$AgToolsDir\Bookmarks" + $edgeBookmarksPath = "$Env:LOCALAPPDATA\Microsoft\Edge\User Data\Default" + + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + $clusterName = $cluster.Name.ToLower() + kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + $publicIPAddress = $(az network public-ip show --resource-group $resourceGroup --name "Ag-LB-Public-IP-$clusterName" --query "ipAddress" --output tsv) + $services = kubectl get services -n contoso-hypermarket -o json | ConvertFrom-Json + + # Matching url: backend-api + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'backend-api' -and + $_.spec.ports.port -contains 5002 + } + $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($backendApiIp in $backendApiIps) { + $output = "http://${publicIPAddress}:5002/docs" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("backend-api-" + $clusterName + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 + } + + # Matching url: cerebral-api-service + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'cerebral-api-service' -and + $_.spec.ports.port -contains 5003 + } + $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($backendApiIp in $backendApiIps) { + $output = "http://${publicIPAddress}:5003/api/docs" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("cerebral-api-" + $clusterName + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 + } + + # Matching url: cerebral-simulator-service + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'cerebral-simulator-service' -and + $_.spec.ports.port -contains 8001 + } + $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($backendApiIp in $backendApiIps) { + $output = "http://${publicIPAddress}:8001/apidocs" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("cerebral-simulator-" + $clusterName + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 + } + + # Matching url: footfall-ai-api + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'footfall-ai-api' -and + $_.spec.ports.port -contains 5000 + } + $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($backendApiIp in $backendApiIps) { + $output = "http://${publicIPAddress}:5000" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("footfall-ai-api-" + $clusterName + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 + } + + # Matching url: main-ui + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'main-ui' -and + $_.spec.ports.port -contains 8080 + } + $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($backendApiIp in $backendApiIps) { + $output = "http://${publicIPAddress}:8080/maintenanceworkerdashboard" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("main-ui-" + $clusterName + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 + } + + # Matching url: InfluxDB + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'InfluxDB' -and + $_.spec.ports.port -contains 9999 + } + $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($backendApiIp in $backendApiIps) { + $output = "http://${publicIPAddress}:9999" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("InfluxDB-" + $clusterName + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 + } + + # Matching url: Shopper Insights API + $matchingServices = $services.items | Where-Object { + $_.metadata.name -eq 'shopper-insights-api' -and + $_.spec.ports.port -contains 5001 + } + $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip + + foreach ($backendApiIp in $backendApiIps) { + $output = "http://${publicIPAddress}:5001" + $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") + + # Replace matching value in the Bookmarks file + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("Shopper-Insights-API-" + $clusterName + "-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 + } + } + Start-Sleep -Seconds 2 + + Copy-Item -Path $bookmarksFileName -Destination $edgeBookmarksPath -Force + + ############################################################## + # Pinning important directories to Quick access + ############################################################## + Write-Host "[$(Get-Date -Format t)] INFO: Pinning important directories to Quick access (Step 16/17)" -ForegroundColor DarkGreen + $quickAccess = new-object -com shell.application + $quickAccess.Namespace($AgConfig.AgDirectories.AgDir).Self.InvokeVerb("pintohome") + $quickAccess.Namespace($AgConfig.AgDirectories.AgLogsDir).Self.InvokeVerb("pintohome") +} \ No newline at end of file From 7a4b6dfeb7aa91fe42e2662af9bad1ebee7e6e5a Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Wed, 6 Nov 2024 17:42:52 -0500 Subject: [PATCH 320/409] Update SetupFabricWorkspace.ps1 --- .../artifacts/PowerShell/SetupFabricWorkspace.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 index 032ae5a0e2..ffbb567530 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 @@ -25,7 +25,7 @@ if ([System.IO.File]::Exists($fabricConfigFile)){ $fabricCapacityName = $fabricConfig.fabricCapacityName $eventHubNamespace = $fabricConfig.eventHubNamespace $eventHubName = $fabricConfig.eventHubName - $eventHubKeyName = $eventHubKeyName + $eventHubKeyName = $fabricConfig.eventHubKeyName $eventHubPrimaryKey = $fabricConfig.eventHubPrimaryKey $AgLogsDir = "." } From 5889b45679ad9e5be00edda5d3b442490f9244cf Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Wed, 6 Nov 2024 18:18:27 -0600 Subject: [PATCH 321/409] bugfix --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 30d7d71e2b..4fcffb0d9e 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -763,7 +763,6 @@ function Set-ACSA { $storageAccountName = $global:aioStorageAccountName # Using $global:aioStorageAccountName $storageContainer = "shopper-videos" # Container name set to "shoppervideos" $resourceGroup = $global:resourceGroup - $location = $global:azureLocation $arcClusterName = $global:k3sArcClusterName $subscriptionId = $global:subscriptionId @@ -779,11 +778,11 @@ function Set-ACSA { --auth-mode login # Assign necessary role to the extension principal - $principalID = az k8s-extension list ` + $principalID = $(az k8s-extension list ` --cluster-name $arcClusterName ` --resource-group $resourceGroup ` --cluster-type connectedClusters ` - --query "[?extensionType=='microsoft.arc.containerstorage'].identity.principalId | [0]" -o tsv + --query "[?extensionType=='microsoft.arc.containerstorage'].identity.principalId | [0]" -o tsv) az role assignment create ` --assignee-object-id $principalID ` From 9f545a29c7770f4c9f6d04b959b8312c89c50c55 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Wed, 6 Nov 2024 19:14:31 -0600 Subject: [PATCH 322/409] updaate --- .../artifacts/PowerShell/AgLogonScript.ps1 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index a5fbad3ff7..32f3c2801d 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -216,6 +216,11 @@ if ($scenario -eq "contoso_supermarket") { --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Nginx.log") } +############################################################## +# Deploy Kubernetes Prometheus Stack for Observability +############################################################## +Deploy-Prometheus -AgConfig $AgConfig + ##################################################################### # Configuring applications on the clusters using GitOps ##################################################################### @@ -242,11 +247,6 @@ if ($scenario -eq "contoso_motors") { Set-LoadBalancerBackendPools } -############################################################## -# Deploy Kubernetes Prometheus Stack for Observability -############################################################## -Deploy-Prometheus -AgConfig $AgConfig - ##################################################################### # Deploy Azure Workbook for Infrastructure Observability ##################################################################### From a678fd37689883ebe0b8fd9ff0c4d2fc68e39ee8 Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Wed, 6 Nov 2024 20:08:18 -0600 Subject: [PATCH 323/409] acsa secret must be created after AIO --- azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 32f3c2801d..51d3e0ff20 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -236,8 +236,8 @@ if ($scenario -eq "contoso_motors") { $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray }elseif($scenario -eq "contoso_hypermarket"){ - Set-ACSA Deploy-AIO-M3 + Set-ACSA $mqttIpArray=Set-MQTTIpAddress Deploy-MQTTExplorer -mqttIpArray $mqttIpArray Set-AIServiceSecrets From 393e5e8fd68534ffe947ebc241b1fe65df6ffe5d Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Thu, 7 Nov 2024 05:17:36 +0100 Subject: [PATCH 324/409] Update authentication for Pester tests after SPN removal Signed-off-by: Jan Egil Ring --- .../artifacts/PowerShell/tests/common.tests.ps1 | 6 ++---- .../artifacts/PowerShell/tests/k8s.tests.ps1 | 16 +++++++--------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 index 96e4a85aa1..2a388266e5 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 @@ -1,9 +1,7 @@ BeforeDiscovery { - # Login to Azure PowerShell with service principal provided by user - $spnpassword = ConvertTo-SecureString $env:spnClientSecret -AsPlainText -Force - $spncredential = New-Object System.Management.Automation.PSCredential ($env:spnClientId, $spnpassword) - Connect-AzAccount -ServicePrincipal -Credential $spncredential -Tenant $env:spnTenantId -Subscription $env:subscriptionId + # Login to Azure PowerShell with Managed Identity + Connect-AzAccount -Identity -Tenant $env:spnTenantId -Subscription $env:subscriptionId } Describe "ArcBox resource group" { diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 index ab927d3975..b5f6d12e4d 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 @@ -1,9 +1,7 @@ BeforeDiscovery { - # Login to Azure PowerShell with service principal provided by user - $spnpassword = ConvertTo-SecureString $env:spnClientSecret -AsPlainText -Force - $spncredential = New-Object System.Management.Automation.PSCredential ($env:spnClientId, $spnpassword) - Connect-AzAccount -ServicePrincipal -Credential $spncredential -Tenant $env:spnTenantId -Subscription $env:subscriptionId + # Login to Azure PowerShell with Managed Identity + Connect-AzAccount -Identity -Tenant $env:spnTenantId -Subscription $env:subscriptionId # Import the configuration data $AgConfig = Import-PowerShellDataFile -Path $Env:AgConfigPath @@ -47,7 +45,7 @@ Describe "" -ForEach $ArcClusterNames { $containersInCrashLoop = $pod.status.containerStatuses | Where-Object { $_.state.waiting.reason -eq "CrashLoopBackOff" } - + # Ensure there are no containers in CrashLoopBackOff for this pod $containersInCrashLoop | Should -BeNullOrEmpty -Because "Pod $($pod.metadata.name) should not have containers in CrashLoopBackOff" } @@ -56,15 +54,15 @@ Describe "" -ForEach $ArcClusterNames { $pod.status.phase | Should -BeIn @("Running", "Succeeded") -Because "Pod $($pod.metadata.name) should be Running or Completed" } } - } + } It "Azure IoT Operations - aio-operator service should be online with a valid ClusterIP" { # Find the aio-operator service in the list $aioOperatorService = $aioServices.items | Where-Object { $_.metadata.name -eq "aio-operator" } - + # Verify that the aio-operator service exists $aioOperatorService | Should -Not -BeNullOrEmpty -Because "The aio-operator service should exist in the azure-iot-operations namespace" - + # Verify that the aio-operator service has a ClusterIP assigned - $aioOperatorService.spec.clusterIP | Should -Not -BeNullOrEmpty -Because "The aio-operator service should have a valid ClusterIP assigned" + $aioOperatorService.spec.clusterIP | Should -Not -BeNullOrEmpty -Because "The aio-operator service should have a valid ClusterIP assigned" } } From 00919d37e3fd32bb9cefbfceb3667e25d93f8c24 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Thu, 7 Nov 2024 06:15:36 +0100 Subject: [PATCH 325/409] Updated authentication parameters for tests Signed-off-by: Jan Egil Ring --- azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 | 2 +- azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 index 2a388266e5..eff98e3869 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/tests/common.tests.ps1 @@ -1,7 +1,7 @@ BeforeDiscovery { # Login to Azure PowerShell with Managed Identity - Connect-AzAccount -Identity -Tenant $env:spnTenantId -Subscription $env:subscriptionId + Connect-AzAccount -Identity -Subscription $env:subscriptionId } Describe "ArcBox resource group" { diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 index b5f6d12e4d..54ea6cc443 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 @@ -1,7 +1,7 @@ BeforeDiscovery { # Login to Azure PowerShell with Managed Identity - Connect-AzAccount -Identity -Tenant $env:spnTenantId -Subscription $env:subscriptionId + Connect-AzAccount -Identity -Subscription $env:subscriptionId # Import the configuration data $AgConfig = Import-PowerShellDataFile -Path $Env:AgConfigPath From 15f15f8ac6e67290c6d84ddd019bafc0f9900609 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 7 Nov 2024 12:20:21 +0200 Subject: [PATCH 326/409] Update InfluxDB port from 9999 to 8086 in Deploy-HypermarketBookmarks function --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 462a4d8f19..a761f025f3 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -752,12 +752,12 @@ function Deploy-HypermarketBookmarks { # Matching url: InfluxDB $matchingServices = $services.items | Where-Object { $_.metadata.name -eq 'InfluxDB' -and - $_.spec.ports.port -contains 9999 + $_.spec.ports.port -contains 8086 } $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip foreach ($backendApiIp in $backendApiIps) { - $output = "http://${publicIPAddress}:9999" + $output = "http://${publicIPAddress}:8086" $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") # Replace matching value in the Bookmarks file From 55c44d65a3468f5aef8359f12aa194175075cf24 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 7 Nov 2024 12:22:26 +0200 Subject: [PATCH 327/409] Update InfluxDB port from 9999 to 8086 in Deploy-HypermarketBookmarks function --- .../Modules/contoso_hypermarket.psm1 | 143 +----------------- 1 file changed, 2 insertions(+), 141 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index a761f025f3..5d98ee7f98 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -648,145 +648,6 @@ function Set-LoadBalancerBackendPools { } -function Deploy-HypermarketBookmarks { - $bookmarksFileName = "$AgToolsDir\Bookmarks" - $edgeBookmarksPath = "$Env:LOCALAPPDATA\Microsoft\Edge\User Data\Default" - - foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { - $clusterName = $cluster.Name.ToLower() - kubectx $clusterName | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") - - $publicIPAddress = $(az network public-ip show --resource-group $resourceGroup --name "Ag-LB-Public-IP-$clusterName" --query "ipAddress" --output tsv) - $services = kubectl get services -n contoso-hypermarket -o json | ConvertFrom-Json - - # Matching url: backend-api - $matchingServices = $services.items | Where-Object { - $_.metadata.name -eq 'backend-api' -and - $_.spec.ports.port -contains 5002 - } - $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip - - foreach ($backendApiIp in $backendApiIps) { - $output = "http://${publicIPAddress}:5002/docs" - $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") - - # Replace matching value in the Bookmarks file - $content = Get-Content -Path $bookmarksFileName - $newContent = $content -replace ("backend-api-" + $clusterName + "-URL"), $output - $newContent | Set-Content -Path $bookmarksFileName - Start-Sleep -Seconds 2 - } - - # Matching url: cerebral-api-service - $matchingServices = $services.items | Where-Object { - $_.metadata.name -eq 'cerebral-api-service' -and - $_.spec.ports.port -contains 5003 - } - $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip - - foreach ($backendApiIp in $backendApiIps) { - $output = "http://${publicIPAddress}:5003/api/docs" - $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") - - # Replace matching value in the Bookmarks file - $content = Get-Content -Path $bookmarksFileName - $newContent = $content -replace ("cerebral-api-" + $clusterName + "-URL"), $output - $newContent | Set-Content -Path $bookmarksFileName - Start-Sleep -Seconds 2 - } - - # Matching url: cerebral-simulator-service - $matchingServices = $services.items | Where-Object { - $_.metadata.name -eq 'cerebral-simulator-service' -and - $_.spec.ports.port -contains 8001 - } - $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip - - foreach ($backendApiIp in $backendApiIps) { - $output = "http://${publicIPAddress}:8001/apidocs" - $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") - - # Replace matching value in the Bookmarks file - $content = Get-Content -Path $bookmarksFileName - $newContent = $content -replace ("cerebral-simulator-" + $clusterName + "-URL"), $output - $newContent | Set-Content -Path $bookmarksFileName - Start-Sleep -Seconds 2 - } - - # Matching url: footfall-ai-api - $matchingServices = $services.items | Where-Object { - $_.metadata.name -eq 'footfall-ai-api' -and - $_.spec.ports.port -contains 5000 - } - $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip - - foreach ($backendApiIp in $backendApiIps) { - $output = "http://${publicIPAddress}:5000" - $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") - - # Replace matching value in the Bookmarks file - $content = Get-Content -Path $bookmarksFileName - $newContent = $content -replace ("footfall-ai-api-" + $clusterName + "-URL"), $output - $newContent | Set-Content -Path $bookmarksFileName - Start-Sleep -Seconds 2 - } - - # Matching url: main-ui - $matchingServices = $services.items | Where-Object { - $_.metadata.name -eq 'main-ui' -and - $_.spec.ports.port -contains 8080 - } - $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip - - foreach ($backendApiIp in $backendApiIps) { - $output = "http://${publicIPAddress}:8080/maintenanceworkerdashboard" - $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") - - # Replace matching value in the Bookmarks file - $content = Get-Content -Path $bookmarksFileName - $newContent = $content -replace ("main-ui-" + $clusterName + "-URL"), $output - $newContent | Set-Content -Path $bookmarksFileName - Start-Sleep -Seconds 2 - } - - # Matching url: InfluxDB - $matchingServices = $services.items | Where-Object { - $_.metadata.name -eq 'InfluxDB' -and - $_.spec.ports.port -contains 8086 - } - $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip - - foreach ($backendApiIp in $backendApiIps) { - $output = "http://${publicIPAddress}:8086" - $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") - - # Replace matching value in the Bookmarks file - $content = Get-Content -Path $bookmarksFileName - $newContent = $content -replace ("InfluxDB-" + $clusterName + "-URL"), $output - $newContent | Set-Content -Path $bookmarksFileName - Start-Sleep -Seconds 2 - } - - # Matching url: Shopper Insights API - $matchingServices = $services.items | Where-Object { - $_.metadata.name -eq 'shopper-insights-api' -and - $_.spec.ports.port -contains 5001 - } - $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip - - foreach ($backendApiIp in $backendApiIps) { - $output = "http://${publicIPAddress}:5001" - $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") - - # Replace matching value in the Bookmarks file - $content = Get-Content -Path $bookmarksFileName - $newContent = $content -replace ("Shopper-Insights-API-" + $clusterName + "-URL"), $output - $newContent | Set-Content -Path $bookmarksFileName - Start-Sleep -Seconds 2 - } - } -} - function Set-ACSA { # Begin ACSA Installation. # Documentation: https://aepreviews.ms/docs/edge-storage-accelerator/how-to-install-edge-storage-accelerator/ @@ -940,12 +801,12 @@ function Deploy-HypermarketBookmarks { # Matching url: InfluxDB $matchingServices = $services.items | Where-Object { $_.metadata.name -eq 'InfluxDB' -and - $_.spec.ports.port -contains 9999 + $_.spec.ports.port -contains 8086 } $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip foreach ($backendApiIp in $backendApiIps) { - $output = "http://${publicIPAddress}:9999" + $output = "http://${publicIPAddress}:8086" $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") # Replace matching value in the Bookmarks file From 83b6587b180b515d7967258e4a0e5d43429cc0fd Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 7 Nov 2024 12:36:55 +0200 Subject: [PATCH 328/409] Add InfluxDB port 8086 to network security group rules --- azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep | 1 + 1 file changed, 1 insertion(+) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep index 05f6e3f81a..d1b68a748d 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/mgmt/network.bicep @@ -230,6 +230,7 @@ resource networkSecurityGroupCloud 'Microsoft.Network/networkSecurityGroups@2023 '5000-5003' '8001' '3000' + '8086' ] } } From 5913c167b17222a7f94f1115a452d1139b9306d4 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:26:17 +0200 Subject: [PATCH 329/409] Simplify log message for Azure CLI login in AgLogonScript.ps1 --- .../artifacts/PowerShell/AgLogonScript.ps1 | 2 +- .../Modules/contoso_hypermarket.psm1 | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 51d3e0ff20..da53a58795 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -103,7 +103,7 @@ $global:Credentials = New-Object System.Management.Automation.PSCredential($AgCo # Setup Azure CLI ##################################################################### Write-Host "[$(Get-Date -Format t)] INFO: Configuring Azure CLI (Step 1/17)" -ForegroundColor DarkGreen -Write-Host "[$(Get-Date -Format t)] INFO: Logging into Az CLI using the service principal and secret provided at deployment" -ForegroundColor Gray +Write-Host "[$(Get-Date -Format t)] INFO: Logging into Az CLI" -ForegroundColor Gray if($scenario -eq "contoso_hypermarket"){ az login --identity | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\AzCLI.log") }else{ diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 5d98ee7f98..ecba9e7ca8 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -568,10 +568,6 @@ function Set-SQLSecret { } function Set-LoadBalancerBackendPools { - - #$loadBalancerName = $(az network lb list -g $resourceGroup --query [].name -o tsv) - #$loadBalancerPublicIp = $(az network lb frontend-ip list -g $resourceGroup --lb-name $loadBalancerName --query [].name -o tsv) - #$lbIndex = 0 $vnetResourceId = $(az network vnet list -g $resourceGroup --query [].id -o tsv) foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { $clusterName = $cluster.Name.ToLower() @@ -586,6 +582,8 @@ function Set-LoadBalancerBackendPools { $serviceIp = $service.status.loadBalancer.ingress.ip if ($null -ne $serviceIp) { + Write-Host "[$(Get-Date -Format t)] Creating backend pool for service: $serviceName" -ForegroundColor Gray + Write-Host "`n" az network lb address-pool create -g $resourceGroup ` --lb-name $loadBalancerName ` --name "$serviceName-pool" ` @@ -593,6 +591,8 @@ function Set-LoadBalancerBackendPools { --backend-addresses "[{name:${serviceName},ip-address:${serviceIp}}]" ` --only-show-errors + Write-Host "[$(Get-Date -Format t)] Creating inbound NAT rule for service: $serviceName" -ForegroundColor Gray + Write-Host "`n" az network lb inbound-nat-rule create -g $resourceGroup ` --lb-name $loadBalancerName ` --name "$serviceName-NATRule" ` @@ -616,6 +616,9 @@ function Set-LoadBalancerBackendPools { -o tsv ` --only-show-errors + Write-Host "[$(Get-Date -Format t)] Creating inbound NAT rule for service: $serviceName" -ForegroundColor Gray + Write-Host "`n" + az network lb address-pool create -g $resourceGroup ` --lb-name $loadBalancerName ` --name "$serviceName-pool" ` @@ -623,6 +626,9 @@ function Set-LoadBalancerBackendPools { --backend-addresses "[{name:Grafana,ip-address:${clientVMIpAddress}}]" ` --only-show-errors + Write-Host "[$(Get-Date -Format t)] Creating inbound NAT rule for service: $serviceName" -ForegroundColor Gray + Write-Host "`n" + az network lb inbound-nat-rule create -g $resourceGroup ` --lb-name $loadBalancerName ` --name "$serviceName-NATRule" ` @@ -634,6 +640,9 @@ function Set-LoadBalancerBackendPools { --backend-port $servicePort ` --only-show-errors + Write-Host "[$(Get-Date -Format t)] Creating outbound rule for service: $serviceName" -ForegroundColor Gray + Write-Host "`n" + az network lb outbound-rule create --address-pool "$serviceName-pool"` --lb-name $loadBalancerName ` --name "Grafana-outbound" ` @@ -642,8 +651,6 @@ function Set-LoadBalancerBackendPools { --frontend-ip-configs $loadBalancerPublicIp ` --resource-group $resourceGroup ` --only-show-errors - - #$lbIndex++ } } From e4f97dc936c414bd344cf69eec25fcf71240e0d9 Mon Sep 17 00:00:00 2001 From: Jan Egil Ring Date: Thu, 7 Nov 2024 14:39:34 +0100 Subject: [PATCH 330/409] Filter fluent-bit pods Signed-off-by: Jan Egil Ring --- .../artifacts/PowerShell/tests/k8s.tests.ps1 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 index 54ea6cc443..66ee50eaae 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/tests/k8s.tests.ps1 @@ -22,7 +22,10 @@ Describe "" -ForEach $ArcClusterNames { $cluster $connectedCluster = Get-AzConnectedKubernetes -ResourceGroupName $env:resourceGroup -SubscriptionId $env:subscriptionId -Name $cluster $aioStatus = az iot ops check --as-object 2>$null | ConvertFrom-Json - $aioPodStatus = kubectl get pods -n azure-iot-operations -o json | ConvertFrom-Json + $aioPodStatus = kubectl get pods -n azure-iot-operations -o json | ConvertFrom-Json | Where-Object {$PSItem.items.metadata.name -notlike "*fluent-bit*"} + $aioPodStatusItems = $aioPodStatus.items | Where-Object { + $_.spec.containers.name -notmatch "fluent-bit" + } # Run kubectl to get service details in the azure-iot-operations namespace $aioServices = kubectl get svc -n azure-iot-operations -o json | ConvertFrom-Json } @@ -38,7 +41,7 @@ Describe "" -ForEach $ArcClusterNames { } } It "All pods should be in Running, Completed, or have no containers in CrashLoopBackOff" { - foreach ($pod in $aioPodStatus.items) { + foreach ($pod in $aioPodStatusItems) { # Check the overall pod phase first if ($pod.status.phase -in @("Running", "Succeeded")) { # Now check container statuses within each pod From a7890859473921c261bdd89f4914320b23ad67fd Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:55:15 +0200 Subject: [PATCH 331/409] Refactor logging messages in Az CLI setup and enhance LoadBalancer backend pool creation output --- .../PowerShell/Modules/contoso_hypermarket.psm1 | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index ecba9e7ca8..0d65fba007 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -578,12 +578,19 @@ function Set-LoadBalancerBackendPools { $services.items | ForEach-Object { $service = $_ $serviceName = $service.metadata.name - $servicePort = $service.spec.ports.port + $servicePorts = $service.spec.ports.port $serviceIp = $service.status.loadBalancer.ingress.ip + if($serviceName -eq "influxdb"){ + $servicePort = $servicePorts[1] + }else{ + $servicePort = $servicePorts[0] + } + if ($null -ne $serviceIp) { Write-Host "[$(Get-Date -Format t)] Creating backend pool for service: $serviceName" -ForegroundColor Gray Write-Host "`n" + az network lb address-pool create -g $resourceGroup ` --lb-name $loadBalancerName ` --name "$serviceName-pool" ` @@ -597,11 +604,11 @@ function Set-LoadBalancerBackendPools { --lb-name $loadBalancerName ` --name "$serviceName-NATRule" ` --protocol Tcp ` - --frontend-port-range-start $servicePort[0] ` - --frontend-port-range-end $servicePort[0] ` + --frontend-port-range-start $servicePort ` + --frontend-port-range-end $servicePort ` --frontend-ip $loadBalancerPublicIp ` --backend-address-pool "$serviceName-pool" ` - --backend-port $servicePort[0] ` + --backend-port $servicePort ` --only-show-errors } } From 9996f3c55efc04f817df29ec958af7514c87aeca Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:57:43 +0200 Subject: [PATCH 332/409] Conditional deployment of OS Performance workbook based on scenario --- azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index da53a58795..86354e47d0 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -254,7 +254,9 @@ Deploy-Workbook "arc-inventory-workbook.bicep" ##################################################################### # Deploy Azure Workbook for OS Performance ##################################################################### -Deploy-Workbook "arc-osperformance-workbook.bicep" +if($scenario -ne "contoso_hypermarket"){ + Deploy-Workbook "arc-osperformance-workbook.bicep" +} ##################################################################### # Deploy Azure Data Explorer Dashboard Reports From e5db06bb2165a6ef91a7fc8d93014faaf5aa3cad Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:10:19 +0200 Subject: [PATCH 333/409] Update Footfall API URLs and remove Prometheus entries from bookmarks --- .../settings/Bookmarks-contoso-hypermarket | 41 ++----------------- 1 file changed, 3 insertions(+), 38 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-hypermarket b/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-hypermarket index d09ab19964..6aa6ab66f9 100644 --- a/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-hypermarket +++ b/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-hypermarket @@ -70,14 +70,14 @@ "show_icon": false, "source": "unknown", "type": "url", - "url": "Footfall-API-URL-Chicago" + "url": "Footfall-AI-API-Chicago-URL" }, { "id": "14", "name": "Footfall API - Seattle", "show_icon": false, "source": "unknown", "type": "url", - "url": "Footfall-API-URL-Seattle" + "url": "Footfall-AI-API-Seattle-URL" } ], "id": "12", "name": "Footfall-API", @@ -163,41 +163,6 @@ "name": "InfluxDB", "source": "unknown", "type": "folder" - }, - { - "children": [ { - "id": "30", - "name": "Prometheus Dev", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "Prometheus-Dev-URL" - }, { - "id": "31", - "name": "Prometheus Staging", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "Prometheus-Staging-URL" - }, { - "id": "32", - "name": "Prometheus Canary - Chicago", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "Prometheus-Chicago-URL" - }, { - "id": "33", - "name": "Prometheus Prod - Seattle", - "show_icon": false, - "source": "unknown", - "type": "url", - "url": "Prometheus-Seattle-URL" - } ], - "id": "29", - "name": "Prometheus", - "source": "unknown", - "type": "folder" }, { "children": [ { "id": "20", @@ -205,7 +170,7 @@ "show_icon": false, "source": "unknown", "type": "url", - "url": "https://github.com/microsoft/jumpstart-agora-apps" + "url": "https://github.com/azure/jumpstart-apps" }, { "id": "21", "name": "Agora-Apps-Repo-Your-Fork", From 3d48ba2e241687d600b2c15efd7400cfe8a4dadb Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Thu, 7 Nov 2024 08:45:33 -0600 Subject: [PATCH 334/409] bye gitops --- .../Modules/contoso_hypermarket.psm1 | 213 ++++++++++-------- 1 file changed, 113 insertions(+), 100 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 5d98ee7f98..4fa3d460c0 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -413,111 +413,124 @@ function Set-MicrosoftFabric { } function Deploy-HypermarketConfigs { - # Loop through the clusters and deploy the configs in AppConfig hashtable in AgConfig-contoso-hypermarket.psd + Write-Host "INFO: Cloning the GitHub repository locally to get helm chart" -ForegroundColor Gray + git clone "https://github.com/Azure/jumpstart-apps.git" + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { - Start-Job -Name gitops -ScriptBlock { - $AgConfig = $using:AgConfig - $cluster = $using:cluster - $namingGuid = $using:namingGuid - $resourceGroup = $using:resourceGroup - $appClonedRepo = $using:appUpstreamRepo - $appsRepo = $using:appsRepo - - $AgConfig.AppConfig.GetEnumerator() | sort-object -Property @{Expression = { $_.value.Order }; Ascending = $true } | ForEach-Object { - $app = $_ - $clusterName = $cluster.value.ArcClusterName + "-$namingGuid" - $branch = $cluster.value.Branch.ToLower() - $configName = $app.value.GitOpsConfigName.ToLower() - $namespace = $app.value.Namespace - $appName = $app.Value.KustomizationName - $appPath = $app.Value.KustomizationPath - $retryCount = 0 - $maxRetries = 2 - - Write-Host "[$(Get-Date -Format t)] INFO: Creating GitOps config for $configName on $($cluster.Value.ArcClusterName+"-$namingGuid")" -ForegroundColor Gray - $type = "connectedClusters" - - az k8s-configuration flux create ` - --cluster-name $clusterName ` - --resource-group $resourceGroup ` - --name $configName ` - --cluster-type $type ` - --scope cluster ` - --url $appClonedRepo ` - --branch $branch ` - --sync-interval 3s ` - --kustomization name=$appName path=$appPath prune=true retry_interval=1m ` - --timeout 10m ` - --namespace $namespace ` - --only-show-errors ` - 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - - do { - $configStatus = $(az k8s-configuration flux show --name $configName --cluster-name $clusterName --cluster-type $type --resource-group $resourceGroup -o json 2>$null) | convertFrom-JSON - if ($configStatus.ComplianceState -eq "Compliant") { - Write-Host "[$(Get-Date -Format t)] INFO: GitOps configuration $configName is ready on $clusterName" -ForegroundColor DarkGreen | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - } - else { - if ($configStatus.ComplianceState -ne "Non-compliant") { - Start-Sleep -Seconds 20 - } - elseif ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -lt $maxRetries) { - Start-Sleep -Seconds 20 - $configStatus = $(az k8s-configuration flux show --name $configName --cluster-name $clusterName --cluster-type $type --resource-group $resourceGroup -o json 2>$null) | convertFrom-JSON - if ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -lt $maxRetries) { - $retryCount++ - Write-Host "[$(Get-Date -Format t)] INFO: Attempting to re-install $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - Write-Host "[$(Get-Date -Format t)] INFO: Deleting $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - az k8s-configuration flux delete ` - --resource-group $resourceGroup ` - --cluster-name $clusterName ` - --cluster-type $type ` - --name $configName ` - --force ` - --yes ` - --only-show-errors ` - 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - - Start-Sleep -Seconds 10 - Write-Host "[$(Get-Date -Format t)] INFO: Re-creating $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - - az k8s-configuration flux create ` - --cluster-name $clusterName ` - --resource-group $resourceGroup ` - --name $configName ` - --cluster-type $type ` - --scope cluster ` - --url $appClonedRepo ` - --branch $branch ` - --sync-interval 3s ` - --kustomization name=$appName path=$appPath prune=true ` - --timeout 30m ` - --namespace $namespace ` - --only-show-errors ` - 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - } - } - elseif ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -eq $maxRetries) { - Write-Host "[$(Get-Date -Format t)] ERROR: GitOps configuration $configName has failed on $clusterName. Exiting..." -ForegroundColor White -BackgroundColor Red | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") - break - } - } - } until ($configStatus.ComplianceState -eq "Compliant") - } - } - } - while ($(Get-Job -Name gitops).State -eq 'Running') { - Write-Host "[$(Get-Date -Format t)] INFO: Waiting for GitOps configuration to complete on all clusters...waiting 60 seconds" -ForegroundColor Gray - Receive-Job -Name gitops -WarningAction SilentlyContinue - Start-Sleep -Seconds 60 + $clusterName = $cluster.Name.ToLower() + kubectx $clusterName + helm dependency build ".\jumpstart-apps\agora\contoso_hypermarket\charts\contoso-hypermarket" --namespace contoso-hypermarket + helm install contoso-hypermarket ".\jumpstart-apps\agora\contoso_hypermarket\charts\contoso-hypermarket" --create-namespace --namespace contoso-hypermarket } - - Get-Job -name gitops | Remove-Job - Write-Host "[$(Get-Date -Format t)] INFO: GitOps configuration complete." -ForegroundColor Green - Write-Host } +# function Deploy-HypermarketConfigs { + +# # Loop through the clusters and deploy the configs in AppConfig hashtable in AgConfig-contoso-hypermarket.psd +# foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { +# Start-Job -Name gitops -ScriptBlock { +# $AgConfig = $using:AgConfig +# $cluster = $using:cluster +# $namingGuid = $using:namingGuid +# $resourceGroup = $using:resourceGroup +# $appClonedRepo = $using:appUpstreamRepo +# $appsRepo = $using:appsRepo + +# $AgConfig.AppConfig.GetEnumerator() | sort-object -Property @{Expression = { $_.value.Order }; Ascending = $true } | ForEach-Object { +# $app = $_ +# $clusterName = $cluster.value.ArcClusterName + "-$namingGuid" +# $branch = $cluster.value.Branch.ToLower() +# $configName = $app.value.GitOpsConfigName.ToLower() +# $namespace = $app.value.Namespace +# $appName = $app.Value.KustomizationName +# $appPath = $app.Value.KustomizationPath +# $retryCount = 0 +# $maxRetries = 2 + +# Write-Host "[$(Get-Date -Format t)] INFO: Creating GitOps config for $configName on $($cluster.Value.ArcClusterName+"-$namingGuid")" -ForegroundColor Gray +# $type = "connectedClusters" + +# az k8s-configuration flux create ` +# --cluster-name $clusterName ` +# --resource-group $resourceGroup ` +# --name $configName ` +# --cluster-type $type ` +# --scope cluster ` +# --url $appClonedRepo ` +# --branch $branch ` +# --sync-interval 3s ` +# --kustomization name=$appName path=$appPath prune=true retry_interval=1m ` +# --timeout 10m ` +# --namespace $namespace ` +# --only-show-errors ` +# 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + +# do { +# $configStatus = $(az k8s-configuration flux show --name $configName --cluster-name $clusterName --cluster-type $type --resource-group $resourceGroup -o json 2>$null) | convertFrom-JSON +# if ($configStatus.ComplianceState -eq "Compliant") { +# Write-Host "[$(Get-Date -Format t)] INFO: GitOps configuration $configName is ready on $clusterName" -ForegroundColor DarkGreen | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") +# } +# else { +# if ($configStatus.ComplianceState -ne "Non-compliant") { +# Start-Sleep -Seconds 20 +# } +# elseif ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -lt $maxRetries) { +# Start-Sleep -Seconds 20 +# $configStatus = $(az k8s-configuration flux show --name $configName --cluster-name $clusterName --cluster-type $type --resource-group $resourceGroup -o json 2>$null) | convertFrom-JSON +# if ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -lt $maxRetries) { +# $retryCount++ +# Write-Host "[$(Get-Date -Format t)] INFO: Attempting to re-install $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") +# Write-Host "[$(Get-Date -Format t)] INFO: Deleting $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") +# az k8s-configuration flux delete ` +# --resource-group $resourceGroup ` +# --cluster-name $clusterName ` +# --cluster-type $type ` +# --name $configName ` +# --force ` +# --yes ` +# --only-show-errors ` +# 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + +# Start-Sleep -Seconds 10 +# Write-Host "[$(Get-Date -Format t)] INFO: Re-creating $configName on $clusterName" -ForegroundColor Gray | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") + +# az k8s-configuration flux create ` +# --cluster-name $clusterName ` +# --resource-group $resourceGroup ` +# --name $configName ` +# --cluster-type $type ` +# --scope cluster ` +# --url $appClonedRepo ` +# --branch $branch ` +# --sync-interval 3s ` +# --kustomization name=$appName path=$appPath prune=true ` +# --timeout 30m ` +# --namespace $namespace ` +# --only-show-errors ` +# 2>&1 | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") +# } +# } +# elseif ($configStatus.ComplianceState -eq "Non-compliant" -and $retryCount -eq $maxRetries) { +# Write-Host "[$(Get-Date -Format t)] ERROR: GitOps configuration $configName has failed on $clusterName. Exiting..." -ForegroundColor White -BackgroundColor Red | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\GitOps-$clusterName.log") +# break +# } +# } +# } until ($configStatus.ComplianceState -eq "Compliant") +# } +# } +# } +# while ($(Get-Job -Name gitops).State -eq 'Running') { +# Write-Host "[$(Get-Date -Format t)] INFO: Waiting for GitOps configuration to complete on all clusters...waiting 60 seconds" -ForegroundColor Gray +# Receive-Job -Name gitops -WarningAction SilentlyContinue +# Start-Sleep -Seconds 60 +# } + +# Get-Job -name gitops | Remove-Job +# Write-Host "[$(Get-Date -Format t)] INFO: GitOps configuration complete." -ForegroundColor Green +# Write-Host +# } + function Set-AIServiceSecrets { $location = $global:azureLocation $AIServiceAccountName = $(az cognitiveservices account list -g $resourceGroup --query [].name -o tsv) From 4ff598876200b2561f18cce33900a2931c2fae46 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:55:00 +0200 Subject: [PATCH 335/409] Add parameter for Azure OpenAI SKU name and update model deployment configuration --- .../contoso_hypermarket/bicep/ai/aoai.bicep | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep index 22264faea8..149c5348c7 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep @@ -13,12 +13,20 @@ param openAICapacity int = 10 @description('The type of Cognitive Services account to create') param cognitiveSvcType string = 'AIServices' +@description('The deployment type of the Cognitive Services account') +@allowed([ + 'ProvisionedManaged' + 'Standard' + 'GlobalStandard' +]) +param azureOpenAiSkuName string = 'GlobalStandard' + @description('The array of OpenAI models to deploy') param azureOpenAIModels array = [ - { + /*{ name: 'gpt-35-turbo' version: '0301' - } + }*/ { name: 'gpt-4o-mini' version: '2024-07-18' @@ -42,7 +50,7 @@ resource openAIModelsDeployment 'Microsoft.CognitiveServices/accounts/deployment parent: openAIAccount name: '${openAIAccountName}-${model.name}-deployment' sku: { - name: 'Standard' + name: azureOpenAiSkuName capacity: openAICapacity } properties: { From ff6de48224159619fe9610e77d444d05b503f398 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:56:57 +0200 Subject: [PATCH 336/409] Update OpenAI model version and comment out unused model configuration --- azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index 7b93249146..65363924ce 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -91,10 +91,10 @@ param openAICapacity int = 10 @description('The array of OpenAI models to deploy') param azureOpenAIModels array = [ - { + /*{ name: 'gpt-35-turbo' - version: '0125' - } + version: '0301' + }*/ { name: 'gpt-4o-mini' version: '2024-07-18' From 882ee046d06062d458f53c9588ff1e2d8fdd2845 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:11:08 +0200 Subject: [PATCH 337/409] Remove commented-out configuration for unused OpenAI model in Bicep files --- azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep | 4 ---- azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep | 4 ---- 2 files changed, 8 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep index 149c5348c7..7634fdb590 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep @@ -23,10 +23,6 @@ param azureOpenAiSkuName string = 'GlobalStandard' @description('The array of OpenAI models to deploy') param azureOpenAIModels array = [ - /*{ - name: 'gpt-35-turbo' - version: '0301' - }*/ { name: 'gpt-4o-mini' version: '2024-07-18' diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index 65363924ce..ac228b653f 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -91,10 +91,6 @@ param openAICapacity int = 10 @description('The array of OpenAI models to deploy') param azureOpenAIModels array = [ - /*{ - name: 'gpt-35-turbo' - version: '0301' - }*/ { name: 'gpt-4o-mini' version: '2024-07-18' From 74a2c301f0615b29562afe82044e4c67a62c4a6a Mon Sep 17 00:00:00 2001 From: Zaid Mohammad Date: Thu, 7 Nov 2024 10:33:27 -0500 Subject: [PATCH 338/409] comment arc-inventory workbook --- azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 86354e47d0..32c282a71e 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -250,7 +250,9 @@ if ($scenario -eq "contoso_motors") { ##################################################################### # Deploy Azure Workbook for Infrastructure Observability ##################################################################### -Deploy-Workbook "arc-inventory-workbook.bicep" +if($scenario -ne "contoso_hypermarket"){ + Deploy-Workbook "arc-inventory-workbook.bicep" +} ##################################################################### # Deploy Azure Workbook for OS Performance ##################################################################### From 02f45edfa6c54c9e98e5463a8fc1df851ec36d8a Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Thu, 7 Nov 2024 11:54:24 -0500 Subject: [PATCH 339/409] Fixed data ingestion issues --- .../PowerShell/SetupFabricWorkspace.ps1 | 24 +++++++++++-------- .../bicep/data/dataflows.bicep | 2 +- .../contoso_hypermarket/bicep/data/script.kql | 2 +- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 index ffbb567530..0e2dd350f0 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 @@ -46,6 +46,9 @@ $global:kqlClusterUri = "" Start-Transcript -Path ($AgLogsDir + "\SetupFabricWorkspace.log") Write-Host "[$(Get-Date -Format t)] INFO: Configuring Fabric Wrokspace" -ForegroundColor DarkGreen +# Turn off subscription selection prompt in new AZ CLI +az config set core.login_experience_v2=off + # Login to Azure as end user or managed identity to get access tokens for different API endpoints if ($runAs -eq "user") { # login using device code @@ -208,7 +211,7 @@ function Set-Fabric-Workspace { $ordersDashboardBody = (Invoke-WebRequest -Method Get -Uri $hyperMarketDashboardReport).Content -replace '{{KQL_CLUSTER_URI}}', $kqlQueryServiceUri -replace '{{KQL_DATABASE_ID}}', $kqlDatabaseId -replace '{{FABRIC_WORKSPACE_ID}}', $fabricWorkspaceId # Convert the KQL dashboard report payload to base64 - Write-Host "INFO: Conerting report content into base64 encoded format." + Write-Host "INFO: Converting report content into base64 encoded format." $base64Payload = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($ordersDashboardBody)) # Build KQL dashboard report payload from the report template @@ -363,12 +366,11 @@ function Set-Fabric-Workspace { # Use MWC Token to create event data connection Write-Host "INFO: Creating eventstream in KQL database to ingest data." $dataSourceConnectionId = Invoke-RestMethod -Method Post -Uri $streamApi -Body $streamBody -ContentType "application/json" -Headers @{ Authorization = "MwcToken $mwcToken" } - if ($dataSourceConnectionId.Length -gt 0){ - Write-Host "INFO: Created eventstream in KQL database with ID: $dataSourceConnectionId" + if ($dataSourceConnectionId.dataSourceConnectionId){ + Write-Host "INFO: Created eventstream in KQL database with ID: $($dataSourceConnectionId.dataSourceConnectionId)" } else { - Write-Host "ERROR: Failed to create eventstream in KQL database." - return + Write-Host "ERROR: Failed to create eventstream in KQL database. Review KQL database to make sure datastream is created." } # Import data sceince notebook for sales forecast @@ -378,7 +380,7 @@ function Set-Fabric-Workspace { $ordersNotebookBody = (Invoke-WebRequest -Method Get -Uri "$templateBaseUrl/artifacts/fabric/$ordersSalesForecastNotebook").Content -replace '{{KQL_CLUSTER_URI}}', $kqlQueryServiceUri -replace '{{KQL_DATABASE_NAME}}', $kqlDatabaseName # Convert the KQL dashboard report payload to base64 - Write-Host "INFO: Converting report content into base64 encoded format." + Write-Host "INFO: Converting notebook content into base64 encoded format." $base64Payload = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($ordersNotebookBody)) # Build KQL dashboard report payload from the report template @@ -399,12 +401,11 @@ function Set-Fabric-Workspace { } "@ - # Create KQL dashboard report + # Create notebook in Fabric workspace $nootebookApi = "https://api.fabric.microsoft.com/v1/workspaces/$fabricWorkspaceId/notebooks" $headers = @{"Authorization" = "Bearer $fabricAccessToken"; "Content-Type" = "application/json"} - $notebookResp = Invoke-RestMethod -Method Post -Uri $nootebookApi -Headers $headers -Body $body - $notebookResp - Write-Host "INFO: Created notebook in Fabric workspace." + Invoke-RestMethod -Method Post -Uri $nootebookApi -Headers $headers -Body $body + Write-Host "INFO: Imported notebook in Fabric workspace." } Function Invoke-FabricAPIRequest { @@ -689,6 +690,9 @@ function Set-PowerBI-Project { Write-Host "INFO: Import the PowerBI report and save the item id." $reportImport = Import-FabricItem -workspaceId $global:workspaceId -path $pbipReportPath -itemProperties @{"semanticModelId" = $semanticModelImport.Id} Write-Host "INFO: Imported PowerBI report with the item id $($reportImport.id)" + + # Print Fabric workspace URL + } # Create Fabric workspace and KQL database diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep index 6dee4d3fe4..3d3b869963 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/dataflows.bicep @@ -82,7 +82,7 @@ resource iotDataFlow 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflo endpointRef: defaultDataflowEndpointName dataSources: [ 'iot/#' - 'topic/commercial' + 'topic/#' ] } } diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql index 4cec0f6a99..9b5c84d78b 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/data/script.kql @@ -128,7 +128,7 @@ LAX,Los Angeles,CA,United States .create-or-alter function expand_iot_data() { staging - | where subject == "topic/iot" + | where subject == "iot/devices" | extend data = parse_json(event_data) | project timestamp = todatetime(data.timestamp), From 9c7de24618c733670a764ae98a418e737f1236c2 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 7 Nov 2024 20:28:30 +0200 Subject: [PATCH 340/409] Update OpenAI model name and version in Bicep files --- azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep | 4 ++-- azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep index 7634fdb590..d0dd976d51 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep @@ -24,8 +24,8 @@ param azureOpenAiSkuName string = 'GlobalStandard' @description('The array of OpenAI models to deploy') param azureOpenAIModels array = [ { - name: 'gpt-4o-mini' - version: '2024-07-18' + name: 'gpt-4o' + version: '2024-05013' } ] diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index ac228b653f..ecd76f38b2 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -92,8 +92,8 @@ param openAICapacity int = 10 @description('The array of OpenAI models to deploy') param azureOpenAIModels array = [ { - name: 'gpt-4o-mini' - version: '2024-07-18' + name: 'gpt-4o' + version: '2024-05013' } ] From 00a5e2a5b90b0f17e333cf1a1dc9bce66cc96ef1 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 7 Nov 2024 20:31:28 +0200 Subject: [PATCH 341/409] Fix OpenAI model version format in Bicep files --- azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep | 2 +- azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep index d0dd976d51..126672ce96 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep @@ -25,7 +25,7 @@ param azureOpenAiSkuName string = 'GlobalStandard' param azureOpenAIModels array = [ { name: 'gpt-4o' - version: '2024-05013' + version: '2024-05-13' } ] diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index ecd76f38b2..d06ea9c79f 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -93,7 +93,7 @@ param openAICapacity int = 10 param azureOpenAIModels array = [ { name: 'gpt-4o' - version: '2024-05013' + version: '2024-05-13' } ] From 596aa03e96ca71bc3b1b522b4a91d642a947ee5c Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 7 Nov 2024 20:47:15 +0200 Subject: [PATCH 342/409] Add support for Azure OpenAI model configuration in PowerShell scripts and Bicep files --- .../artifacts/PowerShell/AgLogonScript.ps1 | 2 +- .../artifacts/PowerShell/Bootstrap.ps1 | 4 +++- .../PowerShell/Modules/contoso_hypermarket.psm1 | 8 ++++++-- .../contoso_hypermarket/bicep/ai/aoai.bicep | 15 ++++++--------- .../bicep/clientVm/clientVm.bicep | 8 +++++++- .../contoso_hypermarket/bicep/main.bicep | 9 ++++----- 6 files changed, 27 insertions(+), 19 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index 86354e47d0..d246529252 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -59,7 +59,7 @@ if ($scenario -eq "contoso_supermarket") { $global:aioStorageAccountName = $Env:aioStorageAccountName $global:k3sArcDataClusterName = $Env:k3sArcDataClusterName $global:k3sArcClusterName = $Env:k3sArcClusterName - #$global:spnObjectId = $Env:spnObjectId + $global:azureOpenAIModel = $Env:azureOpenAIModel $global:openAIEndpoint = $Env:openAIEndpoint $global:speachToTextEndpoint = $Env:speachToTextEndpoint } diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 index 3a56375d8c..e28b94ee48 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Bootstrap.ps1 @@ -31,7 +31,8 @@ param ( [string]$k3sArcDataClusterName, [string]$vmAutologon, [string]$openAIEndpoint, - [string]$speachToTextEndpoint + [string]$speachToTextEndpoint, + [object]$azureOpenAIModel ) ############################################################## @@ -73,6 +74,7 @@ param ( [System.Environment]::SetEnvironmentVariable('k3sArcDataClusterName', $k3sArcDataClusterName, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('openAIEndpoint', $openAIEndpoint, [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('speachToTextEndpoint', $speachToTextEndpoint, [System.EnvironmentVariableTarget]::Machine) +[System.Environment]::SetEnvironmentVariable('azureOpenAIModel', $azureOpenAIModel, [System.EnvironmentVariableTarget]::Machine) $ErrorActionPreference = 'Continue' diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 6b544def5a..62826870da 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -533,6 +533,8 @@ function Deploy-HypermarketConfigs { function Set-AIServiceSecrets { $location = $global:azureLocation + $azureOpenAIModelName = $global:azureOpenAIModel.name + $azureOpenAIModelVersion = $global:azureOpenAIModel.version $AIServiceAccountName = $(az cognitiveservices account list -g $resourceGroup --query [].name -o tsv) $AIServicesEndpoints = $(az cognitiveservices account show --name $AIServiceAccountName --resource-group $resourceGroup --query properties.endpoints) | ConvertFrom-Json -AsHashtable $speechToTextEndpoint = $AIServicesEndpoints['Speech Services Speech to Text (Standard)'] @@ -549,7 +551,9 @@ function Set-AIServiceSecrets { --from-literal=azure-openai-endpoint=$openAIEndpoint ` --from-literal=azure-openai-key=$AIServicesKey ` --from-literal=azure-speech-to-text-endpoint=$speechToTextEndpoint ` - --from-literal=region=$location + --from-literal=region=$location ` + --from-literal=azure-openai-model-name=$azureOpenAIModelName ` + --from-literal=azure-openai-model-version=$azureOpenAIModelVersion } } @@ -761,7 +765,7 @@ function Deploy-HypermarketBookmarks { $backendApiIps = $matchingServices.status.loadBalancer.ingress.ip foreach ($backendApiIp in $backendApiIps) { - $output = "http://${publicIPAddress}:5003/api/docs" + $output = "http://${publicIPAddress}:5003" $output | Out-File -Append -FilePath ($AgConfig.AgDirectories["AgLogsDir"] + "\Bookmarks.log") # Replace matching value in the Bookmarks file diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep index 126672ce96..ef19d006f5 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/ai/aoai.bicep @@ -22,12 +22,10 @@ param cognitiveSvcType string = 'AIServices' param azureOpenAiSkuName string = 'GlobalStandard' @description('The array of OpenAI models to deploy') -param azureOpenAIModels array = [ - { +param azureOpenAIModel object = { name: 'gpt-4o' version: '2024-05-13' } -] resource openAIAccount 'Microsoft.CognitiveServices/accounts@2024-06-01-preview' = { name: openAIAccountName @@ -41,10 +39,9 @@ resource openAIAccount 'Microsoft.CognitiveServices/accounts@2024-06-01-preview' } } -@batchSize(1) -resource openAIModelsDeployment 'Microsoft.CognitiveServices/accounts/deployments@2024-06-01-preview' = [for model in azureOpenAIModels: { +resource openAIModelsDeployment 'Microsoft.CognitiveServices/accounts/deployments@2024-06-01-preview' = { parent: openAIAccount - name: '${openAIAccountName}-${model.name}-deployment' + name: '${openAIAccountName}-${azureOpenAIModel.name}-deployment' sku: { name: azureOpenAiSkuName capacity: openAICapacity @@ -52,14 +49,14 @@ resource openAIModelsDeployment 'Microsoft.CognitiveServices/accounts/deployment properties: { model: { format: 'OpenAI' - name: model.name - version: model.version + name: azureOpenAIModel.name + version: azureOpenAIModel.version } versionUpgradeOption: 'NoAutoUpgrade' currentCapacity: openAICapacity raiPolicyName: 'Microsoft.Default' } -}] +} output openAIEndpoint string = filter(items(openAIAccount.properties.endpoints), endpoint => endpoint.key == 'OpenAI Language Model Instance API')[0].value output speechToTextEndpoint string = filter(items(openAIAccount.properties.endpoints), endpoint => endpoint.key == 'Speech Services Speech to Text')[0].value \ No newline at end of file diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep index 4604aa33d1..83e51c570c 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep @@ -75,6 +75,12 @@ param openAIEndpoint string @description('The URL of the Speech-to-text endpoint.') param speachToTextEndpoint string +@description('The array of OpenAI models to deploy') +param azureOpenAIModel object = { + name: 'gpt-4o' + version: '2024-05-13' +} + var encodedPassword = base64(windowsAdminPassword) var bastionName = 'Ag-Bastion' var publicIpAddressName = deployBastion == false ? '${vmName}-PIP' : '${bastionName}-PIP' @@ -190,7 +196,7 @@ resource vmBootstrap 'Microsoft.Compute/virtualMachines/extensions@2022-11-01' = fileUris: [ uri(templateBaseUrl, 'artifacts/PowerShell/Bootstrap.ps1') ] - commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -tenantId ${tenantId} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName} -k3sArcClusterName ${k3sArcClusterName} -k3sArcDataClusterName ${k3sArcDataClusterName} -openAIEndpoint ${openAIEndpoint} -speachToTextEndpoint ${speachToTextEndpoint} -vmAutologon ${vmAutologon}' + commandToExecute: 'powershell.exe -ExecutionPolicy Bypass -File Bootstrap.ps1 -adminUsername ${windowsAdminUsername} -adminPassword ${encodedPassword} -tenantId ${tenantId} -subscriptionId ${subscription().subscriptionId} -resourceGroup ${resourceGroup().name} -azureLocation ${location} -stagingStorageAccountName ${storageAccountName} -workspaceName ${workspaceName} -templateBaseUrl ${templateBaseUrl} -rdpPort ${rdpPort} -githubAccount ${githubAccount} -githubBranch ${githubBranch} -namingGuid ${namingGuid} -customLocationRPOID ${customLocationRPOID} -scenario ${scenario} -aioStorageAccountName ${aioStorageAccountName} -k3sArcClusterName ${k3sArcClusterName} -k3sArcDataClusterName ${k3sArcDataClusterName} -openAIEndpoint ${openAIEndpoint} -speachToTextEndpoint ${speachToTextEndpoint} -vmAutologon ${vmAutologon} -azureOpenAIModel ${azureOpenAIModel}' } } } diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index d06ea9c79f..6b54b5a7bf 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -90,12 +90,10 @@ param deployGPUNodes bool = false param openAICapacity int = 10 @description('The array of OpenAI models to deploy') -param azureOpenAIModels array = [ - { +param azureOpenAIModel object = { name: 'gpt-4o' version: '2024-05-13' - } -] +} var templateBaseUrl = 'https://raw.githubusercontent.com/${githubAccount}/azure_arc/${githubBranch}/azure_jumpstart_ag/' var k3sClusterNodesCount = 2 // Number of nodes to deploy in the K3s cluster @@ -221,6 +219,7 @@ module clientVmDeployment 'clientVm/clientVm.bicep' = { vmAutologon: vmAutologon openAIEndpoint: azureOpenAI.outputs.openAIEndpoint speachToTextEndpoint: azureOpenAI.outputs.speechToTextEndpoint + azureOpenAIModel: azureOpenAIModel } } module keyVault 'data/keyVault.bicep' = { @@ -264,7 +263,7 @@ module azureOpenAI 'ai/aoai.bicep' = { params: { location: location openAIAccountName: 'openai${namingGuid}' - azureOpenAIModels: azureOpenAIModels + azureOpenAIModel: azureOpenAIModel openAICapacity: openAICapacity } } From 75713e185bab3a44928e23c2e4c282538b343cdb Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 7 Nov 2024 21:01:12 +0200 Subject: [PATCH 343/409] Update Grafana service IP address retrieval and bookmark URL in PowerShell module --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 4 ++-- .../artifacts/settings/Bookmarks-contoso-hypermarket | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 62826870da..7c0a4c24f6 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -634,10 +634,10 @@ function Set-LoadBalancerBackendPools { $clientVMName = "Ag-VM-Client" $serviceName = "Grafana" $servicePort = "3000" - $clientVMIpAddress = az vm list-ip-addresses --name $clientVMName ` + $clientVMIpAddress = az vm list-ip-addresses --name $clientVMName ` --resource-group $resourceGroup ` --query "[].virtualMachine.network.privateIpAddresses[0]" ` - -o tsv ` + --output tsv ` --only-show-errors Write-Host "[$(Get-Date -Format t)] Creating inbound NAT rule for service: $serviceName" -ForegroundColor Gray diff --git a/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-hypermarket b/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-hypermarket index 6aa6ab66f9..553fb44fb1 100644 --- a/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-hypermarket +++ b/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-hypermarket @@ -137,7 +137,7 @@ "show_icon": false, "source": "unknown", "type": "url", - "url": "Grafana-URL" + "url": "http://localhost:3000" }], "id": "15", "name": "Grafana", From 267e734fc441fc0d08b89b9761083553b76fca32 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 7 Nov 2024 21:03:26 +0200 Subject: [PATCH 344/409] Update Grafana URL handling in PowerShell module and bookmarks file --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 8 ++++++++ .../artifacts/settings/Bookmarks-contoso-hypermarket | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 7c0a4c24f6..bdaa0541dc 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -864,6 +864,14 @@ function Deploy-HypermarketBookmarks { $newContent | Set-Content -Path $bookmarksFileName Start-Sleep -Seconds 2 } + + # Matching url: Grafana + # Replace matching value in the Bookmarks file + $output = "http://${publicIPAddress}:3000" + $content = Get-Content -Path $bookmarksFileName + $newContent = $content -replace ("Grafana-URL"), $output + $newContent | Set-Content -Path $bookmarksFileName + Start-Sleep -Seconds 2 } Start-Sleep -Seconds 2 diff --git a/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-hypermarket b/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-hypermarket index 553fb44fb1..6aa6ab66f9 100644 --- a/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-hypermarket +++ b/azure_jumpstart_ag/artifacts/settings/Bookmarks-contoso-hypermarket @@ -137,7 +137,7 @@ "show_icon": false, "source": "unknown", "type": "url", - "url": "http://localhost:3000" + "url": "Grafana-URL" }], "id": "15", "name": "Grafana", From 69c0bb7ebd5e3342f277fed8e36bb77cc6ee6212 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 7 Nov 2024 21:10:48 +0200 Subject: [PATCH 345/409] Update Azure OpenAI model name and version retrieval in PowerShell module --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index bdaa0541dc..49303c51ff 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -533,8 +533,8 @@ function Deploy-HypermarketConfigs { function Set-AIServiceSecrets { $location = $global:azureLocation - $azureOpenAIModelName = $global:azureOpenAIModel.name - $azureOpenAIModelVersion = $global:azureOpenAIModel.version + $azureOpenAIModelName = ($Env:azureOpenAIModel | ConvertFrom-Json).name + $azureOpenAIModelVersion = ($Env:azureOpenAIModel | ConvertFrom-Json).version $AIServiceAccountName = $(az cognitiveservices account list -g $resourceGroup --query [].name -o tsv) $AIServicesEndpoints = $(az cognitiveservices account show --name $AIServiceAccountName --resource-group $resourceGroup --query properties.endpoints) | ConvertFrom-Json -AsHashtable $speechToTextEndpoint = $AIServicesEndpoints['Speech Services Speech to Text (Standard)'] From e9f1d8f694fddfb41ec46922efb810e253f1de8a Mon Sep 17 00:00:00 2001 From: ldabas-msft Date: Thu, 7 Nov 2024 21:38:53 +0000 Subject: [PATCH 346/409] Added Set-GPU-Operator function --- .../Modules/contoso_hypermarket.psm1 | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 6b544def5a..f76fff267b 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -872,4 +872,36 @@ function Deploy-HypermarketBookmarks { $quickAccess = new-object -com shell.application $quickAccess.Namespace($AgConfig.AgDirectories.AgDir).Self.InvokeVerb("pintohome") $quickAccess.Namespace($AgConfig.AgDirectories.AgLogsDir).Self.InvokeVerb("pintohome") +} + +function Set-GPU-Operator { + Write-Host "Starting GPU Operator installation..." -ForegroundColor Gray + + # Add the NVIDIA Helm repository + Write-Host "Adding NVIDIA Helm repository..." -ForegroundColor Gray + helm repo add nvidia https://helm.ngc.nvidia.com/nvidia + helm repo update + + # Loop through each cluster and install the GPU operator + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + $clusterName = $cluster.Name.ToLower() + Write-Host "Switching context to cluster: $clusterName" -ForegroundColor Gray + kubectx $clusterName + + # Create the namespace for the GPU operator + Write-Host "Creating GPU operator namespace in $clusterName..." -ForegroundColor Gray + kubectl create namespace gpu-operator -o yaml --dry-run=client | kubectl apply -f - + + # Install the GPU operator using Helm + Write-Host "Installing GPU operator in $clusterName..." -ForegroundColor Gray + helm install --wait --generate-name ` + -n gpu-operator ` + nvidia/gpu-operator ` + --create-namespace ` + --values jumpstart-apps\agora\contoso_hypermarket\charts\gpu-operator\values.yaml + + Write-Host "GPU operator installation completed on $clusterName." -ForegroundColor Green + } + + Write-Host "GPU operator installation completed successfully on all clusters." -ForegroundColor Green } \ No newline at end of file From 244c4766fa04c7ee535a00d80222e3dee96132fc Mon Sep 17 00:00:00 2001 From: dkirby-ms Date: Thu, 7 Nov 2024 20:10:10 -0600 Subject: [PATCH 347/409] bug --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 49303c51ff..f3e0bf5493 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -577,10 +577,11 @@ function Set-SQLSecret { $clusterName = $cluster.Name.ToLower() Write-Host "[$(Get-Date -Format t)] INFO: Deploying SQL Secret to the $clusterName cluster" -ForegroundColor Gray Write-Host "`n" + $decodeAdminPassword = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($adminPassword)) kubectx $clusterName kubectl create secret generic azure-sqlpassword-secret ` --namespace=contoso-hypermarket ` - --from-literal=azure-sqlpassword-secret=$Env:adminPassword + --from-literal=azure-sqlpassword-secret=$decodeAdminPassword } } From 87a029f406bd4f759e96b25b3a5a2789c3e2823f Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Fri, 8 Nov 2024 10:37:59 +0200 Subject: [PATCH 348/409] Add apiVersion to OpenAI model parameters and secrets function --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 4 +++- .../contoso_hypermarket/bicep/clientVm/clientVm.bicep | 5 +++-- azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep | 1 + 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 7e307b6aad..42d8e257b1 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -535,6 +535,7 @@ function Set-AIServiceSecrets { $location = $global:azureLocation $azureOpenAIModelName = ($Env:azureOpenAIModel | ConvertFrom-Json).name $azureOpenAIModelVersion = ($Env:azureOpenAIModel | ConvertFrom-Json).version + $azureOpenAIApiVersion = ($Env:azureOpenAIModel | ConvertFrom-Json).apiVersion $AIServiceAccountName = $(az cognitiveservices account list -g $resourceGroup --query [].name -o tsv) $AIServicesEndpoints = $(az cognitiveservices account show --name $AIServiceAccountName --resource-group $resourceGroup --query properties.endpoints) | ConvertFrom-Json -AsHashtable $speechToTextEndpoint = $AIServicesEndpoints['Speech Services Speech to Text (Standard)'] @@ -553,7 +554,8 @@ function Set-AIServiceSecrets { --from-literal=azure-speech-to-text-endpoint=$speechToTextEndpoint ` --from-literal=region=$location ` --from-literal=azure-openai-model-name=$azureOpenAIModelName ` - --from-literal=azure-openai-model-version=$azureOpenAIModelVersion + --from-literal=azure-openai-model-version=$azureOpenAIModelVersion ` + --from-literal=azure-openai-api-version=$azureOpenAIApiVersion } } diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep index 83e51c570c..af64d03394 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep @@ -77,8 +77,9 @@ param speachToTextEndpoint string @description('The array of OpenAI models to deploy') param azureOpenAIModel object = { - name: 'gpt-4o' - version: '2024-05-13' + name: 'gpt-4o' + version: '2024-05-13' + apiVersion: '2024-08-01-preview' } var encodedPassword = base64(windowsAdminPassword) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index 6b54b5a7bf..ab778f36a7 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -93,6 +93,7 @@ param openAICapacity int = 10 param azureOpenAIModel object = { name: 'gpt-4o' version: '2024-05-13' + apiVersion: '2024-08-01-preview' } var templateBaseUrl = 'https://raw.githubusercontent.com/${githubAccount}/azure_arc/${githubBranch}/azure_jumpstart_ag/' From b7554edd8a84b1dbcb78f3ffbb6dd377836c26e5 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Fri, 8 Nov 2024 13:35:13 +0200 Subject: [PATCH 349/409] Add apiVersion to OpenAI model parameters and secrets function (#2832) --- .../artifacts/PowerShell/Modules/contoso_hypermarket.psm1 | 4 +++- .../contoso_hypermarket/bicep/clientVm/clientVm.bicep | 5 +++-- azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep | 1 + 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 7e307b6aad..42d8e257b1 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -535,6 +535,7 @@ function Set-AIServiceSecrets { $location = $global:azureLocation $azureOpenAIModelName = ($Env:azureOpenAIModel | ConvertFrom-Json).name $azureOpenAIModelVersion = ($Env:azureOpenAIModel | ConvertFrom-Json).version + $azureOpenAIApiVersion = ($Env:azureOpenAIModel | ConvertFrom-Json).apiVersion $AIServiceAccountName = $(az cognitiveservices account list -g $resourceGroup --query [].name -o tsv) $AIServicesEndpoints = $(az cognitiveservices account show --name $AIServiceAccountName --resource-group $resourceGroup --query properties.endpoints) | ConvertFrom-Json -AsHashtable $speechToTextEndpoint = $AIServicesEndpoints['Speech Services Speech to Text (Standard)'] @@ -553,7 +554,8 @@ function Set-AIServiceSecrets { --from-literal=azure-speech-to-text-endpoint=$speechToTextEndpoint ` --from-literal=region=$location ` --from-literal=azure-openai-model-name=$azureOpenAIModelName ` - --from-literal=azure-openai-model-version=$azureOpenAIModelVersion + --from-literal=azure-openai-model-version=$azureOpenAIModelVersion ` + --from-literal=azure-openai-api-version=$azureOpenAIApiVersion } } diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep index 83e51c570c..af64d03394 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/clientVm/clientVm.bicep @@ -77,8 +77,9 @@ param speachToTextEndpoint string @description('The array of OpenAI models to deploy') param azureOpenAIModel object = { - name: 'gpt-4o' - version: '2024-05-13' + name: 'gpt-4o' + version: '2024-05-13' + apiVersion: '2024-08-01-preview' } var encodedPassword = base64(windowsAdminPassword) diff --git a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep index 6b54b5a7bf..ab778f36a7 100644 --- a/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep +++ b/azure_jumpstart_ag/contoso_hypermarket/bicep/main.bicep @@ -93,6 +93,7 @@ param openAICapacity int = 10 param azureOpenAIModel object = { name: 'gpt-4o' version: '2024-05-13' + apiVersion: '2024-08-01-preview' } var templateBaseUrl = 'https://raw.githubusercontent.com/${githubAccount}/azure_arc/${githubBranch}/azure_jumpstart_ag/' From 9a03ee3c41e453674876a054a0eff484e29123e7 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Fri, 8 Nov 2024 09:30:04 -0500 Subject: [PATCH 350/409] Update contoso_hypermarket.psm1 --- .../Modules/contoso_hypermarket.psm1 | 140 +++++++++++++++++- 1 file changed, 139 insertions(+), 1 deletion(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 42d8e257b1..9239c71643 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -919,4 +919,142 @@ function Set-GPU-Operator { } Write-Host "GPU operator installation completed successfully on all clusters." -ForegroundColor Green -} \ No newline at end of file +} + +function Get-KubernetesSecretValue { + param ( + [string]$secretName, + [string]$namespace + ) + + Write-Host "Retrieving secret value for $secretName in namespace $namespace" -ForegroundColor Gray + kubectx $clusterName + $secret = kubectl get secret $secretName -n $namespace -o json | ConvertFrom-Json + $secret.data.GetEnumerator() | ForEach-Object { + $decodedValue = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($_.Value)) + Write-Host "$($_.Key): $decodedValue" + } +} + +function Set-AzureDataStudioConnections { + param ( + [PSCustomObject[]]$dbConnections + ) + + # Creating endpoints file + Write-Host "`n" + Write-Header "Creating SQL Server connections in Azure Data Studio " + Write-Host "`n" + + $settingsContent = @" +{ + "workbench.enablePreviewFeatures": true, + "datasource.connectionGroups": [ + { + "name": "ROOT", + "id": "C777F06B-202E-4480-B475-FA416154D458" + } + ], + "datasource.connections": [ + {{DB_CONNECTION_LIST}} + ], + "window.zoomLevel": 2 +} +"@ + + $dbConnectionsJson = "" + $index = 0 + foreach($connection in $dbConnections) { + $dagConnection = @" +{ + "options": { + "connectionName": "$($connection.sitename)", + "server": "$($connection.server)", + "database": "", + "authenticationType": "SqlLogin", + "user": "$($connection.username)", + "password": "$($connection.password)", + "applicationName": "azdata", + "groupId": "C777F06B-202E-4480-B475-FA416154D458", + "databaseDisplayName": "", + "trustServerCertificate": true + }, + "groupId": "C777F06B-202E-4480-B475-FA416154D458", + "providerName": "MSSQL", + "savePassword": true, + "id": "ac333479-a04b-436b-88ab-3b314a201295" +} +"@ + $dbConnectionsJson += $dagConnection + + if ($index -lt $dbConnections.Count - 1) { + $dbConnectionsJson += ",`n" + } + else { + $dbConnectionsJson += "`n" + } + $index += 1 + } + + $settingsContent = $settingsContent -replace '{{DB_CONNECTION_LIST}}', $dbConnectionsJson + + $settingsFilePath = "$Env:APPDATA\azuredatastudio\User\settings.json" + $settingsContent | Set-Content -Path $settingsFilePath +} + +function Set-DatabaseConnectionsShortcuts { + # Creating endpoints file + Write-Host "`n" + Write-Header "Creating Database Endpoints file Desktop shortcut" + Write-Host "`n" + + $filename = "DatabaseConnectionEndpoints.txt" + $file = New-Item -Path $AgConfig.AgDirectories.AgDir -Name $filename -ItemType "file" -Force + $Endpoints = $file.FullName + Add-Content $Endpoints "======================================================================" + Add-Content $Endpoints "" + + $dbConnections = @() + + # Get SQL server service IP and the port + foreach ($cluster in $AgConfig.SiteConfig.GetEnumerator()) { + $clusterName = $cluster.Name.ToLower() + kubectx $clusterName + + # Get Loadbalancer IP and target port + $sqlService = kubectl get service mssql-service -n contoso-hypermarket -o json | ConvertFrom-Json + $endPoint = "$($sqlService.spec.loadBalancerIP),$($sqlService.spec.ports.targetPort)" + Add-Content $Endpoints "SQL Server external endpoint for $clusterName cluster:" + $endPoint | Add-Content $Endpoints + + # Get SQL server username and password + $secret = kubectl get secret azure-sqlpassword-secret -n contoso-hypermarket -o json | ConvertFrom-Json + $password = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($secret.data.'azure-sqlpassword-secret')) + Add-Content $Endpoints "Username: SA, Password: $password" + Add-Content $Endpoints "" + Add-Content $Endpoints "" + + $dbConnectionInfo = @{ + sitename = "$clusterName" + server = "$endPoint" + username="SA" + password = "$password" + } + + # Add to the connection list + $dbConnections += $dbConnectionInfo + } + + Add-Content $Endpoints "======================================================================" + Add-Content $Endpoints "" + + $TargetFile = $Endpoints + $ShortcutFile = "C:\Users\$env:adminUsername\Desktop\SQL Server Endpoints.lnk" + $WScriptShell = New-Object -ComObject WScript.Shell + $Shortcut = $WScriptShell.CreateShortcut($ShortcutFile) + $Shortcut.TargetPath = $TargetFile + $Shortcut.Save() + + # Create Azure Data Studio connection + Set-AzureDataStudioConnections -dbConnections $dbConnections +} From 80ad76a972af361543fafa5ae1cbe938558b9610 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Fri, 8 Nov 2024 09:36:21 -0500 Subject: [PATCH 351/409] Removed unused function --- .../artifacts/PowerShell/AgLogonScript.ps1 | 8 ++++++++ .../PowerShell/Modules/contoso_hypermarket.psm1 | 17 ++--------------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 index fffeca038e..701f92fb37 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/AgLogonScript.ps1 @@ -286,6 +286,14 @@ if($scenario -eq "contoso_supermarket"){ Deploy-HypermarketBookmarks } +############################################################## +# Creating database connections desktop shortcuts +############################################################## +Write-Host "[$(Get-Date -Format t)] INFO: Creating database connections desktop shortcuts (Step 16/17)" -ForegroundColor DarkGreen +if($scenario -eq "contoso_hypermarket"){ + Set-DatabaseConnectionsShortcuts +} + ############################################################## # Cleanup ############################################################## diff --git a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 index 9239c71643..fb16d4809b 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/Modules/contoso_hypermarket.psm1 @@ -921,21 +921,7 @@ function Set-GPU-Operator { Write-Host "GPU operator installation completed successfully on all clusters." -ForegroundColor Green } -function Get-KubernetesSecretValue { - param ( - [string]$secretName, - [string]$namespace - ) - - Write-Host "Retrieving secret value for $secretName in namespace $namespace" -ForegroundColor Gray - kubectx $clusterName - $secret = kubectl get secret $secretName -n $namespace -o json | ConvertFrom-Json - $secret.data.GetEnumerator() | ForEach-Object { - $decodedValue = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($_.Value)) - Write-Host "$($_.Key): $decodedValue" - } -} - +# Function to set the Azure Data Studio connections function Set-AzureDataStudioConnections { param ( [PSCustomObject[]]$dbConnections @@ -1002,6 +988,7 @@ function Set-AzureDataStudioConnections { $settingsContent | Set-Content -Path $settingsFilePath } +# Function to set the SQL Server connections file and Azure Data Studio connections shortcuts function Set-DatabaseConnectionsShortcuts { # Creating endpoints file Write-Host "`n" From a51324bb208818e6ea51d660b5d33a03ff5451f6 Mon Sep 17 00:00:00 2001 From: Venkata Chintala <29983008+chintalavr@users.noreply.github.com> Date: Fri, 8 Nov 2024 12:03:21 -0500 Subject: [PATCH 352/409] Removed Power BI zip file from GitHub --- .../PowerShell/SetupFabricWorkspace.ps1 | 2 +- .../artifacts/fabric/Contoso_Hypermarket.zip | Bin 822001 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 azure_jumpstart_ag/artifacts/fabric/Contoso_Hypermarket.zip diff --git a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 index 0e2dd350f0..cd87337c80 100644 --- a/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 +++ b/azure_jumpstart_ag/artifacts/PowerShell/SetupFabricWorkspace.ps1 @@ -666,7 +666,7 @@ function Set-PowerBI-Project { $pbipFileName = "Contoso_Hypermarket.zip" $localFilePath = "$pbipFolder\$pbipFileName" Write-Host "INFO: Downloading Power BI report zip file." - Invoke-WebRequest -Uri "$templateBaseUrl/artifacts/fabric/$pbipFileName" -OutFile $localFilePath + Invoke-WebRequest -Uri "https://download.microsoft.com/download/6a82cfc8-ec94-4a55-a2e8-948e90cc66ca/Contoso_Hypermarket.zip" -OutFile $localFilePath Write-Host "INFO: Unzipping Power BI report zip file." Expand-Archive -Path $localFilePath -DestinationPath $pbipFolder -Force diff --git a/azure_jumpstart_ag/artifacts/fabric/Contoso_Hypermarket.zip b/azure_jumpstart_ag/artifacts/fabric/Contoso_Hypermarket.zip deleted file mode 100644 index 8e8b107955ed3e639d801a1101fb220451f68763..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 822001 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 z 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%0D@(NUrP|_4wOyBL*DTf2 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 zμ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
KuSH=e0cn&0_HMc*{*>GU9|o{)8QN*$+h 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

bHIzcc= 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

bHIzcc= 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